Adjustments following kind discussion with LunarJetman on IRC
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -7,6 +7,6 @@
|
|||||||
/view-minimap
|
/view-minimap
|
||||||
/view-menu
|
/view-menu
|
||||||
/view-set
|
/view-set
|
||||||
/wh40k
|
/ordoor
|
||||||
/investigation/Maps
|
/investigation/Maps
|
||||||
/investigation/Obj
|
/investigation/Obj
|
||||||
|
8
Makefile
8
Makefile
@@ -2,7 +2,7 @@ srcfiles = Makefile go.mod $(shell find . -iname *.go)
|
|||||||
|
|
||||||
GOBUILD ?= go build -tags ebitengl
|
GOBUILD ?= go build -tags ebitengl
|
||||||
|
|
||||||
all: loader palette-idx view-obj view-map view-menu view-minimap view-set wh40k
|
all: loader ordoor palette-idx view-obj view-map view-menu view-minimap view-set
|
||||||
|
|
||||||
loader: $(srcfiles)
|
loader: $(srcfiles)
|
||||||
$(GOBUILD) -o loader ./cmd/loader
|
$(GOBUILD) -o loader ./cmd/loader
|
||||||
@@ -25,10 +25,10 @@ view-minimap: $(srcfiles)
|
|||||||
view-set: $(srcfiles)
|
view-set: $(srcfiles)
|
||||||
$(GOBUILD) -o view-set ./cmd/view-set
|
$(GOBUILD) -o view-set ./cmd/view-set
|
||||||
|
|
||||||
wh40k: $(srcfiles)
|
ordoor: $(srcfiles)
|
||||||
$(GOBUILD) -o wh40k ./cmd/wh40k
|
$(GOBUILD) -o ordoor ./cmd/ordoor
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f loader view-obj view-map view-minimap view-set wh40k palette-idx
|
rm -f loader ordoor view-obj view-map view-minimap view-set palette-idx
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
33
README.md
33
README.md
@@ -1,16 +1,27 @@
|
|||||||
# Ordoor
|
# Ordoor
|
||||||
|
|
||||||
Portmanteau of Order Door, a remake project for Warhammer 40,000: Chaos Gate,
|
Ordoor is an **unofficial** [game engine recreation](https://en.wikipedia.org/wiki/Game_engine_recreation)
|
||||||
the game from 1998.
|
of the classic game from 1998, [Warhammer 40,000: Chaos Gate](https://en.wikipedia.org/wiki/Warhammer_40,000:_Chaos_Gate)
|
||||||
|
|
||||||
**You must have a copy of the original game data to use this project**
|
**You must have a copy of the original game data to use this project**. GOG is
|
||||||
|
the current publisher of this game; [you can purchase it here](https://www.gog.com/game/warhammer_40000_chaos_gate).
|
||||||
|
|
||||||
No game yet, nothing even close. I'm in the very early stages of trying to
|
"Warhammer 40,000" is a trademark of Games Workshop, and the game data used by
|
||||||
understand the various file formats. Until then, you can play WH40K: Chaos Gate
|
Ordoor contains Games Workshop intellectual property. I am confident that this
|
||||||
in a WinXP VM, disconnected from the internet. It doesn't need 3D rendering!
|
project uses all those things in accordance with the
|
||||||
|
[Intellectual Property Policy](https://www.games-workshop.com/en-GB/Intellectual-Property-Policy)
|
||||||
|
and the license granted when purchasing a copy of the game in question. Do let
|
||||||
|
me know if you see or suspect any violation, and I'll address it immediately.
|
||||||
|
|
||||||
WH40K.exe is the existing game engine, and WH40K_TD.exe is the map editor.
|
Ordoor is a portmanteau of Order Door, which is, of course, the opposite of a
|
||||||
Allows things to be saved as .MAP or as .SMF ("Super Macro File").
|
Chaos Gate.
|
||||||
|
|
||||||
|
## Current status
|
||||||
|
|
||||||
|
Some of the original file formats are either partially or fully decoded. Maps,
|
||||||
|
menus, and most visual data can be rendered pixel-perfect. Sound can be played
|
||||||
|
(with a preprocessing step). Some UI tookit work is done. No game mechanics are
|
||||||
|
implemented yet.
|
||||||
|
|
||||||
## Building from source
|
## Building from source
|
||||||
|
|
||||||
@@ -66,12 +77,12 @@ Use the arrow keys to scroll around the map, the mouse wheel to zoom, and the
|
|||||||
|
|
||||||
Dependency management uses `go mod`, so ensure you have at least Go 1.11.
|
Dependency management uses `go mod`, so ensure you have at least Go 1.11.
|
||||||
|
|
||||||
There is the **start** of the menu / campaign flow in a `wh40k` binary:
|
There is the **start** of the menu / campaign flow in a `ordoor` binary:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cp config.toml.example config.toml
|
$ cp config.toml.example config.toml
|
||||||
$ make wh40k
|
$ make ordoor
|
||||||
$ ./wh40k
|
$ ./ordoor
|
||||||
```
|
```
|
||||||
|
|
||||||
This plays the introductory videos so far, and nothing else.
|
This plays the introductory videos so far, and nothing else.
|
||||||
|
@@ -4,7 +4,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"code.ur.gs/lupine/ordoor/internal/wh40k"
|
"code.ur.gs/lupine/ordoor/internal/ordoor"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -13,7 +13,7 @@ func main() {
|
|||||||
configFile = os.Args[1]
|
configFile = os.Args[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := wh40k.Run(configFile); err != nil {
|
if err := ordoor.Run(configFile); err != nil {
|
||||||
log.Fatalf(err.Error())
|
log.Fatalf(err.Error())
|
||||||
}
|
}
|
||||||
|
|
@@ -1,4 +1,4 @@
|
|||||||
[wh40k]
|
[ordoor]
|
||||||
data_dir = "./orig"
|
data_dir = "./orig"
|
||||||
video_player = [
|
video_player = [
|
||||||
"mpv",
|
"mpv",
|
||||||
|
@@ -12,7 +12,7 @@ type WH40K struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
WH40K `toml:"wh40k"`
|
WH40K `toml:"ordoor"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Load(filename string) (*Config, error) {
|
func Load(filename string) (*Config, error) {
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
// package wh40k implements the full WH40K.EXE functionality, and is used from
|
// package ordoor implements the full WH40K.EXE functionality, and is used from
|
||||||
// cmd/wh40k/main.go
|
// cmd/ordoor/main.go
|
||||||
//
|
//
|
||||||
// Entrypoint is Run()
|
// Entrypoint is Run()
|
||||||
package wh40k
|
package ordoor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
"code.ur.gs/lupine/ordoor/internal/config"
|
"code.ur.gs/lupine/ordoor/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
type WH40K struct {
|
type Ordoor struct {
|
||||||
Config *config.Config
|
Config *config.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,12 +20,12 @@ func Run(configFile string) error {
|
|||||||
return fmt.Errorf("Couldn't load config file: %v", err)
|
return fmt.Errorf("Couldn't load config file: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
wh40k := &WH40K{
|
ordoor := &Ordoor{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
}
|
}
|
||||||
|
|
||||||
wh40k.PlaySkippableVideo("LOGOS")
|
ordoor.PlaySkippableVideo("LOGOS")
|
||||||
wh40k.PlaySkippableVideo("movie1")
|
ordoor.PlaySkippableVideo("movie1")
|
||||||
|
|
||||||
// TODO: load main interface
|
// TODO: load main interface
|
||||||
|
|
35
internal/ordoor/videos.go
Normal file
35
internal/ordoor/videos.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package ordoor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (o *Ordoor) PlayVideo(name string, skippable bool) {
|
||||||
|
filename := o.Config.DataFile("SMK/" + name + ".smk")
|
||||||
|
|
||||||
|
if len(o.Config.VideoPlayer) == 0 {
|
||||||
|
log.Printf("Video player not configured, skipping video %v", filename)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
argc := o.Config.VideoPlayer[0]
|
||||||
|
argv := append(o.Config.VideoPlayer[1:])
|
||||||
|
if skippable {
|
||||||
|
argv = append(argv, "--input-conf=skippable.mpv.conf")
|
||||||
|
}
|
||||||
|
|
||||||
|
argv = append(argv, filename)
|
||||||
|
|
||||||
|
if err := exec.Command(argc, argv...).Run(); err != nil {
|
||||||
|
log.Printf("Error playing video %v: %v", filename, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Ordoor) PlayUnskippableVideo(name string) {
|
||||||
|
o.PlayVideo(name, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Ordoor) PlaySkippableVideo(name string) {
|
||||||
|
o.PlayVideo(name, true)
|
||||||
|
}
|
@@ -1,35 +0,0 @@
|
|||||||
package wh40k
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os/exec"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (w *WH40K) PlayVideo(name string, skippable bool) {
|
|
||||||
filename := w.Config.DataFile("SMK/" + name + ".smk")
|
|
||||||
|
|
||||||
if len(w.Config.VideoPlayer) == 0 {
|
|
||||||
log.Printf("Video player not configured, skipping video %v", filename)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
argc := w.Config.VideoPlayer[0]
|
|
||||||
argv := append(w.Config.VideoPlayer[1:])
|
|
||||||
if skippable {
|
|
||||||
argv = append(argv, "--input-conf=skippable.mpv.conf")
|
|
||||||
}
|
|
||||||
|
|
||||||
argv = append(argv, filename)
|
|
||||||
|
|
||||||
if err := exec.Command(argc, argv...).Run(); err != nil {
|
|
||||||
log.Printf("Error playing video %v: %v", filename, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WH40K) PlayUnskippableVideo(name string) {
|
|
||||||
w.PlayVideo(name, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WH40K) PlaySkippableVideo(name string) {
|
|
||||||
w.PlayVideo(name, true)
|
|
||||||
}
|
|
Reference in New Issue
Block a user