Commit 69a54386 authored by fallenstardust's avatar fallenstardust

添加genesys与传统禁卡表模式切换

parent 298ec401
......@@ -632,6 +632,23 @@ public class AppsSettings {
mSharedPreferences.getString(Constants.PREF_LAST_LIMIT, Constants.PREF_DEF_LAST_LIMIT) : limitName;
}
public void setLastGenesysLimit(String limitName) {
App.get().saveSetting("lastGenesysLimit", limitName);
mSharedPreferences.putString(Constants.PREF_LAST_GENESYS_LIMIT, limitName);
}
public String getLastGenesysLimit() {
String limitName = App.get().getSetting("lastGenesysLimit");
return limitName == null || TextUtils.isEmpty(limitName) ?
mSharedPreferences.getString(Constants.PREF_LAST_GENESYS_LIMIT, Constants.PREF_DEF_LAST_GENESYS_LIMIT) : limitName;
}
public void setGenesysMode(int value) {
App.get().saveIntSetting("lastGenesysMode", value);
mSharedPreferences.putInt(Constants.PREF_LAST_GENESYS_MODE, value);
}
public int getGenesysMode () {
return mSharedPreferences.getInt(Constants.PREF_LAST_GENESYS_MODE, Constants.PREF_DEF_LAST_GENESYS_MODE);
}
/**
* 获得(最后)上次打开的卡组的绝对路径
......
......@@ -9,7 +9,11 @@ public interface Constants {
boolean DEBUG = BuildConfig.DEBUG;
String PREF_START = "game_pref_";
String PREF_LAST_LIMIT = "pref_last_limit";
String PREF_LAST_GENESYS_MODE = "pref_last_genesys_mode";
int PREF_DEF_LAST_GENESYS_MODE = 0;//0代表传统禁限模式,1代表Genesys模式
String PREF_DEF_LAST_LIMIT = "";
String PREF_LAST_GENESYS_LIMIT = "pref_last_genesys_limit";
String PREF_DEF_LAST_GENESYS_LIMIT = "";
String PREF_LAST_DECK_PATH = "pref_last_deck_path";
String PREF_LAST_YDK = "pref_last_ydk";
String PREF_DEF_LAST_YDK = "new";
......
......@@ -33,6 +33,7 @@ public class CardLoader implements ICardSearcher {
private final CardManager mCardManager;
private CallBack mCallBack;
private LimitList mLimitList;
private LimitList mGenesys_LimitList;
private static final String TAG = CardLoader.class.getSimpleName();
private final static boolean DEBUG = false;
......@@ -52,13 +53,20 @@ public class CardLoader implements ICardSearcher {
// 读取上次使用的LimitList,如果有非空值存在且和禁卡表列表中有相同名称对应,则使用,否则设置第一个禁卡表
mLimitList = mLimitManager.getLastLimit() != null ? mLimitManager.getLastLimit() : mLimitManager.getTopLimit();
mGenesys_LimitList = mLimitManager.getLastGenesysLimit() != null ? mLimitManager.getLastGenesysLimit() : mLimitManager.getGenesysTopLimit();
}
@Override
public void setLimitList(LimitList limitList) {
mLimitList = limitList;
if (limitList != null)
AppsSettings.get().setLastLimit(limitList.getName());
if (limitList != null) {
if(limitList.getCreditLimits() != null) {
mGenesys_LimitList = limitList;
AppsSettings.get().setLastGenesysLimit(limitList.getName());
} else {
mLimitList = limitList;
AppsSettings.get().setLastLimit(limitList.getName());
}
}
}
/**
......@@ -98,12 +106,23 @@ public class CardLoader implements ICardSearcher {
loadData(null, null);
}
/**
* 获取限制列表
* 这即是ICardSearcher的getLimitList()映射的方法
* @return 返回当前对象的限制列表,非空
*/
@Override
public @NonNull
LimitList getLimitList() {
return mLimitList;
}
@Override
public @NonNull
LimitList getGenesysLimitList() {
return mGenesys_LimitList;
}
public SparseArray<Card> readAllCardCodes() {
if (DEBUG) {
SparseArray<Card> tmp = new SparseArray<>();
......
......@@ -7,4 +7,5 @@ public interface ICardSearcher extends ICardLoader{
void onReset();
void setLimitList(LimitList limit);
LimitList getLimitList();
LimitList getGenesysLimitList();
}
......@@ -15,6 +15,7 @@ import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Switch;
import android.widget.TextView.OnEditorActionListener;
import java.util.ArrayList;
......@@ -49,9 +50,11 @@ public class CardSearcher implements View.OnClickListener {
private final EditText keyWord;
private final CheckBox chk_multi_keyword;
private final Spinner otSpinner;
private final Switch genesys_Switch;
private final Spinner limitSpinner;
private final Spinner genesys_limitSpinner;
private final Spinner limitListSpinner;
private final Spinner genesys_limitListSpinner;
private final Spinner typeSpinner;
private final Spinner typeMonsterSpinner;
private final Spinner typeMonsterSpinner2;
......@@ -90,9 +93,11 @@ public class CardSearcher implements View.OnClickListener {
keyWord = findViewById(R.id.edt_word1);
chk_multi_keyword = findViewById(R.id.chk_multi_keyword);
otSpinner = findViewById(R.id.sp_ot);
genesys_Switch = findViewById(R.id.sw_genesys_mode);//genesys模式开关
limitSpinner = findViewById(R.id.sp_limit);
genesys_limitSpinner = findViewById(R.id.sp_genesys_limit);//初始化genesys禁限选项布局
limitListSpinner = findViewById(R.id.sp_limit_list);
genesys_limitListSpinner = findViewById(R.id.sp_genesys_limit_list);//初始化genesys禁卡表布局
typeSpinner = findViewById(R.id.sp_type_card);
typeMonsterSpinner = findViewById(R.id.sp_type_monster);
typeMonsterSpinner2 = findViewById(R.id.sp_type_monster2);
......@@ -206,23 +211,30 @@ public class CardSearcher implements View.OnClickListener {
}
});
genesys_Switch.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
genesys_limitListSpinner.setVisibility(View.VISIBLE);
genesys_limitSpinner.setVisibility(View.VISIBLE);
limitListSpinner.setVisibility(View.GONE);
limitSpinner.setVisibility(View.GONE);
} else {
genesys_limitListSpinner.setVisibility(View.GONE);
genesys_limitSpinner.setVisibility(View.GONE);
limitListSpinner.setVisibility(View.VISIBLE);
limitSpinner.setVisibility(View.VISIBLE);
}
genesys_Switch.setText(isChecked ? "起源赛制模式" : "传统禁限模式");
mSettings.setGenesysMode(isChecked ? 1 : 0);
});
limitListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
long value = getSelect(limitListSpinner);
if (value <= 0) {
reset(limitSpinner);
reset(genesys_limitSpinner);
}
LimitList limit = mLimitManager.getLimit(getSelectText(limitListSpinner));
if (limit.getName().toLowerCase().contains("genesys")) {
genesys_limitSpinner.setVisibility(View.VISIBLE);
limitSpinner.setVisibility(View.GONE);
} else {
genesys_limitSpinner.setVisibility(View.GONE);
limitSpinner.setVisibility(View.VISIBLE);
}
mICardSearcher.setLimitList(limit);
//同时通知整个界面都显示该禁卡表的禁限情况
mCallBack.setLimit(limit);
......@@ -240,6 +252,31 @@ public class CardSearcher implements View.OnClickListener {
}
return false; // 返回false以允许正常的spinner行为继续
});
genesys_limitListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
long value = getSelect(genesys_limitListSpinner);
if (value <= 0) {
reset(genesys_limitSpinner);
}
LimitList genesyslimit = mLimitManager.getLimit(getSelectText(genesys_limitListSpinner));
mICardSearcher.setLimitList(genesyslimit);
//同时通知整个界面都显示该禁卡表的禁限情况
mCallBack.setLimit(genesyslimit);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
genesys_limitListSpinner.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
refreshGenesysLimitListSpinnerItems(genesys_limitListSpinner);
}
return false; // 返回false以允许正常的spinner行为继续
});
typeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
......@@ -331,6 +368,7 @@ public class CardSearcher implements View.OnClickListener {
initLimitSpinners(limitSpinner);//初始化常规禁限选项:禁止、限制、准限制
initLimitGenesysSpinners(genesys_limitSpinner);//初始化Genesys禁限选项:Genesys、禁止
initLimitListSpinners(limitListSpinner);
initGenesysLimitListSpinners(genesys_limitSpinner);
initTypeSpinners(typeSpinner, new CardType[]{CardType.None, CardType.Monster, CardType.Spell, CardType.Trap});
initTypeSpinners(typeMonsterSpinner, new CardType[]{CardType.None, CardType.Normal, CardType.Effect, CardType.Fusion, CardType.Ritual,
CardType.Synchro, CardType.Pendulum, CardType.Xyz, CardType.Link, CardType.Spirit, CardType.Union,
......@@ -460,7 +498,50 @@ public class CardSearcher implements View.OnClickListener {
}
}
private void initGenesysLimitListSpinners(Spinner spinner) {
// 创建一个列表用于存储下拉选项
List<SimpleSpinnerItem> items = new ArrayList<>();
// 获取所有禁卡表名称列表
List<String> genesys_limit_names = mLimitManager.getGenesysLimitNames();
// 初始化选中项索引为-1(表示未选中)
int index = -1;
// 获取禁卡表总数
int genesys_count = mLimitManager.getGenesysCount();
// 当前选中的禁卡表,初始化为null
LimitList cur = null;
// 如果卡片搜索器不为null,则获取当前使用的禁卡表
if (mICardSearcher != null) {
cur = mICardSearcher.getGenesysLimitList();
}
// 添加默认选项"禁卡表"
items.add(new SimpleSpinnerItem(0, getString(R.string.label_limitlist)));
// 遍历所有禁卡表
for (int i = 0; i < genesys_count; i++) {
// 计算选项索引(从1开始)
int j = i + 1;
// 获取禁卡表名称
String name = genesys_limit_names.get(i);
// 创建并添加禁卡表选项到列表
items.add(new SimpleSpinnerItem(j, name));
// 如果当前禁卡表不为null且名称匹配,则记录选中索引
if (cur != null && TextUtils.equals(cur.getName(), name)) {
index = j;
}
}
// 创建适配器用于绑定数据到Spinner
SimpleSpinnerAdapter adapter = new SimpleSpinnerAdapter(mContext);
// 设置文字颜色为白色
adapter.setColor(Color.WHITE);
// 设置适配器的数据源
adapter.set(items);
// 将适配器设置给Spinner
spinner.setAdapter(adapter);
// 如果找到了匹配的禁卡表,则设置Spinner的选中项
Log.w(TAG, "index:" + index);
if (index >= 0) {
spinner.setSelection(index);
}
}
private void refreshLimitListSpinnerItems(Spinner spinner) {
// 首先清除所有现有的item
if (spinner.getAdapter() != null && spinner.getAdapter() instanceof SimpleSpinnerAdapter) {
......@@ -472,6 +553,17 @@ public class CardSearcher implements View.OnClickListener {
initLimitListSpinners(spinner);
}
private void refreshGenesysLimitListSpinnerItems(Spinner spinner) {
// 首先清除所有现有的item
if (spinner.getAdapter() != null && spinner.getAdapter() instanceof SimpleSpinnerAdapter) {
//清空选项
((SimpleSpinnerAdapter) spinner.getAdapter()).clear();
//重新加载禁卡表,获取可能存在的变动后情况
mLimitManager.load();
}
initGenesysLimitListSpinners(spinner);
}
private void initPscaleSpinners(Spinner spinner) {
List<SimpleSpinnerItem> items = new ArrayList<>();
......@@ -667,7 +759,7 @@ public class CardSearcher implements View.OnClickListener {
// if (limitListSpinner.getAdapter().getCount() > 1) {//因为禁卡表选择记录已变为保存形式,所以这里不再重置为第一个禁卡表
// limitListSpinner.setSelection(1);
// }
reset(limitSpinner);
reset(limitSpinner.getVisibility() == View.VISIBLE ? limitSpinner : genesys_limitSpinner);
reset(typeSpinner);
reset(typeSpellSpinner);
reset(typeTrapSpinner);
......
......@@ -30,9 +30,13 @@ import ocgcore.data.LimitList;
public class LimitManager implements Closeable {
/* key为时间,如“2023.7” ,value为禁止卡、限制卡、准限制卡的列表 */
private final Map<String, LimitList> mLimitLists = new HashMap<>();
// Genesys禁卡表单独整合为一个列表
private final Map<String, LimitList> mGenesys_LimitLists = new HashMap<>();
/* 只存储key的列表,其元素形如“2023.7” */
private final List<String> mLimitNames = new ArrayList<>();
private final List<String> mGenesys_LimitNames = new ArrayList<>();
private int mCount;
private int mGenesys_Count;
public LimitManager() {
......@@ -41,24 +45,38 @@ public class LimitManager implements Closeable {
@Override
public void close() {
mLimitNames.clear();
mGenesys_LimitNames.clear();
mLimitLists.clear();
mGenesys_LimitLists.clear();
}
public int getCount() {
return mCount;
}
public int getGenesysCount() {
return mGenesys_Count;
}
public Map<String, LimitList> getLimitLists() {
return mLimitLists;
}
public Map<String, LimitList> getGenesys_LimitLists() {
return mGenesys_LimitLists;
}
public List<String> getLimitNames() {
return mLimitNames;
}
public List<String> getGenesysLimitNames() {
return mGenesys_LimitNames;
}
public LimitList getLimit(String name) {
return mLimitLists.get(name);
}
public LimitList getGenesysLimit(String name) {
return mGenesys_LimitLists.get(name);
}
public LimitList getLastLimit() {
if (mLimitNames.isEmpty()) {
......@@ -69,6 +87,15 @@ public class LimitManager implements Closeable {
return lastLimitName == null || TextUtils.isEmpty(lastLimitName) ? getTopLimit() : getLimit(lastLimitName);
}
public LimitList getLastGenesysLimit() {
if (mGenesys_LimitNames.isEmpty()) {
return null;
}
// 读取上次使用的LimitList,如果有非空值存在且和禁卡表列表中有相同名称对应,则使用,否则设置第一个禁卡表
String lastLimitName = AppsSettings.get().getLastGenesysLimit();
return lastLimitName == null || TextUtils.isEmpty(lastLimitName) ? getGenesysTopLimit() : getGenesysLimit(lastLimitName);
}
public LimitList getTopLimit() {
if (mLimitNames.isEmpty()) {
return null;
......@@ -76,6 +103,13 @@ public class LimitManager implements Closeable {
return mLimitLists.get(mLimitNames.get(0));
}
public LimitList getGenesysTopLimit() {
if (mGenesys_LimitNames.isEmpty()) {
return null;
}
return mGenesys_LimitLists.get(mGenesys_LimitNames.get(0));
}
/**
* 加载禁卡表lflist.conf数据
*
......@@ -85,10 +119,11 @@ public class LimitManager implements Closeable {
// 清理旧数据,不让缓存干扰读取结果
mLimitLists.clear();
mLimitNames.clear();
mGenesys_LimitLists.clear();
mGenesys_LimitNames.clear();
boolean expansion_rs2 = true;
boolean expansion_zip_rs1 = true;
boolean default_res3 = true;
boolean default_genesys_res4 = true;
// 如果需要读取扩展包数据,则加载扩展包中的限制文件
if (AppsSettings.get().isReadExpansions()) {
......@@ -116,7 +151,7 @@ public class LimitManager implements Closeable {
}
}
// 2.读取扩展卡文件夹中的lflist.conf文件
if (file.isFile() && file.getName().equals(Constants.CORE_LIMIT_PATH)) {
if (file.isFile() && file.getName().contains(Constants.CORE_LIMIT_PATH)) {
expansion_rs2 = loadFile(file);
}
}
......@@ -125,15 +160,15 @@ public class LimitManager implements Closeable {
// 3.加载主资源路径(ygocore文件夹)下的lflist.conf文件对象,这是内置默认文件
File ygocore_lflist = new File(AppsSettings.get().getResourcePath(), Constants.CORE_LIMIT_PATH);
default_res3 = loadFile(ygocore_lflist);
File genesys_lflist = new File(AppsSettings.get().getExpansionsPath(), Constants.CORE_GENESYS_LIMIT_PATH);
default_genesys_res4 = loadFile(genesys_lflist);
// 4.添加一个空卡表N/A(为了和ygopro显示一致才这么写) 无禁限
mLimitLists.put("N/A", new LimitList("N/A"));
mLimitNames.add("N/A");
mGenesys_LimitLists.put("N/A", new LimitList("N/A"));
mGenesys_LimitNames.add("N/A");
++mCount;
return expansion_zip_rs1 && expansion_rs2 && default_res3 && default_genesys_res4;
return expansion_zip_rs1 && expansion_rs2 && default_res3;
}
/**
......@@ -163,8 +198,13 @@ public class LimitManager implements Closeable {
if (line.startsWith("!")) {
name = line.substring(1);
tmp = new LimitList(name);
mLimitLists.put(name, tmp);
mLimitNames.add(name);
if (name.toLowerCase().contains("genesys")) {
mGenesys_LimitLists.put(name, tmp);
mGenesys_LimitNames.add(name);
} else {
mLimitLists.put(name, tmp);
mLimitNames.add(name);
}
} else if (line.startsWith("$")) {
// 去掉$前缀并按空格分割
String[] words = line.substring(1).trim().split("[\t| ]+");
......@@ -180,7 +220,7 @@ public class LimitManager implements Closeable {
String[] words = line.trim().split("[\t| ]+");
if (words.length >= 2) {
if (words[1].equals("$genesys")) {
tmp.addCredits(toNumber(words[0]), toNumber(words[2]));//保存genesys行的卡牌id和信用分值
tmp.addCredits(toNumber(words[0]), toNumber(words[2]));//保存genesys行的卡牌id和点数
} else {
int id = toNumber(words[0]);
int count = toNumber(words[1]);
......@@ -210,6 +250,7 @@ public class LimitManager implements Closeable {
// 更新限制列表计数
mCount = mLimitLists.size();
mGenesys_Count = mGenesys_LimitLists.size();
Log.e("LimitManager", "限制列表数量:" + mCount);
return true;
}
......@@ -241,8 +282,13 @@ public class LimitManager implements Closeable {
if (line.startsWith("!")) {
name = line.substring(1);
tmp = new LimitList(name);
mLimitLists.put(name, tmp);
mLimitNames.add(name);
if (name.toLowerCase().contains("genesys")) {
mGenesys_LimitLists.put(name, tmp);
mGenesys_LimitNames.add(name);
} else {
mLimitLists.put(name, tmp);
mLimitNames.add(name);
}
} else if (line.startsWith("$")) {
// 去掉$前缀并按空格分割
String[] words = line.substring(1).trim().split("[\t| ]+");
......@@ -257,7 +303,7 @@ public class LimitManager implements Closeable {
String[] words = line.trim().split("[\t| ]+");
if (words.length >= 2) {
if (words[1].equals("$genesys")) {
tmp.addCredits(toNumber(words[0]), toNumber(words[2]));//保存genesys行的卡牌id和信用分值
tmp.addCredits(toNumber(words[0]), toNumber(words[2]));//保存genesys行的卡牌id和点数
} else {
int id = toNumber(words[0]);
int count = toNumber(words[1]);
......@@ -285,6 +331,9 @@ public class LimitManager implements Closeable {
IOUtils.close(in);
}
mCount = mLimitLists.size();
mGenesys_Count = mGenesys_LimitLists.size();
Log.e("LimitManager", "限制列表数量:" + mCount);
Log.e("LimitManager", "Genesys限制列表数量:" + mGenesys_Count);
return true;
}
......
......@@ -81,6 +81,14 @@ public class PackManager implements Closeable {
return true;
}
/**
* 处理文件并提取其中的ID列表
* 该方法读取指定文件,解析其中的数字ID(跳过以#开头的注释行),
* 并将有效的ID添加到packList中
*
* @param file 需要处理的文件对象
* @throws IOException 文件读取过程中可能抛出的IO异常
*/
private void processFile(File file) throws IOException {
List<Integer> ids = new ArrayList<>();
try (FileInputStream inputStream = new FileInputStream(file);
......@@ -99,6 +107,7 @@ public class PackManager implements Closeable {
Log.w(TAG, "Skipping invalid line in file " + file.getName() + ": " + line);
}
}
// 将解析出的ID列表添加到packList中,如果ID列表不为空
if (!ids.isEmpty()) {
packList.add(new AbstractMap.SimpleEntry<>(file.getName(), ids));
}
......
......@@ -17,8 +17,8 @@ import ocgcore.enums.LimitType;
*/
public class LimitList {
private String name = "?";
private Integer credit_limits;//GeneSys模式特有的总分
private Map<Integer, Integer> credits;//GeneSys模式特有的单张卡ID和其信用分
private Integer credit_limits;//GeneSys模式特有的上限
private Map<Integer, Integer> credits;//GeneSys模式特有的单张卡ID和其点数
/**
* 0
*/
......
......@@ -49,6 +49,21 @@
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/label_width_small"
android:orientation="horizontal">
<Switch
android:id="@+id/sw_genesys_mode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="center"
android:text="切换为起源(GENESYS)赛制模式" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/label_width_small"
......@@ -62,19 +77,27 @@
android:layout_weight="1" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/sp_limit"
android:id="@+id/sp_genesys_limit_list"
style="@style/itemSpinnerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:visibility="gone"/>
android:visibility="gone" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/sp_limit"
style="@style/itemSpinnerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/sp_genesys_limit"
style="@style/itemSpinnerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:visibility="gone"/>
android:visibility="gone" />
</LinearLayout>
<LinearLayout
......@@ -249,8 +272,8 @@
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp">
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/edt_word1"
......@@ -269,11 +292,11 @@
android:id="@+id/chk_multi_keyword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="30dp"
android:textSize="10sp"
android:text="@string/settings_key_words_split"/>
android:text="@string/settings_key_words_split"
android:textSize="10sp" />
<LinearLayout
android:layout_width="match_parent"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment