From 05aaff1ff36b201fd8d067881e294764f76a3e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E8=89=B3=E8=BE=89?= <913918146@qq.com> Date: Sun, 13 Nov 2022 23:07:54 +0800 Subject: [PATCH] =?UTF-8?q?1=EF=BC=8C=E6=82=AC=E6=B5=AE=E7=AA=97=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=AE=B0=E5=BD=95=E5=8F=8C=E6=96=B9=E5=A2=93=E5=9C=B0?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../ke/hs_tracker/module/entity/GameEvent.kt | 7 +- .../module/parser/DeckCardObserver.kt | 77 ++++++++++++++----- .../module/parser/PowerTagHandler.kt | 15 +++- .../module/service/WindowService.kt | 65 ++++++++++++++-- .../res/layout/module_floating_window.xml | 22 ++++-- module/src/main/res/values/arrays.xml | 7 ++ 7 files changed, 157 insertions(+), 40 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a36701e..279e62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.ke.hs_tracker.app" minSdk libs.versions.minsdk.get().toInteger() targetSdk libs.versions.targetsdk.get().toInteger() - versionCode 18 - versionName "1.1.8" + versionCode 19 + versionName "1.1.9" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/module/src/main/java/com/ke/hs_tracker/module/entity/GameEvent.kt b/module/src/main/java/com/ke/hs_tracker/module/entity/GameEvent.kt index 1752ff9..208b387 100644 --- a/module/src/main/java/com/ke/hs_tracker/module/entity/GameEvent.kt +++ b/module/src/main/java/com/ke/hs_tracker/module/entity/GameEvent.kt @@ -7,7 +7,7 @@ import com.ke.hs_tracker.module.db.Game */ sealed interface GameEvent { - object None : GameEvent + /** @@ -36,4 +36,9 @@ sealed interface GameEvent { data class RemoveCardFromUserDeck( val cardId: String ) : GameEvent + + /** + * 插入一张卡牌到墓地 + */ + data class InsertCardToGraveyard(val cardId: String, val isUser: Boolean) : GameEvent } \ No newline at end of file diff --git a/module/src/main/java/com/ke/hs_tracker/module/parser/DeckCardObserver.kt b/module/src/main/java/com/ke/hs_tracker/module/parser/DeckCardObserver.kt index 79f475e..f97e366 100644 --- a/module/src/main/java/com/ke/hs_tracker/module/parser/DeckCardObserver.kt +++ b/module/src/main/java/com/ke/hs_tracker/module/parser/DeckCardObserver.kt @@ -25,6 +25,16 @@ interface DeckCardObserver { */ val deckCardList: StateFlow> + /** + * 自己的墓地 + */ + val userGraveyardCardList: StateFlow> + + /** + * 对手的墓地 + */ + val opponentGraveyardCardList: StateFlow> + /** * 初始化 */ @@ -59,6 +69,15 @@ class DeckCardObserverImpl @Inject constructor( override val deckCardList: StateFlow> get() = _deckCardList + private val _userGraveyardCardList = MutableStateFlow>(emptyList()) + + override val userGraveyardCardList: StateFlow> + get() = _userGraveyardCardList + + private val _opponentGraveyardCardList = MutableStateFlow>(emptyList()) + override val opponentGraveyardCardList: StateFlow> + get() = _opponentGraveyardCardList + /** * 所有卡牌 */ @@ -73,21 +92,7 @@ class DeckCardObserverImpl @Inject constructor( * 当前卡组剩余的卡牌 */ private var deckLeftCardList: List = listOf() - set(value) { -// "设置了剩余卡牌 ${ -// value.map { -// it.count -// }.reduce { acc, i -> -// acc + i -// } -// }".log() - var count = 0 - value.forEach { - count += it.count - } - "设置了剩余卡牌 $count".log() - field = value - } + /** * 获取炉石log文件夹 @@ -152,21 +157,21 @@ class DeckCardObserverImpl @Inject constructor( scope.launch { powerTagHandler.gameEventFlow.collect { when (it) { + null -> { + } is GameEvent.OnGameOver -> { + _userGraveyardCardList.value = emptyList() + _opponentGraveyardCardList.value = emptyList() clearPowerLogFile() - "清空卡牌 OnGameOver ,deckLeftCardList ${deckLeftCardList.size} , currentDeckList ${currentDeckList.size} , _deckCardList = ${_deckCardList.value.size}".log() -// deckLeftCardList.clear() -// deckLeftCardList.addAll(currentDeckList) deckLeftCardList = currentDeckList.toList() _deckCardList.value = deckLeftCardList.toList() // _deckCardList.send(deckLeftCardList) - "清空卡牌 OnGameOver ,deckLeftCardList ${deckLeftCardList.size} , currentDeckList ${currentDeckList.size} , _deckCardList = ${_deckCardList.value.size}".log() it.game.apply { userDeckCode = currentUserDeck?.code ?: "" @@ -176,6 +181,9 @@ class DeckCardObserverImpl @Inject constructor( powerFileObserver.reset() } GameEvent.OnGameStart -> { + + _userGraveyardCardList.value = emptyList() + _opponentGraveyardCardList.value = emptyList() // deckLeftCardList = currentDeckList "清空卡牌 OnGameStart ,deckLeftCardList ${deckLeftCardList.size} , currentDeckList ${currentDeckList.size}".log() // deckLeftCardList.clear() @@ -192,8 +200,9 @@ class DeckCardObserverImpl @Inject constructor( is GameEvent.InsertCardToUserDeck -> { onUserDeckCardListChanged(it.cardId, false) } - GameEvent.None -> { + is GameEvent.InsertCardToGraveyard -> { + onGraveyardCardsChanged(it.cardId, it.isUser) } } } @@ -218,6 +227,34 @@ class DeckCardObserverImpl @Inject constructor( } + private fun onGraveyardCardsChanged(cardId: String, isUser: Boolean) { + + //TAG_CHANGE Entity=[entityName=UNKNOWN ENTITY [cardType=INVALID] id=106 zone=PLAY zonePos=0 cardId= player=1] tag=ZONE value=GRAVEYARD + //TAG_CHANGE Entity=[entityName=UNKNOWN ENTITY [cardType=INVALID] id=5 zone=SECRET zonePos=0 cardId= player=1] tag=COST value=2 + //如果对面打出一张奥秘拍 会直接进入墓地 +// ?: throw RuntimeException("没有id $entity") + + val card = allCards.find { + it.id == cardId + } ?: return + + if (card.type == CardType.Enchantment) { +// "衍生牌 $card 不能放到墓地去".log() + return + } + +// "插入一张牌到墓地 $card $entity".log() + + //TAG_CHANGE Entity=[entityName=破霰元素 id=62 zone=PLAY zonePos=1 cardId=AV_260 player=2] tag=ZONE value=GRAVEYARD + if (isUser) { + _userGraveyardCardList.value += CardBean(card, 1) + } else { + _opponentGraveyardCardList.value += CardBean(card, 1) + } + + + } + /** * 清空log文件 */ diff --git a/module/src/main/java/com/ke/hs_tracker/module/parser/PowerTagHandler.kt b/module/src/main/java/com/ke/hs_tracker/module/parser/PowerTagHandler.kt index 755e0e6..491ec63 100644 --- a/module/src/main/java/com/ke/hs_tracker/module/parser/PowerTagHandler.kt +++ b/module/src/main/java/com/ke/hs_tracker/module/parser/PowerTagHandler.kt @@ -22,7 +22,7 @@ interface PowerTagHandler { /** * 游戏事件流 */ - val gameEventFlow: Flow + val gameEventFlow: Flow } class PowerTagHandlerImpl @Inject constructor( @@ -31,9 +31,9 @@ class PowerTagHandlerImpl @Inject constructor( private val _gameEventFlow = // Channel(capacity = Channel.UNLIMITED) - MutableStateFlow(GameEvent.None) + MutableStateFlow(null) - override val gameEventFlow: Flow + override val gameEventFlow: Flow get() = _gameEventFlow @@ -227,7 +227,7 @@ class PowerTagHandlerImpl @Inject constructor( insertCardToDeck(cardId) } else if (it.currentZone == Zone.Play && it.newZone == Zone.Graveyard) { -// onGraveyardCardsChanged(cardId, it.isUser) + onGraveyardCardsChanged(cardId, it.isUser) } else if (it.newZone == Zone.Hand || it.currentZone == Zone.Hand) { //手牌 if (!it.isUser) { @@ -241,6 +241,13 @@ class PowerTagHandlerImpl @Inject constructor( } + private fun onGraveyardCardsChanged(cardId: String?, user: Boolean) { + if (cardId == null) { + return + } + _gameEventFlow.value = GameEvent.InsertCardToGraveyard(cardId, user) + } + // private fun findCardById(cardId: String) = // allCard.find { it.id == cardId } ?: throw RuntimeException("id为 $cardId 没有这张牌") diff --git a/module/src/main/java/com/ke/hs_tracker/module/service/WindowService.kt b/module/src/main/java/com/ke/hs_tracker/module/service/WindowService.kt index e68fc9f..39a45bb 100644 --- a/module/src/main/java/com/ke/hs_tracker/module/service/WindowService.kt +++ b/module/src/main/java/com/ke/hs_tracker/module/service/WindowService.kt @@ -5,11 +5,15 @@ import android.os.Build import android.os.IBinder import android.view.Gravity import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup.LayoutParams import android.view.WindowManager -import androidx.core.view.isVisible +import android.widget.AdapterView +import android.widget.AdapterView.OnItemSelectedListener +import android.widget.ArrayAdapter import androidx.lifecycle.LifecycleService import androidx.lifecycle.lifecycleScope +import com.ke.hs_tracker.module.R import com.ke.hs_tracker.module.databinding.ModuleFloatingWindowBinding import com.ke.hs_tracker.module.log import com.ke.hs_tracker.module.parser.DeckCardObserver @@ -32,8 +36,11 @@ class WindowService : LifecycleService() { ModuleFloatingWindowBinding.inflate(layoutInflater) } - private val adapter = CardAdapter() + private val deckAdapter = CardAdapter() + private val graveyardAdapter = CardAdapter() + + private val opponentGraveyardAdapter = CardAdapter() @Inject lateinit var deckCardObserver: DeckCardObserver @@ -58,17 +65,50 @@ class WindowService : LifecycleService() { windowManager.addView(binding.root, layoutParams) - binding.recyclerView.adapter = adapter + binding.recyclerView.adapter = deckAdapter - binding.zoom.setOnClickListener { - binding.recyclerView.isVisible = !binding.recyclerView.isVisible - } +// binding.zoom.setOnClickListener { +// binding.recyclerView.isVisible = !binding.recyclerView.isVisible +// } binding.close.setOnClickListener { windowManager.removeView(binding.root) stopSelf() } + binding.spinner.adapter = ArrayAdapter.createFromResource( + applicationContext, + R.array.module_spinner, + android.R.layout.simple_list_item_1 + ) + binding.spinner.onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>, + view: View, + position: Int, + id: Long + ) { + when (position) { + 0 -> { + binding.recyclerView.adapter = deckAdapter + } + 1 -> { + binding.recyclerView.adapter = graveyardAdapter + } + 2 -> { + binding.recyclerView.adapter = opponentGraveyardAdapter + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + + } + + binding.spinner.setSelection(0) + binding.root.setOnTouchListener( ItemViewTouchListener( layoutParams, @@ -89,10 +129,21 @@ class WindowService : LifecycleService() { lifecycleScope.launch { deckCardObserver.deckCardList.collect { // adapter.setList(it) - adapter.setDiffNewData(it.toMutableList()) + deckAdapter.setDiffNewData(it.toMutableList()) } } + lifecycleScope.launch { + deckCardObserver.userGraveyardCardList.collect { + graveyardAdapter.setDiffNewData(it.toMutableList()) + } + } + + lifecycleScope.launch { + deckCardObserver.opponentGraveyardCardList.collect { + opponentGraveyardAdapter.setDiffNewData(it.toMutableList()) + } + } } diff --git a/module/src/main/res/layout/module_floating_window.xml b/module/src/main/res/layout/module_floating_window.xml index d15ff22..ad53608 100644 --- a/module/src/main/res/layout/module_floating_window.xml +++ b/module/src/main/res/layout/module_floating_window.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="#33000000" android:orientation="vertical"> @@ -19,14 +20,14 @@ app:layout_constraintTop_toTopOf="parent" /> + android:src="@drawable/module_baseline_zoom_out_map_white_24dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/header" /> + app:layout_constraintTop_toTopOf="@id/zoom" /> + + \ No newline at end of file diff --git a/module/src/main/res/values/arrays.xml b/module/src/main/res/values/arrays.xml index 34d608f..e53ebd4 100644 --- a/module/src/main/res/values/arrays.xml +++ b/module/src/main/res/values/arrays.xml @@ -7,4 +7,11 @@ 时间正序 时间倒序 + + + @string/module_deck + @string/module_graveyard + @string/module_opponent_graveyard + + \ No newline at end of file