Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ pygen/
*.grf.cacheindex
grf/

# other generated files
makefile.vcs

# working directories
reference/
previews/
Expand Down
21 changes: 13 additions & 8 deletions baseset/baseset_generate_obg.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import sys, os, glob

def generate_obg(base_path, type_string):
def generate_obg(base_path, type_string, baseset_version, user_version):
print("Generating obg file")
print("Running in " + base_path)

Expand Down Expand Up @@ -158,7 +158,7 @@ def generate_obg(base_path, type_string):

# general, non-translateable, version string
# version, never translated
descriptionversion = "OpenGFX2 0.8 " + typeshort
descriptionversion = "OpenGFX2 " + user_version + " " + typeshort
# used for the origin string
descriptionorigin = "Available from the in-game content download system (BaNaNaS) or https://github.com/OpenTTD/OpenGFX2/"
# fallback description for non-standard zoom and bit depth combinations, should never be in player-facing standard builds
Expand Down Expand Up @@ -211,7 +211,7 @@ def pad(string, length, character=" ", pad_left=True):
pad_length = 18
obg.write(pad("name", pad_length, pad_left=False) + "= OpenGFX2 " + namesuffix + "\n")
obg.write(pad("shortname", pad_length, pad_left=False) + "= " + namelookup[typeshort] + "\n")
obg.write(pad("version", pad_length, pad_left=False) + "= 7" + "\n")
obg.write(pad("version", pad_length, pad_left=False) + "= " + baseset_version + "\n")
obg.write(pad("palette", pad_length, pad_left=False) + "= DOS" + "\n")
obg.write(pad("blitter", pad_length, pad_left=False) + "= "+str(blitter)+"bpp" + "\n")
obg.write(pad("url", pad_length, pad_left=False) + "= https://github.com/OpenTTD/OpenGFX2/" + "\n")
Expand Down Expand Up @@ -247,12 +247,17 @@ def pad(string, length, character=" ", pad_left=True):
obg.write("default = " + descriptionorigin + "\n")

if __name__ == "__main__":
if len(sys.argv) > 1:
type_string = sys.argv[1]
if len(sys.argv) < 3:
print("Usage: baseset_generate_obg.py <baseset_version> <user_version> [type_string] [base_path]")
sys.exit(1)
baseset_version = sys.argv[1]
user_version = sys.argv[2]
if len(sys.argv) > 3:
type_string = sys.argv[3]
else:
type_string = "8"
if len(sys.argv) > 2:
base_path = sys.argv[2]
if len(sys.argv) > 4:
base_path = sys.argv[4]
else:
base_path = "."
generate_obg(base_path, type_string)
generate_obg(base_path, type_string, baseset_version, user_version)
2 changes: 1 addition & 1 deletion baseset/nml/extra/extra-header.pnml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ grf {
name: string(STR_GRF_NAME);
desc: string(STR_GRF_DESCRIPTION);
url: string(STR_GRF_URL);
version: 8;
# version_line_marker #
min_compatible_version: version_openttd(1, 3, 0);
param 1 {
param_cursors_ {
Expand Down
22 changes: 9 additions & 13 deletions docs/releasing-opengfx2.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
# How to release a new version of OpenGFX2

1. Update the changelog:
1. Update the changelog and bump the version:
* `CHANGELOG.md` with key fixes and features
* User-facing version `USER_VERSION` in `makefile`

2. Bump the versions:
* Base set version in `baseset/baseset_generate_obg.py` (`descriptionversion`)
* Base set `extra.grf` version in `baseset/nml/extra-header.pnml` (`grf` block, `version`)
* NewGRF versions in `newgrf/nml/<newgrf_name>/<newgrf_name>-header.pmnl` (`grf` block, `version`)
* `extra.grf`/`opengfx2_settings.grf` co-compatibility check in `baseset/nml/extra-header.pnml` (in `if (grf_future_status("OGZ\1")==1)` block)
Make a PR and, once merged:

The main user facing version in `makefile` (`NAMING_VERSION`) is automatically taken from the repository version.

For better or worse, base set currently uses fractional (0.1, 0.2, ...) versioning and NewGRFs use integer (1, 2, ...) versioning.
2. Do a clean build of master:
* `make clean && make all`

3. On Github, go to "Releases", "Draft a new release":
* Draft the release text (a refined copy of the changelog) and title.
* Attach baseset (both Classic and High Def) `tar`s and NewGRF `grf`s
* Create a new tag with the appropriate version.
Creation of the new version tag on publishing the release will trigger a new release to the OpenTTD CDN.
* Draft the release text (a refined copy of the changelog) and title
* Attach baseset (both Classic and High Def) `tar`s from `baseset/` and NewGRF `grf`s from `newgrf`.
* Create a new tag with the user-facing version
Creation of the new version tag on publishing the release will trigger a new release to the [OpenTTD CDN](https://cdn.openttd.org/opengfx2_classic-releases/) under the user-facing version.
64 changes: 41 additions & 23 deletions makefile
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
# Always run version detection, so we always have an accurate modified
# flag
# Version reported to users
USER_VERSION := 0.8

# Always run version detection, so we always have an accurate modified flag
REPO_VERSIONS := $(shell AWK="$(AWK)" "./findversion.sh")
REPO_MODIFIED := $(shell echo "$(REPO_VERSIONS)" | cut -f 3 -d' ')

# Use autodetected revisions
REPO_VERSION := $(shell echo "$(REPO_VERSIONS)" | cut -f 1 -d' ')
REPO_DATE := $(shell echo "$(REPO_VERSIONS)" | cut -f 2 -d' ')
REPO_HASH := $(shell echo "$(REPO_VERSIONS)" | cut -f 4 -d' ')

# Versions
# nice user-facing version naming
# File naming version
NAMING_VERSION := $(REPO_VERSION)
NAMING_CDN := opengfx2_classic
# Version reported to OpenTTD, days since 2000
BASESET_VERSION := $(shell python3 -c "from datetime import date; d='$(REPO_DATE)'; print((date(int(d[:4]),int(d[4:6]),int(d[6:8]))-date(2000,1,1)).days)")

# Version information target, write if changed so that dependent targets can be updated based on changes
makefile.vcs: FORCE
echo "REPO_HASH = $(REPO_HASH)" > $@.new
echo "REPO_DATE = $(REPO_DATE)" >> $@.new
echo "REPO_VERSION = $(REPO_VERSION)" >> $@.new
echo "BASESET_VERSION = $(BASESET_VERSION)" >> $@.new
echo "USER_VERSION = $(USER_VERSION)" >> $@.new
echo "NAMING_VERSION = $(NAMING_VERSION)" >> $@.new
echo "NAMING_CDN = $(NAMING_CDN)" >> $@.new
cmp -s $@.new $@ || mv $@.new $@
rm -f $@.new

.PHONY: clean_version
clean_version:
rm -f makefile.vcs

# Default target
.PHONY: all
Expand All @@ -20,24 +38,24 @@ all: baseset baseset_highdef newgrf
# Basesets
# "Classic" 8bpp 1x zoom baseset
.PHONY: baseset
baseset: baseset/OpenGFX2_Classic-$(NAMING_VERSION).zip
baseset: baseset/OpenGFX2_Classic-$(NAMING_VERSION).zip makefile.vcs

baseset/OpenGFX2_Classic-$(NAMING_VERSION).zip: baseset/OpenGFX2_Classic-$(NAMING_VERSION).tar
baseset/OpenGFX2_Classic-$(NAMING_VERSION).zip: baseset/OpenGFX2_Classic-$(NAMING_VERSION).tar makefile.vcs
cd baseset && zip -9 -r OpenGFX2_Classic-$(NAMING_VERSION).zip OpenGFX2_Classic-$(NAMING_VERSION).tar

# "High Def" 32bpp 4x zoom baseset
.PHONY: baseset_highdef
baseset_highdef: baseset/OpenGFX2_HighDef-$(NAMING_VERSION).zip
baseset_highdef: baseset/OpenGFX2_HighDef-$(NAMING_VERSION).zip makefile.vcs

baseset/OpenGFX2_HighDef-$(NAMING_VERSION).zip: baseset/OpenGFX2_HighDef-$(NAMING_VERSION).tar
baseset/OpenGFX2_HighDef-$(NAMING_VERSION).zip: baseset/OpenGFX2_HighDef-$(NAMING_VERSION).tar makefile.vcs
cd baseset && zip -9 -r OpenGFX2_HighDef-$(NAMING_VERSION).zip OpenGFX2_HighDef-$(NAMING_VERSION).tar

# Base set packaging
.PRECIOUS: OpenGFX2_Classic-$(NAMING_VERSION).tar OpenGFX2_HighDef-$(NAMING_VERSION).tar
.PRECIOUS: OpenGFX2_Classic-$(NAMING_VERSION).tar OpenGFX2_HighDef-$(NAMING_VERSION).tar makefile.vcs
BASESET_GRFS = ogfx2c_arctic ogfx2e_extra ogfx2h_tropical ogfx2i_logos ogfx2t_toyland ogfx21_base
BASESET_DOCS = README.md LICENSE CHANGELOG.md

baseset/OpenGFX2_Classic-$(NAMING_VERSION).tar: baseset/opengfx2_8.obg $(BASESET_DOCS) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_8.grf)
baseset/OpenGFX2_Classic-$(NAMING_VERSION).tar: baseset/opengfx2_8.obg $(BASESET_DOCS) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_8.grf) makefile.vcs
mkdir -p baseset/OpenGFX2_Classic-$(NAMING_VERSION)
cp README.md baseset/OpenGFX2_Classic-$(NAMING_VERSION)/readme.md
cp LICENSE baseset/OpenGFX2_Classic-$(NAMING_VERSION)/license.txt
Expand All @@ -47,7 +65,7 @@ baseset/OpenGFX2_Classic-$(NAMING_VERSION).tar: baseset/opengfx2_8.obg $(BASESET
cd baseset && tar -cf OpenGFX2_Classic-$(NAMING_VERSION).tar OpenGFX2_Classic-$(NAMING_VERSION)/
rm -r baseset/OpenGFX2_Classic-$(NAMING_VERSION)

baseset/OpenGFX2_HighDef-$(NAMING_VERSION).tar: baseset/opengfx2_32ez.obg $(BASESET_DOCS) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_32ez.grf)
baseset/OpenGFX2_HighDef-$(NAMING_VERSION).tar: baseset/opengfx2_32ez.obg $(BASESET_DOCS) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_32ez.grf) makefile.vcs
mkdir -p baseset/OpenGFX2_HighDef-$(NAMING_VERSION)
cp README.md baseset/OpenGFX2_HighDef-$(NAMING_VERSION)/readme.md
cp LICENSE baseset/OpenGFX2_HighDef-$(NAMING_VERSION)/license.txt
Expand All @@ -61,11 +79,11 @@ baseset/OpenGFX2_HighDef-$(NAMING_VERSION).tar: baseset/opengfx2_32ez.obg $(BASE
# FORCE, as baseset_generate_obg checks for necessary updates
.PRECIOUS: baseset/opengfx2_8.obg baseset/opengfx2_32ez.obg

baseset/opengfx2_8.obg: baseset/baseset_generate_obg.py baseset/lang/*.lng $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_8.grf) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_8.md5)
python3 baseset/baseset_generate_obg.py 8 baseset/
baseset/opengfx2_8.obg: baseset/baseset_generate_obg.py baseset/lang/*.lng $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_8.grf) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_8.md5) makefile.vcs
python3 baseset/baseset_generate_obg.py $(BASESET_VERSION) $(USER_VERSION) 8 baseset/

baseset/opengfx2_32ez.obg: baseset/baseset_generate_obg.py baseset/lang/*.lng $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_32ez.grf) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_32ez.md5)
python3 baseset/baseset_generate_obg.py 32ez baseset/
baseset/opengfx2_32ez.obg: baseset/baseset_generate_obg.py baseset/lang/*.lng $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_32ez.grf) $(foreach grf,$(BASESET_GRFS),baseset/$(grf)_32ez.md5) makefile.vcs
python3 baseset/baseset_generate_obg.py $(BASESET_VERSION) $(USER_VERSION) 32ez baseset/

# GRF and MD5, via NML intermediate, for baseset
# FORCE, as nml_preprocessor includes arbitrary pnml files
Expand All @@ -75,15 +93,15 @@ baseset/%_8.grf: graphics_1 baseset/lang/*.lng FORCE
$(eval PREF=$(word 1, $(subst _, ,$(basename $(notdir $@)))))
$(eval NAME=$(word 2, $(subst _, ,$(basename $(notdir $@)))))
$(eval ZOOM=$(word 3, $(subst _, ,$(basename $(notdir $@)))))
python3 templates/nml_preprocessor.py baseset/$(PREF)_$(NAME).pnml $(ZOOM)
python3 templates/nml_preprocessor.py baseset/$(PREF)_$(NAME).pnml $(BASESET_VERSION) $(ZOOM)
cd baseset && nmlc -p DOS --quiet -c $(PREF)_$(NAME)_$(ZOOM).nml --md5 $(PREF)_$(NAME)_$(ZOOM).md5

baseset/%_32ez.grf: graphics_4 baseset/lang/*.lng FORCE
$(eval PREF=$(word 1, $(subst _, ,$(basename $(notdir $@)))))
$(eval NAME=$(word 2, $(subst _, ,$(basename $(notdir $@)))))
$(eval ZOOM=$(word 3, $(subst _, ,$(basename $(notdir $@)))))
echo $(PREF) $(NAME) $(ZOOM)
python3 templates/nml_preprocessor.py baseset/$(PREF)_$(NAME).pnml $(ZOOM)
python3 templates/nml_preprocessor.py baseset/$(PREF)_$(NAME).pnml $(BASESET_VERSION) $(ZOOM)
cd baseset && nmlc -p DOS --quiet -c $(PREF)_$(NAME)_$(ZOOM).nml --md5 $(PREF)_$(NAME)_$(ZOOM).md5

# NewGRFs
Expand All @@ -99,7 +117,7 @@ newgrf/%.grf: graphics_4 FORCE
$(eval PREF=$(word 1, $(subst _, ,$(basename $(notdir $@)))))
$(eval NAME=$(word 2, $(subst _, ,$(basename $(notdir $@)))))
echo $(PREF) $(NAME)
python3 templates/nml_preprocessor.py newgrf/$(PREF)_$(NAME).pnml 32ez
python3 templates/nml_preprocessor.py newgrf/$(PREF)_$(NAME).pnml $(BASESET_VERSION) 32ez
mv newgrf/$(PREF)_$(NAME)_32ez.nml newgrf/$(PREF)_$(NAME).nml
cd newgrf && nmlc -p DOS --quiet -c -l ../baseset/lang $(PREF)_$(NAME).nml

Expand Down Expand Up @@ -128,16 +146,16 @@ graphics/fonts/openttd-ttf:

# Clean
.PHONY: clean
clean: clean_baseset clean_newgrf clean_graphics
clean: clean_baseset clean_newgrf clean_graphics clean_version

# Clean baseset
.PHONY: clean_baseset
.PHONY: clean_baseset clean_version
clean_baseset:
rm -f baseset/*.grf baseset/*.md5 baseset/*.obg baseset/*.tar baseset/*.nml
rm -rf baseset/.nmlcache

# Clean NewGRFs
.PHONY: clean_newgrf
.PHONY: clean_newgrf clean_version
clean_newgrf:
rm -f newgrf/*.grf newgrf/*.nml
rm -rf newgrf/.nmlcache
Expand All @@ -159,7 +177,7 @@ maintainer-clean: clean

# Glue to work like OpenGFX Makefile
.PHONY: bundle_zip
bundle_zip: baseset/OpenGFX2_Classic-$(NAMING_VERSION).zip
bundle_zip: baseset/OpenGFX2_Classic-$(NAMING_VERSION).zip makefile.vcs
cp baseset/OpenGFX2_Classic-$(NAMING_VERSION).zip $(NAMING_CDN)-$(NAMING_VERSION)-all.zip

# Glue to work like OpenGFX Makefile
Expand Down
2 changes: 1 addition & 1 deletion newgrf/nml/landscape/landscape-header.pnml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ grf {
name: string(STR_GRF_LANDSCAPE_NAME);
desc: string(STR_GRF_LANDSCAPE_DESCRIPTION);
url: string(STR_GRF_URL);
version: 8;
# version_line_marker #
min_compatible_version: version_openttd(1, 3, 0);
param 2 {
param_gridlines {
Expand Down
2 changes: 1 addition & 1 deletion newgrf/nml/objects/objects-header.pnml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ grf {
name: string(STR_GRF_OBJECTS_NAME);
desc: string(STR_GRF_OBJECTS_DESCRIPTION);
url: string(STR_GRF_URL);
version: 8;
# version_line_marker #
min_compatible_version: version_openttd(1, 3, 0);
}

Expand Down
2 changes: 1 addition & 1 deletion newgrf/nml/settings/settings-header.pnml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ grf {
name: string(STR_GRF_SETTINGS_NAME);
desc: string(STR_GRF_SETTINGS_DESCRIPTION);
url: string(STR_GRF_URL);
version: 8;
# version_line_marker #
min_compatible_version: version_openttd(1, 3, 0);
param 1 {
param_cursors_ {
Expand Down
2 changes: 1 addition & 1 deletion newgrf/nml/stations/stations-header.pnml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ grf {
name: string(STR_GRF_STATIONS_NAME);
desc: string(STR_GRF_STATIONS_DESCRIPTION);
url: string(STR_GRF_URL);
version: 8;
# version_line_marker #
min_compatible_version: version_openttd(1, 3, 0);
}

Expand Down
2 changes: 1 addition & 1 deletion newgrf/nml/trams/trams-header.pnml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ grf {
name: string(STR_GRF_TRAMS_NAME);
desc: string(STR_GRF_TRAMS_DESCRIPTION);
url: string(STR_GRF_URL);
version: 8;
# version_line_marker #
min_compatible_version: version_openttd(1, 3, 0);
}

Expand Down
2 changes: 1 addition & 1 deletion newgrf/nml/trees/trees-header.pnml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ grf {
name: string(STR_GRF_TREES_NAME);
desc: string(STR_GRF_TREES_DESCRIPTION);
url: string(STR_GRF_URL);
version: 8;
# version_line_marker #
min_compatible_version: version_openttd(1, 3, 0);
param 12 {
param_trees_temperate {
Expand Down
36 changes: 27 additions & 9 deletions templates/nml_preprocessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

import sys, os

def preprocess_pnml(pnml_path, high_bitdepth = False, extra_zoom = False, exclude_name_suffix = False):
def preprocess_pnml(pnml_path, newgrf_version, high_bitdepth = False, extra_zoom = False, exclude_name_suffix = False):
def get_name():
"""
Set the name of the nml variant based on the options.
Expand Down Expand Up @@ -67,6 +67,18 @@ def check_imports_change():
return True
return False

def handle_version_line(line):
"""
Check if the line is a version line, and return the NML-formatted version if it is.
"""
# comment defining version
comment_version = "# version_line_marker #"

if line.strip() == comment_version:
prefix = line.split(comment_version)[0]
return prefix + "version: " + newgrf_version + ";"
return line

def check_import_line(line):
"""
Check if the line is an import line, and return the path if it is.
Expand Down Expand Up @@ -135,27 +147,33 @@ def handle_alternates(line):
with open(os.path.join(base_path, import_path), "r") as include:
include_lines = include.read().splitlines()
for include_line in include_lines:
include_line = handle_version_line(include_line)
include_line = handle_alternates(include_line)
nml.write(include_line + "\n")
except FileNotFoundError:
print("File not found:", os.path(base_path, import_path))
else:
include_line = handle_alternates(line)
nml.write(line + "\n")
include_line = handle_version_line(line)
include_line = handle_alternates(include_line)
nml.write(include_line + "\n")
except FileNotFoundError:
print("File not found:", sys.argv[1] + ".pnml")

if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: baseset_generate_obg.py <pnml_path> <newgrf_version> [type_string] [exclude_name_suffix]")
sys.exit(1)
pnml_path = sys.argv[1]
newgrf_version = sys.argv[2]
high_bitdepth = False
extra_zoom = False
if len(sys.argv) > 2:
if "32" in sys.argv[2]:
if len(sys.argv) > 3:
if "32" in sys.argv[3]:
high_bitdepth = True
if "ez" in sys.argv[2]:
if "ez" in sys.argv[3]:
extra_zoom = True
exclude_name_suffix = False
if len(sys.argv) > 3:
if sys.argv[3] == "exclude_name_suffix":
if len(sys.argv) > 4:
if sys.argv[4] == "exclude_name_suffix":
exclude_name_suffix = True
preprocess_pnml(pnml_path, high_bitdepth, extra_zoom, exclude_name_suffix)
preprocess_pnml(pnml_path, newgrf_version, high_bitdepth, extra_zoom, exclude_name_suffix)