diff --git a/.gitignore b/.gitignore index 321847e..faafb31 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,9 @@ pygen/ *.grf.cacheindex grf/ +# other generated files +makefile.vcs + # working directories reference/ previews/ diff --git a/baseset/baseset_generate_obg.py b/baseset/baseset_generate_obg.py index 9f9df64..ce5d453 100644 --- a/baseset/baseset_generate_obg.py +++ b/baseset/baseset_generate_obg.py @@ -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) @@ -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 @@ -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") @@ -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 [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) diff --git a/baseset/nml/extra/extra-header.pnml b/baseset/nml/extra/extra-header.pnml index ab2ae40..f8dca16 100644 --- a/baseset/nml/extra/extra-header.pnml +++ b/baseset/nml/extra/extra-header.pnml @@ -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_ { diff --git a/docs/releasing-opengfx2.md b/docs/releasing-opengfx2.md index 2dfdf05..56d7bc0 100644 --- a/docs/releasing-opengfx2.md +++ b/docs/releasing-opengfx2.md @@ -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//-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. diff --git a/makefile b/makefile index 6098a8d..a505b26 100644 --- a/makefile +++ b/makefile @@ -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 @@ -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 @@ -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 @@ -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 @@ -75,7 +93,7 @@ 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 @@ -83,7 +101,7 @@ baseset/%_32ez.grf: graphics_4 baseset/lang/*.lng FORCE $(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 @@ -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 @@ -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 @@ -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 diff --git a/newgrf/nml/landscape/landscape-header.pnml b/newgrf/nml/landscape/landscape-header.pnml index 4b0d3d8..f0ba58e 100644 --- a/newgrf/nml/landscape/landscape-header.pnml +++ b/newgrf/nml/landscape/landscape-header.pnml @@ -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 { diff --git a/newgrf/nml/objects/objects-header.pnml b/newgrf/nml/objects/objects-header.pnml index e60fe9b..414b76a 100644 --- a/newgrf/nml/objects/objects-header.pnml +++ b/newgrf/nml/objects/objects-header.pnml @@ -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); } diff --git a/newgrf/nml/settings/settings-header.pnml b/newgrf/nml/settings/settings-header.pnml index 81ee2dc..0550313 100644 --- a/newgrf/nml/settings/settings-header.pnml +++ b/newgrf/nml/settings/settings-header.pnml @@ -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_ { diff --git a/newgrf/nml/stations/stations-header.pnml b/newgrf/nml/stations/stations-header.pnml index a372b08..e8e5464 100644 --- a/newgrf/nml/stations/stations-header.pnml +++ b/newgrf/nml/stations/stations-header.pnml @@ -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); } diff --git a/newgrf/nml/trams/trams-header.pnml b/newgrf/nml/trams/trams-header.pnml index e339096..cc1c572 100644 --- a/newgrf/nml/trams/trams-header.pnml +++ b/newgrf/nml/trams/trams-header.pnml @@ -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); } diff --git a/newgrf/nml/trees/trees-header.pnml b/newgrf/nml/trees/trees-header.pnml index 15cab77..73bb8e3 100644 --- a/newgrf/nml/trees/trees-header.pnml +++ b/newgrf/nml/trees/trees-header.pnml @@ -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 { diff --git a/templates/nml_preprocessor.py b/templates/nml_preprocessor.py index f3ba661..41b03d7 100644 --- a/templates/nml_preprocessor.py +++ b/templates/nml_preprocessor.py @@ -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. @@ -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. @@ -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 [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)