From f21502c8445fb8848ad1f96840481520e9baf9c1 Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Thu, 16 Mar 2023 17:20:54 +0100 Subject: [PATCH] new class Tool for equipable item :hammer: --- .../com/example/shakecraft/BossFragment.kt | 13 +++++-- .../example/shakecraft/InventoryFragment.kt | 34 ++++++++++++++--- .../java/com/example/shakecraft/data/Stub.kt | 3 ++ .../java/com/example/shakecraft/model/Boss.kt | 4 +- .../com/example/shakecraft/model/Generator.kt | 10 ++--- .../java/com/example/shakecraft/model/Item.kt | 2 +- .../com/example/shakecraft/model/Player.kt | 26 ++++++++++++- .../example/shakecraft/model/RecipeManager.kt | 6 +-- .../java/com/example/shakecraft/model/Tool.kt | 4 ++ .../view/adapter/AdapterInventory.kt | 35 ++++++++++++++++-- .../main/res/drawable/armor_equiped_icon.png | Bin 0 -> 639 bytes .../app/src/main/res/drawable/armor_icon.png | Bin 0 -> 929 bytes .../app/src/main/res/layout/list_item.xml | 12 +++++- 13 files changed, 121 insertions(+), 28 deletions(-) create mode 100644 ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Tool.kt create mode 100644 ShakeAndCraft/app/src/main/res/drawable/armor_equiped_icon.png create mode 100644 ShakeAndCraft/app/src/main/res/drawable/armor_icon.png diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt index 573c7e9..1e04030 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt @@ -79,7 +79,7 @@ class BossFragment() : Fragment() { } private fun setUpBoss(boss: Boss) { progressBar.max = boss.maxlife - progressBar.progress = boss.life + progressBar.progress = boss.life.toInt() image.setImageResource(boss.image) // Create scale animation for boss image @@ -153,9 +153,14 @@ class BossFragment() : Fragment() { setUpRecyclerView(view) } else { - // Reduce boss life based on acceleration value - boss.takeDamage((acceleration / 80).toInt()) - progressBar.progress = boss.life + if(acceleration > 20){ + boss.takeDamage(((acceleration / 80)+ currentPlayer.attack()/100).toDouble()) + } + else{ + boss.takeDamage(currentPlayer.attack().toDouble()/100) + } + progressBar.progress = boss.life.toInt() + } } } diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt index f886ce0..333f589 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt @@ -5,38 +5,60 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.shakecraft.model.Player +import com.example.shakecraft.model.Tool import com.example.shakecraft.view.adapter.AdapterInventory -class InventoryFragment() : Fragment( ) { - +class InventoryFragment() : Fragment( ), AdapterInventory.OnItemLongClickListener { + private lateinit var currentPlayer: Player private lateinit var recyclerView: RecyclerView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } + + override fun onItemLongClick(position: Int) { + if(currentPlayer.items[position] is Tool) { + if (currentPlayer.equipeItem(currentPlayer.items[position]) == true) + Toast.makeText( + context, + currentPlayer.items[position].type.name + " was well equipped", + Toast.LENGTH_SHORT + ).show() + else + Toast.makeText( + context, + currentPlayer.items[position].type.name + " has been well unequipped", + Toast.LENGTH_SHORT + ).show() + println("equiped item") + setUpRecyclerView(view?.parent as ViewGroup, this) + } + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val currentPlayer = (activity as MainActivity).currentPlayer + currentPlayer = (activity as MainActivity).currentPlayer val view = inflater.inflate(R.layout.fragment_inventory, container, false) // Initialize views - setUpRecyclerView(view, currentPlayer) + setUpRecyclerView(view, this) return view } - private fun setUpRecyclerView(view: View, currentPlayer: Player) { + private fun setUpRecyclerView(view: View,listener: AdapterInventory.OnItemLongClickListener ) { recyclerView = view.findViewById(R.id.recyclerviewInventory) with(recyclerView) { layoutManager = LinearLayoutManager(view.context) - adapter = AdapterInventory(currentPlayer.items) + adapter = AdapterInventory(currentPlayer.items, listener , currentPlayer) } } + } \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/data/Stub.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/data/Stub.kt index 7265d3d..1f8ec78 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/data/Stub.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/data/Stub.kt @@ -3,6 +3,7 @@ package com.example.shakecraft.data import com.example.shakecraft.model.ItemManager.Companion.ITEMS import com.example.shakecraft.model.Item import com.example.shakecraft.model.Player +import com.example.shakecraft.model.Tool class Stub { @@ -12,6 +13,8 @@ class Stub { val items : MutableList = mutableListOf() items.add(Item(type = ITEMS.BEECH_LOG.itemtype, stack = 30)) items.add(Item(type = ITEMS.BRONZE_INGOT.itemtype, stack = 30)) + items.add(Tool(type = ITEMS.BRONZE_SWORD.itemtype, stack = 1, damage = 4)) + items.add(Tool(type = ITEMS.DIAMOND_AXE.itemtype, stack = 1, damage = 8)) currentPlayer.items = items return currentPlayer diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Boss.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Boss.kt index 62b9b1b..0e00f09 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Boss.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Boss.kt @@ -3,14 +3,14 @@ package com.example.shakecraft.model class Boss ( var name: String, - var life: Int, + var life: Double, var maxlife: Int, var image: Int, var xpReward: Int, val possibleLoot: List>, ){ - fun takeDamage(strength: Int) { + fun takeDamage(strength: Double) { this.life -= strength } } \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Generator.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Generator.kt index bbf352c..c298339 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Generator.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Generator.kt @@ -43,26 +43,26 @@ class Generator { fun generateBoss(): Boss { val possibleBoss: List> = listOf( - Pair(Boss(name = "Margit the Fell Omen", life = 150, maxlife = 150, image = R.drawable.boss, xpReward = 100, possibleLoot = listOf( + Pair(Boss(name = "Margit the Fell Omen", life = 150.0, maxlife = 150, image = R.drawable.boss, xpReward = 100, possibleLoot = listOf( Pair(Item(type = ITEMS.MONSTER_BONES.itemtype), 0.7), Pair(Item(type = ITEMS.MONSTER_EYE.itemtype), 0.3), )), 0.5), - Pair(Boss(name = "Godrick the Grafted", life = 200, maxlife = 200, image = R.drawable.skeleton, xpReward = 130, possibleLoot = listOf( + Pair(Boss(name = "Godrick the Grafted", life = 200.0, maxlife = 200, image = R.drawable.skeleton, xpReward = 130, possibleLoot = listOf( Pair(Item(type = ITEMS.MONSTER_BONES.itemtype), 0.6), Pair(Item(type = ITEMS.MONSTER_EYE.itemtype), 0.3), Pair(Item(type = ITEMS.TREASURE_KEY.itemtype), 0.1), )), 0.2), - Pair(Boss(name = "Red Wolf of Radagon", life = 250, maxlife = 250, image = R.drawable.halberdier, xpReward = 210, possibleLoot = listOf( + Pair(Boss(name = "Red Wolf of Radagon", life = 250.0, maxlife = 250, image = R.drawable.halberdier, xpReward = 210, possibleLoot = listOf( Pair(Item(type = ITEMS.MONSTER_BONES.itemtype), 0.6), Pair(Item(type = ITEMS.MONSTER_EYE.itemtype), 0.3), Pair(Item(type = ITEMS.TREASURE_KEY.itemtype), 0.1), )), 0.15), - Pair(Boss(name = "Old Banshee", life = 300, maxlife = 300, image = R.drawable.banshee, xpReward = 300, possibleLoot = listOf( + Pair(Boss(name = "Old Banshee", life = 300.0, maxlife = 300, image = R.drawable.banshee, xpReward = 300, possibleLoot = listOf( Pair(Item(type = ITEMS.MONSTER_BONES.itemtype), 0.4), Pair(Item(type = ITEMS.MONSTER_EYE.itemtype), 0.4), Pair(Item(type = ITEMS.TREASURE_KEY.itemtype), 0.2), )), 0.10), - Pair(Boss(name = "Margit the Fell Omen", life = 500, maxlife = 500, image = R.drawable.lich, xpReward = 500, possibleLoot = listOf( + Pair(Boss(name = "Margit the Fell Omen", life = 500.0, maxlife = 500, image = R.drawable.lich, xpReward = 500, possibleLoot = listOf( Pair(Item(type = ITEMS.MONSTER_BONES.itemtype), 0.4), Pair(Item(type = ITEMS.MONSTER_EYE.itemtype), 0.3), Pair(Item(type = ITEMS.TREASURE_KEY.itemtype), 0.3), diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Item.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Item.kt index 0ffe286..1d7414a 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Item.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Item.kt @@ -4,7 +4,7 @@ import android.os.Parcel import android.os.Parcelable -class Item( +open class Item( val type: ItemType, var stack: Int = 1, ) : Parcelable { diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Player.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Player.kt index 2949d97..3b6332e 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Player.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Player.kt @@ -7,6 +7,7 @@ class Player(val pseudo: String, var xp: Int = 0) { val image: Int = R.drawable.player_image var items: MutableList = mutableListOf() var rank: String = "Beginner" + var equipedItem : Tool? = null fun changeRank(){ @@ -30,7 +31,14 @@ class Player(val pseudo: String, var xp: Int = 0) { println("findItem n: "+findItem.stack+" item nb:"+item.stack) findItem.stack += item.stack } - else{items.add(Item(type = item.type, stack = item.stack))} + else{ + if(item is Tool){ + items.add(Tool(type = item.type, stack = item.stack, 4)) + } + else{ + items.add(Item(type = item.type, stack = item.stack)) + } + } } fun gainXp(xp: Int) { @@ -42,6 +50,12 @@ class Player(val pseudo: String, var xp: Int = 0) { } } + fun attack() : Int{ + if(equipedItem == null) + return 0 + return equipedItem!!.damage + } + fun hasItem(item: Item) : Boolean{ for (playeritem in items){ @@ -68,4 +82,14 @@ class Player(val pseudo: String, var xp: Int = 0) { return true } + fun equipeItem(item : Item) : Boolean{ + if(equipedItem == item) { + println("ca jarte") + equipedItem = null + return false + } + equipedItem = item as Tool + return true + } + } \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/RecipeManager.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/RecipeManager.kt index a823462..a806d17 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/RecipeManager.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/RecipeManager.kt @@ -26,19 +26,19 @@ class RecipeManager { val recipeListTools : List = listOf( Recipe( - Item(type = ITEMS.BRONZE_SWORD.itemtype, stack = 1),listOf( + Tool(type = ITEMS.BRONZE_SWORD.itemtype, stack = 1, damage = 4),listOf( Item(type = ITEMS.WOODEN_STICK.itemtype, stack = 5), Item(type = ITEMS.BRONZE_INGOT.itemtype, stack = 10) ), "Tools"), Recipe( - Item(type = ITEMS.WIZARD_STAFF.itemtype, stack = 1),listOf( + Tool(type = ITEMS.WIZARD_STAFF.itemtype, stack = 1, damage = 6),listOf( Item(type = ITEMS.WOODEN_STICK.itemtype, stack = 10), Item(type = ITEMS.MONSTER_EYE.itemtype, stack = 20), ), "Tools"), Recipe( - Item(type = ITEMS.DIAMOND_AXE.itemtype, stack = 1),listOf( + Tool(type = ITEMS.DIAMOND_AXE.itemtype, stack = 1, damage = 8),listOf( Item(type = ITEMS.WOODEN_STICK.itemtype, stack = 5), Item(type = ITEMS.DIAMOND.itemtype, stack = 10), diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Tool.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Tool.kt new file mode 100644 index 0000000..bdebef8 --- /dev/null +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Tool.kt @@ -0,0 +1,4 @@ +package com.example.shakecraft.model + +class Tool(type : ItemType, stack: Int,val damage : Int) : Item(type, stack) { +} \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt index 3795d5e..4caefc8 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt @@ -8,29 +8,56 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.example.shakecraft.R import com.example.shakecraft.model.Item +import com.example.shakecraft.model.Player +import com.example.shakecraft.model.Tool +class AdapterInventory( + private val inventory: List, + private val listener: OnItemLongClickListener, + private val currentPlayer : Player + ) : + RecyclerView.Adapter() { -class AdapterInventory(private val inventory: List) : RecyclerView.Adapter() { - - class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnLongClickListener { val textView: TextView val textViewNumber: TextView var imageView: ImageView + var armorIndicator : ImageView init { // Define click listener for the ViewHolder's View - + itemView.setOnLongClickListener(this) textView = view.findViewById(R.id.item_name) textViewNumber = view.findViewById(R.id.item_stock) imageView = view.findViewById(R.id.item_image) + armorIndicator = view.findViewById(R.id.armor_indicator) + } + + override fun onLongClick(v: View?): Boolean { + val position = adapterPosition + if(position != RecyclerView.NO_POSITION) { + listener.onItemLongClick(position) + } + return true } fun bind(item: Item) { textView.text = item.type.name textViewNumber.text = item.stack.toString() imageView.setImageResource(item.type.image) + if (item is Tool) { + println("tool") + armorIndicator.visibility = View.VISIBLE + if(currentPlayer.equipedItem == item) armorIndicator.setImageResource(R.drawable.armor_equiped_icon) else armorIndicator.setImageResource(R.drawable.armor_icon) + + } } + + } + + interface OnItemLongClickListener{ + fun onItemLongClick(position: Int) } override fun getItemCount() = inventory.size diff --git a/ShakeAndCraft/app/src/main/res/drawable/armor_equiped_icon.png b/ShakeAndCraft/app/src/main/res/drawable/armor_equiped_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..29c94fbd9527b483b40602b699afc3a32a88ff35 GIT binary patch literal 639 zcmV-_0)YLAP)f3|;&ajmh9&Fp7!9($&Nu7SxXwlTC<-N(>?ht*D?S28l-c z_+EMvgT8lf`}V!Ja-ZarM(%mvyC=`x>0OB|7K^2paL8wvxgH;5a1?gJZrOAXAK)R} zcO2)7!Uz&*hchtEYSJ>cmBIoB(+sC!mc5ge&o+}O(0L1-f*G!yw0u_!m5HMmteEd@ z^3Mj?0|(&|&?-q;SxP#hx$K=voo^V2;d_b4x;?vqrASJU6NUokXt5JeR5fokVWQ zJa?*qTA5nPG3X?6K;}`7LF-_JZCI4Hm&}mDj@73M(*4iAN9Neo3DQl(1 zNI@sq>v?36f@48934zy&h|7p$7@_KN0SCNX;(4lweDOS0pV>feB2k%Dt{&P8+>b zL}-%ufs513%bJOcXDF;-a4~lO%|vY56I2UepdE1Ok0h31H`N*#bd-y0M;IlG#bU8Y Zz5$Fq)sZp;5NH4Z002ovPDHLkV1i4P8~y+Q literal 0 HcmV?d00001 diff --git a/ShakeAndCraft/app/src/main/res/drawable/armor_icon.png b/ShakeAndCraft/app/src/main/res/drawable/armor_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d07573bc40817eeae3b3d25f602e72212476ce20 GIT binary patch literal 929 zcmV;S177@zP)<(t>#%KK4O}p?Y!nCv+Wp0!^FW=0U5VE~rNI*JXDSI*pS1Mj=R9Caddxq4`<` zErD8~HmDn_6GJAU6VNG4C|e+=j<**&2&Khgox~tC0*ylB(2P0uIrMb})7F3`@*O%} zOwH@QP_G#qgjNbmfJ7caN1${_i`*umV~m!Ph^@5r;9>UD9q1YK0=kQ(eoPL5-)ekp zfL1_F&_;H64g5wZ40%?ho?=3K3GWua{uP#ZAI0}-iVx{E>DSqoh}?N%Tai3oS-;M{ ziJ&HDM1Tg0k43DVHFGJ5ZACOMSv$@|7PIziTjwB&ykhM}iVyDf+}1frB5zo`iQc8jOvJ-p@EMA5_V=;LM%z62>P z&283hr|4P7+PBCRSlV4|nWv!|iU=Lsc;whku0XIl=tm^M|M%L#e6;8MAmaj+migB< zz<%07(Xo}aufh8(xddmXOY9_VZeR zjP#jXOO7zB@r%Xpp{PLcN@$pw-5^IG))0$3ro0y)(E)>Q^)LIWL=a<-h`F8O07jRY z=@%8?5yB_dGUyYFH$-s(v!%lPfeP`qPWBX{fFcZ2cCN$tzW;j+2oy)VD(e6?<^a?;%#Ki8YJR5-WF6@lx zds8`h8}9^@j9eN01baw%_a3bS%Db33gJqLM4pV0Gn$e6IN%~Y&k035k-VO7EDvaK? zchX!ydGBq{ literal 0 HcmV?d00001 diff --git a/ShakeAndCraft/app/src/main/res/layout/list_item.xml b/ShakeAndCraft/app/src/main/res/layout/list_item.xml index 55970a4..7a25dea 100644 --- a/ShakeAndCraft/app/src/main/res/layout/list_item.xml +++ b/ShakeAndCraft/app/src/main/res/layout/list_item.xml @@ -1,7 +1,6 @@ @@ -9,7 +8,7 @@ + android:layout_marginVertical="5dp"> + +