// SPDX-License-Identifier: MIT pragma solidity ^0.8.29; contract PokemonDex { struct Pokemon { uint id; string name; string typeOf; } mapping(uint => Pokemon) private allPokemon; mapping(address => uint[]) private playerDex; mapping(address => mapping(uint => bool)) private playerPokemon; event PokemonCaught(address indexed player, uint indexed pokemonId, string name, string typeOf); event PokemonTraded(address indexed from, address indexed to, uint indexed pokemonId); constructor() { // Initialize with some Pokémon for demonstration allPokemon[1] = Pokemon(1, "Bulbasaur", "Grass"); allPokemon[2] = Pokemon(2, "Charmander", "Fire"); allPokemon[3] = Pokemon(3, "Squirtle", "Water"); // Add more Pokémon as needed } function catchPokemon(uint pokemonId) public { require(pokemonId > 0 && pokemonId <= 3, "Invalid Pokemon ID"); require(!playerPokemon[msg.sender][pokemonId], "Pokemon already caught."); playerDex[msg.sender].push(pokemonId); playerPokemon[msg.sender][pokemonId] = true; emit PokemonCaught(msg.sender, pokemonId, allPokemon[pokemonId].name, allPokemon[pokemonId].typeOf); } function viewDex() public view returns (Pokemon[] memory) { uint[] memory playerPokemonIds = playerDex[msg.sender]; Pokemon[] memory pokemons = new Pokemon[](playerPokemonIds.length); for (uint i = 0; i < playerPokemonIds.length; i++) { pokemons[i] = allPokemon[playerPokemonIds[i]]; } return pokemons; } function tradePokemon(address to, uint pokemonId) public { require(playerPokemon[msg.sender][pokemonId], "You don't own this Pokemon."); require(!playerPokemon[to][pokemonId], "Receiver already owns this Pokemon."); // Transfer ownership playerPokemon[msg.sender][pokemonId] = false; playerPokemon[to][pokemonId] = true; // Remove from sender's Dex and add to receiver's Dex for (uint i = 0; i < playerDex[msg.sender].length; i++) { if (playerDex[msg.sender][i] == pokemonId) { playerDex[msg.sender][i] = playerDex[msg.sender][playerDex[msg.sender].length - 1]; playerDex[msg.sender].pop(); break; } } playerDex[to].push(pokemonId); emit PokemonTraded(msg.sender, to, pokemonId); } }