From 917bfcfd78aa80bc6058cf4d0d4f94e6007c02a3 Mon Sep 17 00:00:00 2001 From: Jeremy Gao <145064583+WenSimEHRP@users.noreply.github.com> Date: Sat, 27 Apr 2024 21:36:45 -0700 Subject: [PATCH] Initial commit --- .gitignore | 7 + LICENSE.txt | 339 ++++++ Makefile | 61 ++ README.md | 21 + cns.nml | 93 ++ custom_tags.txt | 0 indexes.pnml | 3 + install_dependencies.sh | 11 + lang/english.lng | 11 + palette.png | Bin 0 -> 609 bytes src/header.pnml | 15 + src/templates.pnml | 19 + src/testing.pnml | 55 + vox/fences/fence1.vox | Bin 0 -> 207280 bytes vox/manifest.json | 72 ++ vox/platforms/example.vox | Bin 0 -> 2475123 bytes vox/platforms/platform_concrete.vox | Bin 0 -> 1227697 bytes vox/shelters/shelter1.vox | Bin 0 -> 250706 bytes vox/ttd_palette.json | 1481 +++++++++++++++++++++++++++ 19 files changed, 2188 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 README.md create mode 100644 cns.nml create mode 100644 custom_tags.txt create mode 100644 indexes.pnml create mode 100644 install_dependencies.sh create mode 100644 lang/english.lng create mode 100644 palette.png create mode 100644 src/header.pnml create mode 100644 src/templates.pnml create mode 100644 src/testing.pnml create mode 100644 vox/fences/fence1.vox create mode 100644 vox/manifest.json create mode 100644 vox/platforms/example.vox create mode 100644 vox/platforms/platform_concrete.vox create mode 100644 vox/shelters/shelter1.vox create mode 100644 vox/ttd_palette.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3988cfa --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +gfx +*.grf +gopath +*.png +!palette.png +.nmlcache +nmlc \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..ecbc059 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0d959a6 --- /dev/null +++ b/Makefile @@ -0,0 +1,61 @@ +# dependencies +GORENDER = ./gopath/bin/gorender --palette "vox/ttd_palette.json" -m "vox/manifest.json" -s 4 -overwrite +NMLC = nmlc +GCC = gcc + + +# building paths +BUILD_DIR = build + +# voxel paths + +VOX_DIR = vox +VOX_BUILDINGS = $(wildcard $(VOX_DIR)/buildings/*.vox) +VOX_PLATFORMS = $(wildcard $(VOX_DIR)/platforms/*.vox) +VOX_SHELTERS = $(wildcard $(VOX_DIR)/shelters/*.vox) +VOX_FENCES = $(wildcard $(VOX_DIR)/fences/*.vox) + +VOX_FILES = $(VOX_BUILDINGS) $(VOX_PLATFORMS) $(VOX_SHELTERS) $(VOX_FENCES) + +VOX_8BPP_FILES = $(patsubst %.vox,%_8bpp.png,$(VOX_FILES)) +VOX_32BPP_FILES = $(patsubst %.vox,%_32bpp.png,$(VOX_FILES)) +VOX_MASK_FILES = $(patsubst %.vox,%_mask.png,$(VOX_FILES)) + + + +%_8bpp.png %_32bpp.png %_mask.png: %.vox + $(GORENDER) $< + +# default rule +all: sprites code + +sprites: $(VOX_8BPP_FILES) $(VOX_32BPP_FILES) $(VOX_MASK_FILES) + +NML_FILE = cns.nml +CODE_FILES = $(shell find . -name '*.pnml') $(shell find . -name '*.lng') $(shell find . -name 'custom_tags.txt') indexes.pnml +INDEX_FILE = indexes.pnml +GRF_FILE = cns.grf + +$(GRF_FILE): $(CODE_FILES) + $(GCC) -E -x c -o $(NML_FILE) $(INDEX_FILE) + $(NMLC) $(NML_FILE) + +# Rule to run nmlc when the NML file changes +code: $(GRF_FILE) $(NML_FILE) + +clean: clean_grf clean_png + +clean_grf: + @echo "Cleaning GRF and NML files" + @rm -f *.grf + @rm -f *.nml + +clean_png: + @echo "Cleaning PNG files" + @find $(VOX_DIR) -name '*.png' -type f -delete + +# this is only for debug purpose, you could modify it to copy the GRF to the OpenTTD data directory +# it should be something like /mnt/c/users//documents/openttd/newgrf on wsl +copy: + @echo "Copying GRF files to OpenTTD data directory" + @cp cns.grf ~/.local/share/openttd/newgrf/cns.grf diff --git a/README.md b/README.md new file mode 100644 index 0000000..5acc36d --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# China Set: Stations README + +This repo contains the source code and graphics of CNS China Set: Stations. + +CNS China Set: Stations is licensed under GNU GPL version 2 + +## Building + +You should have a `bash` environment, on Windows this should come with `git`. + +The following subjects are required to build the program: + +- go +- gorender +- make +- nml 0.7.5 or higher + +You can use `install_dependencies.sh` to quickly download and setup `gorender` + +Use the `make` or `make all` command to build the grf; additionally, you could use `make all copy` to quickly copy the grf file to your game directory. +For Windows users, we suggest using `wsl` to build the grf. Note that `gorender` may be slow when using wsl. \ No newline at end of file diff --git a/cns.nml b/cns.nml new file mode 100644 index 0000000..464e773 --- /dev/null +++ b/cns.nml @@ -0,0 +1,93 @@ +# 0 "indexes.pnml" +# 0 "" +# 0 "" +# 1 "/usr/include/stdc-predef.h" 1 3 4 +# 0 "" 2 +# 1 "indexes.pnml" +# 1 "src/header.pnml" 1 +grf { + grfid: "CNSP"; + name: string(STR_GRF_NAME); + desc: string(STR_GRF_DESC); + url: string(STR_GRF_URL); + version: 0; + min_compatible_version: 0; +} + + + +if (ttd_platform != PLATFORM_OPENTTD || openttd_version < version_openttd(12,0)) { + error(FATAL, string(STR_OPENTTD)); + exit; +} +# 2 "indexes.pnml" 2 +# 1 "src/templates.pnml" 1 +# 10 "src/templates.pnml" +template template_standard_0 (a) {[288 * 0, 0, 256, 312, -127, -182, "vox/"+a+"_32bpp.png"]} +template template_standard_1 (a) {[288 * 1, 0, 256, 312, -125, -183, "vox/"+a+"_32bpp.png"]} +template template_standard_2 (a) {[288 * 2, 0, 256, 312, -207, -222, "vox/"+a+"_32bpp.png"]} +template template_standard_3 (a) {[288 * 3, 0, 256, 312, -45, -223, "vox/"+a+"_32bpp.png"]} +template template_standard_4 (a) {[288 * 4, 0, 256, 312, -207, -222, "vox/"+a+"_32bpp.png"]} +template template_standard_5 (a) {[288 * 5, 0, 256, 312, -45, -223, "vox/"+a+"_32bpp.png"]} +template template_standard_6 (a) {[288 * 6, 0, 256, 312, -127, -182, "vox/"+a+"_32bpp.png"]} +template template_standard_7 (a) {[288 * 7, 0, 256, 312, -125, -183, "vox/"+a+"_32bpp.png"]} + +template template_standard_zero (pos, a) {[288 * pos, 0, 256, 312, 0, 0, "vox/"+a+"_32bpp.png"]} +# 3 "indexes.pnml" 2 +# 1 "src/testing.pnml" 1 +spriteset (s_test_platform, ZOOM_LEVEL_IN_4X, BIT_DEPTH_32BPP) { + template_standard_0("platforms/platform_concrete") + template_standard_1("platforms/platform_concrete") + template_standard_2("platforms/platform_concrete") + template_standard_3("platforms/platform_concrete") +} + +spriteset (s_test_shelter, ZOOM_LEVEL_IN_4X, BIT_DEPTH_32BPP) { + template_standard_zero(0, "shelters/shelter1") + template_standard_zero(1, "shelters/shelter1") + template_standard_zero(2, "shelters/shelter1") + template_standard_zero(3, "shelters/shelter1") +} + +spritelayout sp_test() { + ground { + sprite: GROUNDSPRITE_RAIL_X; + } + building { + sprite: CUSTOM(0, 0); + xoffset: 0; + yoffset: 0; + zoffset: 0; + xextent: 16; + yextent: 6; + zextent: 6; + } + childsprite { + sprite: CUSTOM(1, 0); + } + building { + sprite: CUSTOM(0, 2); + xoffset: 0; + yoffset: 10; + zoffset: 0; + xextent: 16; + yextent: 6; + zextent: 6; + } + childsprite { + sprite: CUSTOM(1, 2); + } +} + +item (FEAT_STATIONS, i_test) { + property { + class: "CNS1"; + classname: string(STR_TEST); + name: string(STR_TEST); + } + graphics { + sprite_layouts: [sp_test(), sp_test()]; + custom_spritesets: [s_test_platform, s_test_shelter]; + } +} +# 4 "indexes.pnml" 2 diff --git a/custom_tags.txt b/custom_tags.txt new file mode 100644 index 0000000..e69de29 diff --git a/indexes.pnml b/indexes.pnml new file mode 100644 index 0000000..dd4b2b4 --- /dev/null +++ b/indexes.pnml @@ -0,0 +1,3 @@ +#include "src/header.pnml" +#include "src/templates.pnml" +#include "src/testing.pnml" \ No newline at end of file diff --git a/install_dependencies.sh b/install_dependencies.sh new file mode 100644 index 0000000..e97adeb --- /dev/null +++ b/install_dependencies.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# here I'm using ahyangyi's fork of gorender + +export GOPATH=$PWD/gopath +go install github.com/ahyangyi/gorender/cmd@daeb83b4 +mv gopath/bin/cmd gopath/bin/gorender + +# if you have grf-py installed you may want to use a venv + +pip3 install nml==0.7.5 diff --git a/lang/english.lng b/lang/english.lng new file mode 100644 index 0000000..96d757e --- /dev/null +++ b/lang/english.lng @@ -0,0 +1,11 @@ +##grflangid 0x01 +# english_uk + + +STR_GRF_NAME :China Set: Stations +STR_GRF_DESC :Set of Chinese themed stations. Made by WenSim and the China Set team. +STR_GRF_URL :http://www.github.com/openttd-china-set + +# utilities +STR_TEST :Test +STR_OPENTTD :OpenTTD \ No newline at end of file diff --git a/palette.png b/palette.png new file mode 100644 index 0000000000000000000000000000000000000000..236a7b7651ec6bef594bdf387a6a5fe1454aa4a8 GIT binary patch literal 609 zcmV-n0-pVeP)Px%8%ab#R5*==k|A%URS<@shA-iWBL?z{5w94?34GbCxFi)76;~8RMa2!OqN1V# zaRmZ_Xb5rzKVTCo2_adFAc3E-VkKhbii!$0Sy6HkU+H!YWb)+9oaDSSXJ+7u7ZX>3t8wy845 zV?$1z>_LXeOza{Qghix?GH4BX2s+~A@g-727P65N$tca``8QY-l@oTu+3;w{H^?_I zE@4_T+M0@nS|g*Q-qC#@I$a_p_OC8!9U>+oAfhd~qmc@pKDl20u0YXA1(`uQu!GZ! zr-VeNkrw^5DHrA9;_!f+Ao@h~M)bbakU~m+`RP~G+frKue&9C+T|t*PKii@nD3*81 zBFD^ESHIDF5dG~;tIRx`c`i2VAIL0HCVCRxD2xhRaJ1b*PY8n&(quL&JC%*uokPRs z?3@;T>0NYeGpd-&tVZ$j=ztlR0agPZ510qk3?3ZU_b8Vcx{QaZIce>EGXG|?nkZnv z{pmY6c@R9L;Q5nAwp+5_f>xk?&^~?r2U8DPh!#Q5B%DMUtMTS$L#PwkQ3fZv;?9{2e5qJMt|@hwwY_*^0Z} vgJ;j+qtCZY)ASA*fh+lXyW!LR9_-*BLse=1p8k3X00000NkvXXu0mjfaV!;L literal 0 HcmV?d00001 diff --git a/src/header.pnml b/src/header.pnml new file mode 100644 index 0000000..ffdbce3 --- /dev/null +++ b/src/header.pnml @@ -0,0 +1,15 @@ +grf { + grfid: "CNSP"; + name: string(STR_GRF_NAME); + desc: string(STR_GRF_DESC); + url: string(STR_GRF_URL); + version: 0; + min_compatible_version: 0; +} + + +// version check +if (ttd_platform != PLATFORM_OPENTTD || openttd_version < version_openttd(12,0)) { + error(FATAL, string(STR_OPENTTD)); + exit; +} diff --git a/src/templates.pnml b/src/templates.pnml new file mode 100644 index 0000000..d6835cc --- /dev/null +++ b/src/templates.pnml @@ -0,0 +1,19 @@ +#define POSITION_X 288 +#define POSITION_Y 0 +#define SIZE_X 256 +#define SIZE_Y 312 + +#define PATH "vox/"+a+"_32bpp.png" + +// empty templates and sprites will be removed after the release of NML 0.7.5 +// currently for maximum compatibility we need to keep them +template template_standard_0 (a) {[POSITION_X * 0, POSITION_Y, SIZE_X, SIZE_Y, -127, -182, PATH]} +template template_standard_1 (a) {[POSITION_X * 1, POSITION_Y, SIZE_X, SIZE_Y, -125, -183, PATH]} +template template_standard_2 (a) {[POSITION_X * 2, POSITION_Y, SIZE_X, SIZE_Y, -207, -222, PATH]} +template template_standard_3 (a) {[POSITION_X * 3, POSITION_Y, SIZE_X, SIZE_Y, -45, -223, PATH]} +template template_standard_4 (a) {[POSITION_X * 4, POSITION_Y, SIZE_X, SIZE_Y, -207, -222, PATH]} +template template_standard_5 (a) {[POSITION_X * 5, POSITION_Y, SIZE_X, SIZE_Y, -45, -223, PATH]} +template template_standard_6 (a) {[POSITION_X * 6, POSITION_Y, SIZE_X, SIZE_Y, -127, -182, PATH]} +template template_standard_7 (a) {[POSITION_X * 7, POSITION_Y, SIZE_X, SIZE_Y, -125, -183, PATH]} + +template template_standard_zero (pos, a) {[POSITION_X * pos, POSITION_Y, SIZE_X, SIZE_Y, 0, 0, PATH]} \ No newline at end of file diff --git a/src/testing.pnml b/src/testing.pnml new file mode 100644 index 0000000..daaa328 --- /dev/null +++ b/src/testing.pnml @@ -0,0 +1,55 @@ +spriteset (s_test_platform, ZOOM_LEVEL_IN_4X, BIT_DEPTH_32BPP) { + template_standard_0("platforms/platform_concrete") + template_standard_1("platforms/platform_concrete") + template_standard_2("platforms/platform_concrete") + template_standard_3("platforms/platform_concrete") +} + +spriteset (s_test_shelter, ZOOM_LEVEL_IN_4X, BIT_DEPTH_32BPP) { + template_standard_zero(0, "shelters/shelter1") + template_standard_zero(1, "shelters/shelter1") + template_standard_zero(2, "shelters/shelter1") + template_standard_zero(3, "shelters/shelter1") +} + +spritelayout sp_test() { + ground { + sprite: GROUNDSPRITE_RAIL_X; + } + building { // station platform + sprite: CUSTOM(0, 0); + xoffset: 0; + yoffset: 0; + zoffset: 0; + xextent: 16; + yextent: 6; + zextent: 6; + } + childsprite { // shelter + sprite: CUSTOM(1, 0); + } + building { + sprite: CUSTOM(0, 2); + xoffset: 0; + yoffset: 10; + zoffset: 0; + xextent: 16; + yextent: 6; + zextent: 6; + } + childsprite { + sprite: CUSTOM(1, 2); + } +} + +item (FEAT_STATIONS, i_test) { + property { + class: "CNS1"; + classname: string(STR_TEST); + name: string(STR_TEST); + } + graphics { + sprite_layouts: [sp_test(), sp_test()]; + custom_spritesets: [s_test_platform, s_test_shelter]; + } +} \ No newline at end of file diff --git a/vox/fences/fence1.vox b/vox/fences/fence1.vox new file mode 100644 index 0000000000000000000000000000000000000000..fe8d6b2fa16d8b01387dbbc0790a67b201c0ff3d GIT binary patch literal 207280 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