func NewShallowShownPokeFromPacket(_packet *pnet.QTPacket) *ShallowShownPoke { shallowShownPoke := ShallowShownPoke{UID: NewUniqueIdFromPacket(_packet), Level: int(_packet.ReadUint8()), Gender: int(_packet.ReadUint8()), Item: _packet.ReadBool()} return &shallowShownPoke }
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 }
func NewBattleMoveFromPacket(_packet *pnet.QTPacket) *BattleMove { battleMove := NewBattleMoveFromId(int(_packet.ReadUint16())) battleMove.CurrentPP = int(_packet.ReadUint8()) battleMove.TotalPP = int(_packet.ReadUint8()) return battleMove }
func (b *Battle) receivedStatusMessage(_packet *pnet.QTPacket, _player int) { status := int(_packet.ReadUint8()) var statusStr string switch status { case STATUSFEELING_FEELCONFUSION: statusStr = fmt.Sprintf("%s is confused!\n", b.currentPoke(_player)) case STATUSFEELING_HURTCONFUSION: statusStr = "It hurt itself in its confusion!\n" case STATUSFEELING_FREECONFUSION: statusStr = fmt.Sprintf("%s snapped out of its confusion!\n", b.currentPoke(_player)) case STATUSFEELING_PREVPARALYSED: statusStr = fmt.Sprintf("%s is paralyzed! It can't move!\n", b.currentPoke(_player)) case STATUSFEELING_FEELASLEEP: statusStr = fmt.Sprintf("%s is fast asleep!\n", b.currentPoke(_player)) case STATUSFEELING_FREEASLEEP: statusStr = fmt.Sprintf("%s woke up!\n", b.currentPoke(_player)) case STATUSFEELING_HURTBURN: statusStr = fmt.Sprintf("%s is hurt by its burn!\n", b.currentPoke(_player)) case STATUSFEELING_HURTPOISON: statusStr = fmt.Sprintf("%s is hurt by poison!\n", b.currentPoke(_player)) case STATUSFEELING_PREVFROZEN: statusStr = fmt.Sprintf("%s if frozen solid!\n", b.currentPoke(_player)) case STATUSFEELING_FREEFROZEN: statusStr = fmt.Sprintf("%s thawed out!\n", b.currentPoke(_player)) } b.WriteToHist(statusStr) }
func (b *Battle) receivedHit(_packet *pnet.QTPacket) { number := _packet.ReadUint8() extraStr := "!" if number > 1 { extraStr = "s!" } b.WriteToHist(fmt.Sprintf("Hit %d time%s\n", number, extraStr)) }
func NewTeamFromPacket(_packet *pnet.QTPacket) *Team { team := Team{Pokes: make([]*TeamPoke, 6)} team.Gen = int(_packet.ReadUint8()) for i := 0; i < 6; i++ { team.Pokes[i] = NewTeamPokeFromPacket(_packet) } return &team }
func NewRearrangeChoiceFromPacket(_packet *pnet.QTPacket) *RearrangeChoice { rearrangeChoice := RearrangeChoice{} rearrangeChoice.PokeIndexes = make([]int, 6) for i := 0; i < 6; i++ { rearrangeChoice.PokeIndexes[i] = int(_packet.ReadUint8()) } return &rearrangeChoice }
func (b *Battle) receivedChangePP(_packet *pnet.QTPacket) { moveNum := int(_packet.ReadUint8()) newPP := int(_packet.ReadUint8()) b.displayedMoves[moveNum].CurrentPP = newPP b.myTeam.Pokes[0].Moves[moveNum].CurrentPP = newPP // Send updateMovePP to PUClient SendBattleEvent_ChangePP(b.owner.player, 0, moveNum, newPP) }
func NewBattleDynamicInfoFromPacket(_packet *pnet.QTPacket) *BattleDynamicInfo { battleDynamicInfo := BattleDynamicInfo{} battleDynamicInfo.Boosts = make([]byte, 7) for i := 0; i < 7; i++ { battleDynamicInfo.Boosts[i] = _packet.ReadUint8() } battleDynamicInfo.Flags = _packet.ReadUint8() return &battleDynamicInfo }
func NewQColorFromPacket(_packet *pnet.QTPacket) *QColor { color := QColor{} color.Spec = _packet.ReadUint8() color.Alpha = _packet.ReadUint16() color.Red = _packet.ReadUint16() color.Green = _packet.ReadUint16() color.Blue = _packet.ReadUint16() color.Pad = _packet.ReadUint16() color.Html = ">" return &color }
func (b *Battle) receivedBattleEnd(_packet *pnet.QTPacket, _player int) { result := int(_packet.ReadUint8()) if result == BATTLERESULT_TIE { b.WriteToHist(fmt.Sprintf("Tie between %v and %v.\n", b.players[0].Nick, b.players[1].Nick)) } else { b.WriteToHist(fmt.Sprintf("%v won the battle!\n", b.players[_player].Nick)) } b.gotEnd = true // Update pokemon data of player b.owner.UpdatePokemonData() // TODO: Send endBattle to PU client }
func (b *Battle) receivedEffective(_packet *pnet.QTPacket) { eff := _packet.ReadUint8() switch eff { case 0: b.WriteToHist("It had no effect!\n") case 1: fallthrough case 2: b.WriteToHist("It's not very effective...\n") case 8: fallthrough case 16: b.WriteToHist("It's super effective!\n") } }
func (b *Battle) receivedAbsStatusChange(_packet *pnet.QTPacket, _player int) { poke := int(_packet.ReadUint8()) status := uint(_packet.ReadUint8()) if (poke >= 0 || poke < 6) && status != STATUS_CONFUSED { b.pokes[_player][poke].ChangeStatus(status) if _player == b.me { b.myTeam.Pokes[poke].ChangeStatus(status) } // if b.isOut(poke) { // TODO: Send updatePokes to PU client // } // TODO: Send updatePokeballs to PU client } }
func NewBattleChoiceFromPacket(_packet *pnet.QTPacket) *BattleChoice { battleChoice := BattleChoice{} battleChoice.PlayerSlot = int(_packet.ReadUint8()) battleChoice.ChoiceType = int(_packet.ReadUint8()) switch battleChoice.ChoiceType { case CHOICETYPE_SWITCHTYPE: battleChoice.Choice = NewSwitchChoiceFromPacket(_packet) case CHOICETYPE_ATTACKTYPE: battleChoice.Choice = NewAttackChoiceFromPacket(_packet) case CHOICETYPE_REARRANGETYPE: battleChoice.Choice = NewRearrangeChoiceFromPacket(_packet) } return &battleChoice }
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 }
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 }
func (b *Battle) receivedWeatherMesage(_packet *pnet.QTPacket, _player int) { wstatus := int(_packet.ReadUint8()) weather := int(_packet.ReadUint8()) if weather == WEATHER_NORMALWEATHER { return } var message string = "" if wstatus == WEATHERSTATE_ENDWEATHER { switch weather { case WEATHER_HAIL: message = "The hail subsided!" case WEATHER_SANDSTORM: message = "The sandstorm subsided!" case WEATHER_SUNNY: message = "The sunglight faded!" case WEATHER_RAIN: message = "The rain stopped!" } } else if wstatus == WEATHERSTATE_HURTWEATHER { switch weather { case WEATHER_HAIL: message = fmt.Sprintf("%v is buffeted by the hail!", b.currentPoke(_player).Nick) case WEATHER_SANDSTORM: message = fmt.Sprintf("%v is buffeted by the sandstorm!", b.currentPoke(_player).Nick) } } else if wstatus == WEATHERSTATE_CONTINUEWEATHER { switch weather { case WEATHER_HAIL: message = "Hail continues to fall!" case WEATHER_SANDSTORM: message = "The sandstorm rages!" case WEATHER_SUNNY: message = "The sunlight is strong!" case WEATHER_RAIN: message = "Rain continues to fall!" } } b.WriteToHist(message + "\n") }
func (b *Battle) receivedAbilityMessage(_packet *pnet.QTPacket, _player int) { ab := int(_packet.ReadUint16()) part := int(_packet.ReadUint8()) msgType := int(_packet.ReadUint8()) foe := int(_packet.ReadUint8()) other := int(_packet.ReadUint16()) s := pokemon.GetInstance().GetAbilityMessage((ab + 1), part) if other != -1 && strings.Contains(s, "%st") { s = strings.Replace(s, "%st", puh.GetStatById(other), 0) } s = strings.Replace(s, "%s", b.currentPoke(_player).Nick, 0) if msgType != -1 { s = strings.Replace(s, "%t", puh.GetTypeValueById(msgType), 0) } if foe != -1 { s = strings.Replace(s, "%f", b.currentPoke(foe).Nick, 0) } if other != -1 { if strings.Contains(s, "%m") { s = strings.Replace(s, "%m", pokemon.GetInstance().GetMoveNameById(other), 0) } if strings.Contains(s, "%i") { s = strings.Replace(s, "%i", pokemon.GetInstance().GetItemNameById(other), 0) } if strings.Contains(s, "%a") { s = strings.Replace(s, "%a", pokemon.GetInstance().GetAbilityNameById(other+1), 0) } if strings.Contains(s, "%p") { s = strings.Replace(s, "%p", pokemon.GetInstance().GetPokemonName(other, 0), 0) } } b.WriteToHist(s + "\n") }
func (c *POClient) ProcessPacket(_packet *pnet.QTPacket) { header := int(_packet.ReadUint8()) fmt.Printf("Received header %v\n", header) switch header { case COMMAND_Login: // 2 c.login(_packet) case COMMAND_PlayersList: // 5 c.playerList(_packet) case COMMAND_ChallengeStuff: // 7 c.challengeStuff(_packet) case COMMAND_EngageBattle: // 8 c.engageBattle(_packet) case COMMAND_BattleMessage: // 10 c.battleMessage(_packet) case COMMAND_KeepAlive: // 12 c.keepAlive() case COMMAND_Register: // 14 // Do nothing case COMMAND_VersionControl: // 33 // Do nothing case COMMAND_TierSelection: // 34 // Do nothing case COMMAND_BattleList: // 43 // Do nothin case COMMAND_ChannelsList: // 44 // Do nothing case COMMAND_ChannelPlayers: // 45 // Do nothing case COMMAND_JoinChannel: // 46 // Do nothing case COMMAND_ChannelMessage: // 51 // Do nothing case COMMAND_HtmlMessage: // 53 fmt.Printf("[Message] %s\n\r", _packet.ReadString()) case COMMAND_ServerName: // 55 // Do nothing default: fmt.Printf("UNIMPLEMENTED PACKET: %v\n", header) } }
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)) } }
func (b *Battle) receivedStatChange(_packet *pnet.QTPacket, _player int) { stat := int(_packet.ReadUint8()) boost := int(_packet.ReadUint8()) var statStr string if stat == 0 { statStr = STAT_HP } else if stat == 1 { statStr = STAT_ATTACK } else if stat == 2 { statStr = STAT_DEFENSE } else if stat == 3 { statStr = STAT_SPATTACK } else if stat == 4 { statStr = STAT_SPDEFENSE } else if stat == 5 { statStr = STAT_SPEED } else if stat == 6 { statStr = STAT_ACCURACY } else if stat == 7 { statStr = STAT_EVASION } else if stat == 8 { statStr = STAT_ALLSTATS } var boostStr string if boost > 0 { boostStr = "rose!" } else { boostStr = "fell!" } boostStrExt := "" if boost > 1 { boostStr = "sharply" } b.WriteToHist(fmt.Sprintf("%s's %s %s%s\n", b.currentPoke(_player).Nick, statStr, boostStrExt, boostStr)) }
func (b *Battle) receivedTempPokeChange(_packet *pnet.QTPacket, _player int) { id := int(_packet.ReadUint8()) switch id { case TEMPPOKECHANGE_TEMPMOVE: fallthrough case TEMPPOKECHANGE_DEFMOVE: slot := int(_packet.ReadUint8()) newMove := NewBattleMoveFromId(int(_packet.ReadUint16())) b.displayedMoves[slot] = newMove if id == TEMPPOKECHANGE_DEFMOVE { b.myTeam.Pokes[0].Moves[slot] = newMove } // TODO: Send updatePokes(player) to PU client case TEMPPOKECHANGE_TEMPPP: slot := int(_packet.ReadUint8()) pp := int(_packet.ReadUint8()) b.displayedMoves[slot].CurrentPP = pp // TODO: Send updateMovePP(slot) to PU client case TEMPPOKECHANGE_TEMPSPRITE: // TODO: Implement case TEMPPOKECHANGE_DEFINITEFORME: poke := int(_packet.ReadUint8()) newForm := int(_packet.ReadUint16()) if b.isOut(poke) { b.currentPoke(b.slot(_player, poke)).UID.PokeNum = newForm // TODO: Send updatePokes(player) to PU client } case TEMPPOKECHANGE_AESTHETICFORME: newForm := int(_packet.ReadUint16()) b.currentPoke(_player).UID.SubNum = newForm // TODO: Send updatePokes(player) to PU client } }
// -------------------- 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)) } }
func (b *Battle) receivedMoveMessage(_packet *pnet.QTPacket, _player int) { move := int(_packet.ReadUint16()) part := int(_packet.ReadUint8()) msgType := int(_packet.ReadUint8()) foe := int(_packet.ReadUint8()) other := int(_packet.ReadUint16()) q := _packet.ReadString() s := pokemon.GetInstance().GetMoveMessage(move, part) if len(s) == 0 { fmt.Printf("Could not find message %d part %d\n", move, part) return } s = strings.Replace(s, "%s", b.currentPoke(_player).Nick, 0) s = strings.Replace(s, "%ts", b.players[_player].Nick, 0) var tmp int = 0 if _player == 0 { tmp = 1 } s = strings.Replace(s, "%tf", b.players[tmp].Nick, 0) if msgType != -1 { s = strings.Replace(s, "%t", puh.GetTypeValueById(msgType), 0) } if foe != -1 { s = strings.Replace(s, "%f", b.currentPoke(foe).Nick, 0) } if other != -1 && strings.Contains(s, "%m") { s = strings.Replace(s, "%m", pokemon.GetInstance().GetMoveNameById(other), 0) } s = strings.Replace(s, "%d", string(other), 0) s = strings.Replace(s, "%q", q, 0) if other != -1 && strings.Contains(s, "%i") { s = strings.Replace(s, "%i", pokemon.GetInstance().GetItemNameById(other), 0) } if other != -1 && strings.Contains(s, "%a") { s = strings.Replace(s, "%a", pokemon.GetInstance().GetAbilityNameById(other+1), 0) } if other != -1 && strings.Contains(s, "%p") { s = strings.Replace(s, "%p", pokemon.GetInstance().GetPokemonName(other, 0), 0) } b.WriteToHist(s + "\n") }
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) } }
func NewSwitchChoiceFromPacket(_packet *pnet.QTPacket) *SwitchChoice { return NewSwitchChoice(int(_packet.ReadUint8())) }
func NewAttackChoiceFromPacket(_packet *pnet.QTPacket) *AttackChoice { return NewAttackChoice(int(_packet.ReadUint8()), int(_packet.ReadUint8())) }