예제 #1
0
func NewTeamPokeFromPacket(_packet *pnet.QTPacket) *TeamPoke {
	teamPoke := TeamPoke{}
	teamPoke.UID = NewUniqueIdFromPacket(_packet)
	teamPoke.Nick = _packet.ReadString()
	teamPoke.Item = int(_packet.ReadUint16())
	teamPoke.Ability = int(_packet.ReadUint16())
	teamPoke.Nature = int(_packet.ReadUint8())
	teamPoke.Gender = int(_packet.ReadUint8())
	// teamPoke.Gen = (int)_packet.ReadByte()
	teamPoke.Shiny = _packet.ReadBool()
	teamPoke.Happiness = int(_packet.ReadUint8())
	teamPoke.Level = int(_packet.ReadUint8())

	teamPoke.Moves = make([]int, 4)
	for i := 0; i < 4; i++ {
		teamPoke.Moves[i] = int(_packet.ReadUint32())
	}
	teamPoke.DVs = make([]int, 6)
	for i := 0; i < 6; i++ {
		teamPoke.DVs[i] = int(_packet.ReadUint8())
	}
	teamPoke.EVs = make([]int, 6)
	for i := 0; i < 6; i++ {
		teamPoke.EVs[i] = int(_packet.ReadUint8())
	}

	return &teamPoke
}
예제 #2
0
func NewShallowShownPokeFromPacket(_packet *pnet.QTPacket) *ShallowShownPoke {
	shallowShownPoke := ShallowShownPoke{UID: NewUniqueIdFromPacket(_packet),
		Level:  int(_packet.ReadUint8()),
		Gender: int(_packet.ReadUint8()),
		Item:   _packet.ReadBool()}
	return &shallowShownPoke
}
예제 #3
0
func (b *Battle) receivedRated(_packet *pnet.QTPacket) {
	rated := "Unrated"
	if _packet.ReadBool() {
		rated = "Rated"
	}
	b.WriteToHist("Rule: " + rated + "\n")

	// TODO: Print clauses
}
예제 #4
0
func (b *Battle) receivedSubstitute(_packet *pnet.QTPacket, _player int) {
	isSub := _packet.ReadBool()
	b.currentPoke(_player).Sub = isSub
	if _player == b.me {
		// TODO: Send updateMyPoke to PU client
	} else {
		// TODO: Send updateOppPoke to PU client
	}
}
예제 #5
0
func NewFullPlayerInfoFromPacket(_packet *pnet.QTPacket) *FullPlayerInfo {
	fullPlayerInfo := &FullPlayerInfo{}
	fullPlayerInfo.Team = NewPlayerTeamFromPacket(_packet)
	fullPlayerInfo.IsDefault = true
	fullPlayerInfo.ladderEnabled = _packet.ReadBool()
	fullPlayerInfo.showTeam = _packet.ReadBool()
	fullPlayerInfo.nameColor = NewQColorFromPacket(_packet)

	return fullPlayerInfo
}
func NewShallowBattlePokeFromPacket(_packet *pnet.QTPacket, _isMe bool) *ShallowBattlePoke {
	shallowPoke := ShallowBattlePoke{Types: make([]int, 2)}
	shallowPoke.UID = NewUniqueIdFromPacket(_packet)
	shallowPoke.RNick = _packet.ReadString()
	shallowPoke.Nick = shallowPoke.RNick
	if !_isMe {
		shallowPoke.Nick = "the foe's " + shallowPoke.Nick

		shallowPoke.getName()
		shallowPoke.getTypes()
	}

	shallowPoke.LifePercent = int(_packet.ReadUint8())
	shallowPoke.fullStatus = _packet.ReadUint32()
	shallowPoke.Gender = int(_packet.ReadUint8())
	shallowPoke.Shiny = _packet.ReadBool()
	shallowPoke.Level = int(_packet.ReadUint32())

	return &shallowPoke
}
예제 #7
0
func (b *Battle) receiveOfferChoice(_packet *pnet.QTPacket) {
	_packet.ReadUint8() // We don't need it (numSlot)
	b.allowSwitch = _packet.ReadBool()
	b.allowAttack = _packet.ReadBool()
	canDoAttack := false
	for i := 0; i < 4; i++ {
		b.allowAttacks[i] = _packet.ReadBool()
		if b.allowAttacks[i] {
			canDoAttack = true
		}
	}

	if b.allowAttack && !canDoAttack {
		b.shouldStruggle = true
	} else {
		b.shouldStruggle = false
	}

	// TODO: Send updateButtons to PU client
}
예제 #8
0
func (b *Battle) receivedStatusChange(_packet *pnet.QTPacket, player int) {
	status := int(_packet.ReadUint8())
	multipleTurns := _packet.ReadBool()
	if status > STATUS_FINE && status <= STATUS_POISONED {
		statusChangeMessages := make([]string, 6)
		statusChangeMessages[0] = "is paralyzed! It may be unable to move!"
		statusChangeMessages[1] = "fell asleep!"
		statusChangeMessages[2] = "was frozen solid!"
		statusChangeMessages[3] = "was burned!"
		statusChangeMessages[4] = "was poisoned!"
		statusChangeMessages[5] = "was badly poisoned!"

		statusIndex := status - 1
		if status == STATUS_POISONED && multipleTurns {
			statusIndex += 1
		}

		b.WriteToHist(fmt.Sprintf("%s %s\n", b.currentPoke(player).Nick, statusChangeMessages[statusIndex]))
	} else if status == STATUS_CONFUSED {
		b.WriteToHist(fmt.Sprintf("%s became confused!\n", b.currentPoke(player).Nick))
	}
}
예제 #9
0
// -------------------- Received Messages ----------------------
func (b *Battle) receivedSendOut(_packet *pnet.QTPacket, _player int) {
	isSilent := _packet.ReadBool()
	fromSpot := int(_packet.ReadUint8())

	if _player == b.me {
		// tmp := b.myTeam.Pokes[0]
		b.myTeam.Pokes[0], b.myTeam.Pokes[fromSpot] = b.myTeam.Pokes[fromSpot], b.myTeam.Pokes[0]
		for i := 0; i < 4; i++ {
			b.displayedMoves[i] = NewBattleMoveFromBattleMove(b.myTeam.Pokes[0].Moves[i])
		}
	}

	b.pokes[_player][0], b.pokes[_player][fromSpot] = b.pokes[_player][fromSpot], b.pokes[_player][0]
	if _packet.GetMsgSize() > _packet.GetReadPos() { // this is the first time you've seen it
		b.pokes[_player][0] = NewShallowBattlePokeFromPacket(_packet, (_player == b.me))
	}

	// TOOD: Send updatePokes to PU client
	// TODO: Send updatePokeballs to PU client

	if !isSilent {
		b.WriteToHist(fmt.Sprintf("%s sent out %s!\n", b.players[_player].Nick, b.currentPoke(_player).RNick))
	}
}
예제 #10
0
func (b *Battle) ReceiveCommand(_packet *pnet.QTPacket) {
	bc := int(_packet.ReadUint8())
	player := int(_packet.ReadUint8())
	fmt.Printf("Battle command received: %d | PlayerId: %d\n", bc, player)
	switch bc {
	case BattleCommand_SendOut: // 0
		b.receivedSendOut(_packet, player)
	case BattleCommand_SendBack: // 1
		b.receivedSendBack(player)
	case BattleCommand_UseAttack: // 2
		b.receivedUseAttack(_packet, player)
	case BattleCommand_OfferChoice: // 3
		b.receiveOfferChoice(_packet)
	case BattleCommand_BeginTurn: // 4
		b.receivedBeginTurn(_packet)
	case BattleCommand_ChangePP: // 5
		b.receivedChangePP(_packet)
	case BattleCommand_ChangeHp: // 6
		b.receivedChangeHp(_packet, player)
	case BattleCommand_Ko: // 7
		b.receivedKo(player)
	case BattleCommand_Effective: // 8
		b.receivedEffective(_packet)
	case BattleCommand_Miss: // 9
		b.receivedMiss(player)
	case BattleCommand_CriticalHit: // 10
		b.receivedCriticalHit()
	case BattleCommand_Hit: // 11
		b.receivedHit(_packet)
	case BattleCommand_StatChange: // 12
		b.receivedStatChange(_packet, player)
	case BattleCommand_StatusChange: // 13
		b.receivedStatusChange(_packet, player)
	case BattleCommand_StatusMessage: // 14
		b.receivedStatusMessage(_packet, player)
	case BattleCommand_Failed: // 15
		b.receivedFailed()
	case BattleCommand_MoveMessage: // 17
		b.receivedMoveMessage(_packet, player)
	case BattleCommand_ItemMessage: // 18
		// TODO: We don't have items yet, so do nothing for now
	case BattleCommand_NoOpponent: // 19
		b.WriteToHist("But there was no target...\n")
	case BattleCommand_Flinch: // 20
		b.WriteToHist(b.currentPoke(player).Nick + " flinched!\n")
	case BattleCommand_Recoil: // 21
		damaging := _packet.ReadBool()
		if damaging {
			b.WriteToHist(b.currentPoke(player).Nick + " is hit with recoil!\n")
		} else {
			b.WriteToHist(b.currentPoke(player).Nick + " had its energy drained!\n")
		}
	case BattleCommand_WeatherMessage: // 22
		b.receivedWeatherMesage(_packet, player)
	case BattleCommand_StraightDamage: // 23
		b.receivedStraigthDamage(_packet, player)
	case BattleCommand_AbilityMessage: // 24
		b.receivedAbilityMessage(_packet, player)
	case BattleCommand_AbsStatusChange: // 25
		b.receivedAbsStatusChange(_packet, player)
	case BattleCommand_Substitute: // 26
		b.receivedSubstitute(_packet, player)
	case BattleCommand_BattleEnd: // 27
		b.receivedBattleEnd(_packet, player)
	case BattleCommand_BlankMessage: // 28
		b.WriteToHist("\n")
	case BattleCommand_CancelMove: // 29
		b.receivedCancelMove()
	case BattleCommand_Clause: // 30
		// TODO: Do someting with this, it only writes to history so isn't that important
	case BattleCommand_DynamicInfo: // 31
		b.receiveDynamicInfo(_packet, player)
	case BattleCommand_DynamicStats: // 32
		b.receiveDynamicStats(_packet, player)
	case BattleCommand_Spectating: // 33
		// TODO: implement
	case BattleCommand_SpectatorChat: // 34
		// TODO: Implement? Or are we using our own chat (probably yes)
	case BattleCommand_AlreadyStatusMessage: // 35
		status := int(_packet.ReadUint8())
		b.WriteToHist(fmt.Sprintf("%v is already %v\n", b.currentPoke(player), puh.GetStatusById(status)))
	case BattleCommand_TempPokeChange: // 36
		b.receivedTempPokeChange(_packet, player)
	case BattleCommand_ClockStart: // 37
		b.clockStart(_packet, player)
	case BattleCommand_ClockStop: // 38
		b.clockStop(_packet, player)
	case BattleCommand_Rated: // 39
		b.receivedRated(_packet)
	case BattleCommand_TierSection: // 40
		tier := _packet.ReadString()
		b.WriteToHist("Tier: " + tier + "\n")
	case BattleCommand_EndMessage: // 41
		endMessage := _packet.ReadString()
		if len(endMessage) > 0 {
			b.WriteToHist(fmt.Sprintf("%v: %v\n", b.players[player].Nick, endMessage))
		}
	case BattleCommand_PointEstimate: // 42
		// NOT IMPLEMENTED
	case BattleCommand_MakeYourChoice: // 43
		b.receiveMakeYourCoice()
	case BattleCommand_Avoid: // 44
		b.WriteToHist(fmt.Sprintf("%v avoided the attack!\n", b.currentPoke(player).Nick))
	case BattleCommand_RearrangeTeam: // 45
		b.receivedRearrangeTeam(_packet)
	case BattleCommand_SpotShifts: // 46
		// TOOD
	default:
		fmt.Printf("Battle command unimplemented: %d\n", bc)
	}
}