From 783993470e1fc0eba20c06a9c5e2c5e9dff53045 Mon Sep 17 00:00:00 2001 From: gravestench Date: Thu, 22 Oct 2020 06:12:06 +0100 Subject: [PATCH] Lint error cleanup1 (#779) * fixed lint error in d2app/app.go * go fmt entire project * adding doc.go for d2records * fixed lint issues in d2core/d2map * fixed lint error in d2interface/palette.go * fixed lint error in d2core/d2hero/hero_state_factory.go * adding dov.go to d2common/d2geom * fixing lint errors in d2common/d2loader * adding doc.go to d2common/d2cache * adding doc files for d2datautils, d2util, d2path * adding package doc strings for mapgen, in-geam help screen, and tcp client connection * removed all cuddling lint errors * changed stamina equality check to '<=' instead of '<' --- d2app/app.go | 2 +- d2common/d2cache/doc.go | 2 ++ d2common/d2datautils/doc.go | 3 ++ d2common/d2fileformats/d2mpq/mpq.go | 1 + d2common/d2fileformats/d2mpq/mpq_stream.go | 9 ++--- d2common/d2geom/doc.go | 2 ++ d2common/d2interface/palette.go | 2 +- d2common/d2loader/asset/source.go | 1 + d2common/d2loader/loader_test.go | 5 +++ d2common/d2path/doc.go | 2 ++ d2common/d2util/debug_print.go | 2 ++ d2common/d2util/doc.go | 3 ++ d2common/d2util/palette.go | 1 + d2core/d2asset/animation.go | 1 + d2core/d2gui/button.go | 3 ++ d2core/d2gui/label.go | 1 + d2core/d2hero/hero_state_factory.go | 3 +- d2core/d2item/diablo2item/item_factory.go | 1 + d2core/d2map/d2mapengine/engine.go | 5 +-- d2core/d2map/d2mapentity/factory.go | 2 ++ d2core/d2map/d2mapentity/player.go | 3 +- .../d2wilderness/wilderness_tile_types.go | 1 + d2core/d2map/d2maprenderer/renderer.go | 1 + d2core/d2map/d2maprenderer/tile_cache.go | 6 ++-- d2core/d2map/d2mapstamp/factory.go | 34 +++++++++++-------- d2core/d2records/doc.go | 8 +++++ d2core/d2records/object_details_loader.go | 2 +- d2core/d2records/skill_details_loader.go | 1 - d2core/d2ui/button.go | 2 ++ d2core/d2ui/checkbox.go | 3 ++ d2core/d2ui/ui_manager.go | 1 + d2game/d2gamescreen/character_select.go | 10 ++++++ d2game/d2gamescreen/credits.go | 2 ++ d2game/d2gamescreen/game.go | 1 + d2game/d2gamescreen/main_menu.go | 12 +++++++ d2game/d2player/escape_menu.go | 13 +++++++ d2game/d2player/game_controls.go | 18 +++++++--- d2game/d2player/help/help.go | 15 +++++++- d2game/d2player/hero_stats_panel.go | 1 + d2game/d2player/inventory_grid.go | 2 ++ .../remote_client_connection.go | 1 + d2networking/d2client/game_client.go | 1 + d2networking/d2netpacket/packet_add_player.go | 1 + .../d2netpacket/packet_generate_map.go | 1 + d2networking/d2netpacket/packet_item_spawn.go | 1 + .../d2netpacket/packet_move_player.go | 1 + d2networking/d2netpacket/packet_ping.go | 1 + .../d2netpacket/packet_player_cast.go | 1 + .../packet_player_connection_request.go | 1 + .../packet_player_disconnect_request.go | 1 + d2networking/d2netpacket/packet_pong.go | 1 + .../d2netpacket/packet_server_closed.go | 1 + .../d2netpacket/packet_update_server_info.go | 1 + .../tcp_client_connection.go | 1 + utils/extract-mpq/extract-mpq.go | 11 ++++-- 55 files changed, 175 insertions(+), 37 deletions(-) create mode 100644 d2common/d2cache/doc.go create mode 100644 d2common/d2datautils/doc.go create mode 100644 d2common/d2geom/doc.go create mode 100644 d2common/d2path/doc.go create mode 100644 d2common/d2util/doc.go create mode 100644 d2core/d2records/doc.go diff --git a/d2app/app.go b/d2app/app.go index f8ec956d..fcbd5b74 100644 --- a/d2app/app.go +++ b/d2app/app.go @@ -636,8 +636,8 @@ func (a *App) ToCharacterSelect(connType d2clientconnectiontype.ClientConnection func (a *App) ToMapEngineTest(region, level int) { met, err := d2gamescreen.CreateMapEngineTest(region, level, a.asset, a.terminal, a.renderer, a.inputManager, a.audio, a.screen) if err != nil { - return log.Print(err) + return } a.screen.SetNextScreen(met) diff --git a/d2common/d2cache/doc.go b/d2common/d2cache/doc.go new file mode 100644 index 00000000..b7c064e9 --- /dev/null +++ b/d2common/d2cache/doc.go @@ -0,0 +1,2 @@ +// Package d2cache provides a generic caching implementation +package d2cache diff --git a/d2common/d2datautils/doc.go b/d2common/d2datautils/doc.go new file mode 100644 index 00000000..8d72f218 --- /dev/null +++ b/d2common/d2datautils/doc.go @@ -0,0 +1,3 @@ +// Package d2datautils is a utility package that provides helper functions/classes +// for parsing the original diablo2 files. (eg. parsers for binary files that aren't byte-aligned) +package d2datautils diff --git a/d2common/d2fileformats/d2mpq/mpq.go b/d2common/d2fileformats/d2mpq/mpq.go index 0416b357..4b95d0ca 100644 --- a/d2common/d2fileformats/d2mpq/mpq.go +++ b/d2common/d2fileformats/d2mpq/mpq.go @@ -216,6 +216,7 @@ func (v *MPQ) loadBlockTable() { if err != nil { log.Print(err) } + blockData[i] = binary.LittleEndian.Uint32(hash) } diff --git a/d2common/d2fileformats/d2mpq/mpq_stream.go b/d2common/d2fileformats/d2mpq/mpq_stream.go index fb16af7a..816b92ee 100644 --- a/d2common/d2fileformats/d2mpq/mpq_stream.go +++ b/d2common/d2fileformats/d2mpq/mpq_stream.go @@ -166,10 +166,12 @@ func (v *Stream) bufferData() { func (v *Stream) loadSingleUnit() { fileData := make([]byte, v.BlockSize) + _, err := v.MPQData.file.Seek(int64(v.MPQData.data.HeaderSize), 0) if err != nil { log.Print(err) } + _, err = v.MPQData.file.Read(fileData) if err != nil { log.Print(err) @@ -204,6 +206,7 @@ func (v *Stream) loadBlock(blockIndex, expectedLength uint32) []byte { if err != nil { log.Print(err) } + _, err = v.MPQData.file.Read(data) if err != nil { log.Print(err) @@ -294,14 +297,13 @@ func deflate(data []byte) []byte { } buffer := new(bytes.Buffer) - _, err = buffer.ReadFrom(r) + _, err = buffer.ReadFrom(r) if err != nil { log.Panic(err) } err = r.Close() - if err != nil { log.Panic(err) } @@ -318,14 +320,13 @@ func pkDecompress(data []byte) []byte { } buffer := new(bytes.Buffer) - _, err = buffer.ReadFrom(r) + _, err = buffer.ReadFrom(r) if err != nil { panic(err) } err = r.Close() - if err != nil { panic(err) } diff --git a/d2common/d2geom/doc.go b/d2common/d2geom/doc.go new file mode 100644 index 00000000..a5dca600 --- /dev/null +++ b/d2common/d2geom/doc.go @@ -0,0 +1,2 @@ +// Package d2geom is a utility package for anything related to geometry +package d2geom diff --git a/d2common/d2interface/palette.go b/d2common/d2interface/palette.go index 927be9af..d9ec83a1 100644 --- a/d2common/d2interface/palette.go +++ b/d2common/d2interface/palette.go @@ -17,6 +17,6 @@ type Color interface { // Palette is a color palette type Palette interface { NumColors() int - GetColors() [256]Color + GetColors() [numColors]Color GetColor(idx int) (Color, error) } diff --git a/d2common/d2loader/asset/source.go b/d2common/d2loader/asset/source.go index ddfcd821..58834345 100644 --- a/d2common/d2loader/asset/source.go +++ b/d2common/d2loader/asset/source.go @@ -2,6 +2,7 @@ package asset import ( "fmt" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2loader/asset/types" ) diff --git a/d2common/d2loader/loader_test.go b/d2common/d2loader/loader_test.go index 39143597..34d1f845 100644 --- a/d2common/d2loader/loader_test.go +++ b/d2common/d2loader/loader_test.go @@ -81,6 +81,7 @@ func TestLoader_AddSource(t *testing.T) { } } +// nolint:gocyclo // this is just a test, not a big deal if we ignore linter here func TestLoader_Load(t *testing.T) { loader := NewLoader(nil) @@ -89,21 +90,25 @@ func TestLoader_Load(t *testing.T) { t.Fail() log.Print(err) } + _, err = loader.AddSource(sourcePathD) if err != nil { t.Fail() log.Print(err) } + _, err = loader.AddSource(sourcePathA) if err != nil { t.Fail() log.Print(err) } + _, err = loader.AddSource(sourcePathC) if err != nil { t.Fail() log.Print(err) } + entryCommon, errCommon := loader.Load(commonFile) // common file exists in all three Sources entryA, errA := loader.Load(exclusiveA) // each source has a file exclusive to itself diff --git a/d2common/d2path/doc.go b/d2common/d2path/doc.go new file mode 100644 index 00000000..a117ec29 --- /dev/null +++ b/d2common/d2path/doc.go @@ -0,0 +1,2 @@ +// Package d2path is a utility package for functionality related to map entity pathing +package d2path diff --git a/d2common/d2util/debug_print.go b/d2common/d2util/debug_print.go index ade84f61..fbd39a40 100644 --- a/d2common/d2util/debug_print.go +++ b/d2common/d2util/debug_print.go @@ -92,9 +92,11 @@ func (p *GlyphPrinter) drawDebugText(target *ebiten.Image, str string, ox, oy in op.CompositeMode = ebiten.CompositeModeLighter err := target.DrawImage(s, op) + if err != nil { log.Print(err) } + x += cw } } diff --git a/d2common/d2util/doc.go b/d2common/d2util/doc.go new file mode 100644 index 00000000..ac872158 --- /dev/null +++ b/d2common/d2util/doc.go @@ -0,0 +1,3 @@ +// Package d2util is a utility package for general-purpose functions used frequently throughout the +// codebase. +package d2util diff --git a/d2common/d2util/palette.go b/d2common/d2util/palette.go index df86ab7a..b514f74f 100644 --- a/d2common/d2util/palette.go +++ b/d2common/d2util/palette.go @@ -20,6 +20,7 @@ func ImgIndexToRGBA(indexData []byte, palette d2interface.Palette) []byte { if err != nil { log.Print(err) } + colorData[i*bytesPerPixel] = c.R() colorData[i*bytesPerPixel+1] = c.G() colorData[i*bytesPerPixel+2] = c.B() diff --git a/d2core/d2asset/animation.go b/d2core/d2asset/animation.go index a34461ec..80ab0310 100644 --- a/d2core/d2asset/animation.go +++ b/d2core/d2asset/animation.go @@ -238,6 +238,7 @@ func (a *Animation) GetCurrentFrameSize() (width, height int) { if err != nil { log.Print(err) } + return width, height } diff --git a/d2core/d2gui/button.go b/d2core/d2gui/button.go index 44534568..071038cb 100644 --- a/d2core/d2gui/button.go +++ b/d2core/d2gui/button.go @@ -28,16 +28,19 @@ type Button struct { func (b *Button) onMouseButtonDown(_ d2interface.MouseEvent) bool { b.state = buttonStatePressed + return false } func (b *Button) onMouseButtonUp(_ d2interface.MouseEvent) bool { b.state = buttonStateDefault + return false } func (b *Button) onMouseLeave(_ d2interface.MouseMoveEvent) bool { b.state = buttonStateDefault + return false } diff --git a/d2core/d2gui/label.go b/d2core/d2gui/label.go index 72530d5d..448b6b74 100644 --- a/d2core/d2gui/label.go +++ b/d2core/d2gui/label.go @@ -29,6 +29,7 @@ func createLabel(renderer d2interface.Renderer, text string, font *d2asset.Font) log.Print(err) return nil } + label.SetVisible(true) return label diff --git a/d2core/d2hero/hero_state_factory.go b/d2core/d2hero/hero_state_factory.go index 84a32839..6b782536 100644 --- a/d2core/d2hero/hero_state_factory.go +++ b/d2core/d2hero/hero_state_factory.go @@ -54,6 +54,7 @@ func (f *HeroStateFactory) CreateHeroState( defaultStats := f.asset.Records.Character.Stats[hero] skillState, err := f.CreateHeroSkillsState(defaultStats) + if err != nil { return nil, err } @@ -109,7 +110,7 @@ func (f *HeroStateFactory) CreateHeroSkillsState(classStats *d2records.CharStats for idx := range classStats.BaseSkill { skillName := &classStats.BaseSkill[idx] - if len(*skillName) == 0 { + if *skillName == "" { continue } diff --git a/d2core/d2item/diablo2item/item_factory.go b/d2core/d2item/diablo2item/item_factory.go index 431a4437..2d7f3155 100644 --- a/d2core/d2item/diablo2item/item_factory.go +++ b/d2core/d2item/diablo2item/item_factory.go @@ -149,6 +149,7 @@ func (f *ItemFactory) NewItem(codes ...string) (*Item, error) { } item.factory = f + return item.init(), nil } diff --git a/d2core/d2map/d2mapengine/engine.go b/d2core/d2map/d2mapengine/engine.go index 7f8606fe..3328bf42 100644 --- a/d2core/d2map/d2mapengine/engine.go +++ b/d2core/d2map/d2mapengine/engine.go @@ -32,7 +32,7 @@ type MapEngine struct { startSubTileY int // Starting Y position dt1Files []string // List of DS1 strings // TODO: remove this flag and show loading screen until the initial server packets are handled and the map is generated (only for remote client) - IsLoading bool // (temp) Whether we have processed the GenerateMapPacket(only for remote client) + IsLoading bool // (temp) Whether we have processed the GenerateMapPacket(only for remote client) } // CreateMapEngine creates a new instance of the map engine and returns a pointer to it. @@ -45,7 +45,7 @@ func CreateMapEngine(asset *d2asset.AssetManager) *MapEngine { MapEntityFactory: entity, StampFactory: stamp, // This will be set to true when we are using a remote client connection, and then set to false after we process the GenerateMapPacket - IsLoading: false, + IsLoading: false, } return engine @@ -93,6 +93,7 @@ func (m *MapEngine) addDT1(fileName string) { if err != nil { log.Print(err) } + m.dt1TileData = append(m.dt1TileData, dt1.Tiles...) m.dt1Files = append(m.dt1Files, fileName) } diff --git a/d2core/d2map/d2mapentity/factory.go b/d2core/d2map/d2mapentity/factory.go index 1c0cb06b..b2da0e45 100644 --- a/d2core/d2map/d2mapentity/factory.go +++ b/d2core/d2map/d2mapentity/factory.go @@ -192,9 +192,11 @@ func (f *MapEntityFactory) NewNPC(x, y int, monstat *d2records.MonStatsRecord, d composite, err := f.asset.LoadComposite(d2enum.ObjectTypeCharacter, monstat.AnimationDirectoryToken, d2resource.PaletteUnits) + if err != nil { return nil, err } + result.composite = composite if err := composite.SetMode(d2enum.MonsterAnimationModeNeutral, diff --git a/d2core/d2map/d2mapentity/player.go b/d2core/d2map/d2mapentity/player.go index c57e07d9..da7566ee 100644 --- a/d2core/d2map/d2mapentity/player.go +++ b/d2core/d2map/d2mapentity/player.go @@ -2,6 +2,7 @@ package d2mapentity import ( "fmt" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2math/d2vector" @@ -109,7 +110,7 @@ func (p *Player) Advance(tickTime float64) { // Drain and regenerate Stamina if p.IsRunning() && !p.atTarget() && !p.IsInTown() { p.Stats.Stamina -= float64(p.composite.AssetManager.Records.Character.Stats[p.Class].StaminaRunDrain) * tickTime / 5 - if p.Stats.Stamina < 0 { + if p.Stats.Stamina <= 0 { p.SetSpeed(baseWalkSpeed) p.Stats.Stamina = 0 } diff --git a/d2core/d2map/d2mapgen/d2wilderness/wilderness_tile_types.go b/d2core/d2map/d2mapgen/d2wilderness/wilderness_tile_types.go index d9fbc6ba..5a8fcbd6 100644 --- a/d2core/d2map/d2mapgen/d2wilderness/wilderness_tile_types.go +++ b/d2core/d2map/d2mapgen/d2wilderness/wilderness_tile_types.go @@ -1,3 +1,4 @@ +// Package d2wilderness provides an enumeration of wilderness types package d2wilderness // nolint: golint // these probably don't require individual explanations. diff --git a/d2core/d2map/d2maprenderer/renderer.go b/d2core/d2map/d2maprenderer/renderer.go index 11c7b9e1..0b59f8d0 100644 --- a/d2core/d2map/d2maprenderer/renderer.go +++ b/d2core/d2map/d2maprenderer/renderer.go @@ -130,6 +130,7 @@ func (mr *MapRenderer) Render(target d2interface.Surface) { if mr.mapEngine.IsLoading { return } + mapSize := mr.mapEngine.Size() stxf, styf := mr.viewport.ScreenToWorld(screenMiddleX, -200) diff --git a/d2core/d2map/d2maprenderer/tile_cache.go b/d2core/d2map/d2maprenderer/tile_cache.go index 14d489fa..110c7a13 100644 --- a/d2core/d2map/d2maprenderer/tile_cache.go +++ b/d2core/d2map/d2maprenderer/tile_cache.go @@ -3,17 +3,17 @@ package d2maprenderer import ( "log" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2util" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2ds1" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dt1" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2math" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2util" ) func (mr *MapRenderer) generateTileCache() { var err error mr.palette, err = mr.loadPaletteForAct(d2enum.RegionIdType(mr.mapEngine.LevelType().ID)) + if err != nil { log.Print(err) } @@ -88,6 +88,7 @@ func (mr *MapRenderer) generateFloorCache(tile *d2ds1.FloorShadowRecord) { tileYOffset := d2math.AbsInt32(tileYMinimum) tileHeight := d2math.AbsInt32(tileData[i].Height) image, err := mr.renderer.NewSurface(int(tileData[i].Width), int(tileHeight), d2enum.FilterNearest) + if err != nil { log.Print(err) } @@ -100,6 +101,7 @@ func (mr *MapRenderer) generateFloorCache(tile *d2ds1.FloorShadowRecord) { if err != nil { log.Print(err) } + mr.setImageCacheRecord(tile.Style, tile.Sequence, 0, tileIndex, image) } } diff --git a/d2core/d2map/d2mapstamp/factory.go b/d2core/d2map/d2mapstamp/factory.go index d5844bfa..bc9e4355 100644 --- a/d2core/d2map/d2mapstamp/factory.go +++ b/d2core/d2map/d2mapstamp/factory.go @@ -13,16 +13,20 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" ) +// NewStampFactory creates a MapStamp factory instance func NewStampFactory(asset *d2asset.AssetManager, entity *d2mapentity.MapEntityFactory) *StampFactory { return &StampFactory{asset, entity} } +// StampFactory is responsible for loading map stamps. A stamp can be thought of like a +// preset map configuration, like the various configurations of Act 1 town. type StampFactory struct { asset *d2asset.AssetManager entity *d2mapentity.MapEntityFactory } -// LoadStamp loads the Stamp data from file. +// LoadStamp loads the Stamp data from file, using the given level type, level preset index, and +// level file index. func (f *StampFactory) LoadStamp(levelType d2enum.RegionIdType, levelPreset, fileIndex int) *Stamp { stamp := &Stamp{ factory: f, @@ -33,20 +37,22 @@ func (f *StampFactory) LoadStamp(levelType d2enum.RegionIdType, levelPreset, fil } for _, levelTypeDt1 := range &stamp.levelType.Files { - if levelTypeDt1 != "" && levelTypeDt1 != "0" { - fileData, err := f.asset.LoadFile("/data/global/tiles/" + levelTypeDt1) - if err != nil { - panic(err) - } - - dt1, err := d2dt1.LoadDT1(fileData) - if err != nil { - log.Print(err) - return nil - } - - stamp.tiles = append(stamp.tiles, dt1.Tiles...) + if levelTypeDt1 == "" || levelTypeDt1 == "0" { + continue } + + fileData, err := f.asset.LoadFile("/data/global/tiles/" + levelTypeDt1) + if err != nil { + panic(err) + } + + dt1, err := d2dt1.LoadDT1(fileData) + if err != nil { + log.Print(err) + return nil + } + + stamp.tiles = append(stamp.tiles, dt1.Tiles...) } var levelFilesToPick []string diff --git a/d2core/d2records/doc.go b/d2core/d2records/doc.go new file mode 100644 index 00000000..a7ebb451 --- /dev/null +++ b/d2core/d2records/doc.go @@ -0,0 +1,8 @@ +// d2records provides a RecordManager implementation which is used to parse +// the various txt files from the d2 mpq archives. Each data dictionary (txt file) is +// parsed into slices or maps of structs. There is a struct type defined for each txt file. +// +// The RecordManager is a singleton that loads all of the txt files and export them as +// data members. The RecordManager is meant to be used a a singleton member, exported by the +// AssetManager in d2core/d2asset. +package d2records diff --git a/d2core/d2records/object_details_loader.go b/d2core/d2records/object_details_loader.go index 612b8c06..22c2c031 100644 --- a/d2core/d2records/object_details_loader.go +++ b/d2core/d2records/object_details_loader.go @@ -14,7 +14,7 @@ func objectDetailsLoader(r *RecordManager, d *d2txt.DataDictionary) error { for d.Next() { record := &ObjectDetailsRecord{ - Index: i, + Index: i, Name: d.String("Name"), Description: d.String("description - not loaded"), id: d.Number("Id"), diff --git a/d2core/d2records/skill_details_loader.go b/d2core/d2records/skill_details_loader.go index f320e663..363c958f 100644 --- a/d2core/d2records/skill_details_loader.go +++ b/d2core/d2records/skill_details_loader.go @@ -277,7 +277,6 @@ func skillDetailsLoader(r *RecordManager, d *d2txt.DataDictionary) error { return nil } - func animToEnum(anim string) d2enum.PlayerAnimationMode { switch anim { case "SC": diff --git a/d2core/d2ui/button.go b/d2core/d2ui/button.go index 9fa3f788..d38d56d5 100644 --- a/d2core/d2ui/button.go +++ b/d2core/d2ui/button.go @@ -220,6 +220,7 @@ func (ui *UIManager) NewButton(buttonType ButtonType, text string) *Button { log.Print(err) return nil } + btn.width += w } @@ -251,6 +252,7 @@ func (ui *UIManager) NewButton(buttonType ButtonType, text string) *Button { func (v *Button) renderFrames(btnSprite *Sprite, btnLayout *ButtonLayout, label *Label) { var err error + totalButtonTypes := btnSprite.GetFrameCount() / (btnLayout.XSegments * btnLayout.YSegments) err = btnSprite.RenderSegmented(v.normalSurface, btnLayout.XSegments, btnLayout.YSegments, btnLayout.BaseFrame) diff --git a/d2core/d2ui/checkbox.go b/d2core/d2ui/checkbox.go index 05326530..8b7f8a4e 100644 --- a/d2core/d2ui/checkbox.go +++ b/d2core/d2ui/checkbox.go @@ -26,6 +26,7 @@ type Checkbox struct { // NewCheckbox creates a new instance of a checkbox func (ui *UIManager) NewCheckbox(checkState bool) *Checkbox { var err error + result := &Checkbox{ checkState: checkState, visible: true, @@ -45,6 +46,7 @@ func (ui *UIManager) NewCheckbox(checkState bool) *Checkbox { log.Print(err) return nil } + checkboxSprite.SetPosition(0, 0) result.Image, err = ui.renderer.NewSurface(result.width, result.height, d2enum.FilterNearest) @@ -84,6 +86,7 @@ func (v *Checkbox) bindManager(manager *UIManager) { // Render renders the checkbox func (v *Checkbox) Render(target d2interface.Surface) error { var err error + target.PushTranslation(v.x, v.y) defer target.Pop() diff --git a/d2core/d2ui/ui_manager.go b/d2core/d2ui/ui_manager.go index 52623162..8961060d 100644 --- a/d2core/d2ui/ui_manager.go +++ b/d2core/d2ui/ui_manager.go @@ -53,6 +53,7 @@ func (ui *UIManager) addWidget(widget Widget) { if err != nil { log.Print(err) } + ui.widgets = append(ui.widgets, widget) widget.bindManager(ui) diff --git a/d2game/d2gamescreen/character_select.go b/d2game/d2gamescreen/character_select.go index f2dfc225..8d844a67 100644 --- a/d2game/d2gamescreen/character_select.go +++ b/d2game/d2gamescreen/character_select.go @@ -143,6 +143,7 @@ const ( // OnLoad loads the resources for the Character Select screen func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { var err error + v.audioProvider.PlayBGM(d2resource.BGMTitle) if err := v.inputManager.BindHandler(v); err != nil { @@ -152,10 +153,12 @@ func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { loading.Progress(tenPercent) bgX, bgY := 0, 0 + v.background, err = v.uiManager.NewSprite(d2resource.CharacterSelectionBackground, d2resource.PaletteSky) if err != nil { log.Print(err) } + v.background.SetPosition(bgX, bgY) v.createButtons(loading) @@ -178,6 +181,7 @@ func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { if err != nil { log.Print(err) } + selBoxX, selBoxY := 37, 86 v.selectionBox.SetPosition(selBoxX, selBoxY) @@ -185,6 +189,7 @@ func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { if err != nil { log.Print(err) } + okCancelX, okCancelY := 270, 175 v.okCancelBox.SetPosition(okCancelX, okCancelY) @@ -196,6 +201,7 @@ func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { for i := 0; i < 8; i++ { offsetX, offsetY := rootLabelOffsetX, rootLabelOffsetY+((i/2)*95) + if i&1 > 0 { offsetX = 385 } @@ -205,10 +211,12 @@ func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { v.characterNameLabel[i].Color[0] = rgbaColor(lightBrown) offsetY += labelHeight + v.characterStatsLabel[i] = v.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteUnits) v.characterStatsLabel[i].SetPosition(offsetX, offsetY) offsetY += labelHeight + v.characterExpLabel[i] = v.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteStatic) v.characterExpLabel[i].SetPosition(offsetX, offsetY) v.characterExpLabel[i].Color[0] = rgbaColor(lightGreen) @@ -287,6 +295,7 @@ func (v *CharacterSelect) updateCharacterBoxes() { for i := 0; i < 8; i++ { idx := i + (v.charScrollbar.GetCurrentOffset() * 2) + if idx >= len(v.gameStates) { v.characterNameLabel[i].SetText("") v.characterStatsLabel[i].SetText("") @@ -455,6 +464,7 @@ func (v *CharacterSelect) onDeleteCharacterConfirmClicked() { if err != nil { log.Print(err) } + v.charScrollbar.SetCurrentOffset(0) v.refreshGameStates() v.toggleDeleteCharacterDialog(false) diff --git a/d2game/d2gamescreen/credits.go b/d2game/d2gamescreen/credits.go index 0cf4b100..e2cac97f 100644 --- a/d2game/d2gamescreen/credits.go +++ b/d2game/d2gamescreen/credits.go @@ -90,10 +90,12 @@ func (v *Credits) LoadContributors() []string { // OnLoad is called to load the resources for the credits screen func (v *Credits) OnLoad(loading d2screen.LoadingState) { var err error + v.creditsBackground, err = v.uiManager.NewSprite(d2resource.CreditsBackground, d2resource.PaletteSky) if err != nil { log.Print(err) } + v.creditsBackground.SetPosition(creditsX, creditsY) loading.Progress(twentyPercent) diff --git a/d2game/d2gamescreen/game.go b/d2game/d2gamescreen/game.go index 6d08f9ba..5a3bdfd6 100644 --- a/d2game/d2gamescreen/game.go +++ b/d2game/d2gamescreen/game.go @@ -208,6 +208,7 @@ func (v *Game) Render(screen d2interface.Surface) error { // When help overlay is open, put transparent black screen. Magic noumber is hex for RGBA. screen.DrawRect(800, 600, d2util.Color(0x0000007f)) } + if err := v.gameControls.Render(screen); err != nil { return err } diff --git a/d2game/d2gamescreen/main_menu.go b/d2game/d2gamescreen/main_menu.go index 3ad79664..f58f7f4e 100644 --- a/d2game/d2gamescreen/main_menu.go +++ b/d2game/d2gamescreen/main_menu.go @@ -183,28 +183,33 @@ func (v *MainMenu) OnLoad(loading d2screen.LoadingState) { func (v *MainMenu) loadBackgroundSprites() { var err error + v.background, err = v.uiManager.NewSprite(d2resource.GameSelectScreen, d2resource.PaletteSky) if err != nil { log.Print(err) } + v.background.SetPosition(backgroundX, backgroundY) v.trademarkBackground, err = v.uiManager.NewSprite(d2resource.TrademarkScreen, d2resource.PaletteSky) if err != nil { log.Print(err) } + v.trademarkBackground.SetPosition(backgroundX, backgroundY) v.tcpIPBackground, err = v.uiManager.NewSprite(d2resource.TCPIPBackground, d2resource.PaletteSky) if err != nil { log.Print(err) } + v.tcpIPBackground.SetPosition(backgroundX, backgroundY) v.serverIPBackground, err = v.uiManager.NewSprite(d2resource.PopUpOkCancel, d2resource.PaletteFechar) if err != nil { log.Print(err) } + v.serverIPBackground.SetPosition(serverIPbackgroundX, serverIPbackgroundY) } @@ -248,18 +253,22 @@ func (v *MainMenu) createLabels(loading d2screen.LoadingState) { v.tcpJoinGameLabel = v.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteUnits) v.tcpJoinGameLabel.Alignment = d2gui.HorizontalAlignCenter + v.tcpJoinGameLabel.SetText("Enter Host IP Address\nto Join Game") v.tcpJoinGameLabel.Color[0] = rgbaColor(gold) + v.tcpJoinGameLabel.SetPosition(joinGameX, joinGameY) } func (v *MainMenu) createLogos(loading d2screen.LoadingState) { var err error + v.diabloLogoLeft, err = v.uiManager.NewSprite(d2resource.Diablo2LogoFireLeft, d2resource.PaletteUnits) if err != nil { log.Print(err) } + v.diabloLogoLeft.SetEffect(d2enum.DrawEffectModulate) v.diabloLogoLeft.PlayForward() v.diabloLogoLeft.SetPosition(diabloLogoX, diabloLogoY) @@ -269,6 +278,7 @@ func (v *MainMenu) createLogos(loading d2screen.LoadingState) { if err != nil { log.Print(err) } + v.diabloLogoRight.SetEffect(d2enum.DrawEffectModulate) v.diabloLogoRight.PlayForward() v.diabloLogoRight.SetPosition(diabloLogoX, diabloLogoY) @@ -277,12 +287,14 @@ func (v *MainMenu) createLogos(loading d2screen.LoadingState) { if err != nil { log.Print(err) } + v.diabloLogoLeftBack.SetPosition(diabloLogoX, diabloLogoY) v.diabloLogoRightBack, err = v.uiManager.NewSprite(d2resource.Diablo2LogoBlackRight, d2resource.PaletteUnits) if err != nil { log.Print(err) } + v.diabloLogoRightBack.SetPosition(diabloLogoX, diabloLogoY) } diff --git a/d2game/d2player/escape_menu.go b/d2game/d2player/escape_menu.go index a85f6aeb..8272e1a7 100644 --- a/d2game/d2player/escape_menu.go +++ b/d2game/d2player/escape_menu.go @@ -229,6 +229,7 @@ func (m *EscapeMenu) wrapLayout(fn func(*layout)) *layout { left := center.AddLayout(d2gui.PositionTypeVertical) left.SetSize(sidePanelsSize, pentSize) leftPent, err := left.AddAnimatedSprite(d2resource.PentSpin, d2resource.PaletteUnits, d2gui.DirectionBackward) + if err != nil { log.Print(err) return nil @@ -248,6 +249,7 @@ func (m *EscapeMenu) wrapLayout(fn func(*layout)) *layout { right.AddSpacerStatic(sidePanelsSize-pentSize, 0) right.SetSize(sidePanelsSize, pentSize) rightPent, err := right.AddAnimatedSprite(d2resource.PentSpin, d2resource.PaletteUnits, d2gui.DirectionForward) + if err != nil { log.Print(err) return nil @@ -290,12 +292,14 @@ func (m *EscapeMenu) addBigSelectionLabel(l *layout, text string, targetLayout l label.SetMouseEnterHandler(func(_ d2interface.MouseMoveEvent) { m.onHoverElement(elID) }) + l.AddSpacerStatic(spacerWidth, labelGutter) l.actionableElements = append(l.actionableElements, label) } func (m *EscapeMenu) addPreviousMenuLabel(l *layout) { l.AddSpacerStatic(spacerWidth, labelGutter) + guiLabel, err := l.AddLabel("PREVIOUS MENU", d2gui.FontStyle30Units) if err != nil { log.Print(err) @@ -330,7 +334,9 @@ func (m *EscapeMenu) addEnumLabel(l *layout, optID optionID, text string, values layout.SetMouseEnterHandler(func(_ d2interface.MouseMoveEvent) { m.onHoverElement(elID) }) + layout.AddSpacerDynamic() + guiLabel, err := layout.AddLabel(values[0], d2gui.FontStyle30Units) if err != nil { log.Print(err) @@ -350,11 +356,13 @@ func (m *EscapeMenu) addEnumLabel(l *layout, optID optionID, text string, values label.Trigger() }) l.AddSpacerStatic(spacerWidth, labelGutter) + l.actionableElements = append(l.actionableElements, label) } func (m *EscapeMenu) OnLoad() { var err error + m.selectSound, err = m.audioProvider.LoadSound(d2resource.SFXCursorSelect, false, false) if err != nil { log.Print(err) @@ -415,6 +423,7 @@ func (m *EscapeMenu) onHoverElement(id int) { x, _ := m.leftPent.GetPosition() m.leftPent.SetPosition(x, y+spacerWidth) + x, _ = m.rightPent.GetPosition() m.rightPent.SetPosition(x, y+spacerWidth) } @@ -428,6 +437,7 @@ func (m *EscapeMenu) setLayout(id layoutID) { m.rightPent = m.layouts[id].rightPent m.currentLayout = id m.layouts[id].currentEl = len(m.layouts[id].actionableElements) - 1 // default to Previous Menu + m.guiManager.SetLayout(m.layouts[id].Layout) // when first rendering a layout, widgets don't have offsets so we hide pentagrams for a frame @@ -435,6 +445,7 @@ func (m *EscapeMenu) setLayout(id layoutID) { m.layouts[id].rendered = true m.leftPent.SetVisible(false) m.rightPent.SetVisible(false) + go func() { time.Sleep(16 * time.Millisecond) m.onHoverElement(m.layouts[id].currentEl) @@ -454,6 +465,7 @@ func (m *EscapeMenu) onUpKey() { if m.layouts[m.currentLayout].currentEl == 0 { return } + m.layouts[m.currentLayout].currentEl-- m.onHoverElement(m.layouts[m.currentLayout].currentEl) } @@ -466,6 +478,7 @@ func (m *EscapeMenu) onDownKey() { if m.layouts[m.currentLayout].currentEl == len(m.layouts[m.currentLayout].actionableElements)-1 { return } + m.layouts[m.currentLayout].currentEl++ m.onHoverElement(m.layouts[m.currentLayout].currentEl) } diff --git a/d2game/d2player/game_controls.go b/d2game/d2player/game_controls.go index 4c68ae97..91e71d4f 100644 --- a/d2game/d2player/game_controls.go +++ b/d2game/d2player/game_controls.go @@ -334,23 +334,28 @@ func (g *GameControls) OnKeyUp(event d2interface.KeyEvent) bool { return false } +// When escape is pressed: +// 1. If there was some overlay or panel open, close it +// 2. Otherwise, if the Escape Menu was open, let the Escape Menu handle it +// 3. If nothing was open, open the Escape Menu func (g *GameControls) onEscKey() { - // When escape is pressed: - // 1. If there was some overlay or panel open, close it - // 2. Otherwise, if the Escape Menu was open, let the Escape Menu handle it - // 3. If nothing was open, open the Escape Menu - escHandled := false + if g.inventory.IsOpen() { g.inventory.Close() + escHandled = true } + if g.heroStatsPanel.IsOpen() { g.heroStatsPanel.Close() + escHandled = true } + if g.HelpOverlay.IsOpen() { g.HelpOverlay.Toggle() + escHandled = true } @@ -476,6 +481,7 @@ func (g *GameControls) OnMouseButtonDown(event d2interface.MouseEvent) bool { // Load the resources required for the GameControls func (g *GameControls) Load() { var err error + g.globeSprite, err = g.ui.NewSprite(d2resource.GameGlobeOverlap, d2resource.PaletteSky) if err != nil { log.Print(err) @@ -495,6 +501,7 @@ func (g *GameControls) Load() { if err != nil { log.Print(err) } + err = g.menuButton.SetCurrentFrame(2) if err != nil { log.Print(err) @@ -1010,6 +1017,7 @@ func (g *GameControls) Render(target d2interface.Surface) error { g.nameLabel.SetPosition(255, 535) g.nameLabel.Render(target) } + return nil } diff --git a/d2game/d2player/help/help.go b/d2game/d2player/help/help.go index 91f1aff1..c6e96d73 100644 --- a/d2game/d2player/help/help.go +++ b/d2game/d2player/help/help.go @@ -1,3 +1,4 @@ +// Package help contains the in-game diablo2 help panel package help import ( @@ -58,6 +59,7 @@ func NewHelpOverlay( func (h *Overlay) Toggle() { fmt.Print("Help overlay toggled\n") + if h.isOpen { h.close() } else { @@ -95,6 +97,7 @@ func (h *Overlay) IsInRect(px, py int) bool { if px >= x && px <= x+ww && py >= y && py <= y+hh { return true } + return false } @@ -106,6 +109,7 @@ func (h *Overlay) Load() { prevX = 0 prevY = 0 ) + for frameIndex := 0; frameIndex < 7; frameIndex++ { f, err := h.uiManager.NewSprite(d2resource.HelpBorder, d2resource.PaletteSky) if err != nil { @@ -176,6 +180,7 @@ func (h *Overlay) Load() { // Bullets yOffset := 59 + h.createBullet(callout{ LabelText: fmt.Sprintf(d2tbl.TranslateString("StrHelp2"), "Ctrl"), // TODO "Ctrl" should be hotkey // "Hold Down <%s> to Run" LabelX: 100, @@ -185,6 +190,7 @@ func (h *Overlay) Load() { }) yOffset += 20 + h.createBullet(callout{ LabelText: fmt.Sprintf(d2tbl.TranslateString("StrHelp3"), "Alt"), // TODO "Alt" should be hotkey // "Hold down <%s> to highlight items on the ground" LabelX: 100, @@ -194,6 +200,7 @@ func (h *Overlay) Load() { }) yOffset += 20 + h.createBullet(callout{ LabelText: fmt.Sprintf(d2tbl.TranslateString("StrHelp4"), "Shift"), // TODO "Shift" should be hotkey // "Hold down <%s> to attack while standing still" LabelX: 100, @@ -203,6 +210,7 @@ func (h *Overlay) Load() { }) yOffset += 20 + h.createBullet(callout{ LabelText: fmt.Sprintf(d2tbl.TranslateString("StrHelp5"), "Tab"), // TODO "Tab" should be hotkey // "Hit <%s> to toggle the automap on and off" LabelX: 100, @@ -212,6 +220,7 @@ func (h *Overlay) Load() { }) yOffset += 20 + h.createBullet(callout{ LabelText: d2tbl.TranslateString("StrHelp6"), // "Hit to bring up the Game Menu" LabelX: 100, @@ -221,6 +230,7 @@ func (h *Overlay) Load() { }) yOffset += 20 + h.createBullet(callout{ LabelText: d2tbl.TranslateString("StrHelp7"), // "Hit to go into chat mode" LabelX: 100, @@ -230,6 +240,7 @@ func (h *Overlay) Load() { }) yOffset += 20 + h.createBullet(callout{ LabelText: d2tbl.TranslateString("StrHelp8"), // "Hit F1-F8 to set your Left or Right Mouse Buttton Skills." LabelX: 100, @@ -239,6 +250,7 @@ func (h *Overlay) Load() { }) yOffset += 20 + h.createBullet(callout{ LabelText: fmt.Sprintf(d2tbl.TranslateString("StrHelp8a"), "H"), // TODO "H" should be hotkey LabelX: 100, @@ -391,7 +403,6 @@ func (h *Overlay) Load() { DotX: 530, DotY: 568, }) - } type line struct { @@ -426,6 +437,7 @@ func (h *Overlay) createBullet(c callout) { if err != nil { log.Print(err) } + newDot.SetPosition(c.DotX, c.DotY+14) h.frames = append(h.frames, newDot) } @@ -456,6 +468,7 @@ func (h *Overlay) createCallout(c callout) { MoveY: c.DotY - c.LabelY - hh - 5, Color: color.White, } + h.lines = append(h.lines, l) newDot, err := h.uiManager.NewSprite(d2resource.HelpWhiteBullet, d2resource.PaletteSky) diff --git a/d2game/d2player/hero_stats_panel.go b/d2game/d2player/hero_stats_panel.go index 79784d31..82088c88 100644 --- a/d2game/d2player/hero_stats_panel.go +++ b/d2game/d2player/hero_stats_panel.go @@ -80,6 +80,7 @@ func NewHeroStatsPanel(asset *d2asset.AssetManager, ui *d2ui.UIManager, heroName // Load the data for the hero status panel func (s *HeroStatsPanel) Load() { var err error + s.frame, err = s.uiManager.NewSprite(d2resource.Frame, d2resource.PaletteSky) if err != nil { log.Print(err) diff --git a/d2game/d2player/inventory_grid.go b/d2game/d2player/inventory_grid.go index 927e9fc7..ff0976f4 100644 --- a/d2game/d2player/inventory_grid.go +++ b/d2game/d2player/inventory_grid.go @@ -123,6 +123,7 @@ func (g *ItemGrid) loadItem(item InventoryItem) { // TODO: Put the pattern into D2Shared imgPath := fmt.Sprintf("/data/global/items/inv%s.dc6", item.GetItemCode()) + itemSprite, err := g.uiManager.NewSprite(imgPath, d2resource.PaletteSky) if err != nil { log.Printf("Failed to load sprite, error: " + err.Error()) @@ -223,6 +224,7 @@ func (g *ItemGrid) renderItem(item InventoryItem, target d2interface.Surface, x, if itemSprite != nil { itemSprite.SetPosition(x, y) itemSprite.GetCurrentFrameSize() + err := itemSprite.Render(target) if err != nil { log.Print(err) diff --git a/d2networking/d2client/d2remoteclient/remote_client_connection.go b/d2networking/d2client/d2remoteclient/remote_client_connection.go index 06adc0ae..dac3e62f 100644 --- a/d2networking/d2client/d2remoteclient/remote_client_connection.go +++ b/d2networking/d2client/d2remoteclient/remote_client_connection.go @@ -198,6 +198,7 @@ func (r *RemoteClientConnection) decodeToPacket(t d2netpackettype.NetPacketType, if err = json.Unmarshal([]byte(data), &p); err != nil { break } + np = d2netpacket.NetPacket{PacketType: t, PacketData: d2netpacket.MarshalPacket(p)} case d2netpackettype.CastSkill: diff --git a/d2networking/d2client/game_client.go b/d2networking/d2client/game_client.go index 044c9c87..b3de59f0 100644 --- a/d2networking/d2client/game_client.go +++ b/d2networking/d2client/game_client.go @@ -279,6 +279,7 @@ func (g *GameClient) handleCastSkillPacket(packet d2netpacket.NetPacket) error { player.SetDirection(direction) skillRecord := g.asset.Records.Skill.Details[playerCast.SkillID] + missileEntity, err := g.createMissileEntity(skillRecord, player, castX, castY) if err != nil { return err diff --git a/d2networking/d2netpacket/packet_add_player.go b/d2networking/d2netpacket/packet_add_player.go index 27a096f4..36b88415 100644 --- a/d2networking/d2netpacket/packet_add_player.go +++ b/d2networking/d2netpacket/packet_add_player.go @@ -38,6 +38,7 @@ func CreateAddPlayerPacket(id, name string, x, y int, heroType d2enum.Hero, Stats: stats, Skills: skills, } + b, err := json.Marshal(addPlayerPacket) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_generate_map.go b/d2networking/d2netpacket/packet_generate_map.go index 458bfa66..00680d14 100644 --- a/d2networking/d2netpacket/packet_generate_map.go +++ b/d2networking/d2netpacket/packet_generate_map.go @@ -21,6 +21,7 @@ func CreateGenerateMapPacket(regionType d2enum.RegionIdType) NetPacket { generateMapPacket := GenerateMapPacket{ RegionType: regionType, } + b, err := json.Marshal(generateMapPacket) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_item_spawn.go b/d2networking/d2netpacket/packet_item_spawn.go index d8317b49..3564c84f 100644 --- a/d2networking/d2netpacket/packet_item_spawn.go +++ b/d2networking/d2netpacket/packet_item_spawn.go @@ -22,6 +22,7 @@ func CreateSpawnItemPacket(x, y int, codes ...string) NetPacket { Y: y, Codes: codes, } + b, err := json.Marshal(spawnItemPacket) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_move_player.go b/d2networking/d2netpacket/packet_move_player.go index d8c83779..a7e3b5fc 100644 --- a/d2networking/d2netpacket/packet_move_player.go +++ b/d2networking/d2netpacket/packet_move_player.go @@ -28,6 +28,7 @@ func CreateMovePlayerPacket(playerID string, startX, startY, destX, destY float6 DestX: destX, DestY: destY, } + b, err := json.Marshal(movePlayerPacket) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_ping.go b/d2networking/d2netpacket/packet_ping.go index 03ffa469..4b13d2e2 100644 --- a/d2networking/d2netpacket/packet_ping.go +++ b/d2networking/d2netpacket/packet_ping.go @@ -20,6 +20,7 @@ func CreatePingPacket() NetPacket { ping := PingPacket{ TS: time.Now(), } + b, err := json.Marshal(ping) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_player_cast.go b/d2networking/d2netpacket/packet_player_cast.go index 03f8d7d6..79460203 100644 --- a/d2networking/d2netpacket/packet_player_cast.go +++ b/d2networking/d2netpacket/packet_player_cast.go @@ -29,6 +29,7 @@ func CreateCastPacket(entityID string, skillID int, targetX, targetY float64) Ne TargetY: targetY, TargetEntityID: "", // TODO implement targeting entities } + b, err := json.Marshal(castPacket) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_player_connection_request.go b/d2networking/d2netpacket/packet_player_connection_request.go index 733fba5b..1db72b92 100644 --- a/d2networking/d2netpacket/packet_player_connection_request.go +++ b/d2networking/d2netpacket/packet_player_connection_request.go @@ -23,6 +23,7 @@ func CreatePlayerConnectionRequestPacket(id string, playerState *d2hero.HeroStat ID: id, PlayerState: playerState, } + b, err := json.Marshal(playerConnectionRequest) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_player_disconnect_request.go b/d2networking/d2netpacket/packet_player_disconnect_request.go index b6a47f54..aca0324f 100644 --- a/d2networking/d2netpacket/packet_player_disconnect_request.go +++ b/d2networking/d2netpacket/packet_player_disconnect_request.go @@ -22,6 +22,7 @@ func CreatePlayerDisconnectRequestPacket(id string) NetPacket { playerDisconnectRequest := PlayerDisconnectRequestPacket{ ID: id, } + b, err := json.Marshal(playerDisconnectRequest) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_pong.go b/d2networking/d2netpacket/packet_pong.go index c900e382..7dbe124f 100644 --- a/d2networking/d2netpacket/packet_pong.go +++ b/d2networking/d2netpacket/packet_pong.go @@ -22,6 +22,7 @@ func CreatePongPacket(id string) NetPacket { ID: id, TS: time.Now(), } + b, err := json.Marshal(pong) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_server_closed.go b/d2networking/d2netpacket/packet_server_closed.go index 3ab4f678..a34ed44c 100644 --- a/d2networking/d2netpacket/packet_server_closed.go +++ b/d2networking/d2netpacket/packet_server_closed.go @@ -20,6 +20,7 @@ func CreateServerClosedPacket() NetPacket { serverClosed := ServerClosedPacket{ TS: time.Now(), } + b, err := json.Marshal(serverClosed) if err != nil { log.Print(err) diff --git a/d2networking/d2netpacket/packet_update_server_info.go b/d2networking/d2netpacket/packet_update_server_info.go index 797a9a7e..c3e62ef4 100644 --- a/d2networking/d2netpacket/packet_update_server_info.go +++ b/d2networking/d2netpacket/packet_update_server_info.go @@ -21,6 +21,7 @@ func CreateUpdateServerInfoPacket(seed int64, playerID string) NetPacket { Seed: seed, PlayerID: playerID, } + b, err := json.Marshal(updateServerInfo) if err != nil { log.Print(err) diff --git a/d2networking/d2server/d2tcpclientconnection/tcp_client_connection.go b/d2networking/d2server/d2tcpclientconnection/tcp_client_connection.go index 1c9debd8..56493a2b 100644 --- a/d2networking/d2server/d2tcpclientconnection/tcp_client_connection.go +++ b/d2networking/d2server/d2tcpclientconnection/tcp_client_connection.go @@ -1,3 +1,4 @@ +// Package d2tcpclientconnection provides a TCP protocol implementation of a client connection package d2tcpclientconnection import ( diff --git a/utils/extract-mpq/extract-mpq.go b/utils/extract-mpq/extract-mpq.go index 91a9de64..e1ef2731 100644 --- a/utils/extract-mpq/extract-mpq.go +++ b/utils/extract-mpq/extract-mpq.go @@ -3,12 +3,13 @@ package main import ( "flag" "fmt" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "log" "os" "path/filepath" "strings" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq" ) @@ -17,6 +18,7 @@ func main() { outPath string verbose bool ) + flag.StringVar(&outPath, "o", "./output/", "output directory") flag.BoolVar(&verbose, "v", false, "verbose output") flag.Parse() @@ -28,6 +30,7 @@ func main() { filename := flag.Arg(0) mpq, err := d2mpq.Load(filename) + if err != nil { log.Fatal(err) } @@ -38,6 +41,7 @@ func main() { } _, mpqFile := filepath.Split(strings.Replace(filename, "\\", "/", -1)) + for _, filename := range list { extractFile(mpq, mpqFile, filename, outPath) @@ -47,7 +51,7 @@ func main() { } } -func extractFile(mpq d2interface.Archive, mpqFile string, filename string, outPath string) { +func extractFile(mpq d2interface.Archive, mpqFile string, filename string, outPath string) { defer func() { if r := recover(); r != nil { log.Printf("recovered from panic in file: %s, %v", filename, r) @@ -67,6 +71,7 @@ func extractFile(mpq d2interface.Archive, mpqFile string, filename string, outPa log.Printf("failed to create file: %s, %v", filename, err) return } + defer f.Close() buf, err := mpq.ReadFile(filename) @@ -74,6 +79,6 @@ func extractFile(mpq d2interface.Archive, mpqFile string, filename string, outPa log.Printf("failed to read file: %s, %v", filename, err) return } - f.Write(buf) + f.Write(buf) }