diff --git a/ShakeAndCraft/app/build.gradle b/ShakeAndCraft/app/build.gradle index 3737add..bac712e 100644 --- a/ShakeAndCraft/app/build.gradle +++ b/ShakeAndCraft/app/build.gradle @@ -17,6 +17,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + buildTypes { release { minifyEnabled false diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CraftFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CraftFragment.kt new file mode 100644 index 0000000..ad02f74 --- /dev/null +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CraftFragment.kt @@ -0,0 +1,88 @@ +package com.example.shakecraft + +import android.graphics.Color +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.ImageView +import android.widget.TextView +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.shakecraft.model.Player +import com.example.shakecraft.model.Recipe +import com.example.shakecraft.model.RecipeManager +import com.example.shakecraft.view.adapter.AdapterMaterials + + + +class CraftFragment : Fragment() { + private lateinit var buttonBack: TextView + private lateinit var recyclerViewMaterials: RecyclerView + private lateinit var recipe: Recipe + private lateinit var image: ImageView + private lateinit var name: TextView + private lateinit var buttonForge: Button + private lateinit var numberCraftable: TextView + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + + val currentPlayer = (activity as MainActivity).currentPlayer + val view = inflater.inflate(R.layout.fragment_craft, container, false) + recipe = arguments?.getParcelable("recipe")!! + + initializeViews(view, currentPlayer) + setUpRecyclerView(view,currentPlayer) + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + } + + private fun setUpRecyclerView(view: View, currentPlayer: Player) { + recyclerViewMaterials = view.findViewById(R.id.RecyclerviewMaterials) + with(recyclerViewMaterials) { + layoutManager = LinearLayoutManager(view.context) + if(recipe.type == "Objects") + adapter = AdapterMaterials(recipe.ingredients, currentPlayer) + } + + } + + private fun initializeViews(view: View, currentPlayer: Player) { + buttonBack = view.findViewById(R.id.backbutton) + buttonForge = view.findViewById(R.id.buttonForge) + numberCraftable = view.findViewById(R.id.craftableNumber) + + buttonBack.setOnClickListener{ + findNavController().navigate(R.id.action_craftFragment_to_forgeFragment) + } + image = view.findViewById(R.id.item_image) + name = view.findViewById(R.id.item_name) + image.setImageResource(recipe.item.image) + name.text = recipe.item.name + buttonForge.isEnabled = RecipeManager.isCraftable(recipe,currentPlayer) + numberCraftable.text = RecipeManager.HowManyCraftable(recipe,currentPlayer).toString() + + buttonForge.setOnClickListener{ + currentPlayer.craft(recipe) + } + + + } + +} \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/ForgeFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/ForgeFragment.kt index e756f30..080d001 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/ForgeFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/ForgeFragment.kt @@ -1,28 +1,46 @@ package com.example.shakecraft +import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.core.os.bundleOf import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.example.shakecraft.model.Recipe import com.example.shakecraft.model.RecipeManager import com.example.shakecraft.view.adapter.AdapterRecipe -class ForgeFragment : Fragment() { +class ForgeFragment : Fragment(), AdapterRecipe.OnItemClickListener { private lateinit var buttonBack: TextView private lateinit var recyclerViewObjects: RecyclerView private lateinit var recyclerViewTools: RecyclerView private lateinit var recyclerViewBlacksmithing: RecyclerView + private lateinit var recipe: Recipe override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } + + override fun onItemClick(position: Int, type: String) { + + recipe = when(type){ + "Objects" -> RecipeManager.recipeListObjects[position] + "Tools" -> RecipeManager.recipeListTools[position] + "Blacksmithing" -> RecipeManager.recipeListBlacksmithing[position] + else -> {RecipeManager.recipeListObjects[position]} + } + + val bundle = bundleOf("recipe" to recipe) + findNavController().navigate(R.id.action_forgeFragment_to_craftFragment, bundle) + } + private fun initializeViews(view: View) { buttonBack = view.findViewById(R.id.backbutton) buttonBack.setOnClickListener{ @@ -39,26 +57,26 @@ class ForgeFragment : Fragment() { // Initialize views initializeViews(view) - setUpRecyclerView(view) + setUpRecyclerView(view, this) return view } - private fun setUpRecyclerView(view: View) { + private fun setUpRecyclerView(view: View, listener: AdapterRecipe.OnItemClickListener) { recyclerViewObjects = view.findViewById(R.id.RecyclerviewObjects) with(recyclerViewObjects) { layoutManager = LinearLayoutManager(view.context) - adapter = AdapterRecipe(RecipeManager.recipeListObjects) + adapter = AdapterRecipe(RecipeManager.recipeListObjects, listener) } recyclerViewTools = view.findViewById(R.id.RecyclerviewTools) with(recyclerViewTools) { layoutManager = LinearLayoutManager(view.context) - adapter = AdapterRecipe(RecipeManager.recipeListTools) + adapter = AdapterRecipe(RecipeManager.recipeListTools, listener) } recyclerViewBlacksmithing = view.findViewById(R.id.RecyclerviewBlacksmithing) with(recyclerViewBlacksmithing) { layoutManager = LinearLayoutManager(view.context) - adapter = AdapterRecipe(RecipeManager.recipeListBlacksmithing) + adapter = AdapterRecipe(RecipeManager.recipeListBlacksmithing, listener) } } diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt index f5c9a46..f2dd22a 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt @@ -11,13 +11,13 @@ import androidx.core.view.WindowInsetsControllerCompat import androidx.navigation.findNavController import androidx.navigation.ui.setupWithNavController import com.example.shakecraft.model.Player +import com.example.shakecraft.model.Recipe import com.google.android.material.bottomnavigation.BottomNavigationView class MainActivity : AppCompatActivity() { var currentPlayer = Player("Winker",0) - @RequiresApi(Build.VERSION_CODES.R) private fun hideSystemUI() { WindowCompat.setDecorFitsSystemWindows(window, false) @@ -38,6 +38,7 @@ class MainActivity : AppCompatActivity() { hideSystemUI() setContentView(R.layout.activity_main) + bottomNav = findViewById(R.id.bottomNavigationView) val navController = findNavController(R.id.fragment) bottomNav.setupWithNavController(navController) @@ -55,4 +56,5 @@ class MainActivity : AppCompatActivity() { + } \ No newline at end of file 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 c34cc84..3af9a9d 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 @@ -1,12 +1,46 @@ package com.example.shakecraft.model +import android.os.Parcel +import android.os.Parcelable -data class Item( + +class Item( var name: String, var rarity: Int = 1, var stack: Int = 1, var image: Int, var xpReward: Int = 0, -) +) : Parcelable{ + + + override fun describeContents(): Int { + return 0 + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(name) + parcel.writeInt(rarity) + parcel.writeInt(stack) + parcel.writeInt(image) + parcel.writeInt(xpReward) + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): Item { + return Item( + parcel.readString()!!, + parcel.readInt(), + parcel.readInt(), + parcel.readInt(), + parcel.readInt() + ) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + +} 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 e400e68..12f8c05 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 @@ -44,8 +44,10 @@ class Player(val pseudo: String, var xp: Int = 0) { } fun addItem(item: Item) { val findItem = items.find { it.name == item.name } + if(findItem!= null){ - findItem.stack += 1 + println("findItem n: "+findItem.stack+" item nb:"+item.stack) + findItem.stack += item.stack } else{items.add(item)} } @@ -73,19 +75,19 @@ class Player(val pseudo: String, var xp: Int = 0) { } fun craft(recipe: Recipe) : Boolean{ + println("test") for (ingredient in recipe.ingredients) { - val searchedItem = items.find { it.name == recipe.item.name } + val searchedItem = items.find { it.name == ingredient.name } if(searchedItem != null) { - searchedItem.stack -= recipe.item.stack + searchedItem.stack -= ingredient.stack if (searchedItem.stack == 0){ items.remove(searchedItem) } - return true } - else - return false } - return false + println("item:"+recipe.item.stack) + addItem(recipe.item) + return true } } \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Recipe.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Recipe.kt index 5bcf18c..48d5b86 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Recipe.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/model/Recipe.kt @@ -1,4 +1,29 @@ package com.example.shakecraft.model -class Recipe(val item: Item, val ingredients : List, val type: String) { +import android.os.Parcel +import android.os.Parcelable + +class Recipe(val item: Item, val ingredients : List, val type: String) : Parcelable { + override fun describeContents(): Int { + return 0 + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeParcelable(item, flags) + parcel.writeTypedList(ingredients) + parcel.writeString(type) + } + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): Recipe { + return Recipe( + parcel.readParcelable(Item::class.java.classLoader)!!, + parcel.createTypedArrayList(Item.CREATOR)!!, + parcel.readString()!! + ) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } \ 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 eb42557..c8842ce 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 @@ -74,6 +74,22 @@ class RecipeManager { return true } + fun HowManyCraftable(recipe: Recipe, player: Player): Int{ + var divisedList = mutableListOf() + if(isCraftable(recipe,player)==false) + return 0 + else{ + for(element in recipe.ingredients){ + println("cc") + val itemSearch = player.items.find { it.name == element.name } + if(itemSearch!= null) + divisedList.add(itemSearch.stack / element.stack) + } + return divisedList.min() + } + } + + } } \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterMaterials.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterMaterials.kt new file mode 100644 index 0000000..e4a7d8a --- /dev/null +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterMaterials.kt @@ -0,0 +1,61 @@ +package com.example.shakecraft.view.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.Adapter +import com.example.shakecraft.R +import com.example.shakecraft.model.Item +import com.example.shakecraft.model.Player +import com.example.shakecraft.view.viewholder.ViewHolderInventory + + +class AdapterMaterials(private val materials: List, val currentplayer: Player) : RecyclerView.Adapter() { + + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val textView: TextView + val textViewNumberNeeded: TextView + val textViewNumberPlayer: TextView + var imageView: ImageView + + + + init { + // Define click listener for the ViewHolder's View + + textView = view.findViewById(R.id.item_name) + textViewNumberPlayer = view.findViewById(R.id.numberCurrentPlayer) + textViewNumberNeeded = view.findViewById(R.id.numberNeeded) + imageView = view.findViewById(R.id.item_image) + } + fun bind(item: Item, currentplayer: Player) { + textView.text = item.name + val itemSearch = currentplayer.items.find { it.name == item.name } + textViewNumberNeeded.text = item.stack.toString() + textViewNumberPlayer.text = if (itemSearch != null) itemSearch.stack.toString() else "0" + + imageView.setImageResource(item.image) + } + } + + override fun getItemCount() = materials.size + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.list_craft, parent, false) + + return ViewHolder(view) + } + + override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { + val item : Item = materials[position] + viewHolder.bind(item, currentplayer) + } + + + + +} + diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterRecipe.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterRecipe.kt index fbc45dc..fce04a0 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterRecipe.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/view/adapter/AdapterRecipe.kt @@ -3,33 +3,51 @@ package com.example.shakecraft.view.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView.OnItemClickListener import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView +import com.example.shakecraft.MainActivity import com.example.shakecraft.R import com.example.shakecraft.model.Recipe -class AdapterRecipe(private val recipelist: List) : RecyclerView.Adapter() { +class AdapterRecipe( + private val recipelist: List, + private val listener: OnItemClickListener +) : + RecyclerView.Adapter() { - class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener { val textView: TextView var imageView: ImageView init { // Define click listener for the ViewHolder's View - + itemView.setOnClickListener(this) textView = view.findViewById(R.id.item_name) imageView = view.findViewById(R.id.item_image) } + + override fun onClick(v: View?) { + val position = adapterPosition + val type = recipelist.first().type + if(position != RecyclerView.NO_POSITION) { + listener.onItemClick(position, type) + } + } fun bind(recipe: Recipe) { textView.text = recipe.item.name imageView.setImageResource(recipe.item.image) } } + interface OnItemClickListener{ + fun onItemClick(position: Int, type: String) + } + override fun getItemCount() = recipelist.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) diff --git a/ShakeAndCraft/app/src/main/res/color/button_background_color.xml b/ShakeAndCraft/app/src/main/res/color/button_background_color.xml new file mode 100644 index 0000000..14ce43c --- /dev/null +++ b/ShakeAndCraft/app/src/main/res/color/button_background_color.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/res/drawable/craftable_background.xml b/ShakeAndCraft/app/src/main/res/drawable/craftable_background.xml new file mode 100644 index 0000000..0abe72c --- /dev/null +++ b/ShakeAndCraft/app/src/main/res/drawable/craftable_background.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/res/drawable/custom_ripple.xml b/ShakeAndCraft/app/src/main/res/drawable/custom_ripple.xml new file mode 100644 index 0000000..6dc36ec --- /dev/null +++ b/ShakeAndCraft/app/src/main/res/drawable/custom_ripple.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/res/layout/fragment_craft.xml b/ShakeAndCraft/app/src/main/res/layout/fragment_craft.xml new file mode 100644 index 0000000..7de810d --- /dev/null +++ b/ShakeAndCraft/app/src/main/res/layout/fragment_craft.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +