1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-12 18:50:42 +00:00
OpenDiablo2/d2core/d2map/d2mapengine/level.go
dk fe47e51351
Refactor d2map (#468)
* WIP refactor of d2map stuff

* more d2map refactor

adding realm init to game client
passing map engine from client and server into realm at init
change `generate map packet` to have act and level index as data

* client explodes, but getting there

* realm now initializes, networking works, but map generators dont currently do anything

* changed the way that level type records are loaded

* fixed funcs for level data lookups

* started implementing level generator, currently crashing

* client no longer exploding

* d2networking refactor

put exports into d2client.go and d2server.go
kept GameClient and GameServer methods into their respective files
made methods for packet handlers instead of the giant switch statements

* bugfix: getting first level id by act

* minor refactor of gamescreen for readability

* towns now generate on server start, create player takes act and level id as args, levels have their own map engine
2020-06-26 16:50:24 -04:00

80 lines
2.1 KiB
Go

package d2mapengine
import (
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
)
type MapLevel struct {
act *MapAct
details *d2datadict.LevelDetailsRecord
preset *d2datadict.LevelPresetRecord
warps []*d2datadict.LevelWarpRecord
substitutions *d2datadict.LevelSubstitutionRecord
types *d2datadict.LevelTypeRecord
generator MapGenerator
mapEngine *MapEngine
isInit bool
isGenerated bool
}
func (level *MapLevel) isActive() bool {
// TODO: a level is active only if there is a player in the level
// or in an adjacent level
return true
}
func (level *MapLevel) Advance(elapsed float64) {
if !level.isActive() {
return
}
level.mapEngine.Advance(elapsed)
}
func (level *MapLevel) Init(act *MapAct, levelId int) {
if level.isInit {
return
}
if levelId < 1 {
levelId = 1 // there is a Nonetype map at index 0 in levels.txt
}
level.act = act
level.details = d2datadict.GetLevelDetailsByLevelId(levelId)
level.preset = d2datadict.GetLevelPresetByLevelId(levelId)
level.warps = d2datadict.GetLevelWarpsByLevelId(levelId)
level.substitutions = d2datadict.LevelSubstitutions[level.details.SubType]
level.types = d2datadict.LevelTypes[d2enum.RegionIdType(level.details.LevelType)]
level.isInit = true
level.mapEngine = &MapEngine{}
level.mapEngine.seed = level.act.realm.seed
switch level.details.LevelGenerationType {
case d2enum.LevelTypeNone:
level.generator = nil
case d2enum.LevelTypeRandomMaze:
level.generator = &MapGeneratorMaze{}
case d2enum.LevelTypeWilderness:
level.generator = &MapGeneratorWilderness{}
case d2enum.LevelTypePreset:
level.generator = &MapGeneratorPreset{}
}
seed := act.realm.seed
if level.generator != nil {
log.Printf("Initializing Level: %s", level.details.Name)
level.generator.init(seed, level, level.mapEngine)
}
}
func (level *MapLevel) GenerateMap() {
if level.isGenerated {
return
}
log.Printf("Generating Level: %s", level.details.Name)
level.generator.generate()
level.mapEngine.RegenerateWalkPaths()
level.isGenerated = true
}