I have completed a tutorial on how to make a memory card, everything works great, I can play the game and match all the cards (20 or 30 or 40 for different categories cause I have 6 of them) and I added a timer. I can even reset the game and start all over, and all the cards are randomly sorted out.
But I want to go beyond the tutorial and put some sound effects in the game to make it more fun. I get that you can play sounds on mouse clicks and stuff, but I want to play sounds when specific cards are revealed. Duck card appears and you hear a quacking sound or his name. I'm a beginner and I don't know how to add it.
I'm not sure if I would start a new C# script or add to my existing (PictureManager) script or (Picture) script.
Any help would be appreciated. Thank you. These are my (PictureManager) and (Picture) script for the game.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PictureManager : MonoBehaviour
{
public Picture PicturePrefab;
public Transform PicSpawnPosition;
public Vector2 StartPosition = new Vector2(-2.15f, 3.62f);
public AudioSource WinSound;
public AudioSource BgSound;
[Space]
[Header("End Game Screen")]
public GameObject EndGamePanel;
public GameObject NewBestScoreText;
public GameObject YourScoreText;
public GameObject EndTimeText;
/*to rremove
public List<AudioClip> Vegetabels = new List<AudioClip>();
private AudioSource audioSource;
to remove*/
public enum GameState
{
NoAction,
MovingOnPositions,
DeletingPuzzles,
FlipBack,
Checking,
GameEnd
};
public enum PuzzleState
{
PuzzleRotating,
CanRotate,
};
public enum RevealedState
{
NoRevealed,
OneRevealed,
TwoRevealed
};
[HideInInspector]
public GameState CurrentGameState;
[HideInInspector]
public PuzzleState CurrentPuzzleState;
[HideInInspector]
public RevealedState PuzzleRevealedNumber;
[HideInInspector]
public List<Picture> PictureList;
private Vector2 _offset = new Vector2(1.42f, 1.52f);
private Vector2 _offsetFor15Pairs = new Vector2(1.08f, 1.22f);
private Vector2 _offsetFor20Pairs = new Vector2(1.08f, 1.0f);
private Vector3 _newScaleDown = new Vector3(0.9f, 0.9f, 0.001f);
private List<Material> _materialList = new List<Material>();
private List<string> _texturePathList = new List<string>();
private Material _firstMaterial;
private string _firstTexturePath;
private int _firstRevealedPic;
private int _secondRevealedPic;
private int _revealedPicNumber = 0;
private int _picToDestroy1;
private int _picToDestroy2;
private bool _corutineStarted = false;
private int _pairNumbers;
private int _removedPairs;
private Timer _gameTimer;
void Start()
{
//BgSound.Play();
CurrentGameState = GameState.NoAction;
CurrentPuzzleState = PuzzleState.CanRotate;
PuzzleRevealedNumber = RevealedState.NoRevealed;
_revealedPicNumber = 0;
_firstRevealedPic = -1;
_secondRevealedPic = -1;
_removedPairs = 0;
_pairNumbers = (int)GameSettings.Instance.GetPairNumber();
_gameTimer = GameObject.Find("Main Camera").GetComponent<Timer>();
LoadMaterials();
if(GameSettings.Instance.GetPairNumber()== GameSettings.EPairNumber.E10Pairs)
{
CurrentGameState = GameState.MovingOnPositions;
SpwanPictureMesh(4, 5, StartPosition, _offset, false);
MovePicture(4, 5, StartPosition, _offset);
}
else if (GameSettings.Instance.GetPairNumber() == GameSettings.EPairNumber.E15Pairs)
{
CurrentGameState = GameState.MovingOnPositions;
SpwanPictureMesh(5, 6, StartPosition, _offset, false);
MovePicture(5, 6, StartPosition, _offsetFor15Pairs);
}
else if (GameSettings.Instance.GetPairNumber() == GameSettings.EPairNumber.E20Pairs)
{
CurrentGameState = GameState.MovingOnPositions;
SpwanPictureMesh(5, 8, StartPosition, _offset, true);
MovePicture(5, 8, StartPosition, _offsetFor20Pairs);
}
}
public void CheckPicture()
{
CurrentGameState = GameState.Checking;
_revealedPicNumber = 0;
for(int id = 0; id < PictureList.Count; id++)
{
if(PictureList[id].Revealed && _revealedPicNumber < 2)
{
if(_revealedPicNumber == 0)
{
_firstRevealedPic = id;
_revealedPicNumber++;
//audioSource.PlayOneShot(Vegetabels[id]);
}
else if (_revealedPicNumber == 1)
{
_secondRevealedPic = id;
_revealedPicNumber++;
}
}
if (_revealedPicNumber == 2)
{
if (PictureList[_firstRevealedPic].GetIndex() == PictureList[_secondRevealedPic].GetIndex() && _firstRevealedPic != _secondRevealedPic)
{
CurrentGameState = GameState.DeletingPuzzles;
_picToDestroy1 = _firstRevealedPic;
_picToDestroy2 = _secondRevealedPic;
}
else
{
CurrentGameState = GameState.FlipBack;
}
}
}
CurrentPuzzleState = PictureManager.PuzzleState.CanRotate;
if(CurrentGameState == GameState.Checking)
{
CurrentGameState = GameState.NoAction;
}
}
private void DestroyPicture()
{
PuzzleRevealedNumber = RevealedState.NoRevealed;
PictureList[_picToDestroy1].Deactivate();
PictureList[_picToDestroy2].Deactivate();
_revealedPicNumber = 0;
_removedPairs++;
CurrentGameState = GameState.NoAction;
CurrentPuzzleState = PuzzleState.CanRotate;
}
private IEnumerator FlipBack()
{
_corutineStarted = true;
yield return new WaitForSeconds(0.5f);
PictureList[_firstRevealedPic].FlipBack();
PictureList[_secondRevealedPic].FlipBack();
PictureList[_firstRevealedPic].Revealed = false;
PictureList[_secondRevealedPic].Revealed = false;
PuzzleRevealedNumber = RevealedState.NoRevealed;
CurrentGameState = GameState.NoAction;
_corutineStarted = false;
}
private void LoadMaterials()
{
var materialFilePath = GameSettings.Instance.GetMaterialDirectoryName();
var textureFilePath = GameSettings.Instance.GetPuzzleCategoryTextureDirectoryName();
var pairNumber = (int)GameSettings.Instance.GetPairNumber();
const string matBaseName = "Pic";
var firstMaterialName = "Back";
for(var index = 1; index <= pairNumber; index++)
{
var currentFilePath = materialFilePath + matBaseName + index;
Material mat = Resources.Load(currentFilePath, typeof(Material)) as Material;
_materialList.Add(mat);
var currentTextureFilePath = textureFilePath + matBaseName + index;
_texturePathList.Add(currentTextureFilePath);
}
_firstTexturePath = textureFilePath + firstMaterialName;
_firstMaterial = Resources.Load(materialFilePath + firstMaterialName, typeof(Material)) as Material;
}
void Update()
{
if (PauseMenu.isPaused == false) {
if (CurrentGameState == GameState.DeletingPuzzles)
{
if(CurrentPuzzleState == PuzzleState.CanRotate)
{
DestroyPicture();
CheckGameEnd();
}
}
if (CurrentGameState == GameState.FlipBack)
{
if(CurrentPuzzleState == PuzzleState.CanRotate && _corutineStarted == false)
{
StartCoroutine(FlipBack());
}
}
if(CurrentGameState == GameState.GameEnd)
{
if(PictureList[_firstRevealedPic].gameObject.activeSelf == false &&
PictureList[_secondRevealedPic].gameObject.activeSelf == false &&
EndGamePanel.activeSelf == false)
{
ShowEndGameInformation();
if (GameSettings.Instance.IsSoundEffectMutedPermanently() == false)
WinSound.Play();
//BgSound.Pause();
}
}
}
}
private bool CheckGameEnd()
{
if(_removedPairs == _pairNumbers && CurrentGameState != GameState.GameEnd)
{
CurrentGameState = GameState.GameEnd;
_gameTimer.StopTimer();
Config.PlaceScoreOnBorad(_gameTimer.GetCurrentTime());
}
return (CurrentGameState == GameState.GameEnd);
}
private void ShowEndGameInformation()
{
EndGamePanel.SetActive(true);
if(Config.IsBestScore())
{
NewBestScoreText.SetActive(true);
YourScoreText.SetActive(false);
}
else
{
NewBestScoreText.SetActive(false);
YourScoreText.SetActive(true);
}
var timer = _gameTimer.GetCurrentTime();
var minutes = Mathf.Floor(timer / 60);
var seconds = Mathf.RoundToInt(timer % 60);
var newText = minutes.ToString("00") + ":" + seconds.ToString("00");
EndTimeText.GetComponent<Text>().text = newText;
}
private void SpwanPictureMesh(int rows, int columns, Vector2 Pos, Vector2 offset, bool scaleDown)
{
for(int col = 0; col < columns; col++)
{
for(int row = 0; row < rows; row++)
{
var tempPicture = (Picture)Instantiate(PicturePrefab, PicSpawnPosition.position, PicturePrefab.transform.rotation);
if(scaleDown)
{
tempPicture.transform.localScale = _newScaleDown;
}
tempPicture.name = tempPicture.name + 'c' + col + 'r' + row;
PictureList.Add(tempPicture);
}
}
ApplyTextures();
}
public void ApplyTextures()
{
var rndMatIndex = Random.Range(0, _materialList.Count);
var AppliedTimes = new int[_materialList.Count];
for(int i = 0; i< _materialList.Count; i++)
{
AppliedTimes[i] = 0;
}
foreach(var o in PictureList)
{
var randPrevious = rndMatIndex;
var counter = 0;
var forceMat = false;
while(AppliedTimes[rndMatIndex] >= 2 || ((randPrevious == rndMatIndex) && !forceMat))
{
rndMatIndex = Random.Range(0, _materialList.Count);
counter++;
if(counter > 100)
{
for (var j = 0; j < _materialList.Count; j++)
{
if(AppliedTimes[j] < 2)
{
rndMatIndex = j;
forceMat = true;
}
}
if (forceMat == false)
return;
}
}
o.SetFirstMaterial(_firstMaterial, _firstTexturePath);
o.ApplyFirstMaterial();
o.SetSecondMaterial(_materialList[rndMatIndex], _texturePathList[rndMatIndex]);
o.SetIndex(rndMatIndex);
o.Revealed = false;
AppliedTimes[rndMatIndex] += 1;
forceMat = false;
}
}
private void MovePicture(int rows, int columns, Vector2 pos, Vector2 offset)
{
var index = 0;
for(var col = 0; col < columns; col++)
{
for(int row = 0; row < rows; row++)
{
var targetPosition = new Vector3((pos.x + (offset.x * row)), (pos.y - (offset.y * col)), 0.0f);
StartCoroutine(MoveToPosition(targetPosition, PictureList[index]));
index++;
}
}
}
private IEnumerator MoveToPosition(Vector3 target, Picture obj)
{
var randomDis = 7;
while(obj.transform.position !=target)
{
obj.transform.position = Vector3.MoveTowards(obj.transform.position, target, randomDis * Time.deltaTime);
yield return 0;
}
}
}
----------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Picture : MonoBehaviour
{
public AudioClip PressSound;
private Material _firstMaterial;
private Material _secondMaterial;
private Quaternion _currentRotation;
[HideInInspector] public bool Revealed = false;
private PictureManager _pictureManager;
private bool _clicked = false;
private int _index;
private AudioSource _audio;
public void SetIndex(int id)
{
_index = id;
}
public int GetIndex()
{
return _index;
}
void Start()
{
Revealed = false;
_clicked = false;
_pictureManager = GameObject.Find("[PictureManager]").GetComponent<PictureManager>();
_currentRotation = gameObject.transform.rotation;
_audio = GetComponent<AudioSource>();
_audio.clip = PressSound;
}
void Update()
{
}
private void OnMouseDown()
{
if(_clicked == false)
{
if (PauseMenu.isPaused == false)
{
_pictureManager.CurrentPuzzleState = PictureManager.PuzzleState.PuzzleRotating;
if (GameSettings.Instance.IsSoundEffectMutedPermanently() == false)
_audio.Play();
StartCoroutine(LoopRotation(45, false));
_clicked = true;
}
}
}
public void FlipBack()
{
if (gameObject.activeSelf)
{
_pictureManager.CurrentPuzzleState = PictureManager.PuzzleState.PuzzleRotating;
Revealed = false;
/*if (GameSettings.Instance.IsSoundEffectMutedPermanently() == false)
_audio.Play();*/
StartCoroutine(LoopRotation(45, true));
}
}
IEnumerator LoopRotation(float angle, bool FirstMat)
{
var rot = 0f;
const float dir = 1f;
const float rotSpeed = 180.0f;
const float rotSpeed1 = 90.0f;
var startAngle = angle;
var assigned = false;
if(FirstMat)
{
while(rot < angle)
{
var step = Time.deltaTime * rotSpeed1;
gameObject.GetComponent<Transform>().Rotate(new Vector3(0, 2, 0) * step * dir);
if(rot >= (startAngle - 2) && assigned == false)
{
ApplyFirstMaterial();
assigned = true;
}
rot += (1 * step * dir);
yield return null;
}
}
else
{
while (angle > 0)
{
float step = Time.deltaTime * rotSpeed;
gameObject.GetComponent<Transform>().Rotate(new Vector3(0, 2, 0) * step * dir);
angle -= (1 * step * dir);
yield return null;
}
}
gameObject.GetComponent<Transform>().rotation = _currentRotation;
if (!FirstMat)
{
Revealed = true;
ApplySecondMaterial();
_pictureManager.CheckPicture();
}
else
{
_pictureManager.PuzzleRevealedNumber = PictureManager.RevealedState.NoRevealed;
_pictureManager.CurrentPuzzleState = PictureManager.PuzzleState.CanRotate;
}
_clicked = false;
}
public void SetFirstMaterial(Material mat, string texturePath)
{
_firstMaterial = mat;
_firstMaterial.mainTexture = Resources.Load(texturePath, typeof(Texture2D)) as Texture2D;
}
public void SetSecondMaterial(Material mat, string texturePath)
{
_secondMaterial = mat;
_secondMaterial.mainTexture = Resources.Load(texturePath, typeof(Texture2D)) as Texture2D;
}
public void ApplyFirstMaterial()
{
gameObject.GetComponent<Renderer>().material = _firstMaterial;
}
public void ApplySecondMaterial()
{
gameObject.GetComponent<Renderer>().material = _secondMaterial;
}
public void Deactivate()
{
StartCoroutine(DeactivateCorutine());
}
private IEnumerator DeactivateCorutine()
{
Revealed = false;
yield return new WaitForSeconds(1f);
gameObject.SetActive(false);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PictureManager : MonoBehaviour
{
public Picture PicturePrefab;
public Transform PicSpawnPosition;
public Vector2 StartPosition = new Vector2(-2.15f, 3.62f);
public AudioSource WinSound;
public AudioSource BgSound;
[Space]
[Header("End Game Screen")]
public GameObject EndGamePanel;
public GameObject NewBestScoreText;
public GameObject YourScoreText;
public GameObject EndTimeText;
/*to rremove
public List<AudioClip> Vegetabels = new List<AudioClip>();
private AudioSource audioSource;
to remove*/
public enum GameState
{
NoAction,
MovingOnPositions,
DeletingPuzzles,
FlipBack,
Checking,
GameEnd
};
public enum PuzzleState
{
PuzzleRotating,
CanRotate,
};
public enum RevealedState
{
NoRevealed,
OneRevealed,
TwoRevealed
};
[HideInInspector]
public GameState CurrentGameState;
[HideInInspector]
public PuzzleState CurrentPuzzleState;
[HideInInspector]
public RevealedState PuzzleRevealedNumber;
[HideInInspector]
public List<Picture> PictureList;
private Vector2 _offset = new Vector2(1.42f, 1.52f);
private Vector2 _offsetFor15Pairs = new Vector2(1.08f, 1.22f);
private Vector2 _offsetFor20Pairs = new Vector2(1.08f, 1.0f);
private Vector3 _newScaleDown = new Vector3(0.9f, 0.9f, 0.001f);
private List<Material> _materialList = new List<Material>();
private List<string> _texturePathList = new List<string>();
private Material _firstMaterial;
private string _firstTexturePath;
private int _firstRevealedPic;
private int _secondRevealedPic;
private int _revealedPicNumber = 0;
private int _picToDestroy1;
private int _picToDestroy2;
private bool _corutineStarted = false;
private int _pairNumbers;
private int _removedPairs;
private Timer _gameTimer;
void Start()
{
//BgSound.Play();
CurrentGameState = GameState.NoAction;
CurrentPuzzleState = PuzzleState.CanRotate;
PuzzleRevealedNumber = RevealedState.NoRevealed;
_revealedPicNumber = 0;
_firstRevealedPic = -1;
_secondRevealedPic = -1;
_removedPairs = 0;
_pairNumbers = (int)GameSettings.Instance.GetPairNumber();
_gameTimer = GameObject.Find("Main Camera").GetComponent<Timer>();
LoadMaterials();
if(GameSettings.Instance.GetPairNumber()== GameSettings.EPairNumber.E10Pairs)
{
CurrentGameState = GameState.MovingOnPositions;
SpwanPictureMesh(4, 5, StartPosition, _offset, false);
MovePicture(4, 5, StartPosition, _offset);
}
else if (GameSettings.Instance.GetPairNumber() == GameSettings.EPairNumber.E15Pairs)
{
CurrentGameState = GameState.MovingOnPositions;
SpwanPictureMesh(5, 6, StartPosition, _offset, false);
MovePicture(5, 6, StartPosition, _offsetFor15Pairs);
}
else if (GameSettings.Instance.GetPairNumber() == GameSettings.EPairNumber.E20Pairs)
{
CurrentGameState = GameState.MovingOnPositions;
SpwanPictureMesh(5, 8, StartPosition, _offset, true);
MovePicture(5, 8, StartPosition, _offsetFor20Pairs);
}
}
public void CheckPicture()
{
CurrentGameState = GameState.Checking;
_revealedPicNumber = 0;
for(int id = 0; id < PictureList.Count; id++)
{
if(PictureList[id].Revealed && _revealedPicNumber < 2)
{
if(_revealedPicNumber == 0)
{
_firstRevealedPic = id;
_revealedPicNumber++;
//audioSource.PlayOneShot(Vegetabels[id]);
}
else if (_revealedPicNumber == 1)
{
_secondRevealedPic = id;
_revealedPicNumber++;
}
}
if (_revealedPicNumber == 2)
{
if (PictureList[_firstRevealedPic].GetIndex() == PictureList[_secondRevealedPic].GetIndex() && _firstRevealedPic != _secondRevealedPic)
{
CurrentGameState = GameState.DeletingPuzzles;
_picToDestroy1 = _firstRevealedPic;
_picToDestroy2 = _secondRevealedPic;
}
else
{
CurrentGameState = GameState.FlipBack;
}
}
}
CurrentPuzzleState = PictureManager.PuzzleState.CanRotate;
if(CurrentGameState == GameState.Checking)
{
CurrentGameState = GameState.NoAction;
}
}
private void DestroyPicture()
{
PuzzleRevealedNumber = RevealedState.NoRevealed;
PictureList[_picToDestroy1].Deactivate();
PictureList[_picToDestroy2].Deactivate();
_revealedPicNumber = 0;
_removedPairs++;
CurrentGameState = GameState.NoAction;
CurrentPuzzleState = PuzzleState.CanRotate;
}
private IEnumerator FlipBack()
{
_corutineStarted = true;
yield return new WaitForSeconds(0.5f);
PictureList[_firstRevealedPic].FlipBack();
PictureList[_secondRevealedPic].FlipBack();
PictureList[_firstRevealedPic].Revealed = false;
PictureList[_secondRevealedPic].Revealed = false;
PuzzleRevealedNumber = RevealedState.NoRevealed;
CurrentGameState = GameState.NoAction;
_corutineStarted = false;
}
private void LoadMaterials()
{
var materialFilePath = GameSettings.Instance.GetMaterialDirectoryName();
var textureFilePath = GameSettings.Instance.GetPuzzleCategoryTextureDirectoryName();
var pairNumber = (int)GameSettings.Instance.GetPairNumber();
const string matBaseName = "Pic";
var firstMaterialName = "Back";
for(var index = 1; index <= pairNumber; index++)
{
var currentFilePath = materialFilePath + matBaseName + index;
Material mat = Resources.Load(currentFilePath, typeof(Material)) as Material;
_materialList.Add(mat);
var currentTextureFilePath = textureFilePath + matBaseName + index;
_texturePathList.Add(currentTextureFilePath);
}
_firstTexturePath = textureFilePath + firstMaterialName;
_firstMaterial = Resources.Load(materialFilePath + firstMaterialName, typeof(Material)) as Material;
}
void Update()
{
if (PauseMenu.isPaused == false) {
if (CurrentGameState == GameState.DeletingPuzzles)
{
if(CurrentPuzzleState == PuzzleState.CanRotate)
{
DestroyPicture();
CheckGameEnd();
}
}
if (CurrentGameState == GameState.FlipBack)
{
if(CurrentPuzzleState == PuzzleState.CanRotate && _corutineStarted == false)
{
StartCoroutine(FlipBack());
}
}
if(CurrentGameState == GameState.GameEnd)
{
if(PictureList[_firstRevealedPic].gameObject.activeSelf == false &&
PictureList[_secondRevealedPic].gameObject.activeSelf == false &&
EndGamePanel.activeSelf == false)
{
ShowEndGameInformation();
if (GameSettings.Instance.IsSoundEffectMutedPermanently() == false)
WinSound.Play();
//BgSound.Pause();
}
}
}
}
private bool CheckGameEnd()
{
if(_removedPairs == _pairNumbers && CurrentGameState != GameState.GameEnd)
{
CurrentGameState = GameState.GameEnd;
_gameTimer.StopTimer();
Config.PlaceScoreOnBorad(_gameTimer.GetCurrentTime());
}
return (CurrentGameState == GameState.GameEnd);
}
private void ShowEndGameInformation()
{
EndGamePanel.SetActive(true);
if(Config.IsBestScore())
{
NewBestScoreText.SetActive(true);
YourScoreText.SetActive(false);
}
else
{
NewBestScoreText.SetActive(false);
YourScoreText.SetActive(true);
}
var timer = _gameTimer.GetCurrentTime();
var minutes = Mathf.Floor(timer / 60);
var seconds = Mathf.RoundToInt(timer % 60);
var newText = minutes.ToString("00") + ":" + seconds.ToString("00");
EndTimeText.GetComponent<Text>().text = newText;
}
private void SpwanPictureMesh(int rows, int columns, Vector2 Pos, Vector2 offset, bool scaleDown)
{
for(int col = 0; col < columns; col++)
{
for(int row = 0; row < rows; row++)
{
var tempPicture = (Picture)Instantiate(PicturePrefab, PicSpawnPosition.position, PicturePrefab.transform.rotation);
if(scaleDown)
{
tempPicture.transform.localScale = _newScaleDown;
}
tempPicture.name = tempPicture.name + 'c' + col + 'r' + row;
PictureList.Add(tempPicture);
}
}
ApplyTextures();
}
public void ApplyTextures()
{
var rndMatIndex = Random.Range(0, _materialList.Count);
var AppliedTimes = new int[_materialList.Count];
for(int i = 0; i< _materialList.Count; i++)
{
AppliedTimes[i] = 0;
}
foreach(var o in PictureList)
{
var randPrevious = rndMatIndex;
var counter = 0;
var forceMat = false;
while(AppliedTimes[rndMatIndex] >= 2 || ((randPrevious == rndMatIndex) && !forceMat))
{
rndMatIndex = Random.Range(0, _materialList.Count);
counter++;
if(counter > 100)
{
for (var j = 0; j < _materialList.Count; j++)
{
if(AppliedTimes[j] < 2)
{
rndMatIndex = j;
forceMat = true;
}
}
if (forceMat == false)
return;
}
}
o.SetFirstMaterial(_firstMaterial, _firstTexturePath);
o.ApplyFirstMaterial();
o.SetSecondMaterial(_materialList[rndMatIndex], _texturePathList[rndMatIndex]);
o.SetIndex(rndMatIndex);
o.Revealed = false;
AppliedTimes[rndMatIndex] += 1;
forceMat = false;
}
}
private void MovePicture(int rows, int columns, Vector2 pos, Vector2 offset)
{
var index = 0;
for(var col = 0; col < columns; col++)
{
for(int row = 0; row < rows; row++)
{
var targetPosition = new Vector3((pos.x + (offset.x * row)), (pos.y - (offset.y * col)), 0.0f);
StartCoroutine(MoveToPosition(targetPosition, PictureList[index]));
index++;
}
}
}
private IEnumerator MoveToPosition(Vector3 target, Picture obj)
{
var randomDis = 7;
while(obj.transform.position !=target)
{
obj.transform.position = Vector3.MoveTowards(obj.transform.position, target, randomDis * Time.deltaTime);
yield return 0;
}
}
}
i have a "Player" class, which is supposed to manage my global music player.
This also works so far. The class is at the bottom, if you have any suggestions for improvement, feel free to give it to us.
I want to start a second song while the current song ends.
So a FadeIn into the next song and a FadeOut from the current song, which makes the song quieter.
My approach at the moment is that one song is running in the "waveOutDevice1" object and the second one is waiting in the second object. And as soon as the current song is about to end, the second WavePlayer starts. But I don't know how I can react to it, as soon as the current song is about to end.
Do you have an idea or suggestions?
With kind regards
my Player class:
public class Player
{
#region Properties, Fields
private IWavePlayer waveOutDevice1;
private IWavePlayer waveOutDevice2;
private AudioFileReader fileReader1;
private AudioFileReader fileReader2;
public AudioFile CurrentSong { get; private set; }
public Playlist CurrentPlaylist { get; private set; }
public List<AudioFile> lstPastSongs { get; private set; }
public List<AudioFile> lstNextSongs { get; set; }
public PlaybackState PlaybackState { get; private set; }
public bool Muted { get; private set; }
private float OldVolume = 0.0f;
#endregion
public Player()
{
this.lstNextSongs = new List<AudioFile>();
this.lstPastSongs = new List<AudioFile>();
}
#region Methods
public void Play(int index)
{
if (this.lstNextSongs.Count > 0 && index >= 0 && index < this.lstNextSongs.Count)
{
this.ResetFileReader();
this.CurrentSong = this.lstNextSongs[index];
this.CurrentPlaylist = this.CurrentSong.Playlist;
this.lstNextSongs.RemoveAt(index);
this.fileReader1 = new AudioFileReader(this.CurrentSong.Path);
this.waveOutDevice1 = new WaveOut();
this.waveOutDevice1.PlaybackStopped += WaveOutDevice1_PlaybackStopped;
this.waveOutDevice1.Init(this.fileReader1);
this.PlaybackState = PlaybackState.Playing;
this.waveOutDevice1.Play();
}
}
private void WaveOutDevice1_PlaybackStopped(object sender, StoppedEventArgs e)
{
this.Next();
}
private void ResetFileReader()
{
if (this.fileReader1 != null)
{
this.fileReader1.Dispose();
this.fileReader1 = null;
}
if (this.fileReader2 != null)
{
this.fileReader2.Dispose();
this.fileReader2 = null;
}
if(this.waveOutDevice1 != null)
{
this.waveOutDevice1.Dispose();
this.waveOutDevice1 = null;
}
if(this.waveOutDevice2 != null)
{
this.waveOutDevice2.Dispose();
this.waveOutDevice2 = null;
}
}
public void Pause()
{
if(this.waveOutDevice1 != null)
if (this.waveOutDevice1.PlaybackState == PlaybackState.Playing)
this.waveOutDevice1.Pause();
if(this.waveOutDevice2 != null)
if (this.waveOutDevice2.PlaybackState == PlaybackState.Playing)
this.waveOutDevice2.Pause();
this.PlaybackState = PlaybackState.Paused;
}
public void Continue()
{
if (this.waveOutDevice1 != null)
if (this.waveOutDevice1.PlaybackState == PlaybackState.Paused)
this.waveOutDevice1.Play();
if (this.waveOutDevice2 != null)
if (this.waveOutDevice2.PlaybackState == PlaybackState.Paused)
this.waveOutDevice2.Play();
this.PlaybackState = PlaybackState.Playing;
}
public void Next()
{
if(this.lstNextSongs.Count > 0)
{
if (this.CurrentSong != null)
this.lstPastSongs.Add(this.CurrentSong);
if (GlobalSettings.Shuffle)
{
System.Random random = new System.Random();
int randomNumber = random.Next(0, this.lstNextSongs.Count - 1);
this.Play(randomNumber);
}
else
this.Play(0);
}
else
{
if(GlobalSettings.Replay)
if(GlobalSettings.CurrentPlaylist != null)
for (int i = 0; i < GlobalSettings.CurrentPlaylist.panPlaylist.SongPlaylist.NumberOfSongs; i++)
this.lstNextSongs.AddRange(GlobalSettings.CurrentPlaylist.panPlaylist.SongPlaylist.AllSongs);
}
}
public void Previous()
{
if(this.CurrentSong == null)
{
if(this.lstPastSongs.Count > 0)
{
this.lstNextSongs.Insert(0, this.lstPastSongs[this.lstPastSongs.Count - 1]);
this.lstPastSongs.RemoveAt(this.lstPastSongs.Count - 1);
this.Play(0);
}
}
else
{
if(this.fileReader1 != null)
this._Previous(this.waveOutDevice1, this.fileReader1);
else if(this.fileReader2 != null)
this._Previous(this.waveOutDevice2, this.fileReader2);
}
}
private void _Previous(IWavePlayer waveOutDevice, AudioFileReader fileReader)
{
if (fileReader.CurrentTime.Seconds >= 10 || this.lstPastSongs.Count == 0)
{
waveOutDevice.Pause();
fileReader.CurrentTime = new System.TimeSpan(0, 0, 0);
waveOutDevice.Play();
}
else
{
this.lstNextSongs.Insert(0, this.CurrentSong);
this.lstNextSongs.Insert(0, this.lstPastSongs[this.lstPastSongs.Count - 1]);
this.lstPastSongs.RemoveAt(this.lstPastSongs.Count - 1);
this.Play(0);
}
}
public void SetVolume(int Volume)
{
if (Volume > -1 && Volume < 101)
{
float vol = (float)Volume / 100;
if (this.fileReader1 != null)
this.fileReader1.Volume = vol;
if (this.fileReader2 != null)
this.fileReader2.Volume = vol;
this.Muted = false;
}
}
public void Mute()
{
if(this.Muted)
{
if(this.fileReader1 != null)
{
this.fileReader1.Volume = this.OldVolume;
this.Muted = false;
}
else if(this.fileReader2 != null)
{
this.fileReader2.Volume = this.OldVolume;
this.Muted = false;
}
}
else
{
this.Muted = true;
if(this.fileReader1 != null)
{
this.OldVolume = this.fileReader1.Volume;
this.fileReader1.Volume = 0;
}
else if(this.fileReader2 != null)
{
this.OldVolume = this.fileReader2.Volume;
this.fileReader2.Volume = 0;
}
}
}
#endregion
}
If you can get the duration of the song when it starts playing, you can set a timer for duration - fadeInTime and start your fade when the timer fires.
Another approach is to use a single wave out device and MixingSampleProvider to add in the second song as a new input to the mixer as the first one is ending. You can do this by creating your own wrapper ISampleProvider whose Read method can keep accurate track of where you are up to.
I have a linkedlist class like follows:
public class DbNode<T>
{
private T _data;
private DbNode<T> _prev;
private DbNode<T> _next;
public T Data
{
get { return this._data; }
set { this._data = value; }
}
public DbNode<T> Prev
{
get { return this._prev; }
set { this._prev = value; }
}
public DbNode<T> Next
{
get { return this._next; }
set { this._next = value; }
}
public DbNode(T data, DbNode<T> prev, DbNode<T> next)
{
this._data = data;
this._prev = prev;
this._next = next;
}
public DbNode(T data, DbNode<T> prev)
{
this._data = data;
this._prev = prev;
this._next = null;
}
public DbNode(DbNode<T> next)
{
this._data = default(T);
this._next = next;
this._prev = null;
}
public DbNode(T data)
{
this._data = data;
this._prev = null;
this._next = null;
}
public DbNode()
{
this._data = default(T);
this._prev = null;
this._next = null;
}
}
public class DbLinkedList<T>
{
private DbNode<T> _head;
public DbNode<T> Head
{
get { return this._head; }
set { this._head = value; }
}
public DbLinkedList()
{
Head = null;
}
public T this[int index]
{
get
{
return this.GetItemAt(index);
}
}
public bool IsEmpty()
{
return Head == null;
}
public T GetItemAt(int i)
{
if (IsEmpty())
{
Console.WriteLine("The double linked list is empty.");
return default(T);
}
DbNode<T> p = new DbNode<T>();
p = Head;
if (0 == i)
{
return p.Data;
}
int j = 0;
while (p.Next != null && j < i)
{
j++;
p = p.Next;
}
if (j == i)
{
return p.Data;
}
else
{
Console.WriteLine("The node dose not exist.");
return default(T);
}
}
public int Count()
{
DbNode<T> p = Head;
int length = 0;
while (p != null)
{
length++;
p = p.Next;
}
return length;
}
public void Clear()
{
this.Head = null;
}
public void AddAfter(T item, int i)
{
if (IsEmpty() || i < 0)
{
Console.WriteLine("The double linked list is empty or the position is uncorrect.");
return;
}
if (0 == i)
{
DbNode<T> newNode = new DbNode<T>(item);
newNode.Next = Head.Next;
Head.Next.Prev = newNode;
Head.Next = newNode;
newNode.Prev = Head;
return;
}
DbNode<T> p = Head;
int j = 0;
while (p != null && j < i)
{
p = p.Next;
j++;
}
if (j == i)
{
DbNode<T> newNode = new DbNode<T>(item);
newNode.Next = p.Next;
if (p.Next != null)
{
p.Next.Prev = newNode;
}
newNode.Prev = p;
p.Next = newNode;
}
else
{
Console.WriteLine("The position is uncorrect.");
}
}
public void AddBefore(T item, int i)
{
if (IsEmpty() || i < 0)
{
Console.WriteLine("The double linked list is empty or the position is uncorrect.");
return;
}
if (0 == i)
{
DbNode<T> newNode = new DbNode<T>(item);
newNode.Next = Head;
Head.Prev = newNode;
Head = newNode;
return;
}
DbNode<T> n = Head;
DbNode<T> d = new DbNode<T>();
int j = 0;
while (n.Next != null && j < i)
{
d = n;
n = n.Next;
j++;
}
if (n.Next == null)
{
DbNode<T> newNode = new DbNode<T>(item);
n.Next = newNode;
newNode.Prev = n;
newNode.Next = null;
}
else
{
if (j == i)
{
DbNode<T> newNode = new DbNode<T>(item);
d.Next = newNode;
newNode.Prev = d;
newNode.Next = n;
n.Prev = newNode;
}
}
}
public void AddLast(T item)
{
DbNode<T> newNode = new DbNode<T>(item);
DbNode<T> p = new DbNode<T>();
if (Head == null)
{
Head = newNode;
return;
}
p = Head;
while (p.Next != null)
{
p = p.Next;
}
p.Next = newNode;
newNode.Prev = p;
}
public T RemoveAt(int i)
{
if (IsEmpty() || i < 0)
{
Console.WriteLine("The double linked list is empty or the position is uncorrect.");
return default(T);
}
DbNode<T> q = new DbNode<T>();
if (0 == i)
{
q = Head;
Head = Head.Next;
Head.Prev = null;
return q.Data;
}
DbNode<T> p = Head;
int j = 0;
while (p.Next != null && j < i)
{
j++;
q = p;
p = p.Next;
}
if (i == j)
{
p.Next.Prev = q;
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("The position is uncorrect.");
return default(T);
}
}
public int IndexOf(T value)
{
if (IsEmpty())
{
Console.WriteLine("The list is empty.");
return -1;
}
DbNode<T> p = new DbNode<T>();
p = Head;
int i = 0;
while (p.Next != null && !p.Data.Equals(value))
{
p = p.Next;
i++;
}
return i;
}
public void Reverse()
{
DbLinkedList<T> tmpList = new DbLinkedList<T>();
DbNode<T> p = this.Head;
tmpList.Head = new DbNode<T>(p.Data);
p = p.Next;
while (p != null)
{
tmpList.AddBefore(p.Data, 0);
p = p.Next;
}
this.Head = tmpList.Head;
tmpList = null;
}
public string ReverseByPrev()
{
DbNode<T> tail = GetNodeAt(Count() - 1);
StringBuilder sb = new StringBuilder();
sb.Append(tail.Data.ToString() + ",");
while (tail.Prev != null)
{
sb.Append(tail.Prev.Data + ",");
tail = tail.Prev;
}
return sb.ToString().TrimEnd(',');
}
private DbNode<T> GetNodeAt(int i)
{
if (IsEmpty())
{
Console.WriteLine("The list is empty.");
return null;
}
DbNode<T> p = new DbNode<T>();
p = this.Head;
if (0 == i)
{
return p;
}
int j = 0;
while (p.Next != null && j < i)
{
j++;
p = p.Next;
}
if (j == i)
{
return p;
}
else
{
Console.WriteLine("The node does not exist.");
return null;
}
}
public T Fisrt()
{
return this.GetItemAt(0);
}
public T Last()
{
return this.GetItemAt(this.Count() - 1);
}
}
And I alse have a class as Product which contains properties:ProductID and ProductValue:
public class Product
{
private byte _productID;
public byte ProductID
{
get { return _productID; }
set
{
_productID = value;
NotifyPropertyChanged("ProductID");
}
}
private UInt16 _productValue;
public UInt16 ProductValue
{
get { return _productValue; }
set
{
_productValue = value;
NotifyPropertyChanged("ProductValue");
}
}
}
I have another listbox to which I want to add the Product when I click the TreeView:
MyLinkList<Product> myLinkList = new MyLinkList<Product>();
private void MenuItem_OnClick(object sender, RoutedEventArgs e)
{
var item = this.TreeView.SelectedItem as Product;
listbox.Items.Add(item);
myLinkList.Append(item);
}
Now the problem is I want to modify the item's property selected to add based on the former one. For example: if the former one's ProductID is 1, then this SelectedItem.ProductValue = FormerItem.ProductValue + 1, how I suppose to do this? Thanks!
I am using https://courses.cs.washington.edu/courses/cse326/07su/prj2/kruskal.html psuedocode as reference when writing my code.
Code is in C#, and my code can only generate mazes up to 11x11, anything more than than it will run, seemingly, forever (e.g. 12x11 or 12x12 won't work)
Grid Properties are just storing the dimension of the size of the maze
public class GridProperties
{
private int xLength;
private int yLength;
public GridProperties(int xlength, int ylength)
{
xLength = xlength;
yLength = ylength;
}
public int getXLength()
{
return this.xLength;
}
public int getYLength()
{
return this.yLength;
}
}
Cell Properties generates the grid
public class CellProperties
{
private GridProperties Grid;
private bool topWall, bottomWall, rightWall, leftWall;
private int? xCoord, yCoord;
private CellProperties topCell, bottomCell, rightCell, leftCell;
private CellProperties topParentCell, bottomParentCell, rightParentCell, leftParentCell;
private HashSet<String> passageID = new HashSet<String>();
public CellProperties(GridProperties grid = null, int? targetXCoord = null, int? targetYCoord = null,
CellProperties tpCell = null, CellProperties bpCell = null,
CellProperties rpCell = null, CellProperties lpCell = null)
{
this.Grid = grid;
this.xCoord = targetXCoord;
this.yCoord = targetYCoord;
this.updatePassageID(this.xCoord.ToString() + this.yCoord.ToString());
this.topWall = true;
this.bottomWall = true;
this.rightWall = true;
this.leftWall = true;
this.topParentCell = tpCell;
this.bottomParentCell = bpCell;
this.rightParentCell = rpCell;
this.leftParentCell = lpCell;
this.topCell = this.setTopCell();
this.bottomCell = this.setBottomCell();
if (this.yCoord == 0)
{
this.rightCell = this.setRightCell();
}
this.leftCell = this.setLeftCell();
}
public CellProperties setTopCell()
{
if (this.Grid == null)
{
return null;
}
if (this.yCoord == this.Grid.getYLength() - 1)
{
return new CellProperties();
}
else
{
return new CellProperties(this.Grid, this.xCoord, this.yCoord + 1, null, this, null, null);
}
}
public CellProperties setBottomCell()
{
if (this.yCoord == 0)
{
return new CellProperties();
}
else
{
return this.bottomParentCell;
}
}
public CellProperties setRightCell()
{
if (this.Grid == null)
{
return null;
}
if (this.xCoord == this.Grid.getXLength() - 1)
{
return new CellProperties();
}
else
{
return new CellProperties(this.Grid, this.xCoord + 1, this.yCoord, null, null, null, this);
}
}
public CellProperties setLeftCell( )
{
if (this.xCoord == 0)
{
return new CellProperties();
}
else
{
if (this.Grid == null)
{
return null;
}
if (this.yCoord == 0)
{
return this.leftParentCell;
}
else
{
CellProperties buffer = this.bottomCell;
for (int depth = 0; depth < this.yCoord - 1; depth++)
{
buffer = buffer.bottomParentCell;
}
buffer = buffer.leftParentCell.topCell;
for (int depth = 0; depth < this.yCoord - 1; depth++)
{
buffer = buffer.topCell;
}
buffer.rightCell = this;
return buffer;
}
}
}
public GridProperties getGrid()
{
return this.Grid;
}
public CellProperties getBottomCell()
{
return this.bottomCell;
}
public CellProperties getTopCell()
{
return this.topCell;
}
public CellProperties getLeftCell()
{
return this.leftCell;
}
public CellProperties getRightCell()
{
return this.rightCell;
}
public void setBottomWall(Boolean newBottomWall)
{
this.bottomWall = newBottomWall;
}
public void setTopWall(Boolean newTopWall)
{
this.topWall = newTopWall;
}
public void setLeftWall(Boolean newLeftWall)
{
this.leftWall = newLeftWall;
}
public void setRightWall(Boolean newRightWall)
{
this.rightWall = newRightWall;
}
public Boolean getBottomWall()
{
return this.bottomWall;
}
public Boolean getTopWall()
{
return this.topWall;
}
public Boolean getLeftWall()
{
return this.leftWall;
}
public Boolean getRightWall()
{
return this.rightWall;
}
public void updatePassageID(String newPassageID)
{
this.passageID.Add(newPassageID);
}
public void setPassageID(HashSet<String> newPassageID)
{
this.passageID = new HashSet<string>(newPassageID);
}
public HashSet<String> getPassageID()
{
return this.passageID;
}
}
This class is where the magic happens ... or suppose to happen.
public class KruskalMazeGenerator
{
private CellProperties Cell0x0;
private CellProperties CurrentCell;
private CellProperties NeighbourCell;
private int WallsDown;
private int TotalNumberOfCells;
private Random rnd = new Random();
private int rndXCoord, rndYCoord;
private String rndSide;
public KruskalMazeGenerator(CellProperties cell0x0)
{
Cell0x0 = cell0x0;
WallsDown = 0;
TotalNumberOfCells = Cell0x0.getGrid().getXLength() * Cell0x0.getGrid().getYLength();
}
public void selectRandomCellCoords()
{
this.rndXCoord = rnd.Next(0, this.Cell0x0.getGrid().getXLength());
this.rndYCoord = rnd.Next(0, this.Cell0x0.getGrid().getYLength());
}
public void selectRandomSide(String[] possibleSides)
{
if (possibleSides.Length != 0)
{
this.rndSide = possibleSides[rnd.Next(0, possibleSides.Length)];
}
}
public void selectRandomCurrentCell()
{
this.selectRandomCellCoords();
this.CurrentCell = this.Cell0x0;
for (int xWalk = 0; xWalk < this.rndXCoord; xWalk++)
{
this.CurrentCell = this.CurrentCell.getRightCell();
}
for (int xWalk = 0; xWalk < this.rndYCoord; xWalk++)
{
this.CurrentCell = this.CurrentCell.getTopCell();
}
}
public CellProperties checkWallBetweenCurrentAndNeighbour(List<String> possibleSides)
{
if (this.rndSide == "top")
{
if (this.CurrentCell.getTopCell() == null || this.CurrentCell.getTopCell().getGrid() == null)
{
possibleSides.Remove("top");
this.selectRandomSide(possibleSides.ToArray());
return this.checkWallBetweenCurrentAndNeighbour(possibleSides);
}
return this.CurrentCell.getTopCell();
}
else if (this.rndSide == "bottom")
{
if (this.CurrentCell.getBottomCell() == null || this.CurrentCell.getBottomCell().getGrid() == null)
{
possibleSides.Remove("bottom");
this.selectRandomSide(possibleSides.ToArray());
return this.checkWallBetweenCurrentAndNeighbour(possibleSides);
}
return this.CurrentCell.getBottomCell();
}
else if (this.rndSide == "left")
{
if (this.CurrentCell.getLeftCell() == null || this.CurrentCell.getLeftCell().getGrid() == null)
{
possibleSides.Remove("left");
this.selectRandomSide(possibleSides.ToArray());
return this.checkWallBetweenCurrentAndNeighbour(possibleSides);
}
return this.CurrentCell.getLeftCell();
}
else if (this.rndSide == "right")
{
if (this.CurrentCell.getRightCell() == null || this.CurrentCell.getRightCell().getGrid() == null)
{
possibleSides.Remove("right");
this.selectRandomSide(possibleSides.ToArray());
return this.checkWallBetweenCurrentAndNeighbour(possibleSides);
}
return this.CurrentCell.getRightCell();
}
return null;
}
public void selectRandomNeigbhourCell()
{
this.selectRandomSide(new String[4] { "top", "bottom", "left", "right" });
this.NeighbourCell = this.checkWallBetweenCurrentAndNeighbour(new List<String>(new String[4] { "top", "bottom", "left", "right" }));
}
public void checkForDifferentPassageID()
{
if (!this.CurrentCell.getPassageID().SetEquals(this.NeighbourCell.getPassageID()))
{
if (this.rndSide == "top")
{
this.CurrentCell.setTopWall(false);
this.NeighbourCell.setBottomWall(false);
this.unionAndResetPassageID();
this.WallsDown += 1;
}
else if (this.rndSide == "bottom")
{
this.CurrentCell.setBottomWall(false);
this.NeighbourCell.setTopWall(false);
this.unionAndResetPassageID();
this.WallsDown += 1;
}
else if (this.rndSide == "left")
{
this.CurrentCell.setLeftWall(false);
this.NeighbourCell.setRightWall(false);
this.unionAndResetPassageID();
this.WallsDown += 1;
}
else if (this.rndSide == "right")
{
this.CurrentCell.setRightWall(false);
this.NeighbourCell.setLeftWall(false);
this.unionAndResetPassageID();
this.WallsDown += 1;
}
}
}
public void unionAndResetPassageID()
{
HashSet<String> oldCurrentPassageID = new HashSet<String>(this.CurrentCell.getPassageID());
HashSet<String> oldNeighbourPassageID = new HashSet<String>(this.NeighbourCell.getPassageID());
HashSet <String> newPassageID = new HashSet<String>();
newPassageID = this.CurrentCell.getPassageID();
newPassageID.UnionWith(this.NeighbourCell.getPassageID());
CellProperties xwalkCell = new CellProperties();
CellProperties ywalkCell = new CellProperties();
for (int xWalk = 0; xWalk < this.Cell0x0.getGrid().getXLength(); xWalk++)
{
xwalkCell = xWalk == 0 ? this.Cell0x0 : xwalkCell.getRightCell();
for (int yWalk = 0; yWalk < this.Cell0x0.getGrid().getYLength(); yWalk++)
{
xwalkCell.setBottomWall(xWalk == 0 && yWalk == 0 ? false : xwalkCell.getBottomWall());
xwalkCell.setBottomWall(xWalk == this.Cell0x0.getGrid().getXLength() - 1 && yWalk == this.Cell0x0.getGrid().getYLength() - 1 ? false : xwalkCell.getBottomWall());
ywalkCell = yWalk == 0 ? xwalkCell : ywalkCell.getTopCell();
if (ywalkCell.getPassageID().SetEquals(oldCurrentPassageID) ||
ywalkCell.getPassageID().SetEquals(oldNeighbourPassageID))
{
ywalkCell.setPassageID(newPassageID);
}
}
}
}
public CellProperties createMaze()
{
while (this.WallsDown < this.TotalNumberOfCells - 1)
{
this.selectRandomCurrentCell();
this.selectRandomNeigbhourCell();
if (this.NeighbourCell != null)
{
this.checkForDifferentPassageID();
}
}
return this.Cell0x0;
}
}
then this is my visual representation class
public class drawGrid : CellProperties
{
private CellProperties Cell0x0 = new CellProperties();
private CellProperties yWalkBuffer = new CellProperties();
private CellProperties xWalkBuffer = new CellProperties();
private String bottomWall = "";
private String topWall = "";
private String leftAndrightWalls = "";
public drawGrid(CellProperties cell0x0)
{
Cell0x0 = cell0x0;
}
private void WallDrawingReset()
{
this.bottomWall = "\n";
this.topWall = "\n";
this.leftAndrightWalls = "\n";
}
private void Draw()
{
// draw bottom wall
{
if (this.bottomWall == "\n")
{
Console.Write("");
}
else
{
Console.Write(this.bottomWall);
}
}
Console.Write(this.leftAndrightWalls);
// draw top wall
{
if (topWall == "\n")
{
Console.Write("");
}
else
{
Console.Write(this.topWall);
}
}
}
public void yWalk()
{
for (int yWalk = 0; yWalk < this.Cell0x0.getGrid().getYLength(); yWalk++)
{
this.yWalkBuffer = yWalk == 0 ? this.Cell0x0 : this.yWalkBuffer.getTopCell();
this.WallDrawingReset();
this.xWalk(yWalk);
this.Draw();
}
}
private void xWalk(int yWalk)
{
for (int xWalk = 0; xWalk < this.Cell0x0.getGrid().getXLength(); xWalk++)
{
this.xWalkBuffer = xWalk == 0 ? this.yWalkBuffer : this.xWalkBuffer.getRightCell();
if (yWalk == 0)
{
this.bottomWall = xWalkBuffer.getBottomWall() ? this.bottomWall + "----" : this.bottomWall + " ";
this.topWall = xWalkBuffer.getTopWall() ? this.topWall + "----" : this.topWall + " ";
}
else
{
this.topWall = this.xWalkBuffer.getTopWall() ? this.topWall + "----" : this.topWall + " ";
}
if (xWalk == 0)
{
leftAndrightWalls = this.xWalkBuffer.getLeftWall() ? this.leftAndrightWalls + "| " : this.leftAndrightWalls + " ";
leftAndrightWalls = this.xWalkBuffer.getRightWall() ? this.leftAndrightWalls + "| " : this.leftAndrightWalls + " ";
}
else
{
leftAndrightWalls = this.xWalkBuffer.getRightWall() ? this.leftAndrightWalls + "| " : this.leftAndrightWalls + " ";
}
}
}
}
this is how i call them
class Program
{
static void Main(string[] args)
{
{
CellProperties cell = new CellProperties(new GridProperties(12, 11), 0, 0, null, null, null, null);
drawGrid draw = new drawGrid(cell);
draw.yWalk();
KruskalMazeGenerator kmaze = new KruskalMazeGenerator(cell);
cell = kmaze.createMaze();
Console.WriteLine("Final");
draw = new drawGrid(cell);
draw.yWalk();
}
Console.ReadKey();
}
}
Since I got you guys here, please don't mind pitching in what I can improve on as in coding style and other things that you are displeased with.
Thanks in advance.
Error seems to be here:
this.updatePassageID(this.xCoord.ToString() + this.yCoord.ToString());
Image those two scenarios:
xCoord = 1 and yCoord = 11.
xCoord = 11 and yCoord = 1.
both those result in newPassageID of 111.
So simply change the line to
this.updatePassageID(this.xCoord.ToString() + "|" + this.yCoord.ToString());
or written more sexy:
this.updatePassageID($"{xCoord}|{yCoord}");
With this you will receive
1|11 for the first scenario and 11|1 for the second which differs.
Edit based on comments:
I saw that your code is looping endlessly in the method createMaze. This method calls a method called checkForDifferentPassageID in there you check if two collections are equal or not. Once I saw that those collections are of type HashSet<string>, I thought that maybe your strings you put into the HashSet arent as unique as you think they are and there we go. So overall it took me like 10 minutes.
When i check via debug, i can see the methods and variables but no matter what solution i have tried posted on stackoverflow failed
Here how i can see the methods with debug
Here the class
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public sealed partial class PlayerStats : pb::IMessage<PlayerStats>
{
/// <summary>Field number for the "level" field.</summary>
public const int LevelFieldNumber = 1;
/// <summary>Field number for the "experience" field.</summary>
public const int ExperienceFieldNumber = 2;
/// <summary>Field number for the "prev_level_xp" field.</summary>
public const int PrevLevelXpFieldNumber = 3;
/// <summary>Field number for the "next_level_xp" field.</summary>
public const int NextLevelXpFieldNumber = 4;
/// <summary>Field number for the "km_walked" field.</summary>
public const int KmWalkedFieldNumber = 5;
/// <summary>Field number for the "pokemons_encountered" field.</summary>
public const int PokemonsEncounteredFieldNumber = 6;
/// <summary>Field number for the "unique_pokedex_entries" field.</summary>
public const int UniquePokedexEntriesFieldNumber = 7;
/// <summary>Field number for the "pokemons_captured" field.</summary>
public const int PokemonsCapturedFieldNumber = 8;
/// <summary>Field number for the "evolutions" field.</summary>
public const int EvolutionsFieldNumber = 9;
/// <summary>Field number for the "poke_stop_visits" field.</summary>
public const int PokeStopVisitsFieldNumber = 10;
/// <summary>Field number for the "pokeballs_thrown" field.</summary>
public const int PokeballsThrownFieldNumber = 11;
/// <summary>Field number for the "eggs_hatched" field.</summary>
public const int EggsHatchedFieldNumber = 12;
/// <summary>Field number for the "big_magikarp_caught" field.</summary>
public const int BigMagikarpCaughtFieldNumber = 13;
/// <summary>Field number for the "battle_attack_won" field.</summary>
public const int BattleAttackWonFieldNumber = 14;
/// <summary>Field number for the "battle_attack_total" field.</summary>
public const int BattleAttackTotalFieldNumber = 15;
/// <summary>Field number for the "battle_defended_won" field.</summary>
public const int BattleDefendedWonFieldNumber = 16;
/// <summary>Field number for the "battle_training_won" field.</summary>
public const int BattleTrainingWonFieldNumber = 17;
/// <summary>Field number for the "battle_training_total" field.</summary>
public const int BattleTrainingTotalFieldNumber = 18;
/// <summary>Field number for the "prestige_raised_total" field.</summary>
public const int PrestigeRaisedTotalFieldNumber = 19;
/// <summary>Field number for the "prestige_dropped_total" field.</summary>
public const int PrestigeDroppedTotalFieldNumber = 20;
/// <summary>Field number for the "pokemon_deployed" field.</summary>
public const int PokemonDeployedFieldNumber = 21;
/// <summary>Field number for the "pokemon_caught_by_type" field.</summary>
public const int PokemonCaughtByTypeFieldNumber = 22;
/// <summary>Field number for the "small_rattata_caught" field.</summary>
public const int SmallRattataCaughtFieldNumber = 23;
private static readonly pb::MessageParser<PlayerStats> _parser =
new pb::MessageParser<PlayerStats>(() => new PlayerStats());
private int battleAttackTotal_;
private int battleAttackWon_;
private int battleDefendedWon_;
private int battleTrainingTotal_;
private int battleTrainingWon_;
private int bigMagikarpCaught_;
private int eggsHatched_;
private int evolutions_;
private long experience_;
private float kmWalked_;
private int level_;
private long nextLevelXp_;
private int pokeballsThrown_;
private pb::ByteString pokemonCaughtByType_ = pb::ByteString.Empty;
private int pokemonDeployed_;
private int pokemonsCaptured_;
private int pokemonsEncountered_;
private int pokeStopVisits_;
private int prestigeDroppedTotal_;
private int prestigeRaisedTotal_;
private long prevLevelXp_;
private int smallRattataCaught_;
private int uniquePokedexEntries_;
public PlayerStats()
{
OnConstruction();
}
public PlayerStats(PlayerStats other) : this()
{
level_ = other.level_;
experience_ = other.experience_;
prevLevelXp_ = other.prevLevelXp_;
nextLevelXp_ = other.nextLevelXp_;
kmWalked_ = other.kmWalked_;
pokemonsEncountered_ = other.pokemonsEncountered_;
uniquePokedexEntries_ = other.uniquePokedexEntries_;
pokemonsCaptured_ = other.pokemonsCaptured_;
evolutions_ = other.evolutions_;
pokeStopVisits_ = other.pokeStopVisits_;
pokeballsThrown_ = other.pokeballsThrown_;
eggsHatched_ = other.eggsHatched_;
bigMagikarpCaught_ = other.bigMagikarpCaught_;
battleAttackWon_ = other.battleAttackWon_;
battleAttackTotal_ = other.battleAttackTotal_;
battleDefendedWon_ = other.battleDefendedWon_;
battleTrainingWon_ = other.battleTrainingWon_;
battleTrainingTotal_ = other.battleTrainingTotal_;
prestigeRaisedTotal_ = other.prestigeRaisedTotal_;
prestigeDroppedTotal_ = other.prestigeDroppedTotal_;
pokemonDeployed_ = other.pokemonDeployed_;
pokemonCaughtByType_ = other.pokemonCaughtByType_;
smallRattataCaught_ = other.smallRattataCaught_;
}
public static pb::MessageParser<PlayerStats> Parser
{
get { return _parser; }
}
public static pbr::MessageDescriptor Descriptor
{
get { return global::PokemonGo.RocketAPI.GeneratedCode.PayloadsReflection.Descriptor.MessageTypes[14]; }
}
public int Level
{
get { return level_; }
set { level_ = value; }
}
public long Experience
{
get { return experience_; }
set { experience_ = value; }
}
public long PrevLevelXp
{
get { return prevLevelXp_; }
set { prevLevelXp_ = value; }
}
public long NextLevelXp
{
get { return nextLevelXp_; }
set { nextLevelXp_ = value; }
}
public float KmWalked
{
get { return kmWalked_; }
set { kmWalked_ = value; }
}
public int PokemonsEncountered
{
get { return pokemonsEncountered_; }
set { pokemonsEncountered_ = value; }
}
public int UniquePokedexEntries
{
get { return uniquePokedexEntries_; }
set { uniquePokedexEntries_ = value; }
}
public int PokemonsCaptured
{
get { return pokemonsCaptured_; }
set { pokemonsCaptured_ = value; }
}
public int Evolutions
{
get { return evolutions_; }
set { evolutions_ = value; }
}
public int PokeStopVisits
{
get { return pokeStopVisits_; }
set { pokeStopVisits_ = value; }
}
public int PokeballsThrown
{
get { return pokeballsThrown_; }
set { pokeballsThrown_ = value; }
}
public int EggsHatched
{
get { return eggsHatched_; }
set { eggsHatched_ = value; }
}
public int BigMagikarpCaught
{
get { return bigMagikarpCaught_; }
set { bigMagikarpCaught_ = value; }
}
public int BattleAttackWon
{
get { return battleAttackWon_; }
set { battleAttackWon_ = value; }
}
public int BattleAttackTotal
{
get { return battleAttackTotal_; }
set { battleAttackTotal_ = value; }
}
public int BattleDefendedWon
{
get { return battleDefendedWon_; }
set { battleDefendedWon_ = value; }
}
public int BattleTrainingWon
{
get { return battleTrainingWon_; }
set { battleTrainingWon_ = value; }
}
public int BattleTrainingTotal
{
get { return battleTrainingTotal_; }
set { battleTrainingTotal_ = value; }
}
public int PrestigeRaisedTotal
{
get { return prestigeRaisedTotal_; }
set { prestigeRaisedTotal_ = value; }
}
public int PrestigeDroppedTotal
{
get { return prestigeDroppedTotal_; }
set { prestigeDroppedTotal_ = value; }
}
public int PokemonDeployed
{
get { return pokemonDeployed_; }
set { pokemonDeployed_ = value; }
}
/// <summary>
/// TODO: repeated PokemonType ??
/// </summary>
public pb::ByteString PokemonCaughtByType
{
get { return pokemonCaughtByType_; }
set { pokemonCaughtByType_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); }
}
public int SmallRattataCaught
{
get { return smallRattataCaught_; }
set { smallRattataCaught_ = value; }
}
pbr::MessageDescriptor pb::IMessage.Descriptor
{
get { return Descriptor; }
}
public PlayerStats Clone()
{
return new PlayerStats(this);
}
public bool Equals(PlayerStats other)
{
if (ReferenceEquals(other, null))
{
return false;
}
if (ReferenceEquals(other, this))
{
return true;
}
if (Level != other.Level) return false;
if (Experience != other.Experience) return false;
if (PrevLevelXp != other.PrevLevelXp) return false;
if (NextLevelXp != other.NextLevelXp) return false;
if (KmWalked != other.KmWalked) return false;
if (PokemonsEncountered != other.PokemonsEncountered) return false;
if (UniquePokedexEntries != other.UniquePokedexEntries) return false;
if (PokemonsCaptured != other.PokemonsCaptured) return false;
if (Evolutions != other.Evolutions) return false;
if (PokeStopVisits != other.PokeStopVisits) return false;
if (PokeballsThrown != other.PokeballsThrown) return false;
if (EggsHatched != other.EggsHatched) return false;
if (BigMagikarpCaught != other.BigMagikarpCaught) return false;
if (BattleAttackWon != other.BattleAttackWon) return false;
if (BattleAttackTotal != other.BattleAttackTotal) return false;
if (BattleDefendedWon != other.BattleDefendedWon) return false;
if (BattleTrainingWon != other.BattleTrainingWon) return false;
if (BattleTrainingTotal != other.BattleTrainingTotal) return false;
if (PrestigeRaisedTotal != other.PrestigeRaisedTotal) return false;
if (PrestigeDroppedTotal != other.PrestigeDroppedTotal) return false;
if (PokemonDeployed != other.PokemonDeployed) return false;
if (PokemonCaughtByType != other.PokemonCaughtByType) return false;
if (SmallRattataCaught != other.SmallRattataCaught) return false;
return true;
}
public void WriteTo(pb::CodedOutputStream output)
{
if (Level != 0)
{
output.WriteRawTag(8);
output.WriteInt32(Level);
}
if (Experience != 0L)
{
output.WriteRawTag(16);
output.WriteInt64(Experience);
}
if (PrevLevelXp != 0L)
{
output.WriteRawTag(24);
output.WriteInt64(PrevLevelXp);
}
if (NextLevelXp != 0L)
{
output.WriteRawTag(32);
output.WriteInt64(NextLevelXp);
}
if (KmWalked != 0F)
{
output.WriteRawTag(45);
output.WriteFloat(KmWalked);
}
if (PokemonsEncountered != 0)
{
output.WriteRawTag(48);
output.WriteInt32(PokemonsEncountered);
}
if (UniquePokedexEntries != 0)
{
output.WriteRawTag(56);
output.WriteInt32(UniquePokedexEntries);
}
if (PokemonsCaptured != 0)
{
output.WriteRawTag(64);
output.WriteInt32(PokemonsCaptured);
}
if (Evolutions != 0)
{
output.WriteRawTag(72);
output.WriteInt32(Evolutions);
}
if (PokeStopVisits != 0)
{
output.WriteRawTag(80);
output.WriteInt32(PokeStopVisits);
}
if (PokeballsThrown != 0)
{
output.WriteRawTag(88);
output.WriteInt32(PokeballsThrown);
}
if (EggsHatched != 0)
{
output.WriteRawTag(96);
output.WriteInt32(EggsHatched);
}
if (BigMagikarpCaught != 0)
{
output.WriteRawTag(104);
output.WriteInt32(BigMagikarpCaught);
}
if (BattleAttackWon != 0)
{
output.WriteRawTag(112);
output.WriteInt32(BattleAttackWon);
}
if (BattleAttackTotal != 0)
{
output.WriteRawTag(120);
output.WriteInt32(BattleAttackTotal);
}
if (BattleDefendedWon != 0)
{
output.WriteRawTag(128, 1);
output.WriteInt32(BattleDefendedWon);
}
if (BattleTrainingWon != 0)
{
output.WriteRawTag(136, 1);
output.WriteInt32(BattleTrainingWon);
}
if (BattleTrainingTotal != 0)
{
output.WriteRawTag(144, 1);
output.WriteInt32(BattleTrainingTotal);
}
if (PrestigeRaisedTotal != 0)
{
output.WriteRawTag(152, 1);
output.WriteInt32(PrestigeRaisedTotal);
}
if (PrestigeDroppedTotal != 0)
{
output.WriteRawTag(160, 1);
output.WriteInt32(PrestigeDroppedTotal);
}
if (PokemonDeployed != 0)
{
output.WriteRawTag(168, 1);
output.WriteInt32(PokemonDeployed);
}
if (PokemonCaughtByType.Length != 0)
{
output.WriteRawTag(178, 1);
output.WriteBytes(PokemonCaughtByType);
}
if (SmallRattataCaught != 0)
{
output.WriteRawTag(184, 1);
output.WriteInt32(SmallRattataCaught);
}
}
public int CalculateSize()
{
var size = 0;
if (Level != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
}
if (Experience != 0L)
{
size += 1 + pb::CodedOutputStream.ComputeInt64Size(Experience);
}
if (PrevLevelXp != 0L)
{
size += 1 + pb::CodedOutputStream.ComputeInt64Size(PrevLevelXp);
}
if (NextLevelXp != 0L)
{
size += 1 + pb::CodedOutputStream.ComputeInt64Size(NextLevelXp);
}
if (KmWalked != 0F)
{
size += 1 + 4;
}
if (PokemonsEncountered != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsEncountered);
}
if (UniquePokedexEntries != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(UniquePokedexEntries);
}
if (PokemonsCaptured != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokemonsCaptured);
}
if (Evolutions != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(Evolutions);
}
if (PokeStopVisits != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeStopVisits);
}
if (PokeballsThrown != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokeballsThrown);
}
if (EggsHatched != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(EggsHatched);
}
if (BigMagikarpCaught != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(BigMagikarpCaught);
}
if (BattleAttackWon != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackWon);
}
if (BattleAttackTotal != 0)
{
size += 1 + pb::CodedOutputStream.ComputeInt32Size(BattleAttackTotal);
}
if (BattleDefendedWon != 0)
{
size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleDefendedWon);
}
if (BattleTrainingWon != 0)
{
size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingWon);
}
if (BattleTrainingTotal != 0)
{
size += 2 + pb::CodedOutputStream.ComputeInt32Size(BattleTrainingTotal);
}
if (PrestigeRaisedTotal != 0)
{
size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeRaisedTotal);
}
if (PrestigeDroppedTotal != 0)
{
size += 2 + pb::CodedOutputStream.ComputeInt32Size(PrestigeDroppedTotal);
}
if (PokemonDeployed != 0)
{
size += 2 + pb::CodedOutputStream.ComputeInt32Size(PokemonDeployed);
}
if (PokemonCaughtByType.Length != 0)
{
size += 2 + pb::CodedOutputStream.ComputeBytesSize(PokemonCaughtByType);
}
if (SmallRattataCaught != 0)
{
size += 2 + pb::CodedOutputStream.ComputeInt32Size(SmallRattataCaught);
}
return size;
}
public void MergeFrom(PlayerStats other)
{
if (other == null)
{
return;
}
if (other.Level != 0)
{
Level = other.Level;
}
if (other.Experience != 0L)
{
Experience = other.Experience;
}
if (other.PrevLevelXp != 0L)
{
PrevLevelXp = other.PrevLevelXp;
}
if (other.NextLevelXp != 0L)
{
NextLevelXp = other.NextLevelXp;
}
if (other.KmWalked != 0F)
{
KmWalked = other.KmWalked;
}
if (other.PokemonsEncountered != 0)
{
PokemonsEncountered = other.PokemonsEncountered;
}
if (other.UniquePokedexEntries != 0)
{
UniquePokedexEntries = other.UniquePokedexEntries;
}
if (other.PokemonsCaptured != 0)
{
PokemonsCaptured = other.PokemonsCaptured;
}
if (other.Evolutions != 0)
{
Evolutions = other.Evolutions;
}
if (other.PokeStopVisits != 0)
{
PokeStopVisits = other.PokeStopVisits;
}
if (other.PokeballsThrown != 0)
{
PokeballsThrown = other.PokeballsThrown;
}
if (other.EggsHatched != 0)
{
EggsHatched = other.EggsHatched;
}
if (other.BigMagikarpCaught != 0)
{
BigMagikarpCaught = other.BigMagikarpCaught;
}
if (other.BattleAttackWon != 0)
{
BattleAttackWon = other.BattleAttackWon;
}
if (other.BattleAttackTotal != 0)
{
BattleAttackTotal = other.BattleAttackTotal;
}
if (other.BattleDefendedWon != 0)
{
BattleDefendedWon = other.BattleDefendedWon;
}
if (other.BattleTrainingWon != 0)
{
BattleTrainingWon = other.BattleTrainingWon;
}
if (other.BattleTrainingTotal != 0)
{
BattleTrainingTotal = other.BattleTrainingTotal;
}
if (other.PrestigeRaisedTotal != 0)
{
PrestigeRaisedTotal = other.PrestigeRaisedTotal;
}
if (other.PrestigeDroppedTotal != 0)
{
PrestigeDroppedTotal = other.PrestigeDroppedTotal;
}
if (other.PokemonDeployed != 0)
{
PokemonDeployed = other.PokemonDeployed;
}
if (other.PokemonCaughtByType.Length != 0)
{
PokemonCaughtByType = other.PokemonCaughtByType;
}
if (other.SmallRattataCaught != 0)
{
SmallRattataCaught = other.SmallRattataCaught;
}
}
public void MergeFrom(pb::CodedInputStream input)
{
uint tag;
while ((tag = input.ReadTag()) != 0)
{
switch (tag)
{
default:
input.SkipLastField();
break;
case 8:
{
Level = input.ReadInt32();
break;
}
case 16:
{
Experience = input.ReadInt64();
break;
}
case 24:
{
PrevLevelXp = input.ReadInt64();
break;
}
case 32:
{
NextLevelXp = input.ReadInt64();
break;
}
case 45:
{
KmWalked = input.ReadFloat();
break;
}
case 48:
{
PokemonsEncountered = input.ReadInt32();
break;
}
case 56:
{
UniquePokedexEntries = input.ReadInt32();
break;
}
case 64:
{
PokemonsCaptured = input.ReadInt32();
break;
}
case 72:
{
Evolutions = input.ReadInt32();
break;
}
case 80:
{
PokeStopVisits = input.ReadInt32();
break;
}
case 88:
{
PokeballsThrown = input.ReadInt32();
break;
}
case 96:
{
EggsHatched = input.ReadInt32();
break;
}
case 104:
{
BigMagikarpCaught = input.ReadInt32();
break;
}
case 112:
{
BattleAttackWon = input.ReadInt32();
break;
}
case 120:
{
BattleAttackTotal = input.ReadInt32();
break;
}
case 128:
{
BattleDefendedWon = input.ReadInt32();
break;
}
case 136:
{
BattleTrainingWon = input.ReadInt32();
break;
}
case 144:
{
BattleTrainingTotal = input.ReadInt32();
break;
}
case 152:
{
PrestigeRaisedTotal = input.ReadInt32();
break;
}
case 160:
{
PrestigeDroppedTotal = input.ReadInt32();
break;
}
case 168:
{
PokemonDeployed = input.ReadInt32();
break;
}
case 178:
{
PokemonCaughtByType = input.ReadBytes();
break;
}
case 184:
{
SmallRattataCaught = input.ReadInt32();
break;
}
}
}
}
public override bool Equals(object other)
{
return Equals(other as PlayerStats);
}
public override int GetHashCode()
{
var hash = 1;
if (Level != 0) hash ^= Level.GetHashCode();
if (Experience != 0L) hash ^= Experience.GetHashCode();
if (PrevLevelXp != 0L) hash ^= PrevLevelXp.GetHashCode();
if (NextLevelXp != 0L) hash ^= NextLevelXp.GetHashCode();
if (KmWalked != 0F) hash ^= KmWalked.GetHashCode();
if (PokemonsEncountered != 0) hash ^= PokemonsEncountered.GetHashCode();
if (UniquePokedexEntries != 0) hash ^= UniquePokedexEntries.GetHashCode();
if (PokemonsCaptured != 0) hash ^= PokemonsCaptured.GetHashCode();
if (Evolutions != 0) hash ^= Evolutions.GetHashCode();
if (PokeStopVisits != 0) hash ^= PokeStopVisits.GetHashCode();
if (PokeballsThrown != 0) hash ^= PokeballsThrown.GetHashCode();
if (EggsHatched != 0) hash ^= EggsHatched.GetHashCode();
if (BigMagikarpCaught != 0) hash ^= BigMagikarpCaught.GetHashCode();
if (BattleAttackWon != 0) hash ^= BattleAttackWon.GetHashCode();
if (BattleAttackTotal != 0) hash ^= BattleAttackTotal.GetHashCode();
if (BattleDefendedWon != 0) hash ^= BattleDefendedWon.GetHashCode();
if (BattleTrainingWon != 0) hash ^= BattleTrainingWon.GetHashCode();
if (BattleTrainingTotal != 0) hash ^= BattleTrainingTotal.GetHashCode();
if (PrestigeRaisedTotal != 0) hash ^= PrestigeRaisedTotal.GetHashCode();
if (PrestigeDroppedTotal != 0) hash ^= PrestigeDroppedTotal.GetHashCode();
if (PokemonDeployed != 0) hash ^= PokemonDeployed.GetHashCode();
if (PokemonCaughtByType.Length != 0) hash ^= PokemonCaughtByType.GetHashCode();
if (SmallRattataCaught != 0) hash ^= SmallRattataCaught.GetHashCode();
return hash;
}
partial void OnConstruction();
public override string ToString()
{
return pb::JsonFormatter.ToDiagnosticString(this);
}
}
You can't see methods in the Auto and Locals View. Methods can have side effects when they get evaluated (properties are ought to have no side effects), so to prevent your application to end up corrupted it doesn't show them.
Only properties and fields are shown. You can call methods yourself in the Watch View.