Skip to content

Commit

Permalink
Merge pull request #19 from Galaco/refactor
Browse files Browse the repository at this point in the history
Refactor
  • Loading branch information
Galaco authored Mar 19, 2019
2 parents 06e43c6 + dd60906 commit 1654020
Show file tree
Hide file tree
Showing 96 changed files with 1,312 additions and 813 deletions.
Binary file removed .DS_Store
Binary file not shown.
8 changes: 8 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: 2
jobs:
build:
docker:
- image: circleci/golang:1.12
steps:
- checkout
- run: go test -v ./...
39 changes: 39 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# This is a weird way of telling Travis to use the fast container-based test
# runner instead of the slow VM-based runner.
sudo: false

language: go

# Force-enable Go modules. This will be unnecessary when Go 1.12 lands.
env:
- GO111MODULE=on

# You don't need to test on very old version of the Go compiler. It's the user's
# responsibility to keep their compilers up to date.
go:
- 1.11.x

# Only clone the most recent commit.
git:
depth: 1

# Skip the install step. Don't `go get` dependencies. Only build with the code
# in vendor/
install: true

# Don't email me the results of the test runs.
notifications:
email: false

# Anything in before_script that returns a nonzero exit code will flunk the
# build and immediately stop. It's sorta like having set -e enabled in bash.
# Make sure golangci-lint is vendored.
before_script:
- go get -v github.com/golangci/golangci-lint/cmd/golangci-lint

# script always runs to completion (set +e). If we have linter issues AND a
# failing test, we want to see both. Configure golangci-lint with a
# .golangci.yml file at the top level of your repo.
script:
- golangci-lint run # run a bunch of code checkers/linters in parallel
- go test -v -race ./... # Run all the tests with the race detector enabled
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
[![GoDoc](https://godoc.org/github.com/Galaco/bsp?status.svg)](https://godoc.org/github.com/Galaco/bsp)
[![Go report card](https://goreportcard.com/badge/github.com/galaco/bsp)](https://goreportcard.com/badge/github.com/galaco/bsp)
[![GolangCI](https://golangci.com/badges/github.com/galaco/bsp.svg)](https://golangci.com)
[![Build Status](https://travis-ci.com/Galaco/bsp.svg?branch=dev)](https://travis-ci.com/Galaco/bsp)
[![CircleCI](https://circleci.com/gh/Galaco/bsp.svg?style=svg)](https://circleci.com/gh/Galaco/bsp)

# Bsp
Go library for manipulating Source Engine .bsp map files.
Expand Down
24 changes: 12 additions & 12 deletions bsp.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package bsp

import "github.com/galaco/bsp/lumps"

// Root .bsp filetype container.
// Bsp is the root .bsp filetype container.
// Consists of a 1036byte header and 64 lump blocks.
type Bsp struct {
header Header
lumps [64]Lump
}

// Bsp header. Contains format and lump layout data.
// Header is the Bsp header. Contains format and lump layout data.
// Do not trust lump information between import and export
type Header struct {
Id int32
Expand All @@ -18,30 +18,30 @@ type Header struct {
Revision int32
}

// Layout information for a given lump, stored in the Header.
// HeaderLump contains layout information for a given lump, stored in the Header.
type HeaderLump struct {
Offset int32
Length int32
Version int32
Id [4]byte
}

// Get the header for a bsp.
// GetHeader gets the header for a bsp.
func (bsp *Bsp) GetHeader() Header {
return bsp.header
}

// Get the lump for a given index.
func (bsp *Bsp) GetLump(index int) lumps.ILump {
// GetLump gets the lump for a given index.
func (bsp *Bsp) GetLump(index LumpId) lumps.ILump {
return bsp.GetLumpRaw(index).GetContents()
}

// Get the lump for a given index.
func (bsp *Bsp) GetLumpRaw(index int) *Lump {
return &bsp.lumps[index]
// GetLumpRaw gets the lump for a given index.
func (bsp *Bsp) GetLumpRaw(index LumpId) *Lump {
return &bsp.lumps[int(index)]
}

// Set the lump data for a given index.
func (bsp *Bsp) SetLump(index int, lump Lump) {
bsp.lumps[index] = lump
// SetLump sets the lump data for a given index.
func (bsp *Bsp) SetLump(index LumpId, lump Lump) {
bsp.lumps[int(index)] = lump
}
144 changes: 144 additions & 0 deletions bspFlags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package bsp

const (
CONTENTS_EMPTY = 0 // No contents

CONTENTS_SOLID = 0x1 // an eye is never valid in a solid
CONTENTS_WINDOW = 0x2 // translucent, but not watery (glass)
CONTENTS_AUX = 0x4
CONTENTS_GRATE = 0x8 // alpha-tested "grate" textures. Bullets/sight pass through, but solids don't
CONTENTS_SLIME = 0x10
CONTENTS_WATER = 0x20
CONTENTS_BLOCKLOS = 0x40 // block AI line of sight
CONTENTS_OPAQUE = 0x80 // things that cannot be seen through (may be non-solid though)
LAST_VISIBLE_CONTENTS = 0x80

ALL_VISIBLE_CONTENTS = LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS - 1)

CONTENTS_TESTFOGVOLUME = 0x100
CONTENTS_UNUSED = 0x200

// unused
// NOTE: If it's visible, grab from the top + update LAST_VISIBLE_CONTENTS
// if not visible, then grab from the bottom.
CONTENTS_UNUSED6 = 0x400

CONTENTS_TEAM1 = 0x800 // per team contents used to differentiate collisions
CONTENTS_TEAM2 = 0x1000 // between players and objects on different teams

// ignore CONTENTS_OPAQUE on surfaces that have SURF_NODRAW
CONTENTS_IGNORE_NODRAW_OPAQUE = 0x2000

// hits entities which are MOVETYPE_PUSH (doors, plats, etc.)
CONTENTS_MOVEABLE = 0x4000

// remaining contents are non-visible, and don't eat brushes
CONTENTS_AREAPORTAL = 0x8000

CONTENTS_PLAYERCLIP = 0x10000
CONTENTS_MONSTERCLIP = 0x20000

// currents can be added to any other contents, and may be mixed
CONTENTS_CURRENT_0 = 0x40000
CONTENTS_CURRENT_90 = 0x80000
CONTENTS_CURRENT_180 = 0x100000
CONTENTS_CURRENT_270 = 0x200000
CONTENTS_CURRENT_UP = 0x400000
CONTENTS_CURRENT_DOWN = 0x800000

CONTENTS_ORIGIN = 0x1000000 // removed before bsping an entity

CONTENTS_MONSTER = 0x2000000 // should never be on a brush, only in game
CONTENTS_DEBRIS = 0x4000000
CONTENTS_DETAIL = 0x8000000 // brushes to be added after vis leafs
CONTENTS_TRANSLUCENT = 0x10000000 // auto set if any surface has trans
CONTENTS_LADDER = 0x20000000
CONTENTS_HITBOX = 0x40000000 // use accurate hitboxes on trace

// NOTE: These are stored in a short in the engine now. Don't use more than 16 bits
SURF_LIGHT = 0x0001 // value will hold the light strength
SURF_SKY2D = 0x0002 // don't draw, indicates we should skylight + draw 2d sky but not draw the 3D skybox
SURF_SKY = 0x0004 // don't draw, but add to skybox
SURF_WARP = 0x0008 // turbulent water warp
SURF_TRANS = 0x0010
SURF_NOPORTAL = 0x0020 // the surface can not have a portal placed on it
SURF_TRIGGER = 0x0040 // FIXME: This is an xbox hack to work around elimination of trigger surfaces, which breaks occluders
SURF_NODRAW = 0x0080 // don't bother referencing the texture

SURF_HINT = 0x0100 // make a primary bsp splitter

SURF_SKIP = 0x0200 // completely ignore, allowing non-closed brushes
SURF_NOLIGHT = 0x0400 // Don't calculate light
SURF_BUMPLIGHT = 0x0800 // calculate three lightmaps for the surface for bumpmapping
SURF_NOSHADOWS = 0x1000 // Don't receive shadows
SURF_NODECALS = 0x2000 // Don't receive decals
SURF_NOCHOP = 0x4000 // Don't subdivide patches on this surface
SURF_HITBOX = 0x8000 // surface is part of a hitbox

// -----------------------------------------------------
// spatial content masks - used for spatial queries (traceline,etc.)
// -----------------------------------------------------
MASK_ALL = (0xFFFFFFFF)

// everything that is normally solid
MASK_SOLID = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_GRATE)

// everything that blocks player movement
MASK_PLAYERSOLID = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_GRATE)

// blocks npc movement
MASK_NPCSOLID = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_GRATE)

// water physics in these contents
MASK_WATER = (CONTENTS_WATER | CONTENTS_MOVEABLE | CONTENTS_SLIME)

// everything that blocks lighting
MASK_OPAQUE = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_OPAQUE)

// everything that blocks lighting, but with monsters added.
MASK_OPAQUE_AND_NPCS = (MASK_OPAQUE | CONTENTS_MONSTER)

// everything that blocks line of sight for AI
MASK_BLOCKLOS = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_BLOCKLOS)

// everything that blocks line of sight for AI plus NPCs
MASK_BLOCKLOS_AND_NPCS = (MASK_BLOCKLOS | CONTENTS_MONSTER)

// everything that blocks line of sight for players
MASK_VISIBLE = (MASK_OPAQUE | CONTENTS_IGNORE_NODRAW_OPAQUE)

// everything that blocks line of sight for players, but with monsters added.
MASK_VISIBLE_AND_NPCS = (MASK_OPAQUE_AND_NPCS | CONTENTS_IGNORE_NODRAW_OPAQUE)

// bullets see these as solid
MASK_SHOT = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_WINDOW | CONTENTS_DEBRIS | CONTENTS_HITBOX)

// non-raycasted weapons see this as solid (includes grates)
MASK_SHOT_HULL = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_WINDOW | CONTENTS_DEBRIS | CONTENTS_GRATE)

// hits solids (not grates) and passes through everything else
MASK_SHOT_PORTAL = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_MONSTER)

// everything normally solid, except monsters (world+brush only)
MASK_SOLID_BRUSHONLY = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_GRATE)

// everything normally solid for player movement, except monsters (world+brush only)
MASK_PLAYERSOLID_BRUSHONLY = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_PLAYERCLIP | CONTENTS_GRATE)

// everything normally solid for npc movement, except monsters (world+brush only)
MASK_NPCSOLID_BRUSHONLY = (CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP | CONTENTS_GRATE)

// just the world, used for route rebuilding
MASK_NPCWORLDSTATIC = (CONTENTS_SOLID | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP | CONTENTS_GRATE)

// These are things that can split areaportals
MASK_SPLITAREAPORTAL = (CONTENTS_WATER | CONTENTS_SLIME)

// UNDONE: This is untested, any moving water
MASK_CURRENT = (CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN)

// everything that blocks corpse movement
// UNDONE: Not used yet / may be deleted
MASK_DEADSOLID = (CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_GRATE)
)

10 changes: 7 additions & 3 deletions bsp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

// Test that resultant lump data matches expected.
func TestLumpExports(t *testing.T) {
t.Skip()
file, err := ReadFromFile("maps/v20/de_dust2.bsp")
if err != nil {
t.Error(err)
Expand All @@ -16,9 +17,12 @@ func TestLumpExports(t *testing.T) {
// Verify lump lengths
lumpIndex := 0
for lumpIndex < 64 {
lump := file.GetLump(lumpIndex)
rawLump := file.GetLumpRaw(lumpIndex)
lumpBytes := lump.ToBytes()
lump := file.GetLump(LumpId(lumpIndex))
rawLump := file.GetLumpRaw(LumpId(lumpIndex))
lumpBytes,err := lump.Marshall()
if err != nil {
t.Error(err)
}
if len(lumpBytes) != int(file.GetHeader().Lumps[lumpIndex].Length) {
t.Errorf("Lump: %d length mismatch. Got: %dbytes, expected: %dbytes", lumpIndex, len(lumpBytes), file.header.Lumps[lumpIndex].Length)
} else {
Expand Down
Loading

0 comments on commit 1654020

Please sign in to comment.