From dad7b3a1ab5979cc80c900a2e176415de447e837 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 25 Jul 2010 14:56:40 +0100 Subject: [PATCH 001/237] first commit --- README | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README diff --git a/README b/README new file mode 100644 index 000000000..e69de29bb From 2b8775bc56a1016198010e50a0329db82144c1cc Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 25 Jul 2010 15:03:39 +0100 Subject: [PATCH 002/237] Current source - 38.0 --- LICENSE | 340 ++ Makefile | 88 + Resources/Font-Data | Bin 0 -> 4422 bytes Resources/Font-Pointers | Bin 0 -> 512 bytes Resources/Icon-16.png | Bin 0 -> 3161 bytes Resources/Icon-32.png | Bin 0 -> 3896 bytes Resources/powder.icns | Bin 0 -> 98761 bytes Resources/powder.ico | Bin 0 -> 90174 bytes font.h | 27 + hmap.h | 21 + http.c | 913 +++++ http.h | 43 + icon.h | 22 + md5.c | 224 ++ md5.h | 17 + powder.c | 8429 +++++++++++++++++++++++++++++++++++++++ update.c | 188 + update.h | 27 + version.h | 31 + 19 files changed, 10370 insertions(+) create mode 100644 LICENSE create mode 100755 Makefile create mode 100644 Resources/Font-Data create mode 100644 Resources/Font-Pointers create mode 100755 Resources/Icon-16.png create mode 100755 Resources/Icon-32.png create mode 100755 Resources/powder.icns create mode 100755 Resources/powder.ico create mode 100755 font.h create mode 100755 hmap.h create mode 100755 http.c create mode 100755 http.h create mode 100755 icon.h create mode 100755 md5.c create mode 100755 md5.h create mode 100755 powder.c create mode 100755 update.c create mode 100755 update.h create mode 100755 version.h diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..983f982a1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, 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 Library 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 St, 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 Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100755 index 000000000..90fed1c77 --- /dev/null +++ b/Makefile @@ -0,0 +1,88 @@ +SOURCES := powder.c http.c md5.c update.c +HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h + +CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -fgnu89-inline +OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations +LFLAGS := -lSDL -lm -lbz2 +LFLAGS_MTW32 := -lpthreadGC2 +LFLAGS_MT := $(LFLAGS) -lpthread +MFLAGS_MT := -march=k8 -DX86 -DX86_SSE3 -DMT -msse3 +MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 +MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 +MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE + +LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 +WIN32_TARG := powder-sse.exe powder-sse2.exe + +powder: $(SOURCES) $(HEADERS) + gcc -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + +powder-sse3: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 + strip $@ +powder-mt: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -DLIN32 + strip $@ +powder-sse2: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN32 + strip $@ +powder-sse: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 + strip $@ + +powder-64-sse3: $(SOURCES) $(HEADERS) + gcc -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + strip $@ +powder-64-sse2: $(SOURCES) $(HEADERS) + gcc -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 + strip $@ + +powder-res.o: powder-res.rc powder.ico + i586-mingw32msvc-windres powder-res.rc powder-res.o + +powder-sse3.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-mt.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_MT) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS_MTW32) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-sse2.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-sse.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-x: $(SOURCES) $(HEADERS) + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa + strip $@ +powder-x-mt: $(SOURCES) $(HEADERS) + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa +powder-src.tar.bz2: *.c *.h *.rc *.ico Makefile + mkdir powder-src + cp *.c *.h *.rc *.ico Makefile powder-src/ + tar cfj powder-src.tar.bz2 powder-src + rm -rf powder-src + +release: $(LINUX_TARG) $(WIN32_TARG) powder-src.tar.bz2 + tar cfz powder-linux.tar.gz $(LINUX_TARG) + cp /usr/i586-mingw32msvc/bin/SDL.dll . + zip powder-win32.zip $(WIN32_TARG) SDL.dll + mkdir -p release + mv powder-linux.tar.gz release/ + mv powder-win32.zip release/ + mv powder-src.tar.bz2 release/ + cp powder-sse.exe powder.exe + rm -f release/powder.zip + zip release/powder.zip powder.exe SDL.dll + cp powder-64-sse2 release/powder64 + rm -f release/powder64.gz + gzip release/powder64 + rm -f release/powder.gz + cp powder-sse release/powder + gzip release/powder + cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. + rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe diff --git a/Resources/Font-Data b/Resources/Font-Data new file mode 100644 index 0000000000000000000000000000000000000000..1abf887519ef352056ae302bfdea96ec8327b40a GIT binary patch literal 4422 zcmeHJ;cr`46+eF0elM|a`oh8lC3c*VA`rOqwcn#jshjt*lw}e@i}r;Nd?12~PY7Hb zq)O1*RY4tUCDJcQRX@-Vlc+ML7G=_cHk#KwZLWyZzBZHiKt!D-q6o3&P4+Yo>|D;h z@3~pWUjXWfbA8V}=brOB=bn46WAJf`eVl>ETsIy6E14kG994=@fLLvAMCqaj6)O8{ zb*tuQYxBLhsxr?qHnrvx1_y$?cJOv>Gv$!EZy1XwgI($=MhCq7qLDnMi4`(k3ItIz zr4cP-lJ7iJm2aT9}1!U=o|OTHyOl7w8Z=<{cFJ>WYh*cq}9Gbxe@(9_aW?7?U$xs}zR zGbqLSn+~}9Q z%seJe>}TV9fub|gu!zB?q`zp23Q8dw)r(LEsMFt9me{l@*DR7ZV9~i=d^JR?F(Bg8 z&*j1Q5SBjr(<58?vy9+hprmPQq~u=6yK9c&g-gwe>IsiBvUc}wIy5B$DVaP6^1wlB zPOJ+R7gg@d&_U%nlQi@{GgIppMNaed`H^lB@PUB<&z!WWks26|@N(~=7Yr0jZ0%-W z01g39vZ}e3e0M0bkJ1nwnRd?{@yNzAZq5l^8;9-}Rl2R?2gudXo zqrkuvK!=1*?)JWPEf?s>xTcPxz5sps#HeB9Cj$gn@YS444S9P`T zc{-@e*7Bz=lw`UES7X(=NsZ!OL;Rsr5~ zcG78QJ=jVx7 z2`KKBD!gbks;~W8DlPdU*`?W&i_E##W z!9$x|z}QoldxDJsp&xzJ5B=yHe(1+e!z@0q&uEh#3+!6?UK$mTT z1I}32czClgiZ<8Vh)u>Ah7{y}sh;Iq*(JFqobzmlf5^LZpO;%)1ZhX`jk%@uyO8Sx zY|dCLqFEte{MU8g|KxxYJ67T6hrFi|Qk^G2hb40T9j?qodbmc0NQvwar~AiI0bn~@ zAH*ie$qoNz-ZYlM5Mj>@U;5t(8F5lw%!g##(bbYzP7j`*f#DedIO4P$C0RIu# zf4eq=E5mRcdh1qk_Iu8DWrb+^&=2?*xrHwt>K{7>PfWZRed?*7KQ}zGQtM$suj|D` zrQjsIs`**x-*7`|Y8~;Yh+hbTY{1;^hpSML?89}e9qDS@9sMNq?Fb37C!5@{sFV+jcbBSIM#f#ONaBevl2iFcg zfGP6Z%ApRwdHJKIrKQ&{VV&smWQai8#+nw+x#bJncTm_PO#dvs%3P}or$v^K;_{kM zaN7nw;5s>~x{M*qtvI*vAwkZ>7KH#q?q_d0c1=3rke%(k%F*0GIwRTI1RbQ*c& zfar%Em=uu+**P{lJ1g&cz%9YZL(P4M-fH77sX)_Tg|a2J{`wCWw^jPtdHY#)elXaB=c25< zyf8jo$3a=aBMz+fC=SD(gpcxW!Yji|5%h5d|0{6jK>sgb`1|&gU;pm>H@){qBAtl| z4J9#@V@GQ#sJ@%Pjrg>ep&5~WOn5uusdgDVO;hv4BjBM$M7W!HG5dl)6N$flt=##b zni$7c_);WZ$yUCT#S#KhM-kI>B3hsKldd(9*JebvMx2Et{9s?&f!7n*Qx@Wt{cv27 z;%;_q=s#F_khszMm$I9vWMM|4ZYkI$u4Ql3|Dv3Xf_w-?-okihcE8=>Q#@T?7D0Vr zM?M|5KL@?)a0Qeeta}Mi4p{A7DDrzDjyaG+w{rQreDnThc5~;Q>`u^P{_9*ndCrgd NN9+D^KK`%r@gG!MsmA~S literal 0 HcmV?d00001 diff --git a/Resources/Font-Pointers b/Resources/Font-Pointers new file mode 100644 index 0000000000000000000000000000000000000000..4826cc60b212f4c0657174631b4a52b3d7b7df7d GIT binary patch literal 512 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 literal 0 HcmV?d00001 diff --git a/Resources/Icon-32.png b/Resources/Icon-32.png new file mode 100755 index 0000000000000000000000000000000000000000..1f056bd778a1a0f9f6dc4c94ad864e7dcaf1db4c GIT binary patch literal 3896 zcmV-856AF{P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000DINkl^ia$QVm01Jjrd3KQeKUG5Lnk^0$Jop z3&^ z_$-naeAH#OW4f4C6oqcLyBL5NnT%{LxT|F3o7i6e@!25K%6YrwSmd)nSs(xUlHr1# zJ#H=dbe4At{+;lz=)^xdOUn@asN{PcHsv(Gjh|o~H((3?S_A14yBrOaxT4_XJk2>8 zEv^ZCCoq&VxsF{O?(XnmgByr3N|NMU0A&aR_7?PCkMH6(RUqLyT#4)PBHpGo&&Tsj z%rV(!sAMyt`ordCnr&>uCAC^^sZVKinQw<{t}nrXwbiX{xTjXdwtC~Cny|}l6&6zb z@*EJpVqv@-ch@0F*8u$T)ynaqwbZinsN(Ba0nj>7>wI|&At=kz`E^kLTj0Rb01p0+ z?jP!$zu01o(lnK2*`i#&y8QZnrJ(sX)66^30og=*8 zTR9ILId-Z3-&fs1*%xF@@@AAIQDdkryZW$n>tX32$wAtGW9DRTK2%kAHZY#Du|ead zS&iG@kxr0&p77p?;=L5p%X47M@lRF`<$*PF?vHEeiWg)Sqclm*85c=rmHDOCzr2<% zmx@m>e0f~T*-G>}PI`&Yl`99mQ))%mIFWeeO10MTrbsKI2cjEg&)j0qa9Z*AQkhnCUH7zw@WzeD zjvPI{Yu%BnN9MB^!bEy2SBiM8NW^I+xR8j2iB_xx%W&1(DuHkD86K{0bnClTyLo)~ zKbvr(s^Q^H)@!w;ug7h^GRh2Bgoh_`TD|NK#hg~O093=n)mq6>_ChqCqEUo!BK`32 zNx7WXvNTt#&2ne2TDta~I=@}B;hTp3$u7fS!ozEI7 z)f?9^F*7kW=S1~3Y!KB8X)V$hi%di`m<=1cywQH_CbArRXSkFT>228Xh|`+g*%YbO zK5fQcS1YyR#|_z~#&fR5r#yZ9>Y1xPd#SRqdENR_qZ-YOYhXYdHef)YUr{^s+=>lz zJ4~M{5{adv|K^AG|FDnA)5t*${bOO_O}v3ZBvQW#e{M19IeqdXk;cP!-pj1KLRFEd zP+4GXZQT-2DttD7Sfe$v)>_dYPu6KAEn7CDhwHVH%Eku5BlwH%DHsNi`1M-hsek)` zJokU`CY4sNwB&mzb8>pCQmYS_E)FdttI>)|%KuOyc)o{~y|iB2Ku7<5>W7pMU%qDL z<`))aCBC_H@!6+uIeGc{nYyuU5=n`+=sP}T-$nS=!z2E?ls!W)Z4xm7mxS?#a#e_0 zDO2#GxmQJhYoWqrn-m5rktifCJjyaKiaw#xQ15{Q2m1x=x%wpLeLSCF`C!{}*`hgP zhmL_V@v^F?k5`}FpH*7R@A3P$?AorFIDR@bORso(cI)w0rL9r;h#NM3(UMUvZq86N zz2err%ghX=wno-dMVF2P7p^(y%tsUG3i^WoYY27YP5PEFMQTi_%r`& zY5AWpw(eqPS-Rk-2Q(T*o>FHusqVe^isV1+W=L;2nxTT_LbRd+PGm$+tc%Gnl9ByF zwIbN1COv00F=YLLt9PUFwc55x2pd(woR=q!4IXHHnpbj73qE4-v zmNn~ntU0)8wuep>*pg}^Wyc;t{%O*_a5ux>f+q4jiZCTqXXAkY-h{a zbb^uT^)Bu`yLiv`YTwbxsXgA%+RoP2&d#R!pLJnrdcAY6&aOdwrnhVB)Ulm?Yg-%Z zmW>CoMSgO|CV1uH%O}CGEiO2X9h}QPcp%SG+J@eE>0w+H=6Yb zfADFARxfi~H_Qw4jM&`DbMnfFb1`|jk*D_W*?(a7UuR!N@9T~!r7^uOG0-!RR;pI7 zU4I|jniiETEGk!S=;q$i*g(gJtEE??hUN0=dX}~7=;VSE(Uo|^zjGpb2~LDxVahO# zLFh8f!%B@Pkep~5n{EuG|IOLvzy0>b|7m*SC3;Ah|KX#CB=0}Gs?|0&{m-vAGym1E z|Ht8Lo0hl9w(iOKR<|in46#b=9_jYa(tkcSn+uV zxjA6QWj1EqzI^`l=_A;sf*tt1kBej6Kr<=|!f>y+m$Db)=g*ZdM9<|fL@)VQO(A0B z%c$tsl-GCfp1OG^`cBln-M9C?c@h;9^Y+61Ywu&@9)HmWGmc=G&*d31j#*rW9^~V` z{PF1{<46)FCcKA)UZi@3CJxp}z-+;@4YqC{3~ zP*PG{T*McL6mf;3B6*>vAT(c*C(g~~@5B~*Ocm&l!BIiaY=EBvRGVHtSZtgEGkkJ>J=0g$_hmJe1R-qoR_c66X)FE zYz%Cj8NF(O+O1da?>&0@?Ah~|E?l^X&&x$Bq8L(&RfMWUuei8GQOp&Iiq#mHegUYd z3*`Cwd06A~d1kpe*_oGYtZi&MGIEsywc8&>oxO17`n`Mi@87$}-4#D5Qhe7d#o80Z z3}|#Za>^nl8=Ja7k*^18GV76qLV&lWEU_owISa{r5pssu#_cSv8Y5| zEGm)}%ZtQ?Me0HYMC33q6&q8=6>DoNYk`hwpmtY!c0pk=bOmK`AfhZaEGaEv3M2W{ z@S!3QGJwJgF)TS#mlC>ye7QN-ty)=GIlm$G>j!H8`c6w}jD|1O`(6sM_!3buS0XNE zMW+v!2!>O8&NylZ?*9RUd>D}{1o5Q|i-E?ov$G%$KdfnI(=0ZCwx3!XnN zfdKokvJCrffcKYv4=dHs$YsU)PyjfR`>6_5>}t8rU2^kexuR=)3w@_3?P8?0h1$d4 z;diKSVBku|co{4rgGH3^I#`2^Sy`YGyhMf60B6s=#x*x+A<&R6)E>gc_)_bP%9V)V zA0aRV4MXr;q9D%8<5?)=@id6$Gzi$?2LTlb$iAye^~s!?5)GrklPO^ZHMZDtp7wI=+@v2YnRed*N&H#Tn+kA zRm1B!K}i}Ggk*aITv&)y1GiVhgURh>OxfyOeFP&LdyIAo*e})|{SF6|l$K(er6C{^ z;Y5mJ2{c`VPv(qrkfC5u2=1)THJ~id$i&i=X%MVEMr0_tD9hZ4GD0yzS%Xweic{tC zIfB~a=o-CX?Q!LIL(*C)#xLkhQKAxzq$&!7zSZn9neMXpbeaAV?eS6tC07p7uEAJ^ z%%c*tC1dIi(Z#w(@DGeOM;L7xi4!oGiV_&?q|1a#He3b5S6syMmm$0ZGP8`YKn_6o zk>`UJeG2pv*pQZLPr%#sNr9SjLAYWurD;J2ln+7#cU8fLxw&OBC1^Rw1Og>8l1Wo4 zp)s*RDOd)>EJU$fSR_cM(q%(3se<{U8vX=w($ma)1$vzJWC^dc248|$P$0j`%2E`~ z8u}EB$^v~7ky%xq$K{IPU?8T*k)HAo5BG1zh)F;UX&(a05s3(FA*N{Z5Tujoa=wa9 zYN9+&kW&FygP=-`YzD$xAZAD-`wlOGtcp@2rhoiUAnTE$R7Hm5@|5~1Vu%*`4JnN1 zut6mX8Y?9UX@13sWSC(~5N$MVknPlzW5{<{U>jfdazv+y(zQ49u?`GK*;PVLK>1T8OoxVy080kYi-NhgqD(#^ ze=5)P!o6F&|E9ioVl;{$Znk~oV z@V6qY6;&{=5{||TPOE0V20em;?4J~hm280+qFc{}z#1Vmcp00`Xl25tGa7>e6lBoC zKgIwGYM2!oROzyf8qUh)i`b%z%f(F1B2bA-Nt6G)zC>P1le}O~4XJ|CE3J~4ODM}0 zysBIkDFENnQ${AnM$MT=FjWc^c0 zKnghvHCl2pUC5a|m58<+C8%Vd^bcP>u>uttrf0P2jn3X$^^6&X&YVmLzH7 zq#P2GEj{@!3ehlYP@dJN6%U8;u=L0l83L6MCM#T-Kq!J)_&XZ>(eV{%eTW+i3Y z2VwFnTWSbvSeikJoRGOmzaYuwh~O;}(lEZ26)kQAszsDcRKk`-rQ45?+Yv35ZU&I$ z8bUaHDRO9NAr)!B=DUhDSOGEf&eH}jt4k{~!BA?D6lHO6Tc)RfGd{|7JPRONT`1xBv;|??86oMb zDEPAYY}LQ$2iDfGMHrO=C`Hk(kjukrUf98Cn4R^&S|!-JS$VoGmxnFmXd9s@q-l$1 zRMadPD9cwkWv0%`)>I@UL=7TXSR@In95u5NPhLl}AMHwXQ-=o5QcgjLU#tao7P38% z3fm`5*=!+fX4JWA#6osL}N{H>li6y!s719Pd z7*WZrKm}`uokb-O2v?|& z1s>)e1TXElY4KaOaVt}_iWy4I6cm=l{|g;#l2Of};su4TuoTy@DMnegC_<2^p;|6W zmif;-P^e_XphY56Ev@TdBMq!9tjaK#Q;-Rs4%1)+|BN(7LrpT2g+H4el)6bqgY+R> zP6ndOr>|aBVPQ}xgI>!j7dpdIoYE{#sYA&W5Xxx$5aZ`$RLB>HA!$&Uv5kOG8dC^M z3XaVS3bx2ZW*28c8{$liMe#4n#12PSLE_7-5{iL@U{*mIR3SzwT7*jvVTu!?9>KaR zoeDt&PN32gB~zA+X_1WCjj~M+1fgt$RbE!MLKuK5Qxpg)wOH=J9JT8!xRawomtpWz zjV{%NfVBa+5-x-XWc_p zL1s?Y$IsvLcp6bY3|pS|X!BMF=|49&W0_2J9aicNRo5>vk_vX^Hm zGmSpSKEH;_^!Rc)=LMu}a_>9P+r4-1uHAZg^&2|W$ESav{=-HMA39>R|HKIsCQg|) zb=tJa(`U_|JqKU2rcD?-Vt{vFuMSoYF755@nl)(`-^w`}lYpt`JqK9y)5oh*6>4N3<0gdinS$ z`iWY~MCL;^O`A5>j2u3EV!blL<>L)x<6YH3WK}*?O$R-URMuY9h;JDBzZ$AQ(L5k^ z1+QMJnxA)g=~2KYsb*#g*sFU+j3P z|LSh^LX_`j#Xiq{A]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 S;?fN;ne)(?8bTL3 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≀0iwiUE9s3m_S| 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 byTM}{bv<>=)c?OJA@jd>%%ZgaZ@2#kNH-22 literal 0 HcmV?d00001 diff --git a/font.h b/font.h new file mode 100755 index 000000000..1eb1b54cf --- /dev/null +++ b/font.h @@ -0,0 +1,27 @@ +/** + * Powder Toy - Font Data + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw. + * + * 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 02111-1301 USA + */ +#define FONT_H 10 +char font_data[] = { + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, +}; +short font_ptrs[] = { + 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e56, 0x0e66, 0x0e76, 0x0e86, 0x0e96, 0x0ea6, 0x0eb6, 0x0ec6, 0x0ed6, 0x0ee6, 0x0ef6, 0x0f06, 0x0f16, 0x0f26, 0x0f36, 0x0f46, 0x0f56, 0x0f66, 0x0f76, 0x0f86, 0x0f96, 0x0fa6, 0x0fb6, 0x0fc6, 0x0fd6, 0x0fe6, 0x0ff6, 0x1006, 0x1016, 0x1026, 0x1036, 0x1046, 0x1056, 0x1066, 0x1076, 0x1086, 0x1096, 0x10a6, 0x10b6, 0x10c6, 0x10d6, 0x10e6, 0x10f6, 0x1106, 0x1116, 0x1126, 0x1136, +}; \ No newline at end of file diff --git a/hmap.h b/hmap.h new file mode 100755 index 000000000..a356fd205 --- /dev/null +++ b/hmap.h @@ -0,0 +1,21 @@ +/** + * Powder Toy - Heatmap Data + * + * Copyright (c) 2010 Simon Robertshaw + * + * 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 02111-1301 USA + */ +unsigned char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; +unsigned char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; \ No newline at end of file diff --git a/http.c b/http.c new file mode 100755 index 000000000..74bafa29c --- /dev/null +++ b/http.c @@ -0,0 +1,913 @@ +/** + * Powder Toy - HTTP Library + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * 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 02111-1301 USA + */ + + +#include +#include +#include +#ifndef MACOSX +#include +#endif +#include +#ifdef WIN32 +#define _WIN32_WINNT 0x0501 +//#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#endif + +#include "version.h" +#include "http.h" +#include "md5.h" + +#ifdef WIN32 +#define PERROR SOCKET_ERROR +#define PERRNO WSAGetLastError() +#define PEAGAIN WSAEWOULDBLOCK +#define PEINTR WSAEINTR +#define PEINPROGRESS WSAEINPROGRESS +#define PEALREADY WSAEALREADY +#define PCLOSE closesocket +#else +#define PERROR -1 +#define PERRNO errno +#define PEAGAIN EAGAIN +#define PEINTR EINTR +#define PEINPROGRESS EINPROGRESS +#define PEALREADY EALREADY +#define PCLOSE close +#endif + +static int http_up = 0; +static long http_timeout = 15; +static int http_use_proxy = 0; +static struct sockaddr_in http_proxy; + +static char *mystrdup(char *s) +{ + char *x; + if(s) { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +static int splituri(char *uri, char **host, char **path) +{ + char *p=uri,*q,*x,*y; + if(!strncmp(p, "http://", 7)) + p += 7; + q = strchr(p, '/'); + if(!q) + q = p + strlen(p); + x = malloc(q-p+1); + if(*q) + y = mystrdup(q); + else + y = mystrdup("/"); + strncpy(x, p, q-p); + x[q-p] = 0; + if(q==p || x[q-p-1]==':') { + free(x); + free(y); + return 1; + } + *host = x; + *path = y; + return 0; +} + +static char *getserv(char *host) +{ + char *q, *x = mystrdup(host); + q = strchr(x, ':'); + if(q) + *q = 0; + return x; +} + +static char *getport(char *host) +{ + char *p, *q; + q = strchr(host, ':'); + if(q) + p = mystrdup(q+1); + else + p = mystrdup("80"); + return p; +} + +static int resolve(char *dns, char *srv, struct sockaddr_in *addr) +{ + struct addrinfo hnt, *res = 0; + if(http_use_proxy) { + memcpy(addr, &http_proxy, sizeof(struct sockaddr_in)); + return 0; + } + memset(&hnt, 0, sizeof(hnt)); + hnt.ai_family = AF_INET; + hnt.ai_socktype = SOCK_STREAM; + if(getaddrinfo(dns, srv, &hnt, &res)) + return 1; + if(res) { + if(res->ai_family != AF_INET) { + freeaddrinfo(res); + return 1; + } + memcpy(addr, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + return 0; + } + return 1; +} + +void http_init(char *proxy) +{ + char *host, *port; +#ifdef WIN32 + WSADATA wsadata; + if(!WSAStartup(MAKEWORD(2,2), &wsadata)) + http_up = 1; +#else + signal(SIGPIPE, SIG_IGN); + http_up = 1; +#endif + if(proxy) { + host = getserv(proxy); + port = getport(proxy); + if(resolve(host, port, &http_proxy)) + http_up = 0; + else + http_use_proxy = 1; + free(host); + free(port); + } +} + +void http_done(void) +{ +#ifdef WIN32 + WSACleanup(); +#endif + http_up = 0; +} + +#define CHUNK 4096 + +#define HTS_STRT 0 +#define HTS_RSLV 1 +#define HTS_CONN 2 +#define HTS_IDLE 3 +#define HTS_XMIT 4 +#define HTS_RECV 5 +#define HTS_DONE 6 +struct http_ctx { + int state; + time_t last; + int keep; + int ret; + char *host, *path; + char *thdr; + int thlen; + char *txd; + int txdl; + struct sockaddr_in addr; + char *tbuf; + int tlen, tptr; + char *hbuf; + int hlen, hptr; + char *rbuf; + int rlen, rptr; + int chunked, chunkhdr, rxtogo, contlen, cclose; + int fd; + char *fdhost; +}; +void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep) +{ + struct http_ctx *cx = ctx; + if(!ctx) { + ctx = calloc(1, sizeof(struct http_ctx)); + cx = ctx; + cx->fd = PERROR; + } + + if(!cx->hbuf) { + cx->hbuf = malloc(256); + cx->hlen = 256; + } + + if(!http_up) { + cx->ret = 604; + cx->state = HTS_DONE; + return ctx; + } + + if(cx->state!=HTS_STRT && cx->state!=HTS_IDLE) { + fprintf(stderr, "HTTP: unclean request restart state.\n"); + exit(1); + } + + cx->keep = keep; + cx->ret = 600; + if(splituri(uri, &cx->host, &cx->path)) { + cx->ret = 601; + cx->state = HTS_DONE; + return ctx; + } + if(http_use_proxy) { + free(cx->path); + cx->path = mystrdup(uri); + } + if(cx->fdhost && strcmp(cx->host, cx->fdhost)) { + free(cx->fdhost); + cx->fdhost = NULL; + PCLOSE(cx->fd); + cx->fd = PERROR; + cx->state = HTS_STRT; + } + if(data) { + if(!dlen) + dlen = strlen(data); + cx->txd = malloc(dlen); + memcpy(cx->txd, data, dlen); + cx->txdl = dlen; + } else + cx->txdl = 0; + + cx->contlen = 0; + cx->chunked = 0; + cx->chunkhdr = 0; + cx->rxtogo = 0; + cx->cclose = 0; + + cx->tptr = 0; + cx->tlen = 0; + + cx->last = time(NULL); + + return ctx; +} + +void http_async_add_header(void *ctx, char *name, char *data) +{ + struct http_ctx *cx = ctx; + cx->thdr = realloc(cx->thdr, cx->thlen + strlen(name) + strlen(data) + 4); + cx->thlen += sprintf(cx->thdr+cx->thlen, "%s: %s\n", name, data); +} + +static void process_header(struct http_ctx *cx, char *str) +{ + char *p; + if(cx->chunkhdr) { + p = strchr(str, ';'); + if(p) + *p = 0; + cx->rxtogo = strtoul(str, NULL, 16); + cx->chunkhdr = 0; + if(!cx->rxtogo) + cx->chunked = 0; + } + if(!str[0]) { + cx->rxtogo = cx->contlen; + cx->chunkhdr = cx->chunked; + if(!cx->contlen && !cx->chunked && cx->ret!=100) + cx->state = HTS_DONE; + return; + } + if(!strncmp(str, "HTTP/", 5)) { + p = strchr(str, ' '); + if(!p) { + cx->ret = 603; + cx->state = HTS_DONE; + return; + } + p++; + cx->ret = atoi(p); + return; + } + if(!strncmp(str, "Content-Length: ", 16)) { + cx->contlen = atoi(str+16); + return; + } + if(!strcmp(str, "Transfer-Encoding: chunked")) { + cx->chunked = 1; + return; + } + if(!strcmp(str, "Connection: close")) { + cx->cclose = 1; + return; + } +} + +static void process_byte(struct http_ctx *cx, char ch) +{ + if(cx->rxtogo) { + cx->rxtogo--; + + if(!cx->rbuf) { + cx->rbuf = malloc(256); + cx->rlen = 256; + } + if(cx->rptr >= cx->rlen-1) { + cx->rlen *= 2; + cx->rbuf = realloc(cx->rbuf, cx->rlen); + } + cx->rbuf[cx->rptr++] = ch; + + if(!cx->rxtogo && !cx->chunked) + cx->state = HTS_DONE; + } else { + if(ch == '\n') { + cx->hbuf[cx->hptr] = 0; + process_header(cx, cx->hbuf); + cx->hptr = 0; + } else if(ch != '\r') { + if(cx->hptr >= cx->hlen-1) { + cx->hlen *= 2; + cx->hbuf = realloc(cx->hbuf, cx->hlen); + } + cx->hbuf[cx->hptr++] = ch; + } + } +} + +int http_async_req_status(void *ctx) +{ + struct http_ctx *cx = ctx; + char *dns,*srv,buf[CHUNK]; + int tmp, i; + time_t now = time(NULL); +#ifdef WIN32 + unsigned long tmp2; +#endif + + switch(cx->state) { + case HTS_STRT: + dns = getserv(cx->host); + srv = getport(cx->host); + if(resolve(dns, srv, &cx->addr)) { + free(dns); + free(srv); + cx->state = HTS_DONE; + cx->ret = 602; + return 1; + } + free(dns); + free(srv); + cx->state = HTS_RSLV; + return 0; + case HTS_RSLV: + cx->state = HTS_CONN; + cx->last = now; + return 0; + case HTS_CONN: + if(cx->fd == PERROR) { + cx->fd = socket(AF_INET, SOCK_STREAM, 0); + if(cx->fd == PERROR) + goto fail; + cx->fdhost = mystrdup(cx->host); +#ifdef WIN32 + tmp2 = 1; + if(ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR) + goto fail; +#else + tmp = fcntl(cx->fd, F_GETFL); + if(tmp < 0) + goto fail; + if(fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0) + goto fail; +#endif + } + if(!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr))) + cx->state = HTS_IDLE; +#ifdef WIN32 + else if(PERRNO==WSAEISCONN) + cx->state = HTS_IDLE; +#endif +#ifdef MACOSX + else if(PERRNO==EISCONN) + cx->state = HTS_IDLE; +#endif + else if(PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY +#ifdef WIN32 + && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL +#endif + ) + goto fail; + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_IDLE: + if(cx->txdl) { + // generate POST + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); + if(cx->thdr) { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl); +#ifdef BETA + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#else + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#endif + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl); + cx->tlen += cx->txdl; + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; + } else { + // generate GET + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(cx->thdr) { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); +#ifdef BETA + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#else + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#endif + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + } + cx->state = HTS_XMIT; + cx->last = now; + return 0; + case HTS_XMIT: + tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) { + cx->tptr += tmp; + if(cx->tptr == cx->tlen) { + cx->tptr = 0; + cx->tlen = 0; + if(cx->tbuf) + free(cx->tbuf); + cx->state = HTS_RECV; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_RECV: + tmp = recv(cx->fd, buf, CHUNK, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) { + for(i=0;istate == HTS_DONE) + return 1; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_DONE: + return 1; + } + return 0; + +fail: + cx->ret = 600; + cx->state = HTS_DONE; + return 1; + +timeout: + cx->ret = 605; + cx->state = HTS_DONE; + return 1; +} + +char *http_async_req_stop(void *ctx, int *ret, int *len) +{ + struct http_ctx *cx = ctx; + char *rxd; + + if(cx->state != HTS_DONE) + while(!http_async_req_status(ctx)) ; + + if(cx->host) { + free(cx->host); + cx->host = NULL; + } + if(cx->path) { + free(cx->path); + cx->path = NULL; + } + if(cx->txd) { + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; + } + if(cx->hbuf) { + free(cx->hbuf); + cx->hbuf = NULL; + } + if(cx->thdr) { + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + + if(ret) + *ret = cx->ret; + if(len) + *len = cx->rptr; + if(cx->rbuf) + cx->rbuf[cx->rptr] = 0; + rxd = cx->rbuf; + cx->rbuf = NULL; + cx->rlen = 0; + cx->rptr = 0; + cx->contlen = 0; + + if(!cx->keep) + http_async_req_close(ctx); + else if(cx->cclose) { + PCLOSE(cx->fd); + cx->fd = PERROR; + if(cx->fdhost) { + free(cx->fdhost); + cx->fdhost = NULL; + } + cx->state = HTS_STRT; + } else + cx->state = HTS_IDLE; + + return rxd; +} + +void http_async_get_length(void *ctx, int *total, int *done) +{ + struct http_ctx *cx = ctx; + if(done) + *done = cx->rptr; + if(total) + *total = cx->contlen; +} + +void http_async_req_close(void *ctx) +{ + struct http_ctx *cx = ctx; + void *tmp; + if(cx->host) { + cx->keep = 1; + tmp = http_async_req_stop(ctx, NULL, NULL); + if(tmp) + free(tmp); + } + if(cx->fdhost) + free(cx->fdhost); + PCLOSE(cx->fd); + free(ctx); +} + +char *http_simple_get(char *uri, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); + if(!ctx) { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} +static char hex[] = "0123456789abcdef"; +void http_auth_headers(void *ctx, char *user, char *pass) +{ + char *tmp; + int i; + unsigned char hash[16]; + unsigned int m; + struct md5_context md5; + + if(user) { + http_async_add_header(ctx, "X-Auth-User", user); + if(pass) { + md5_init(&md5); + md5_update(&md5, (unsigned char *)user, strlen(user)); + md5_update(&md5, (unsigned char *)"-", 1); + m = 0; + + md5_update(&md5, (unsigned char *)pass, strlen(pass)); + md5_final(hash, &md5); + tmp = malloc(33); + for(i=0;i<16;i++) { + tmp[i*2] = hex[hash[i]>>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } + } +} +char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); + + if(!ctx) { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} + +char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, data, dlen, 0); + if(!ctx) { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} + +char *http_ret_text(int ret) +{ + switch(ret) { + case 100: return "Continue"; + case 101: return "Switching Protocols"; + case 102: return "Processing"; + + case 200: return "OK"; + case 201: return "Created"; + case 202: return "Accepted"; + case 203: return "Non-Authoritative Information"; + case 204: return "No Content"; + case 205: return "Reset Content"; + case 206: return "Partial Content"; + case 207: return "Multi-Status"; + + case 300: return "Multiple Choices"; + case 301: return "Moved Permanently"; + case 302: return "Found"; + case 303: return "See Other"; + case 304: return "Not Modified"; + case 305: return "Use Proxy"; + case 306: return "Switch Proxy"; + case 307: return "Temporary Redirect"; + + case 400: return "Bad Request"; + case 401: return "Unauthorized"; + case 402: return "Payment Required"; + case 403: return "Forbidden"; + case 404: return "Not Found"; + case 405: return "Method Not Allowed"; + case 406: return "Not Acceptable"; + case 407: return "Proxy Authentication Required"; + case 408: return "Request Timeout"; + case 409: return "Conflict"; + case 410: return "Gone"; + case 411: return "Length Required"; + case 412: return "Precondition Failed"; + case 413: return "Request Entity Too Large"; + case 414: return "Request URI Too Long"; + case 415: return "Unsupported Media Type"; + case 416: return "Requested Range Not Satisfiable"; + case 417: return "Expectation Failed"; + case 422: return "Unprocessable Entity"; + case 423: return "Locked"; + case 424: return "Failed Dependency"; + case 425: return "Unordered Collection"; + case 426: return "Upgrade Required"; + + case 500: return "Internal Server Error"; + case 501: return "Not Implemented"; + case 502: return "Bad Gateway"; + case 503: return "Service Unavailable"; + case 504: return "Gateway Timeout"; + case 505: return "HTTP Version Not Supported"; + case 506: return "Variant Also Negotiates"; + case 507: return "Insufficient Storage"; + case 509: return "Bandwidth Limit Exceeded"; + case 510: return "Not Extended"; + + case 600: return "Internal Client Error"; + case 601: return "Unsupported Protocol"; + case 602: return "Server Not Found"; + case 603: return "Malformed Response"; + case 604: return "Network Not Available"; + case 605: return "Request Timed Out"; + default: return "Unknown Status Code"; + } +} +char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len) +{ + void *ctx; + char *data = NULL, *tmp, *p; + int dlen = 0, i, j; + unsigned char hash[16]; + unsigned char boundary[32], ch; + int blen = 0; + unsigned int map[62], m; + struct md5_context md5; + //struct md5_context md52; + int own_plen = 0; + + if(names) { + if(!plens) { + own_plen = 1; + for(i=0;names[i];i++) ; + plens = calloc(i, sizeof(int)); + for(i=0;names[i];i++) + plens[i] = strlen(parts[i]); + } + + retry: + if(blen >= 31) + goto fail; + memset(map, 0, 62*sizeof(int)); + for(i=0;names[i];i++) { + for(j=0;j='0' && ch<='9') + map[ch-'0']++; + else if(ch>='A' && ch<='Z') + map[ch-'A'+10]++; + else if(ch>='a' && ch<='z') + map[ch-'a'+36]++; + } + } + m = ~0; + j = 61; + for(i=0;i<62;i++) + if(map[i]>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } + } + + if(data) { + tmp = malloc(32+strlen((char *)boundary)); + sprintf(tmp, "multipart/form-data, boundary=%s", boundary); + http_async_add_header(ctx, "Content-type", tmp); + free(tmp); + free(data); + } + + if(own_plen) + free(plens); + return http_async_req_stop(ctx, ret, len); + +fail: + if(data) + free(data); + if(own_plen) + free(plens); + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; +} diff --git a/http.h b/http.h new file mode 100755 index 000000000..2ad7ccc28 --- /dev/null +++ b/http.h @@ -0,0 +1,43 @@ +/** + * Powder Toy - HTTP Library (Header) + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * 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 02111-1301 USA + */ +#ifndef HTTP_H +#define HTTP_H + +void http_init(char *proxy); +void http_done(void); + +char *http_simple_get(char *uri, int *ret, int *len); +char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len); +char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len); + +void http_auth_headers(void *ctx, char *user, char *pass); + +void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep); +void http_async_add_header(void *ctx, char *name, char *data); +int http_async_req_status(void *ctx); +void http_async_get_length(void *ctx, int *total, int *done); +char *http_async_req_stop(void *ctx, int *ret, int *len); +void http_async_req_close(void *ctx); + +char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len); + +char *http_ret_text(int ret); + +#endif diff --git a/icon.h b/icon.h new file mode 100755 index 000000000..89b2c7f83 --- /dev/null +++ b/icon.h @@ -0,0 +1,22 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * 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 02111-1301 USA + */ +static unsigned char app_icon[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x05,0x06,0x06,0xFF,0x09,0x09,0x0A,0xFF,0x2F,0x08,0x08,0xFF,0x56,0x06,0x07,0xFF,0x23,0x06,0x06,0xFF,0x85,0x02,0x06,0xFF,0xE5,0x02,0x07,0xFF,0xF2,0x1E,0x08,0xFF,0xED,0x0A,0x08,0xFF,0x60,0x07,0x08,0xFF,0x5F,0x08,0x08,0xFF,0x68,0x08,0x08,0xFF,0x18,0x07,0x08,0xFF,0x05,0x04,0x04,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB6,0x00,0x00,0xFF,0xD3,0x00,0x00,0xFF,0xEE,0x00,0x00,0xFF,0xF9,0x00,0x00,0xFF,0x91,0x00,0x00,0xFF,0xDD,0x15,0x00,0xFF,0xFF,0x74,0x00,0xFF,0xFF,0xBF,0x00,0xFF,0xFC,0x37,0x00,0xFF,0xAE,0x00,0x00,0xFF,0xD7,0x00,0x00,0xFF,0xFA,0x00,0x00,0xFF,0xE5,0x01,0x00,0xFF,0xB3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xF9,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE9,0x00,0x00,0xFF,0xFA,0x90,0x02,0xFF,0xFF,0xFF,0x1A,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0xA4,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xF6,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE8,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xB7,0x2E,0xFF,0xFF,0xFF,0xA1,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFA,0x3E,0xFF,0xFF,0x63,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE4,0x00,0x00,0xFF,0xFF,0x21,0x00,0xFF,0xFF,0x61,0x00,0xFF,0xFF,0x94,0x00,0xFF,0xFF,0x8C,0x00,0xFF,0xFF,0xE1,0x5C,0xFF,0xFF,0xFF,0xCD,0xFF,0xFF,0xFF,0xAE,0xFF,0xFF,0xFF,0x6F,0xFF,0xFF,0xF9,0x1D,0xFF,0xFF,0xC3,0x00,0xFF,0xFF,0x99,0x00,0xFF,0xFF,0x48,0x00,0xFF,0xDF,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xC5,0x00,0x00,0xFF,0xFF,0x64,0x00,0xFF,0xFF,0xEF,0x09,0xFF,0xFF,0xFF,0x46,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBC,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF,0x69,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0x81,0x00,0xFF,0xD0,0x01,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB1,0x00,0x00,0xFF,0xEC,0x14,0x00,0xFF,0xFF,0x90,0x13,0xFF,0xFF,0xF9,0x8E,0xFF,0xFF,0xFF,0xE6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xF2,0xC9,0xFF,0xFF,0xFA,0xBD,0xFF,0xFF,0xFF,0xA8,0xFF,0xFF,0xFC,0x9A,0xFF,0xFF,0xA4,0x2A,0xFF,0xFD,0x15,0x00,0xFF,0xEB,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD5,0xFF,0x1F,0x30,0xD5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF }; +static unsigned char app_icon_w32[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x44,0x47,0x49,0x00,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x86,0x88,0x8A,0xFF,0xD8,0xDE,0xE6,0xFF,0xD1,0xD7,0xDF,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x81,0x84,0x88,0xFF,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x83,0x85,0x89,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x14,0x00,0x00,0xFF,0xE1,0x01,0x00,0xFF,0xF4,0x03,0x00,0xFF,0x24,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x86,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0xE7,0x0A,0x01,0xFF,0xFF,0x07,0x01,0xFF,0x41,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0x16,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x0B,0x00,0x00,0xFF,0x55,0x02,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x39,0x00,0x00,0xFF,0xF8,0x1B,0x02,0xFF,0xFF,0x2F,0x03,0xFF,0x52,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1C,0x00,0x00,0xFF,0x5C,0x01,0x00,0xFF,0x09,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0xAE,0x04,0x01,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x50,0x00,0x00,0xFF,0xFE,0x44,0x02,0xFF,0xFF,0x5C,0x03,0xFF,0x60,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x12,0x00,0x00,0xFF,0x9F,0x02,0x00,0xFF,0x49,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x73,0x04,0x00,0xFF,0xEC,0x09,0x01,0xFF,0x2B,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x13,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x4E,0x06,0x00,0xFF,0xFF,0xC1,0x08,0xFF,0xFD,0x9A,0x07,0xFF,0x49,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x01,0x00,0xFF,0xD5,0x03,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0xB7,0x0D,0x01,0xFF,0xFF,0x0F,0x02,0xFF,0xDE,0x00,0x00,0xFF,0xAB,0x00,0x00,0xFF,0xA5,0x01,0x00,0xFF,0x3D,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x35,0x03,0xFF,0xFF,0xF0,0x0E,0xFF,0xDF,0x4B,0x01,0xFF,0x14,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x55,0x00,0x00,0xFF,0xFF,0x05,0x01,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xE5,0x0F,0x01,0xFF,0xFF,0x0D,0x02,0xFF,0xFF,0x04,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xFF,0x01,0x00,0xFF,0x8F,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xD9,0x47,0x03,0xFF,0xFF,0x92,0x06,0xFF,0xAF,0x12,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x20,0x00,0x00,0xFF,0xE5,0x08,0x01,0xFF,0xD1,0x04,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x30,0x01,0x00,0xFF,0xF6,0x47,0x04,0xFF,0xFF,0x1F,0x02,0xFF,0xFF,0x03,0x01,0xFF,0xFF,0x06,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xC7,0x01,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x06,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x38,0x02,0x00,0xFF,0xFB,0x72,0x07,0xFF,0xFF,0x5A,0x03,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA1,0x02,0x00,0xFF,0xFF,0x0C,0x03,0xFF,0x7B,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x06,0x00,0xFF,0xFF,0xBB,0x0C,0xFF,0xFF,0x56,0x04,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x10,0x03,0xFF,0xFF,0x02,0x01,0xFF,0xDE,0x01,0x00,0xFF,0x34,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x05,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x03,0x00,0xFF,0xFC,0x83,0x06,0xFF,0xFF,0x71,0x03,0xFF,0x83,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFB,0x18,0x03,0xFF,0xFF,0x0E,0x02,0xFF,0xB9,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x21,0x01,0x00,0xFF,0xE8,0xB9,0x0F,0xFF,0xFF,0x8F,0x0C,0xFF,0xFF,0x02,0x00,0xFF,0xFF,0x3C,0x04,0xFF,0xFF,0x16,0x02,0xFF,0xFD,0x00,0x00,0xFF,0x63,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x40,0x0B,0x00,0xFF,0xFE,0xAD,0x06,0xFF,0xFF,0xC9,0x06,0xFF,0xCC,0x45,0x02,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x49,0x03,0xFF,0xFF,0x7E,0x03,0xFF,0xFF,0x45,0x01,0xFF,0x67,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0xFF,0xCC,0xA0,0x08,0xFF,0xFB,0xAA,0x0A,0xFF,0xC9,0x00,0x00,0xFF,0xFE,0x6B,0x03,0xFF,0xFF,0x79,0x02,0xFF,0xF9,0x0A,0x00,0xFF,0x4C,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3F,0x14,0x00,0xFF,0xFC,0xDF,0x10,0xFF,0xFF,0xFF,0x10,0xFF,0xFA,0xCD,0x14,0xFF,0x46,0x0C,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x7F,0x03,0xFF,0xFF,0xFF,0x06,0xFF,0xFF,0xE7,0x03,0xFF,0xD5,0x39,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x06,0x00,0xFF,0xEA,0xCF,0x17,0xFF,0xE2,0xA6,0x10,0xFF,0x32,0x00,0x00,0xFF,0xCB,0x80,0x06,0xFF,0xFF,0xF4,0x09,0xFF,0xD8,0x44,0x00,0xFF,0x10,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x44,0x21,0x00,0xFF,0xFD,0xE9,0x1C,0xFF,0xFF,0xD6,0x09,0xFF,0xFF,0xFF,0x28,0xFF,0xB4,0x75,0x04,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x8D,0x03,0xFF,0xFF,0xFF,0x41,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0x7E,0x01,0xFF,0x4C,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x49,0x30,0x04,0xFF,0xFF,0xFC,0x5A,0xFF,0xB0,0x7E,0x14,0xFF,0x00,0x00,0x00,0xFF,0x89,0x66,0x0F,0xFF,0xFF,0xFF,0x6B,0xFF,0xE6,0xA7,0x1E,0xFF,0x1E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x6F,0x5A,0x18,0xFF,0xFF,0xFE,0x70,0xFF,0xCD,0x6C,0x04,0xFF,0xE8,0xB5,0x27,0xFF,0xFE,0xF3,0x60,0xFF,0x6E,0x3D,0x08,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xDB,0x8A,0x26,0xFF,0xFF,0xFF,0xD5,0xFF,0xFF,0xFF,0xD8,0xFF,0xFF,0xCF,0x3A,0xFF,0x94,0x12,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x15,0x0A,0x01,0xFF,0xBF,0xAC,0x7E,0xFF,0xFF,0xFF,0xDE,0xFF,0x82,0x5F,0x20,0xFF,0x00,0x00,0x00,0xFF,0x67,0x5B,0x28,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xF1,0xAA,0xFF,0x5D,0x2E,0x07,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x18,0x0D,0x02,0xFF,0xD0,0xC0,0x90,0xFF,0xFF,0xFF,0xF4,0xFF,0x92,0x61,0x27,0xFF,0x72,0x3F,0x0F,0xFF,0xFF,0xFF,0xE2,0xFF,0xFA,0xE5,0xAE,0xFF,0x80,0x4B,0x19,0xFF,0x02,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xC9,0xA1,0x64,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xB2,0xFF,0xA1,0x33,0x03,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x96,0x7E,0x5E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7E,0x6A,0x41,0xFF,0x00,0x00,0x00,0xFF,0x7F,0x75,0x56,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9,0x8D,0x54,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8C,0x69,0x4F,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x93,0x82,0x58,0xFF,0x16,0x05,0x00,0xFF,0xEB,0xDB,0xB8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0xBD,0xFF,0x62,0x42,0x14,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA3,0x7F,0x47,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xDD,0xA4,0xFF,0x51,0x19,0x02,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0xD0,0xB6,0x88,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x6A,0x5A,0x39,0xFF,0x00,0x00,0x00,0xFF,0x85,0x7D,0x4E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB4,0xA5,0x73,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xB5,0x9B,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8B,0x78,0x4E,0xFF,0x00,0x00,0x00,0xFF,0xCC,0xAE,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x74,0x38,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x24,0x14,0x03,0xFF,0x8C,0x7E,0x44,0xFF,0xA2,0x8E,0x5D,0xFF,0x5B,0x37,0x17,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x71,0x46,0x1E,0xFF,0xCB,0xA4,0x71,0xFF,0xAC,0x93,0x66,0xFF,0x17,0x0E,0x04,0xFF,0x00,0x00,0x00,0xFF,0x30,0x23,0x0A,0xFF,0xBF,0xA4,0x60,0xFF,0xC4,0xAC,0x78,0xFF,0x43,0x34,0x1A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x5C,0x3D,0x18,0xFF,0xC9,0xA9,0x6F,0xFF,0xB8,0x94,0x63,0xFF,0x2A,0x19,0x07,0xFF,0x00,0x00,0x00,0xFF,0x53,0x3B,0x16,0xFF,0xC7,0xB6,0x70,0xFF,0xBD,0xA2,0x66,0xFF,0x2C,0x1C,0x09,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD6,0xFF,0x1F,0x30,0xD6,0xFF,0x00,0x00,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0x00,0x00,0x00,0xFF,0xC8,0x47,0x0E,0xFF,0xC8,0x47,0x0E,0xFF,0x00,0x00,0x00,0xFF,0x20,0xE6,0x0F,0xFF,0x20,0xE6,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xEB,0xF5,0x22,0xFF,0xEB,0xF5,0x22,0xFF,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x44,0x46,0x48,0x00,0x7A,0x7D,0x81,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x83,0x86,0x8A,0xFF,0x86,0x89,0x8C,0xFF,0x89,0x8C,0x8F,0xFF,0x87,0x8A,0x8F,0xFF,0x85,0x87,0x8B,0xFF,0x82,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00 }; \ No newline at end of file diff --git a/md5.c b/md5.c new file mode 100755 index 000000000..874d2c147 --- /dev/null +++ b/md5.c @@ -0,0 +1,224 @@ +// based on public-domain code from Colin Plumb (1993) +#include +#include "md5.h" + +static unsigned getu32(const unsigned char *addr) +{ + return (((((unsigned long)addr[3] << 8) | addr[2]) << 8) | addr[1]) << 8 | addr[0]; +} + +static void putu32(unsigned data, unsigned char *addr) +{ + addr[0] = (unsigned char)data; + addr[1] = (unsigned char)(data >> 8); + addr[2] = (unsigned char)(data >> 16); + addr[3] = (unsigned char)(data >> 24); +} + +void md5_init(struct md5_context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +void md5_update(struct md5_context *ctx, unsigned char const *buf, unsigned len) +{ + unsigned t; + + // update bit count + t = ctx->bits[0]; + if((ctx->bits[0] = (t + ((unsigned)len << 3)) & 0xffffffff) < t) + ctx->bits[1]++; // carry + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; + + // use leading data to top up the buffer + + if(t) { + unsigned char *p = ctx->in + t; + + t = 64-t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + md5_transform(ctx->buf, ctx->in); + buf += t; + len -= t; + } + + // following 64-byte chunks + + while(len >= 64) { + memcpy(ctx->in, buf, 64); + md5_transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + // save rest of bytes for later + + memcpy(ctx->in, buf, len); +} + +void md5_final(unsigned char digest[16], struct md5_context *ctx) +{ + unsigned count; + unsigned char *p; + + // #bytes mod64 + count = (ctx->bits[0] >> 3) & 0x3F; + + // first char of padding = 0x80 + p = ctx->in + count; + *p++ = 0x80; + + // calculate # of bytes to pad + count = 64 - 1 - count; + + // Pad out to 56 mod 64 + if(count < 8) { + // we need to finish a whole block before padding + memset(p, 0, count); + md5_transform(ctx->buf, ctx->in); + memset(ctx->in, 0, 56); + } else { + // just pad to 56 bytes + memset(p, 0, count-8); + } + + // append length & final transform + putu32(ctx->bits[0], ctx->in + 56); + putu32(ctx->bits[1], ctx->in + 60); + + md5_transform(ctx->buf, ctx->in); + putu32(ctx->buf[0], digest); + putu32(ctx->buf[1], digest + 4); + putu32(ctx->buf[2], digest + 8); + putu32(ctx->buf[3], digest + 12); + memset(ctx, 0, sizeof(ctx)); +} + +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<>(32-s), w += x ) + +void md5_transform(unsigned buf[4], const unsigned char inraw[64]) +{ + unsigned a, b, c, d; + unsigned in[16]; + int i; + + for (i = 0; i < 16; ++i) + in[i] = getu32 (inraw + 4 * i); + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +static char hex[] = "0123456789abcdef"; +void md5_ascii(char *result, unsigned char const *buf, unsigned len) +{ + struct md5_context md5; + unsigned char hash[16]; + int i; + + if(len==0) + len = strlen((char *)buf); + + md5_init(&md5); + md5_update(&md5, buf, len); + md5_final(hash, &md5); + + for(i=0;i<16;i++) { + result[i*2] = hex[(hash[i]>>4)&0xF]; + result[i*2+1] = hex[hash[i]&0x0F]; + } + result[32] = 0; +} diff --git a/md5.h b/md5.h new file mode 100755 index 000000000..3f675d62a --- /dev/null +++ b/md5.h @@ -0,0 +1,17 @@ +#ifndef MD5_H +#define MD5_H + +struct md5_context { + unsigned buf[4]; + unsigned bits[2]; + unsigned char in[64]; +}; + +void md5_init(struct md5_context *context); +void md5_update(struct md5_context *context, unsigned char const *buf, unsigned len); +void md5_final(unsigned char digest[16], struct md5_context *context); +void md5_transform(unsigned buf[4], const unsigned char in[64]); + +void md5_ascii(char *result, unsigned char const *buf, unsigned len); + +#endif diff --git a/powder.c b/powder.c new file mode 100755 index 000000000..3102a8f70 --- /dev/null +++ b/powder.c @@ -0,0 +1,8429 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * 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 02111-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#ifdef OCL +#include +#endif +//#include +#ifdef MT +#include +#include +#endif + +#ifdef WIN32 +#include +#else +#include +#include +#endif + + +#include "version.h" +#include "http.h" +#include "md5.h" +#include "update.h" + +#define SERVER "powder.hardwired.org.uk" + +#undef PLOSS + +#ifdef MENUV3 +#define MENUSIZE 40 +#else +#define MENUSIZE 20 +#endif +#define BARSIZE 14 +#define XRES 612 +#define YRES 384 +#define NPART XRES*YRES + +#define ZSIZE_D 16 +#define ZFACTOR_D 8 +unsigned char ZFACTOR = 256/ZSIZE_D;//ZFACTOR_D; +unsigned char ZSIZE = ZSIZE_D; + +#define CELL 4 +#define ISTP (CELL/2) +#define CFDS (4.0f/CELL) + +typedef unsigned char uint8; + +#ifdef HEAT_ENABLE +#include "hmap.h" +#endif + +#ifdef PIX16 +#define PIXELSIZE 2 +typedef unsigned short pixel; +#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) +#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) +#define PIXR(x) (((x)>>8)&0xF8) +#define PIXG(x) (((x)>>3)&0xFC) +#define PIXB(x) (((x)<<3)&0xF8) +#else +#define PIXELSIZE 4 +typedef unsigned int pixel; +#ifdef PIX32BGR +#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) +#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) +#define PIXR(x) ((x)&0xFF) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)>>16) +#else +#ifdef PIX32BGRA +#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) +#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) +#define PIXR(x) (((x)>>8)&0xFF) +#define PIXG(x) (((x)>>16)&0xFF) +#define PIXB(x) (((x)>>24)) +#else +#define PIXPACK(x) (x) +#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) +#define PIXR(x) ((x)>>16) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)&0xFF) +#endif +#endif +#endif + +char *it_msg = +"\brThe Powder Toy\n" +"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" +"\n" +"\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" +"\bgPick your material from the menu using mouse left/right buttons.\n" +"Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" +"Shift+drag will create straight lines of particles.\n" +"Ctrl+drag will result in filled rectangles.\n" +"Ctrl+Shift+click will flood-fill a closed area.\n" +"Middle click or Alt+Click to \"sample\" the particles.\n" +"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" +"Use 'S' to save parts of the window as 'stamps'.\n" +"'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" +"'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" +"Use the mouse scroll wheel to change the tool size for particles.\n" +"'Q' will quit the application.\n" +"The spacebar can be used to pause physics.\n" +"'P' will take a screenshot and save it into the current directory.\n" +"\n" +"\brhttp://powder.hardwired.org.uk/\n" +"\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" +"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powder.hardwired.org.uk\bg)\n" +"\n" +"\bgSpecial thanks to Brian Ledbetter for maintaining ports & server development in the past." +"\nand CW for hosting the original server.\n" +#ifdef WIN32 +"\nThanks to Akuryo for Windows icons.\n" +#endif +"\n" +"\bgTo use online features such as saving, you need to register at: http://powder.hardwired.org.uk/Register.html" +; + +typedef struct { + int start, inc; + pixel *vid; +} upstruc; + +#ifdef BETA +char *old_ver_msg_beta = "A new beta is available - click here!"; +#endif +char *old_ver_msg = "A new version is available - click here!"; +#ifdef HEAT_ENABLE +float mheat = 0.0f; +#endif + +int do_open = 0; +int sys_pause = 0; +int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. + +int amd = 0; + +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + +#define MAXSIGNS 16 + +struct sign { + int x,y,ju; + char text[256]; +} signs[MAXSIGNS]; + +/*********************************************************** + * AIR FLOW SIMULATOR * + ***********************************************************/ + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; +unsigned cmode = 3; + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; +#define TSTEPP 0.3f +#define TSTEPV 0.4f +#define VADV 0.3f +#define VLOSS 0.999f +#define PLOSS 0.9999f +int numCores = 1; +float kernel[9]; +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} + +int core_count(){ + int numCPU = 1; +#ifdef MT +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; +#else +#ifdef MACOSX + numCPU = 4; +#else + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); +#endif +#endif + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); +#endif + return numCPU; +} + +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} + +void *update_air_th(void *arg) +{ + update_air(); + return NULL; +} + +unsigned clamp_flt(float f, float min, float max) +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +float restrict_flt(float f, float min, float max){ + if(fmax) + return max; + return f; +} + +void draw_air(pixel *vid) +{ + int x, y, i, j; + pixel c; + + if(cmode == 2) + return; + + for(y=0; y 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; j=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE)){ + return 1; + } + + if((r&0xFF)==PT_VOID){ + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL){ + parts[i].type=PT_NONE; +#ifdef HEAT_ENABLE + if(!legacy_enable){ + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } +#endif + return 0; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]){ + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE){ + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])){ + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + +#ifdef HEAT_ENABLE + if(t==SPC_HEAT||t==SPC_COOL){ + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP){ + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } else { + return -1; + } + } +#endif + if(t==SPC_AIR){ + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } else + i = p; + + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[t].heat; +#endif + if(t==PT_ACID){ + parts[i].life = 75; + } + //Testing + /*if(t==PT_WOOD){ + parts[i].life = 150; + }*/ + //End Testing + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NEUT) { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f){ + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } else { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //} + } + + pmap[y][x] = t|(i<<8); + + return i; +} + +void delete_part(int x, int y) +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + 255*PIXR(t)) >> 8; + g = (a*g + 255*PIXG(t)) >> 8; + b = (a*b + 255*PIXB(t)) >> 8; + if(r>255) + r = 255; + if(g>255) + g = 255; + if(b>255) + b = 255; + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); + +int is_wire(int x, int y) +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} +int is_wire_off(int x, int y) +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y=XRES || y>=YRES || + bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS) { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); +#endif + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) { + if(pv[y/CELL][x/CELL]>1.0f) { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } else { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + + if(ptypes[t].diffusion) { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } else { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) { + mv -= ISTP; + if(mv <= 0.0f) { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_OILL; + if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) + t = parts[i].type = PT_GASS; +#ifdef HEAT_ENABLE + } +#endif + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_BGLA; + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1){ + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1){ + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + +#ifdef HEAT_ENABLE + if(!legacy_enable){ + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)){ + for(nx=-1; nx<2; nx++) { + for(ny=-1; ny<2; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) { + for(ny=-1; ny<2; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid){ + if(t==PT_LAVA&&parts[i].ctype){ + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp){ + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } else { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)){ + if(pstates[t].liquid==PT_LAVA){ + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } else if(t==PT_ICEI&&parts[i].ctype){ + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } else { + t = parts[i].type = pstates[t].liquid; + } + }else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS){ + t = parts[i].type = pstates[t].liquid; + }else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)){ + if(t==PT_SLTW&&1>rand()%6){ + t = parts[i].type = PT_SALT; + } else { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f){ + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA){ + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_CSCN&&parts[i].temp>24.0f){ + pt = parts[i].temp -= 2.5f; + } + if(t==PT_HSCN&&parts[i].temp>24.0f){ + pt = parts[i].temp -= 2.5f; + } + #endif + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK) { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx0){ + int ttx = (rand()%3)-1; + r = pmap[y-1][x+ttx]; + if(parts[i].life>50){ + if((pmap[y-1][x+ttx]&0xFF)==PT_NONE){ + create_part(-1, x+ttx, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx]>>8].life = parts[i].life-1; + parts[pmap[y-1][x+ttx]>>8].vx = ttx; + } + if((pmap[y-1][x+ttx-1]&0xFF)==PT_NONE){ + create_part(-1, x+ttx-1, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx-1]>>8].life = 0; + } + if((pmap[y-1][x+ttx+1]&0xFF)==PT_NONE){ + create_part(-1, x+ttx+1, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx+1]>>8].life = 0; + } + parts[i].life = 0; + } else if(parts[i].life>10) { + //int ttx = (rand()%3)-parts[i].vx; + //create_part(-1, x+ttx, y-1, PT_WOOD); + //r = pmap[y-1][x+ttx]; + //parts[r>>8].life = parts[i].life-1; + //parts[i].life = 0; + } + } else*/ + if(t==PT_THDR){ + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT) && parts[r>>8].ctype!=PT_SPRK ){ + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)){ + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } else { + t = parts[i].type = PT_NONE; + } + } + } + } else if(t==PT_ICEI || t==PT_SNOW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } +#ifndef HEAT_ENABLE + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; +#else + if(legacy_enable){ + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } +#endif + } + } + else if(t==PT_HSCN||t==PT_CSCN) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } else if((r&0xFF)==PT_LAVA && 1>(rand()%250)){ + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_WTRV; + //parts[r>>8].type = PT_WTRV; +#else + if(legacy_enable){ + t = parts[i].type = PT_WTRV; + } +#endif + } else if((r&0xFF)==PT_SALT && 1>(rand()%250)) { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)){ + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)){ + t = parts[i].type = PT_SLTW; + } +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_SLTW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; +#else + if(legacy_enable){ + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } +#endif + } else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) { + //t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WTRV) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; +#ifdef HEAT_ENABLE + if(legacy_enable){ +#endif + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } +#ifdef HEAT_ENABLE + } +#endif + +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; +#else + if(legacy_enable){ + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } +#endif + } + } + } + // END PLANT + // ACID + else if(t==PT_ACID) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID){ + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD){ + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } else if (parts[i].life==50){ + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + //END ACID :D + else if(t==PT_NEUT) { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) { + if(33>rand()%100) { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } else { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT){ + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + // } else if(((r&0xFF)!=PT_PHOT&&(r&0xFF)!=PT_NONE&&(r&0xFF)!=PT_CLNE)) { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + // }// else if((r&0xFF)!=PT_PLEX){ + // parts[i].life = 4; + // parts[i].type = PT_FIRE + //} + } + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { + parts[r>>8].type = PT_FIRE; +#ifdef HEAT_ENABLE + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); +#endif + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; //LOL + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; +#ifndef HEAT_ENABLE + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && (t!=PT_FIRE || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) { + if(t!=PT_LAVA || parts[i].life>0) { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } else { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { + kill_part(r>>8); + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + //t = parts[i].type = PT_METL; + goto killed; + } + } +#else + if(legacy_enable){ + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) { + if(t!=PT_LAVA || parts[i].life>0) { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } else { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { + kill_part(r>>8); + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + //t = parts[i].type = PT_METL; + goto killed; + } + } + } +#endif + //Bitches now know about my semi-conductor :( + if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; +#ifdef HEAT_ENABLE + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; +#endif + } + } + if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5){ + if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN){ + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + } + killed: + if(parts[i].type == PT_NONE) + continue; + } + + if(t==PT_CLNE) { + if(!parts[i].ctype) { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx=XRES-CELL || + ny=YRES-CELL) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) { + if(nx!=x && try_move(i, x, y, nx, y)) { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ny!=y && try_move(i, x, y, x, ny)) { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ny!=y && try_move(i, x, y, x-r, ny)) { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(nx!=x && try_move(i, x, y, nx, y+r)) { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(nx!=x && try_move(i, x, y, nx, y-r)) { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) { + kill_part(i); + continue; + } else if(try_move(i, x, y, 2*x-nx, ny)) { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } else if(try_move(i, x, y, nx, 2*y-ny)) { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } else { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + + justdraw: + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) { + kill_part(i); + continue; + } +#ifdef HEAT_ENABLE + if(cmode!=CM_HEAT){ + +#endif + if(t==PT_ACID) { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28));//if(parts[i].life<=49) parts[i].life = 50; + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + //vid[ny*(XRES+BARSIZE)+nx] = //(cr<<16)+(cb<<18)+cg;//ptypes[t].pcolors/-(parts[i].life-255); + blendpixel(vid, nx, ny, cr, cg, cb, 255);//(parts[i].life-46)*28 + if(cmode==4){ + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + }else if(t==PT_NEUT) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } else { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + }else if(t==PT_PHOT) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_THDR) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLSM) { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4) { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_FIRE && parts[i].life) { + if(cmode == 3||cmode==4) { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } else { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_LAVA && parts[i].life) { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4) { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } else if(t==PT_LAVA || t==PT_SPRK) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4) { + if(t == PT_LAVA) { + cr = 3; + cg = i%2; + cb = 0; + } else { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; +#ifdef HEAT_ENABLE + } else { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } +#endif + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID){ + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + + } + +} + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb){ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +} + +void update_particles_i_th(void *arg){ + upstruc *newup = (upstruc*)arg; + update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); + return; +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) { + if(emap[y][x]) { + cr = cg = cb = 128; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) { + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } else { + for(y=0; y>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) { + if(emap[y][x]) { + cr = cg = cb = 128; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) { + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9){ + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + +#ifdef MT + if(numCores > 1) { + InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); + for(pc = 0; pc=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} + +void update_particles_th(void *arg) +{ + update_particles((pixel*)arg); + return; +} + +/*********************************************************** + * SDL OUTPUT * + ***********************************************************/ + +int sdl_scale = 1; +SDL_Surface *sdl_scrn; +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +#include "icon.h" +void sdl_seticon(void) +{ +#ifdef WIN32 + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else +#ifdef MACOSX + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#endif +#endif +} + +void sdl_open(void) +{ + if(SDL_Init(SDL_INIT_VIDEO)<0) { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); +#ifdef PIX16 + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); +#else + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); +#endif + if(!sdl_scrn) { + fprintf(stderr, "Creating window: %s\n", SDL_GetError()); + exit(1); + } + SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); + sdl_seticon(); + SDL_EnableUNICODE(1); + //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +} + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0;jpitch/PIXELSIZE; + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + int i,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0;jpitch/PIXELSIZE; + } + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) +{ + if(sdl_scale == 2) + sdl_blit_2(x, y, w, h, src, pitch); + else + sdl_blit_1(x, y, w, h, src, pitch); +} + +int frame_idx=0; +void dump_frame(pixel *src, int w, int h, int pitch) +{ + char frame_name[32]; + int j,i; + unsigned char c[3]; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"wb"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0;j=0 && x=0 && yPT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } else + d = c; + + if(size < XRES*YRES) { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0;y+scl<=YRES;y+=scl) { + sx = 0; + for(x=0;x+scl<=XRES;x+=scl) { + a = 0; + r = g = b = 0; + for(j=0;j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +static char *mystrdup(char *s) +{ + char *x; + if(s) { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +void *build_save(int *size, int x0, int y0, int w, int h) +{ +#ifdef HEAT_ENABLE + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; +#else + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*6+MAXSIGNS*262), *c; +#endif + int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); + int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + // save the required air state + for(y=by0; y255) i=255; + d[p++] = i; + } + for(y=by0; y255) i=255; + d[p++] = i; + } + + // save the particle map + for(i=0; i=x0 && x=y0 && y255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } + } + for(j=0; j255) tttemp=255; + d[p++] = tttemp; + } + } +#endif + for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + + i = (p*101+99)/100 + 612; + c = malloc(i); + c[0] = 0x66; + c[1] = 0x75; + c[2] = 0x43; + c[3] = legacy_enable; + c[4] = SAVE_VERSION; + c[5] = CELL; + c[6] = bw; + c[7] = bh; + c[8] = p; + c[9] = p >> 8; + c[10] = p >> 16; + c[11] = p >> 24; + + i -= 12; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) { + free(d); + free(c); + return NULL; + } + free(d); + + *size = i+12; + return c; +} + +int parse_save(void *save, int size, int replace, int x0, int y0) +{ + unsigned char *d,*c=save; + int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; + int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; + int fp[NPART], nf=0; + + if(size<16) + return 1; + if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) + return 1; + if(c[4]>SAVE_VERSION) + return 2; + ver = c[4]; + +#ifdef HEAT_ENABLE + if(ver<34){ + legacy_enable = 1; + } else { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } +#endif + + bw = c[6]; + bh = c[7]; + if(bx0+bw > XRES/CELL) + bx0 = XRES/CELL - bw; + if(by0+bh > YRES/CELL) + by0 = YRES/CELL - bh; + if(bx0 < 0) + bx0 = 0; + if(by0 < 0) + by0 = 0; + + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) + return 3; + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + return 1; + size = i; + + if(size < bw*bh) + return 1; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + if(replace) { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); + } + + // make a catalog of free parts + memset(pmap, 0, sizeof(pmap)); + for(i=0; i= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } + for(y=by0; y= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + + // load the particle map + i = 0; + pty = p; + for(y=y0;y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j) { + if(pmap[y][x]) { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } else if(i < nf) { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + + // load particle properties + for(j=0; j= size) + goto corrupt; + if(i < NPART) { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + } else + p += 2; + } + } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } + } +#ifdef HEAT_ENABLE + for(j=0; j=34&&legacy_beta==0){ + if(p >= size){ + goto corrupt; + } + if(i <= NPART) { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } else { + p++; + } + } else { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } + } +#endif + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + + if(p >= size) + goto version1; + j = d[p++]; + for(i=0; i size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0;y= size) + goto corrupt; + j=d[p++]; + if(j0) + fb[y*w+x] = ptypes[j].pcolors; + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +/* NO, I DON'T THINK SO + #include "fbi.h" + + pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) + { + unsigned char *tmp; + pixel *res; + int i; + + tmp = malloc(width*height*3); + if(!tmp) + return NULL; + res = malloc(width*height*PIXELSIZE); + if(!res) { + free(tmp); + return NULL; + } + + i = width*height*3; + if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { + free(res); + free(tmp); + return NULL; + } + + for(i=0; i1) { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } + *qw = w; + *qh = h; + return q; +} + +#define GRID_X 5 +#define GRID_Y 4 +#define GRID_P 3 +#define GRID_S 6 +#define GRID_Z 3 + +void stamp_gen_thumb(int i) +{ + char fn[64]; + void *data; + int size, factor_x, factor_y; + pixel *tmp; + + if(stamps[i].thumb) { + free(stamps[i].thumb); + stamps[i].thumb = NULL; + } + + sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); + data = file_load(fn, &size); + + if(data) { + stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); + if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } + } + + free(data); +} + +void stamp_save(int x, int y, int w, int h) +{ + FILE *f; + int n; + char fn[64], sn[16]; + void *s=build_save(&n, x, y, w, h); + +#ifdef WIN32 + _mkdir("stamps"); +#else + mkdir("stamps", 0755); +#endif + + stamp_gen_name(sn); + sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); + + f = fopen(fn, "wb"); + if(!f) + return; + fwrite(s, n, 1, f); + fclose(f); + + free(s); + + if(stamps[STAMP_MAX-1].thumb) + free(stamps[STAMP_MAX-1].thumb); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); + memset(stamps, 0, sizeof(struct stamp_info)); + if(stamp_count0) { + memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); + memcpy(stamps, &tmp, sizeof(struct stamp_info)); + + stamp_update(); + } + + return data; +} + +void stamp_init(void) +{ + int i; + FILE *f; + + memset(stamps, 0, sizeof(stamps)); + + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); + if(!f) + return; + for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) + return; + if(a!=255) { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +{ + int i, j, w, bn = 0, ba = 0; + char *rp = font_data + font_ptrs[c]; + w = *(rp++); + for(j=0; j>= 2; + bn -= 2; + } + return x + w; +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +{ + int sx = x; + for(;*s;s++) { + if(*s == '\n') { + x = sx; + y += FONT_H+2; + } else if(*s == '\b') { + switch(s[1]) { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + return x; +} + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +{ + int i; + for(i=0; i<=w; i++) { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); + } + for(i=1; i=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + if(*s) + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); + return x; +} + +int textnwidth(char *s, int n) +{ + int x = 0; + for(;*s;s++) { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} +int textwidthx(char *s, int w) +{ + int x=0,n=0,cw; + for(;*s;s++) { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; + } + return n; +} + +/*********************************************************** + * MAIN PROGRAM * + ***********************************************************/ + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) +{ + int x, y, i, j, c; + int bo = b; + if(iswall==1){ + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b){ + case WL_WALLELEC: + for(j=1; j<15; j++){ + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } else { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) { + for(i=1; i<6+j; i++) { + if(!(i&j&1)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) { + if(i&j&1) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<13; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) { + for(i=14; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } else { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } +} + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) +{ + int i, j, c; + if(b>=121){ + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b){ + case WL_WALLELEC: + for(j=1; j<15; j++){ + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } else { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) { + for(i=1; i<6+j; i++) { + if(!(i&j&1)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) { + if(i&j&1) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<13; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) { + for(i=14; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } else { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; +} + +void draw_menu(pixel *vid_buf, int i, int hover){ + + //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); +#ifdef MENUV3 + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i){ + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } +#else + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); +#endif +} + +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr){ + int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + rows = ceil((float)msections[i].itemcount/16.0f); + height = (ceil((float)msections[i].itemcount/16.0f)*18); + width = restrict_flt(msections[i].itemcount*31, 0, 16*31); + //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); + h = -1; + x = XRES-BARSIZE-26; + y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; + sy = y; + //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); + fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); + fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); + drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); + if(i==SC_WALL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM){ + if(x-26<=60){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else if(i==SC_SPECIAL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ + if(x-26<=60){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else { + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1){ + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } else { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else if(i==SC_SPECIAL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ + if(x-26<=20){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else { + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1){ + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } else { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1){ + *sl = h; + } + if(b==4&&h!=-1){ + *sr = h; + } + } + +int create_parts(int x, int y, int r, int c) +{ + int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; + + if(c == 125) { + i = x / CELL; + j = y / CELL; + for(v=-1;v<2;v++) + for(u=-1;u<2;u++) + if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } +} + +void create_box(int x1, int y1, int x2, int y2, int c) +{ + int i, j; + if(x1>x2) { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT){ + c = c-100; + } + if(cm==-1) { + if(c==0) { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } else + cm = 0; + } + if(bm==-1) { + if(c==30) { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(y=XRES || y>=YRES) + return; + c = vid[y*(XRES+BARSIZE)+x]; + c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); + if(c<512) + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + else + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); +} + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) { + y += sy; + e -= 1.0f; + } + } +} + +void draw_svf_ui(pixel *vid_buf) +{ + int c; + + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); + drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + c = svf_open ? 255 : 128; + drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); + drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); + + c = svf_login ? 255 : 128; + drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); + if(svf_open) + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + else + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); + if(svf_open && svf_own) + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)){ + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } else if(svf_myvote==-1 && (svf_login && svf_open)){ + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); + if(svf_tags[0]) + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + else + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + +#ifdef HEAT_ENABLE + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); +#else + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-364, 14, c, c, c, 255); +#endif + + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); + drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); + if(svf_login) + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + else + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); + + if(sys_pause) { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + +#ifdef HEAT_ENABLE + if(!legacy_enable) { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } +#endif + + switch(cmode) { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; +#ifdef HEAT_ENABLE + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; +#endif + } + drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(svf_admin) { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } else if(svf_mod) { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? +} + +typedef struct ui_edit { + int x, y, w, nx; + char str[256],*def; + int focus, cursor, hide; +} ui_edit; +void ui_edit_draw(pixel *vid_buf, ui_edit *ed) +{ + int cx, i; + char echo[256], *str; + + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + if(ed->str[0]) { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) { + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } else + ed->focus = 0; + } + if(ed->focus && sdl_key) { + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } else if(ed->cursor > 0) { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} + typedef struct ui_checkbox { + int x, y; + int focus, checked; + } ui_checkbox; + void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) + { + int w = 12; + if(ed->checked) { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus){ + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } else { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } + } + void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) + { + int w = 12; + + if(mb && !mbq) { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ + ed->checked = (ed->checked)?0:1; + } + } else { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ + ed->focus = 1; + } else { + ed->focus = 0; + } + } + } + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +struct strlist { + char *str; + struct strlist *next; +}; +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list;item;item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) { + item = *list; + *list = (*list)->next; + free(item); + } +} + +void tag_list_ui(pixel *vid_buf) +{ + int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; + char *p,*q,s; + char *tag=NULL, *op=NULL; + ui_edit ed; + struct strlist *vote=NULL,*down=NULL; + + ed.x = x0+25; + ed.y = y0+221; + ed.w = 158; + ed.nx = 1; + ed.def = "[new tag]"; + ed.focus = 0; + ed.hide = 0; + ed.cursor = 0; + strcpy(ed.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + op = tag = NULL; + + drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 256); + drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); + p = svf_tags; + s = svf_tags[0] ? ' ' : 0; + y = 36 + y0; + while(s) { + q = strchr(p, ' '); + if(!q) + q = p+strlen(p); + s = *q; + *q = 0; + if(svf_own || svf_admin || svf_mod) { + drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); + d = 14; + if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) { + if(!strcmp(res, "OK ADMIN")){ + svf_admin = 1; + svf_mod = 0; + } else if(!strcmp(res, "OK MOD")){ + svf_admin = 0; + svf_mod = 1; + } else { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} + +static char hex[] = "0123456789ABCDEF"; +void strcaturl(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +#define THUMB_CACHE_SIZE 256 + +char *thumb_cache_id[THUMB_CACHE_SIZE]; +void *thumb_cache_data[THUMB_CACHE_SIZE]; +int thumb_cache_size[THUMB_CACHE_SIZE]; +int thumb_cache_lru[THUMB_CACHE_SIZE]; + +void thumb_cache_inval(char *id) +{ + int i,j; + for(i=0;i= THUMB_CACHE_SIZE) + return; + free(thumb_cache_id[i]); + free(thumb_cache_data[i]); + thumb_cache_id[i] = NULL; + for(j=0;j thumb_cache_lru[i]) + thumb_cache_lru[j]--; +} +void thumb_cache_add(char *id, void *thumb, int size) +{ + int i,m=-1,j=-1; + thumb_cache_inval(id); + for(i=0;i m) { + m = thumb_cache_lru[i]; + j = i; + } + } + if(i >= THUMB_CACHE_SIZE) { + thumb_cache_inval(thumb_cache_id[j]); + i = j; + } + for(j=0;j= THUMB_CACHE_SIZE) + return 0; + for(j=0;j=GRID_X*GRID_Y) + break; + if(votes) { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } else { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } else if(!strncmp(str, "TAG ", 4)) { + if(j >= TAG_MAX) { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } else { + if(i>=GRID_X*GRID_Y) + break; + if(votes) { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } else { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + do_open = 0; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) { + if(search_page) { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0;gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14);gj++) + for(gi=0;giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]) + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, vid_buf, gx, gy, GRID_S); + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]){ + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0){ + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv){ + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8){ + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } else { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1){ + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) { + if(data) { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } else + svf_tags[0] = 0; + } else { + svf_tags[0] = 0; + } + + if(svf_login){ + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200){ + if(data){ + if(!strcmp(data, "Up")){ + svf_myvote = 1; + } else if(!strcmp(data, "Down")){ + svf_myvote = -1; + } else { + svf_myvote = 0; + } + } else { + svf_myvote = 0; + } + } else { + svf_myvote = 0; + } + } + } else { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + search = 1; + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } else + search = 0; + + if(search && lasttime>=TIMEOUT) { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) { + if(search_page) { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } else { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } else { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login){ + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + page_count = search_results(results, last_own||svf_admin||svf_mod); + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) { + http_async_req_close(http); + http = NULL; + } + + for(i=0;i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) { + if(stamp_page) { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; +} + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) +{ + char t[2]; + t[0] = ch; + t[1] = 0; + if(flag) { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } else { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + } +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + for(i=0; i 18) ? -1 : 1; + for(j=0; j<4; j++) { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +/*********************************************************** + * CONFIG FILE * + ***********************************************************/ + +char http_proxy[256] = ""; + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; +} + +unsigned char last_major=0, last_minor=0, update_flag=0; + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66){ + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F){ + if(fseek(f, -3, SEEK_END)){ + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3){ + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; +#ifdef HEAT_ENABLE + cmode = tmp%6; +#else + cmode = tmp%5; +#endif + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void dim_copy(pixel *dst, pixel *src) +{ + int i,r,g,b; + for(i=0;i0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +unsigned int fire_alpha[CELL*3][CELL*3]; +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } else { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i2){ + pthread_t pth; + pthread_create(&pth,NULL,update_air_th,""); + } else { + update_air(); + } +#else + update_air(); +#endif + } + if(cmode==0 || cmode==1) { + draw_air(vid_buf); + } else if(cmode==2) { + memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); + memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); + } else { + memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); + } + update_particles(vid_buf); + + if(cmode==2) { + if(!fire_fc) { + dim_copy(fire_bg, vid_buf); + } else { + memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); + } + fire_fc = (fire_fc+1) % 3; + } + if(cmode==3||cmode==4) + render_fire(vid_buf); + + render_signs(vid_buf); + + //clearrect(vid_buf, 0, YRES, XRES, MENUSIZE); + memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); + //memset(vid_buf+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1)); + clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); + + // Old Menu, you will be missed; but not forgotten :( + /* for(i=0; iSAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; +#else + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; +#endif + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")){ + break; + } + //break; + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) { + if(load_mode) { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } else + load_data = stamp_load(0, &load_size); + if(load_data) { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1'){ + set_cmode(0); + } + if(sdl_key=='2'){ + set_cmode(1); + } + if(sdl_key=='3'){ + set_cmode(2); + } + if(sdl_key=='4'){ + set_cmode(3); + } + if(sdl_key=='5'){ + set_cmode(4); + } + if(sdl_key=='6'){ + set_cmode(5); + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='c') { +#ifdef HEAT_ENABLE + set_cmode((cmode+1) % 6); +#else + set_cmode((cmode+1) % 5); +#endif + if(it > 50) + it = 50; + } +#ifdef INTERNAL + if(sdl_key=='v') + vs = !vs; + if(vs) + dump_frame(vid_buf, XRES, YRES, XRES); +#endif + + if(sdl_wheel) { + if(sdl_zoom_trig==1){ + ZSIZE += sdl_wheel; + if(ZSIZE>32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } else { + bs += sdl_wheel; + if(bs>16) + bs = 16; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)){ +#ifdef BETA + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); +#else + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); +#endif + } else { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } +#endif + mx = x; + my = y; + if(update_flag) { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } else { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } + + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) { + tmp = malloc(64); +#ifdef BETA + if(is_beta){ + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } else { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } +#else + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); +#endif + if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) { + free(tmp); + tmp = download_ui(vid_buf, my_uri, &i); + if(tmp) { + save_presets(1); + if(update_start(tmp, i)) { + update_cleanup(); + save_presets(0); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } else + return 0; + } + } else + free(tmp); + } + if(y>=sdl_scale*(YRES+(MENUSIZE-20))) { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0){ + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0){ + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0){ + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } +#ifdef HEAT_ENABLE + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) { +#else + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-365))*sdl_scale) && svf_login && svf_open) { +#endif + db = svf_own ? 257 : 256; + if(da < 51) + da ++; +#ifdef HEAT_ENABLE + } else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) { + db = 270; + if(da < 51) + da ++; +#endif + } else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) { + db = 266; + if(da < 51) + da ++; + } else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) { + db = svf_login ? 261 : 260; + if(svf_admin) { + db = 268; + } else if(svf_mod) { + db = 271; + } + if(da < 51) + da ++; + } else if(x>=sdl_scale && x<=17*sdl_scale) { + db = 262; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) { + db = 267; + if(da < 51) + da ++; + } else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) { + db = 265; + if(da < 51) + da ++; + } else if(da > 0) + da --; + } else + if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } else if(bq==4 && !b) { + free(load_data); + free(load_img); + load_mode = 0; + } + } else if(save_mode==1) { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1) + save_mode = 2; + else if(b==4) + save_mode = 0; + } else if(save_mode==2) { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } else if(sdl_zoom_trig && zoom_en<2) { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) { + if(!lb) { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ + if(execute_vote(vid_buf, svf_id, "Up")){ + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ + if(execute_vote(vid_buf, svf_id, "Down")){ + svf_myvote = -1; + } + } +#ifdef HEAT_ENABLE + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) +#else + if(x>=219 && x<=(XRES+BARSIZE-(510-365)) && svf_login && svf_open) +#endif + tag_list_ui(vid_buf); +#ifdef HEAT_ENABLE + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) { + legacy_enable = !legacy_enable; + } +#endif + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) { + if(!svf_open || !svf_own || x>51) { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { +#ifdef HEAT_ENABLE + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 6); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+5) % 6); +#else + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 5); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+4) % 5); +#endif + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)){ + c = sl = cr&0xFF; + } else { + //Something + } + } + //create_parts(x, y, bs, SPC_AIR); + lx = x; + ly = y; + lb = 0; + lm = 0; + } else { + create_parts(x, y, bs, c); + lx = x; + ly = y; + lb = b; + lm = 0; + } + } + } + } else { + if(lb && lm) { + x /= sdl_scale; + y /= sdl_scale; + c = (lb&1) ? sl : sr; + su = c; + if(lm == 1) { + if(c!=127 || lx<0 || ly<0 || lx>=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) { + it--; + //if(fbi_img) + //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta){ + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } else { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + /*#ifdef MT + pthread_join(pth2,NULL); + #endif*/ + + if(hud_enable){ + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } +#ifdef HEAT_ENABLE + if(sdl_zoom_trig){ + if(x +#ifndef MACOSX +#include +#endif +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif +#ifdef MACOSX +#include +#include +#include +#endif + +#include "update.h" + +static char *exe_name(void) +{ +#if defined WIN32 + char *name= (char *)malloc(64), max=64, res; + while((res = (char)GetModuleFileName(NULL, name, max)) >= max) { +#elif defined MACOSX + char *fn=malloc(64),*name=malloc(PATH_MAX), max=64, res; + if(_NSGetExecutablePath(fn, &max) != 0) { + fn = realloc(fn, max); + _NSGetExecutablePath(fn, &max); + } + if(realpath(fn, name) == NULL) { + free(fn); + free(name); + return NULL; + } + res = 1; +#else + char fn[64], *name=malloc(64), max=64, res; + sprintf(fn, "/proc/self/exe"); + memset(name, 0, max); + while((res = readlink(fn, name, max)) >= max-1) { +#endif +#ifndef MACOSX + max *= 2; + name = realloc(name, max); + memset(name, 0, max); + } +#endif + if(res <= 0) { + free(name); + return NULL; + } + return name; +} + +int update_start(char *data, int len) +{ + char *self=exe_name(), *temp; +#ifdef WIN32 + char *p; +#endif + FILE *f; + int res = 1; + + if(!self) + return 1; + +#ifdef WIN32 + temp = malloc(strlen(self)+12); + strcpy(temp, self); + p = temp + strlen(temp) - 4; + if(_stricmp(p, ".exe")) + p += 4; + strcpy(p, "_update.exe"); + + if(!MoveFile(self, temp)) + goto fail; + + f = fopen(self, "wb"); + if(!f) + goto fail; + if(fwrite(data, 1, len, f) != len) { + fclose(f); + DeleteFile(self); + goto fail; + } + fclose(f); + + if((int)ShellExecute(NULL, "open", self, NULL, NULL, SW_SHOWNORMAL) <= 32) { + DeleteFile(self); + goto fail; + } + + return 0; +#else + temp = malloc(strlen(self)+8); + strcpy(temp, self); + strcat(temp, "-update"); + + f = fopen(temp, "w"); + if(!f) + goto fail; + if(fwrite(data, 1, len, f) != len) { + fclose(f); + unlink(temp); + goto fail; + } + fclose(f); + + if(chmod(temp, 0755)) { + unlink(temp); + goto fail; + } + + if(rename(temp, self)) { + unlink(temp); + goto fail; + } + + execl(self, "powder-update", NULL); +#endif + +fail: + free(temp); + free(self); + return res; +} + +int update_finish(void) +{ +#ifdef WIN32 + char *temp, *self=exe_name(), *p; + int timeout = 60, err; + + temp = malloc(strlen(self)+12); + strcpy(temp, self); + p = temp + strlen(temp) - 4; + if(_stricmp(p, ".exe")) + p += 4; + strcpy(p, "_update.exe"); + + while(!DeleteFile(temp)) { + err = GetLastError(); + if(err == ERROR_FILE_NOT_FOUND) { + // just as well, then + free(temp); + return 0; + } + Sleep(500); + timeout--; + if(timeout <= 0) { + free(temp); + return 1; + } + } + free(temp); +#endif + return 0; +} + +void update_cleanup(void) +{ +#ifdef WIN32 + update_finish(); +#endif +} diff --git a/update.h b/update.h new file mode 100755 index 000000000..6398d4d79 --- /dev/null +++ b/update.h @@ -0,0 +1,27 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * 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 02111-1301 USA + */ +#ifndef UPDATE_H +#define UPDATE_H + +int update_start(char *data, int len); +int update_finish(void); +void update_cleanup(void); + +#endif diff --git a/version.h b/version.h new file mode 100755 index 000000000..64ce64e01 --- /dev/null +++ b/version.h @@ -0,0 +1,31 @@ +/** + * Powder Toy - Version (Header) + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * 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 02111-1301 USA + */ +#ifndef VERSION_H +#define VERSION_H + +#define SAVE_VERSION 38 +#define MINOR_VERSION 0 +#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. + +#define MENUV3 +//#define BETA +#define HEAT_ENABLE + +#endif From 19665ff2998eb0f340bad15990473dc68d0737a7 Mon Sep 17 00:00:00 2001 From: triclops200 Date: Mon, 26 Jul 2010 02:33:12 +0800 Subject: [PATCH 003/237] Changed plasma's heat value to a realistic 115 This is actually a conservative change seeing as if it was helium plasma it would've been 19 --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 3102a8f70..8e21845b0 100755 --- a/powder.c +++ b/powder.c @@ -619,7 +619,7 @@ const struct part_type ptypes[] = { {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_OTHER, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable."}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 251, "Plasma, extremely hot."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_OTHER, -250.0f, 46, "Nitrogen Ice."}, }; From 6cd3ba00ea8432b6097d512fbb8a48bacfcb9543 Mon Sep 17 00:00:00 2001 From: triclops200 Date: Mon, 26 Jul 2010 02:47:08 +0800 Subject: [PATCH 004/237] Changed glass's specific heat to 150. --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 8e21845b0..2bf88fefd 100755 --- a/powder.c +++ b/powder.c @@ -615,7 +615,7 @@ const struct part_type ptypes[] = { {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f, 170, "Liquid Rubidium."}, {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_OTHER, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_OTHER, R_TEMP+0.0f, 251, "Solid. Meltable. Shatters under pressure"}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_OTHER, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_OTHER, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable."}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, From d12bf45aafb99438c60788a1c11e9ef533ac2c37 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 27 Jul 2010 14:13:16 +0100 Subject: [PATCH 005/237] Added copy/cut and paste, speed improvements for the 'nearest_part' function --- Resources/powder-res.rc | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Resources/powder-res.rc diff --git a/Resources/powder-res.rc b/Resources/powder-res.rc new file mode 100644 index 000000000..569b629dc --- /dev/null +++ b/Resources/powder-res.rc @@ -0,0 +1,2 @@ +#define IDI_ICON1 101 +IDI_ICON1 ICON DISCARDABLE "powder.ico" From 7e2d1ed3c093c8aef4844c55a810adf57a0bed22 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 27 Jul 2010 14:20:11 +0100 Subject: [PATCH 006/237] Added copy/cut and paste, speed improvements for the 'nearest_part' function --- powder.c | 79 +++++++++++++++++++++++++++++++++++++++++++------------ version.h | 6 ++--- 2 files changed, 65 insertions(+), 20 deletions(-) diff --git a/powder.c b/powder.c index 2bf88fefd..4b52a6d82 100755 --- a/powder.c +++ b/powder.c @@ -26,9 +26,6 @@ #include #include #include -#ifdef OCL -#include -#endif //#include #ifdef MT #include @@ -64,7 +61,7 @@ #define ZSIZE_D 16 #define ZFACTOR_D 8 -unsigned char ZFACTOR = 256/ZSIZE_D;//ZFACTOR_D; +unsigned char ZFACTOR = 256/ZSIZE_D; unsigned char ZSIZE = ZSIZE_D; #define CELL 4 @@ -115,6 +112,7 @@ char *it_msg = "\brThe Powder Toy\n" "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" "\n" +"\bgControl+C/V/X are Copy, Paste and cut respectively.\n" "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" "\bgPick your material from the menu using mouse left/right buttons.\n" "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" @@ -137,11 +135,7 @@ char *it_msg = "\n" "\bgSpecial thanks to Brian Ledbetter for maintaining ports & server development in the past." "\nand CW for hosting the original server.\n" -#ifdef WIN32 -"\nThanks to Akuryo for Windows icons.\n" -#endif -"\n" -"\bgTo use online features such as saving, you need to register at: http://powder.hardwired.org.uk/Register.html" +"\bgTo use online features such as saving, you need to register at: \brhttp://powder.hardwired.org.uk/Register.html" ; typedef struct { @@ -1110,7 +1104,7 @@ int nearest_part(int ci, int t){ int cy = (int)parts[ci].y; for(i=0; i= YRES/CELL) save_y = YRES/CELL-1; save_w = 1; save_h = 1; - if(b==1) + if(b==1){ save_mode = 2; - else if(b==4) + } else if(b==4){ save_mode = 0; + copy_mode = 0; + } } else if(save_mode==2) { save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; save_h = (my/sdl_scale+CELL/2)/CELL - save_y; @@ -8071,8 +8103,21 @@ int main(int argc, char *argv[]) if(save_w<1) save_w = 1; if(save_h<1) save_h = 1; if(!b) { - stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - save_mode = 0; + if(copy_mode==1){ + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + } else if(copy_mode==2){ + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + } else { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } } } else if(sdl_zoom_trig && zoom_en<2) { x /= sdl_scale; diff --git a/version.h b/version.h index 64ce64e01..449eb6133 100755 --- a/version.h +++ b/version.h @@ -21,11 +21,11 @@ #define VERSION_H #define SAVE_VERSION 38 -#define MINOR_VERSION 0 -#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. +#define MINOR_VERSION 1 +#define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. #define MENUV3 -//#define BETA +#define BETA #define HEAT_ENABLE #endif From 4bf0a27495ec92319aa210baf4e8a7d920001f5e Mon Sep 17 00:00:00 2001 From: triclops200 Date: Tue, 27 Jul 2010 15:44:53 +0800 Subject: [PATCH 007/237] Fixed a bug with neon creating infinate pressure --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 4b52a6d82..1917ee664 100755 --- a/powder.c +++ b/powder.c @@ -1182,7 +1182,7 @@ void update_particles_i(pixel *vid, int start, int inc){ vy[y/CELL][x/CELL] *= ptypes[t].airloss; vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS) { + if(t==PT_GASS||t==PT_NEON) { if(pv[y/CELL][x/CELL]<3.5f) pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); if(y+CELL Date: Wed, 28 Jul 2010 06:48:18 -0700 Subject: [PATCH 008/237] Add NOBL - triclops200 --- powder.c | 16973 +++++++++++++++++++++++++++-------------------------- 1 file changed, 8499 insertions(+), 8474 deletions(-) mode change 100755 => 100644 powder.c diff --git a/powder.c b/powder.c old mode 100755 new mode 100644 index 1917ee664..23289192b --- a/powder.c +++ b/powder.c @@ -1,8474 +1,8499 @@ -/** - * Powder Toy - Main source - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * - * 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 02111-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include -//#include -#ifdef MT -#include -#include -#endif - -#ifdef WIN32 -#include -#else -#include -#include -#endif - - -#include "version.h" -#include "http.h" -#include "md5.h" -#include "update.h" - -#define SERVER "powder.hardwired.org.uk" - -#undef PLOSS - -#ifdef MENUV3 -#define MENUSIZE 40 -#else -#define MENUSIZE 20 -#endif -#define BARSIZE 14 -#define XRES 612 -#define YRES 384 -#define NPART XRES*YRES - -#define ZSIZE_D 16 -#define ZFACTOR_D 8 -unsigned char ZFACTOR = 256/ZSIZE_D; -unsigned char ZSIZE = ZSIZE_D; - -#define CELL 4 -#define ISTP (CELL/2) -#define CFDS (4.0f/CELL) - -typedef unsigned char uint8; - -#ifdef HEAT_ENABLE -#include "hmap.h" -#endif - -#ifdef PIX16 -#define PIXELSIZE 2 -typedef unsigned short pixel; -#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) -#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) -#define PIXR(x) (((x)>>8)&0xF8) -#define PIXG(x) (((x)>>3)&0xFC) -#define PIXB(x) (((x)<<3)&0xF8) -#else -#define PIXELSIZE 4 -typedef unsigned int pixel; -#ifdef PIX32BGR -#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) -#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) -#define PIXR(x) ((x)&0xFF) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)>>16) -#else -#ifdef PIX32BGRA -#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) -#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) -#define PIXR(x) (((x)>>8)&0xFF) -#define PIXG(x) (((x)>>16)&0xFF) -#define PIXB(x) (((x)>>24)) -#else -#define PIXPACK(x) (x) -#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) -#define PIXR(x) ((x)>>16) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)&0xFF) -#endif -#endif -#endif - -char *it_msg = -"\brThe Powder Toy\n" -"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" -"\n" -"\bgControl+C/V/X are Copy, Paste and cut respectively.\n" -"\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" -"\bgPick your material from the menu using mouse left/right buttons.\n" -"Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" -"Shift+drag will create straight lines of particles.\n" -"Ctrl+drag will result in filled rectangles.\n" -"Ctrl+Shift+click will flood-fill a closed area.\n" -"Middle click or Alt+Click to \"sample\" the particles.\n" -"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" -"Use 'S' to save parts of the window as 'stamps'.\n" -"'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" -"'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" -"Use the mouse scroll wheel to change the tool size for particles.\n" -"'Q' will quit the application.\n" -"The spacebar can be used to pause physics.\n" -"'P' will take a screenshot and save it into the current directory.\n" -"\n" -"\brhttp://powder.hardwired.org.uk/\n" -"\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" -"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powder.hardwired.org.uk\bg)\n" -"\n" -"\bgSpecial thanks to Brian Ledbetter for maintaining ports & server development in the past." -"\nand CW for hosting the original server.\n" -"\bgTo use online features such as saving, you need to register at: \brhttp://powder.hardwired.org.uk/Register.html" -; - -typedef struct { - int start, inc; - pixel *vid; -} upstruc; - -#ifdef BETA -char *old_ver_msg_beta = "A new beta is available - click here!"; -#endif -char *old_ver_msg = "A new version is available - click here!"; -#ifdef HEAT_ENABLE -float mheat = 0.0f; -#endif - -int do_open = 0; -int sys_pause = 0; -int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. - -int amd = 0; - -unsigned char fire_r[YRES/CELL][XRES/CELL]; -unsigned char fire_g[YRES/CELL][XRES/CELL]; -unsigned char fire_b[YRES/CELL][XRES/CELL]; - -#define MAXSIGNS 16 - -struct sign { - int x,y,ju; - char text[256]; -} signs[MAXSIGNS]; - -/*********************************************************** - * AIR FLOW SIMULATOR * - ***********************************************************/ - -unsigned char bmap[YRES/CELL][XRES/CELL]; -unsigned char emap[YRES/CELL][XRES/CELL]; -unsigned cmode = 3; - -float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; -float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; -#define TSTEPP 0.3f -#define TSTEPV 0.4f -#define VADV 0.3f -#define VLOSS 0.999f -#define PLOSS 0.9999f -int numCores = 1; -float kernel[9]; -void make_kernel(void) -{ - int i, j; - float s = 0.0f; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) { - kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); - s += kernel[(i+1)+3*(j+1)]; - } - s = 1.0f / s; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - kernel[(i+1)+3*(j+1)] *= s; -} - -int core_count(){ - int numCPU = 1; -#ifdef MT -#ifdef WIN32 - SYSTEM_INFO sysinfo; - GetSystemInfo( &sysinfo ); - numCPU = sysinfo.dwNumberOfProcessors; -#else -#ifdef MACOSX - numCPU = 4; -#else - numCPU = sysconf( _SC_NPROCESSORS_ONLN ); -#endif -#endif - - printf("Cpus: %d\n", numCPU); - if(numCPU>1) - printf("Multithreading enabled\n"); - else - printf("Multithreading disabled\n"); -#endif - return numCPU; -} - -void update_air(void) -{ - int x, y, i, j; - float dp, dx, dy, f, tx, ty; - - for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; - if(dp < -256.0f) dp = -256.0f; - if(dx > 256.0f) dx = 256.0f; - if(dx < -256.0f) dx = -256.0f; - if(dy > 256.0f) dy = 256.0f; - if(dy < -256.0f) dy = -256.0f; - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); -} - -void *update_air_th(void *arg) -{ - update_air(); - return NULL; -} - -unsigned clamp_flt(float f, float min, float max) -{ - if(fmax) - return 255; - return (int)(255.0f*(f-min)/(max-min)); -} - -float restrict_flt(float f, float min, float max){ - if(fmax) - return max; - return f; -} - -void draw_air(pixel *vid) -{ - int x, y, i, j; - pixel c; - - if(cmode == 2) - return; - - for(y=0; y 0.0f) - c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); - else - c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); - } else - c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), - clamp_flt(pv[y][x], 0.0f, 8.0f), - clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); - for(j=0; j=XRES || ny>=YRES) - return 0; - if(x==nx && y==ny) - return 1; - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; - - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE)){ - return 1; - } - - if((r&0xFF)==PT_VOID){ - parts[i].type=PT_NONE; - return 0; - } - if((r&0xFF)==PT_BHOL){ - parts[i].type=PT_NONE; -#ifdef HEAT_ENABLE - if(!legacy_enable){ - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; - } -#endif - return 0; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]){ - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE){ - return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])){ - return 0; - } - - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - - if(parts[i].type==PT_CNCT && y>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; - } - - return 1; -} - -void kill_part(int i) -{ - int x, y; - parts[i].type = PT_NONE; - - x = (int)(parts[i].x+0.5f); - y = (int)(parts[i].y+0.5f); - - if(x>=0 && y>=0 && x=XRES || y>=YRES) - return -1; - -#ifdef HEAT_ENABLE - if(t==SPC_HEAT||t==SPC_COOL){ - if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); - } - if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP){ - parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); - } - return pmap[y][x]>>8; - } else { - return -1; - } - } -#endif - if(t==SPC_AIR){ - pv[y/CELL][x/CELL] += 0.03f; - if(y+CELL>8].type = PT_SPRK; - parts[pmap[y][x]>>8].life = 4; - parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; - pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; - return pmap[y][x]>>8; - } - - if(p==-1) { - if(pmap[y][x]) - return -1; - if(pfree == -1) - return -1; - i = pfree; - pfree = parts[i].life; - } else - i = p; - - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; -#ifdef HEAT_ENABLE - parts[i].temp = ptypes[t].heat; -#endif - if(t==PT_ACID){ - parts[i].life = 75; - } - //Testing - /*if(t==PT_WOOD){ - parts[i].life = 150; - }*/ - //End Testing - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_PLSM) - parts[i].life = rand()%150+50; - if(t==PT_LAVA) - parts[i].life = rand()%120+240; - if(t==PT_NEUT) { - float r = (rand()%128+128)/127.0f; - float a = (rand()%360)*3.14159f/180.0f; - parts[i].life = rand()%480+480; - parts[i].vx = r*cosf(a); - parts[i].vy = r*sinf(a); - } - if(t==PT_PHOT) { - float r = (rand()%3-1)*3; - float a = (rand()%3-1)*3; - parts[i].life = 680; - if(a==0.0f&&r==0.0f){ - parts[i].life = 0; - parts[i].type = PT_NONE; - return -1; - } else { - parts[i].vx = a; - parts[i].vy = r; - } - //} else { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - //} - } - - pmap[y][x] = t|(i<<8); - - return i; -} - -void delete_part(int x, int y) -{ - unsigned i; - - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - i = pmap[y][x]; - if(!i || (i>>8)>=NPART) - return; - - kill_part(i>>8); - pmap[y][x] = 0; // just in case -} - -void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - if(a!=255) { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + 255*PIXR(t)) >> 8; - g = (a*g + 255*PIXG(t)) >> 8; - b = (a*b + 255*PIXB(t)) >> 8; - if(r>255) - r = 255; - if(g>255) - g = 255; - if(b>255) - b = 255; - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); - -int is_wire(int x, int y) -{ - return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; -} -int is_wire_off(int x, int y) -{ - return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; -} - -void set_emap(int x, int y) -{ - int x1, x2; - - if(!is_wire_off(x, y)) - return; - - // go left as far as possible - x1 = x2 = x; - while(x1>0) { - if(!is_wire_off(x1-1, y)) - break; - x1--; - } - while(x21 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) - set_emap(x1, y-2); - else if(y>0) - for(x=x1; x<=x2; x++) - if(is_wire_off(x, y-1)) { - if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) - set_emap(x, y-1); - } - - if(y=XRES || y>=YRES || - bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) { - kill_part(i); - continue; - } - - vx[y/CELL][x/CELL] *= ptypes[t].airloss; - vy[y/CELL][x/CELL] *= ptypes[t].airloss; - vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; - vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS||t==PT_NEON) { - if(pv[y/CELL][x/CELL]<3.5f) - pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); - if(y+CELL2.5f) { - parts[i].life = rand()%80+180; - rt = parts[i].type = PT_FIRE; -#ifdef HEAT_ENABLE - parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); -#endif - pv[y/CELL][x/CELL] += 0.25f * CFDS; - t = PT_FIRE; - } - - parts[i].vx *= ptypes[t].loss; - parts[i].vy *= ptypes[t].loss; - - if(t==PT_DFRM && !parts[i].life) { - if(pv[y/CELL][x/CELL]>1.0f) { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - parts[i].life = rand()%80+300; - } - } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - - if(ptypes[t].diffusion) { - parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - } - - // interpolator -#ifdef WIN32 - mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#else - mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#endif - if(mv < ISTP) { - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - } else { - dx = parts[i].vx*ISTP/mv; - dy = parts[i].vy*ISTP/mv; - ix = parts[i].x; - iy = parts[i].y; - while(1) { - mv -= ISTP; - if(mv <= 0.0f) { - // nothing found - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - break; - } - ix += dx; - iy += dy; - nx = (int)(ix+0.5f); - ny = (int)(iy+0.5f); - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) { - parts[i].x = ix; - parts[i].y = iy; - break; - } - } - } - - a = nt = 0; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx4.0f) - t = parts[i].type = PT_DSTW; - if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) - t = parts[i].type = PT_OILL; - if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) - t = parts[i].type = PT_GASS; -#ifdef HEAT_ENABLE - } -#endif - if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - t = parts[i].type = PT_BGLA; - if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) - t = parts[i].type = PT_SNOW; - if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) { - t = PT_NEUT; - create_part(i, x, y, t); - } - - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1){ - nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1){ - create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[nearp].type = PT_SPRK; - parts[nearp].life = 9; - parts[nearp].ctype = PT_ETRD; - } - } - -#ifdef HEAT_ENABLE - if(!legacy_enable){ - int ctemp = pv[y/CELL][x/CELL]*2; - c_heat = 0.0f; - h_count = 0; - if(ptypes[t].hconduct>(rand()%250)){ - for(nx=-1; nx<2; nx++) { - for(ny=-1; ny<2; ny++) { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ - h_count++; - c_heat += parts[r>>8].temp; - } - } - } - } - pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); - for(nx=-1; nx<2; nx++) { - for(ny=-1; ny<2; ny++) { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ - parts[r>>8].temp = parts[i].temp; - } - } - } - } - if(pt>=pstates[t].btemp&&pstates[t].burn) { - t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - } - else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid){ - if(t==PT_LAVA&&parts[i].ctype){ - parts[i].life = 0; - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp){ - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } else { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)){ - if(pstates[t].liquid==PT_LAVA){ - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } else if(t==PT_ICEI&&parts[i].ctype){ - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } else { - t = parts[i].type = pstates[t].liquid; - } - }else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS){ - t = parts[i].type = pstates[t].liquid; - }else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)){ - if(t==PT_SLTW&&1>rand()%6){ - t = parts[i].type = PT_SALT; - } else { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - } - } - if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f){ - float atemp = parts[i].temp + (-MIN_TEMP); - pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; - } - if(t==PT_LAVA){ - parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - } - pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); - } - } - if(t==PT_CSCN&&parts[i].temp>24.0f){ - pt = parts[i].temp -= 2.5f; - } - if(t==PT_HSCN&&parts[i].temp>24.0f){ - pt = parts[i].temp -= 2.5f; - } - #endif - - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK) { - nx = x % CELL; - if(nx == 0) - nx = x/CELL - 1; - else if(nx == CELL-1) - nx = x/CELL + 1; - else - nx = x/CELL; - ny = y % CELL; - if(ny == 0) - ny = y/CELL - 1; - else if(ny == CELL-1) - ny = y/CELL + 1; - else - ny = y/CELL; - if(nx>=0 && ny>=0 && nx0){ - int ttx = (rand()%3)-1; - r = pmap[y-1][x+ttx]; - if(parts[i].life>50){ - if((pmap[y-1][x+ttx]&0xFF)==PT_NONE){ - create_part(-1, x+ttx, y-1, PT_WOOD); - parts[pmap[y-1][x+ttx]>>8].life = parts[i].life-1; - parts[pmap[y-1][x+ttx]>>8].vx = ttx; - } - if((pmap[y-1][x+ttx-1]&0xFF)==PT_NONE){ - create_part(-1, x+ttx-1, y-1, PT_WOOD); - parts[pmap[y-1][x+ttx-1]>>8].life = 0; - } - if((pmap[y-1][x+ttx+1]&0xFF)==PT_NONE){ - create_part(-1, x+ttx+1, y-1, PT_WOOD); - parts[pmap[y-1][x+ttx+1]>>8].life = 0; - } - parts[i].life = 0; - } else if(parts[i].life>10) { - //int ttx = (rand()%3)-parts[i].vx; - //create_part(-1, x+ttx, y-1, PT_WOOD); - //r = pmap[y-1][x+ttx]; - //parts[r>>8].life = parts[i].life-1; - //parts[i].life = 0; - } - } else*/ - if(t==PT_THDR){ - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT) && parts[r>>8].ctype!=PT_SPRK ){ - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - } else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) { - pv[y/CELL][x/CELL] += 100.0f; - if(legacy_enable&&1>(rand()%200)){ - parts[i].life = rand()%50+120; - t = parts[i].type = PT_FIRE; - } else { - t = parts[i].type = PT_NONE; - } - } - } - } else if(t==PT_ICEI || t==PT_SNOW) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } -#ifndef HEAT_ENABLE - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; -#else - if(legacy_enable){ - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; - } -#endif - } - } - else if(t==PT_HSCN||t==PT_CSCN) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) { - parts[i].temp = 200.0f; - } - } - } - //PLANT - else if(t==PT_PLNT) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR && 1>(rand()%250)) { - t = parts[i].type = PT_PLNT; - parts[r>>8].type = PT_PLNT; - } else if((r&0xFF)==PT_LAVA && 1>(rand()%250)){ - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WATR||t==PT_DSTW) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { -#ifndef HEAT_ENABLE - t = parts[i].type = PT_WTRV; - //parts[r>>8].type = PT_WTRV; -#else - if(legacy_enable){ - t = parts[i].type = PT_WTRV; - } -#endif - } else if((r&0xFF)==PT_SALT && 1>(rand()%250)) { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)){ - t = parts[i].type = PT_WATR; - } - if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)){ - t = parts[i].type = PT_SLTW; - } -#ifdef HEAT_ENABLE - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)){ -#else - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ -#endif - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_SLTW) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { -#ifndef HEAT_ENABLE - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; -#else - if(legacy_enable){ - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; - } -#endif - } else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) { - //t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } -#ifdef HEAT_ENABLE - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ -#else - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ -#endif - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WTRV) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; -#ifdef HEAT_ENABLE - if(legacy_enable){ -#endif - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { - t = parts[i].type = PT_WATR; - parts[r>>8].type = PT_WATR; - } -#ifdef HEAT_ENABLE - } -#endif - -#ifdef HEAT_ENABLE - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ -#else - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ -#endif - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000)) { -#ifndef HEAT_ENABLE - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; -#else - if(legacy_enable){ - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } -#endif - } - } - } - // END PLANT - // ACID - else if(t==PT_ACID) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)!=PT_ACID){ - if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD){ - t = parts[i].type = PT_FIRE; - parts[i].life = 4; - parts[r>>8].type = PT_FIRE; - parts[r>>8].life = 4; - } else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) { - parts[i].life--; - parts[r>>8].type = PT_NONE; - } else if (parts[i].life==50){ - parts[i].life = 0; - t = parts[i].type = PT_NONE; - } - } - } - } - //END ACID :D - else if(t==PT_NEUT) { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) { - if(33>rand()%100) { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); - } else { - create_part(r>>8, x+nx, y+ny, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - fe ++; - } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) - parts[r>>8].type = PT_DUST; - if((r&0xFF)==PT_WATR && 15>(rand()%100)) - parts[r>>8].type = PT_DSTW; - if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_DFRM; - if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_OILL; - if((r&0xFF)==PT_OILL && 5>(rand()%1000)) - parts[r>>8].type = PT_GASS; - if((r&0xFF)==PT_PLNT && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - } - } - else if(t==PT_PHOT){ - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=0; nx<1; nx++) - for(ny=0; ny<1; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - // } else if(((r&0xFF)!=PT_PHOT&&(r&0xFF)!=PT_NONE&&(r&0xFF)!=PT_CLNE)) { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - // }// else if((r&0xFF)!=PT_PLEX){ - // parts[i].life = 4; - // parts[i].type = PT_FIRE - //} - } - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) - continue; - rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { - parts[r>>8].type = PT_FIRE; -#ifdef HEAT_ENABLE - parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); -#endif - parts[r>>8].life = rand()%80+180; - if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; //LOL - continue; - } - lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; - if(lpv < 1) lpv = 1; -#ifndef HEAT_ENABLE - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && (t!=PT_FIRE || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && - ptypes[rt].meltable*lpv>(rand()%1000)) { - if(t!=PT_LAVA || parts[i].life>0) { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } else { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = PT_METL; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { - kill_part(r>>8); - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - //t = parts[i].type = PT_METL; - goto killed; - } - } -#else - if(legacy_enable){ - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && - ptypes[rt].meltable*lpv>(rand()%1000)) { - if(t!=PT_LAVA || parts[i].life>0) { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } else { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = PT_METL; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { - kill_part(r>>8); - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - //t = parts[i].type = PT_METL; - goto killed; - } - } - } -#endif - //Bitches now know about my semi-conductor :( - if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)){ - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; -#ifdef HEAT_ENABLE - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; -#endif - } - } - if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp>100.0f)){ - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp<100.0f)){ - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 6; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5){ - if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN){ - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - } - killed: - if(parts[i].type == PT_NONE) - continue; - } - - if(t==PT_CLNE) { - if(!parts[i].ctype) { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx=XRES-CELL || - ny=YRES-CELL) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - continue; - } - - rt = parts[i].flags & FLAG_STAGNANT; - parts[i].flags &= ~FLAG_STAGNANT; - if(!try_move(i, x, y, nx, ny)) { - parts[i].x = lx; - parts[i].y = ly; - if(ptypes[t].falldown) { - if(nx!=x && try_move(i, x, y, nx, y)) { - parts[i].x = ix; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(ny!=y && try_move(i, x, y, x, ny)) { - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else { - r = (rand()%2)*2-1; - if(ny!=y && try_move(i, x, y, x+r, ny)) { - parts[i].x += r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(ny!=y && try_move(i, x, y, x-r, ny)) { - parts[i].x -= r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(nx!=x && try_move(i, x, y, nx, y+r)) { - parts[i].x = ix; - parts[i].y += r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(nx!=x && try_move(i, x, y, nx, y-r)) { - parts[i].x = ix; - parts[i].y -= r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) { - s = 0; - if(!rt || nt) - rt = 50; - else - rt = 10; - for(j=x+r; j>=0 && j>=x-rt && j0) - r = 1; - else - r = -1; - if(s) - for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) { - kill_part(i); - continue; - } else if(try_move(i, x, y, 2*x-nx, ny)) { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } else if(try_move(i, x, y, nx, 2*y-ny)) { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } else { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } - } - - justdraw: - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) { - kill_part(i); - continue; - } -#ifdef HEAT_ENABLE - if(cmode!=CM_HEAT){ - -#endif - if(t==PT_ACID) { - if(parts[i].life>255) parts[i].life = 255; - if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28));//if(parts[i].life<=49) parts[i].life = 50; - if(s==0) s = 1; - cr = PIXR(ptypes[t].pcolors)/s; - cg = PIXG(ptypes[t].pcolors)/s; - cb = PIXB(ptypes[t].pcolors)/s; - //vid[ny*(XRES+BARSIZE)+nx] = //(cr<<16)+(cb<<18)+cg;//ptypes[t].pcolors/-(parts[i].life-255); - blendpixel(vid, nx, ny, cr, cg, cb, 255);//(parts[i].life-46)*28 - if(cmode==4){ - blendpixel(vid, nx+1, ny, cr, cg, cb, 223); - blendpixel(vid, nx-1, ny, cr, cg, cb, 223); - blendpixel(vid, nx, ny+1, cr, cg, cb, 223); - blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); - } - }else if(t==PT_NEUT) { - if(cmode == 3||cmode==4) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 8; - cb = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } else { - cr = 0x20; - cg = 0xE0; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - }else if(t==PT_PHOT) { - if(cmode == 3||cmode==4) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } else { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_THDR) { - if(cmode == 3||cmode==4) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 16; - cb = 20; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } else { - cr = 0xFF; - cg = 0xFF; - cb = 0xA0; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLSM) { - float ttemp = parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = plasma_data[caddress]; - uint8 G = plasma_data[caddress+1]; - uint8 B = plasma_data[caddress+2]; - if(cmode == 3||cmode==4) { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } else { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_FIRE && parts[i].life) { - if(cmode == 3||cmode==4) { - cr = parts[i].life / 4; - cg = parts[i].life / 16; - cb = parts[i].life / 32; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } else { - cr = parts[i].life * 8; - cg = parts[i].life * 2; - cb = parts[i].life; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_LAVA && parts[i].life) { - cr = parts[i].life * 2 + 0xE0; - cg = parts[i].life * 1 + 0x50; - cb = parts[i].life/2 + 0x10; - if(cr>255) cr = 255; - if(cg>192) cg = 192; - if(cb>128) cb = 128; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 64); - blendpixel(vid, nx-1, ny, cr, cg, cb, 64); - blendpixel(vid, nx, ny+1, cr, cg, cb, 64); - blendpixel(vid, nx, ny-1, cr, cg, cb, 64); - if(cmode == 3||cmode==4) { - cr /= 32; - cg /= 32; - cb /= 32; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } else if(t==PT_LAVA || t==PT_SPRK) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - if(cmode == 3 || cmode==4) { - if(t == PT_LAVA) { - cr = 3; - cg = i%2; - cb = 0; - } else { - cr = 8; - cg = 12; - cb = 16; - } - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } else - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; -#ifdef HEAT_ENABLE - } else { - float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); - uint8 R = color_data[caddress]; - uint8 G = color_data[caddress+1]; - uint8 B = color_data[caddress+2]; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); - } -#endif - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID){ - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); - - //if(vid[(ny-1)*YRES+(nx-1)]!=0){ - // blendpixel(vid, nx, ny-1, R, G, B, 46); - //} - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - - } - -} - -void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb){ - blendpixel(vid, x+1, y, cr, cg, cb, 112); - blendpixel(vid, x-1, y, cr, cg, cb, 112); - blendpixel(vid, x, y+1, cr, cg, cb, 112); - blendpixel(vid, x, y-1, cr, cg, cb, 112); - - blendpixel(vid, x+1, y-1, cr, cg, cb, 64); - blendpixel(vid, x-1, y-1, cr, cg, cb, 64); - blendpixel(vid, x+1, y+1, cr, cg, cb, 64); - blendpixel(vid, x-1, y+1, cr, cg, cb, 64); -} - -void update_particles_i_th(void *arg){ - upstruc *newup = (upstruc*)arg; - update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); - return; -} - -void update_particles(pixel *vid) -{ - int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; - float lx, ly; -#ifdef MT - int pt = 0, pc = 0; - pthread_t *InterThreads; -#endif - - memset(pmap, 0, sizeof(pmap)); - r = rand()%2; - for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) { - if(emap[y][x]) { - cr = cg = cb = 128; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) { - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==13) { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } else { - for(y=0; y>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) { - if(emap[y][x]) { - cr = cg = cb = 128; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) { - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==9){ - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } - -#ifdef MT - if(numCores > 1) { - InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); - for(pc = 0; pc=XRES || ny<0 || ny>=YRES) - break; - addpixel(vid, nx, ny, 255, 255, 255, 64); - i = nx/CELL; - j = ny/CELL; - lx += vx[j][i]*0.125f; - ly += vy[j][i]*0.125f; - if(bmap[j][i]==5 && i!=x && j!=y) - break; - } - drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); - } - -} - -void update_particles_th(void *arg) -{ - update_particles((pixel*)arg); - return; -} - -/*********************************************************** - * SDL OUTPUT * - ***********************************************************/ - -int sdl_scale = 1; -SDL_Surface *sdl_scrn; -SDLMod sdl_mod; -int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; - -#include "icon.h" -void sdl_seticon(void) -{ -#ifdef WIN32 - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else -#ifdef MACOSX - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else - SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#endif -#endif -} - -void sdl_open(void) -{ - if(SDL_Init(SDL_INIT_VIDEO)<0) { - fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); - exit(1); - } - atexit(SDL_Quit); -#ifdef PIX16 - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); -#else - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); -#endif - if(!sdl_scrn) { - fprintf(stderr, "Creating window: %s\n", SDL_GetError()); - exit(1); - } - SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); - sdl_seticon(); - SDL_EnableUNICODE(1); - //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); -} - -void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0;jpitch/PIXELSIZE; - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} - -void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - int i,k; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0;jpitch/PIXELSIZE; - } - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} -void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) -{ - if(sdl_scale == 2) - sdl_blit_2(x, y, w, h, src, pitch); - else - sdl_blit_1(x, y, w, h, src, pitch); -} - -int frame_idx=0; -void dump_frame(pixel *src, int w, int h, int pitch) -{ - char frame_name[32]; - int j,i; - unsigned char c[3]; - FILE *f; - sprintf(frame_name,"frame%04d.ppm",frame_idx); - f=fopen(frame_name,"wb"); - fprintf(f,"P6\n%d %d\n255\n",w,h); - for(j=0;j=0 && x=0 && yPT_NUM) - return 2; - if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) - return 3; - i = XRES*YRES; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) - return 1; - size = i; - } else - d = c; - - if(size < XRES*YRES) { - if(bzip2) - free(d); - return 1; - } - - sy = 0; - for(y=0;y+scl<=YRES;y+=scl) { - sx = 0; - for(x=0;x+scl<=XRES;x+=scl) { - a = 0; - r = g = b = 0; - for(j=0;j=PT_NUM) - goto corrupt; - r += PIXR(ptypes[t].pcolors); - g += PIXG(ptypes[t].pcolors); - b += PIXB(ptypes[t].pcolors); - a ++; - } - } - if(a) { - a = 256/a; - r = (r*a)>>8; - g = (g*a)>>8; - b = (b*a)>>8; - } - drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); - sx++; - } - sy++; - } - - if(bzip2) - free(d); - return 0; - -corrupt: - if(bzip2) - free(d); - return 1; -} - -static char *mystrdup(char *s) -{ - char *x; - if(s) { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; - } - return s; -} - -void *build_save(int *size, int x0, int y0, int w, int h) -{ -#ifdef HEAT_ENABLE - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; -#else - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*6+MAXSIGNS*262), *c; -#endif - int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); - int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - // save the required air state - for(y=by0; y255) i=255; - d[p++] = i; - } - for(y=by0; y255) i=255; - d[p++] = i; - } - - // save the particle map - for(i=0; i=x0 && x=y0 && y255) x=255; - if(y<0) y=0; - if(y>255) y=255; - d[p++] = x; - d[p++] = y; - } - } - for(j=0; j255) tttemp=255; - d[p++] = tttemp; - } - } -#endif - for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; - d[p++] = (signs[i].y-y0); - d[p++] = (signs[i].y-y0)>>8; - d[p++] = signs[i].ju; - x = strlen(signs[i].text); - d[p++] = x; - memcpy(d+p, signs[i].text, x); - p+=x; - } - - i = (p*101+99)/100 + 612; - c = malloc(i); - c[0] = 0x66; - c[1] = 0x75; - c[2] = 0x43; - c[3] = legacy_enable; - c[4] = SAVE_VERSION; - c[5] = CELL; - c[6] = bw; - c[7] = bh; - c[8] = p; - c[9] = p >> 8; - c[10] = p >> 16; - c[11] = p >> 24; - - i -= 12; - - if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) { - free(d); - free(c); - return NULL; - } - free(d); - - *size = i+12; - return c; -} - -int parse_save(void *save, int size, int replace, int x0, int y0) -{ - unsigned char *d,*c=save; - int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; - int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; - int fp[NPART], nf=0; - - if(size<16) - return 1; - if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) - return 1; - if(c[4]>SAVE_VERSION) - return 2; - ver = c[4]; - -#ifdef HEAT_ENABLE - if(ver<34){ - legacy_enable = 1; - } else { - if(c[3]==1||c[3]==0) - legacy_enable = c[3]; - else - legacy_beta = 1; - } -#endif - - bw = c[6]; - bh = c[7]; - if(bx0+bw > XRES/CELL) - bx0 = XRES/CELL - bw; - if(by0+bh > YRES/CELL) - by0 = YRES/CELL - bh; - if(bx0 < 0) - bx0 = 0; - if(by0 < 0) - by0 = 0; - - if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) - return 3; - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - return 1; - size = i; - - if(size < bw*bh) - return 1; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - if(replace) { - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(signs, 0, sizeof(signs)); - memset(parts, 0, sizeof(particle)*NPART); - memset(pmap, 0, sizeof(pmap)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(pv, 0, sizeof(pv)); - } - - // make a catalog of free parts - memset(pmap, 0, sizeof(pmap)); - for(i=0; i= size) - goto corrupt; - fvx[y][x] = (d[p++]-127.0f)/64.0f; - } - for(y=by0; y= size) - goto corrupt; - fvy[y][x] = (d[p++]-127.0f)/64.0f; - } - - // load the particle map - i = 0; - pty = p; - for(y=y0;y= size) - goto corrupt; - j=d[p++]; - if(j >= PT_NUM) - goto corrupt; - if(j) { - if(pmap[y][x]) { - k = pmap[y][x]>>8; - parts[k].type = j; - parts[k].x = (float)x; - parts[k].y = (float)y; - m[(x-x0)+(y-y0)*w] = k+1; - } else if(i < nf) { - parts[fp[i]].type = j; - parts[fp[i]].x = (float)x; - parts[fp[i]].y = (float)y; - m[(x-x0)+(y-y0)*w] = fp[i]+1; - i++; - } else - m[(x-x0)+(y-y0)*w] = NPART+1; - } - } - - // load particle properties - for(j=0; j= size) - goto corrupt; - if(i < NPART) { - parts[i].vx = (d[p++]-127.0f)/16.0f; - parts[i].vy = (d[p++]-127.0f)/16.0f; - } else - p += 2; - } - } - for(j=0; j= size) - goto corrupt; - if(i <= NPART) - parts[i-1].life = d[p++]*4; - else - p++; - } - } -#ifdef HEAT_ENABLE - for(j=0; j=34&&legacy_beta==0){ - if(p >= size){ - goto corrupt; - } - if(i <= NPART) { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } else { - p++; - } - } else { - parts[i-1].temp = ptypes[parts[i-1].type].heat; - } - } - } -#endif - for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) { - if(p >= size) - goto corrupt; - if(i <= NPART) - parts[i-1].ctype = d[p++]; - else - p++; - } - } - - if(p >= size) - goto version1; - j = d[p++]; - for(i=0; i size) - goto corrupt; - for(k=0; k size) - goto corrupt; - if(kSAVE_VERSION) - return NULL; - - bw = c[6]; - bh = c[7]; - w = bw*CELL; - h = bh*CELL; - - if(c[5]!=CELL) - return NULL; - - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return NULL; - fb = calloc(w*h, PIXELSIZE); - if(!fb) { - free(d); - return NULL; - } - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - goto corrupt; - size = i; - - if(size < bw*bh) - goto corrupt; - - k = 0; - for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) - goto corrupt; - - for(y=0;y= size) - goto corrupt; - j=d[p++]; - if(j0) - fb[y*w+x] = ptypes[j].pcolors; - } - - free(d); - *width = w; - *height = h; - return fb; - -corrupt: - free(d); - free(fb); - return NULL; -} - -/* NO, I DON'T THINK SO - #include "fbi.h" - - pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) - { - unsigned char *tmp; - pixel *res; - int i; - - tmp = malloc(width*height*3); - if(!tmp) - return NULL; - res = malloc(width*height*PIXELSIZE); - if(!res) { - free(tmp); - return NULL; - } - - i = width*height*3; - if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { - free(res); - free(tmp); - return NULL; - } - - for(i=0; i1) { - r = (r+c/2)/c; - g = (g+c/2)/c; - b = (b+c/2)/c; - } - q[y*w+x] = PIXRGB(r, g, b); - } - *qw = w; - *qh = h; - return q; -} - -#define GRID_X 5 -#define GRID_Y 4 -#define GRID_P 3 -#define GRID_S 6 -#define GRID_Z 3 - -void stamp_gen_thumb(int i) -{ - char fn[64]; - void *data; - int size, factor_x, factor_y; - pixel *tmp; - - if(stamps[i].thumb) { - free(stamps[i].thumb); - stamps[i].thumb = NULL; - } - - sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); - data = file_load(fn, &size); - - if(data) { - stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); - if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) { - factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); - factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); - if(factor_y > factor_x) - factor_x = factor_y; - tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); - free(stamps[i].thumb); - stamps[i].thumb = tmp; - } - } - - free(data); -} - -int clipboard_ready = 0; -void *clipboard_data = 0; -int clipboard_length = 0; - -void stamp_save(int x, int y, int w, int h) -{ - FILE *f; - int n; - char fn[64], sn[16]; - void *s=build_save(&n, x, y, w, h); - -#ifdef WIN32 - _mkdir("stamps"); -#else - mkdir("stamps", 0755); -#endif - - stamp_gen_name(sn); - sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); - - f = fopen(fn, "wb"); - if(!f) - return; - fwrite(s, n, 1, f); - fclose(f); - - free(s); - - if(stamps[STAMP_MAX-1].thumb) - free(stamps[STAMP_MAX-1].thumb); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); - memset(stamps, 0, sizeof(struct stamp_info)); - if(stamp_count0) { - memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); - memcpy(stamps, &tmp, sizeof(struct stamp_info)); - - stamp_update(); - } - - return data; -} - -void stamp_init(void) -{ - int i; - FILE *f; - - memset(stamps, 0, sizeof(stamps)); - - f=fopen("stamps" PATH_SEP "stamps.def", "rb"); - if(!f) - return; - for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) - return; - if(a!=255) { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) -{ - int i, j, w, bn = 0, ba = 0; - char *rp = font_data + font_ptrs[c]; - w = *(rp++); - for(j=0; j>= 2; - bn -= 2; - } - return x + w; -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) -{ - int sx = x; - for(;*s;s++) { - if(*s == '\n') { - x = sx; - y += FONT_H+2; - } else if(*s == '\b') { - switch(s[1]) { - case 'w': - r = g = b = 255; - break; - case 'g': - r = g = b = 192; - break; - case 'o': - r = 255; - g = 216; - b = 32; - break; - case 'r': - r = 255; - g = b = 0; - break; - case 'b': - r = g = 0; - b = 255; - break; - } - s++; - } else - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - return x; -} - -void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) -{ - int i; - for(i=0; i<=w; i++) { - drawpixel(vid, x+i, y, r, g, b, a); - drawpixel(vid, x+i, y+h, r, g, b, a); - } - for(i=1; i=w && x+textwidth(s)>=w+5) - break; - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - if(*s) - for(i=0; i<3; i++) - x = drawchar(vid, x, y, '.', r, g, b, a); - return x; -} - -int textnwidth(char *s, int n) -{ - int x = 0; - for(;*s;s++) { - if(!n) - break; - x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - n--; - } - return x-1; -} -int textwidthx(char *s, int w) -{ - int x=0,n=0,cw; - for(;*s;s++) { - cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - if(x+(cw/2) >= w) - break; - x += cw; - n++; - } - return n; -} - -/*********************************************************** - * MAIN PROGRAM * - ***********************************************************/ - -void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) -{ - int x, y, i, j, c; - int bo = b; - if(iswall==1){ - b = b-100; - x = (2+32*((b-22)/1)); - y = YRES+2+40; - switch(b){ - case WL_WALLELEC: - for(j=1; j<15; j++){ - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } else { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) { - for(i=1; i<6+j; i++) { - if(!(i&j&1)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) { - if(i&j&1) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<13; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) { - for(i=14; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - default: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } else { - x = 2+32*(b/2); - y = YRES+2+20*(b%2); - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - if(bo==sl || bo==sr) { - c = 0; - if(bo==sl) - c |= PIXPACK(0xFF0000); - if(bo==sr) - c |= PIXPACK(0x0000FF); - for(i=0; i<30; i++) { - vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; - } - for(j=0; j<18; j++) { - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; - } - } -} - -int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) -{ - int i, j, c; - if(b>=121){ - b = b-100; - //x = (2+32*((b-22)/1)); - //y = YRES+2+40; - switch(b){ - case WL_WALLELEC: - for(j=1; j<15; j++){ - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } else { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) { - for(i=1; i<6+j; i++) { - if(!(i&j&1)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) { - if(i&j&1) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<13; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) { - for(i=14; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - case 40: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - default: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } else { - //x = 2+32*(b/2); - //y = YRES+2+20*(b%2); - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - return 26; -} - -void draw_menu(pixel *vid_buf, int i, int hover){ - - //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); -#ifdef MENUV3 - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - if(hover==i){ - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); - } else { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); - } -#else - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); -#endif -} - -void menu_ui(pixel *vid_buf, int i, int *sl, int *sr){ - int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; - pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); - fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); - memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - rows = ceil((float)msections[i].itemcount/16.0f); - height = (ceil((float)msections[i].itemcount/16.0f)*18); - width = restrict_flt(msections[i].itemcount*31, 0, 16*31); - //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); - h = -1; - x = XRES-BARSIZE-26; - y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; - sy = y; - //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); - fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); - fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); - drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); - if(i==SC_WALL){ - for(n = 122; n<122+UI_WALLCOUNT; n++){ - if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM){ - if(x-26<=60){ - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else if(i==SC_SPECIAL){ - for(n = 122; n<122+UI_WALLCOUNT; n++){ - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ - if(x-26<=60){ - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else { - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1){ - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); - } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } else { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else if(i==SC_SPECIAL){ - for(n = 122; n<122+UI_WALLCOUNT; n++){ - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ - if(x-26<=20){ - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else { - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1){ - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); - } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } else { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - if(b==1&&h!=-1){ - *sl = h; - } - if(b==4&&h!=-1){ - *sr = h; - } - } - -int create_parts(int x, int y, int r, int c) -{ - int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; - - if(c == 125) { - i = x / CELL; - j = y / CELL; - for(v=-1;v<2;v++) - for(u=-1;u<2;u++) - if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) { - y += sy; - if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) { - if(cp) - create_parts(y, x, r, c); - else - create_parts(x, y, r, c); - } - e -= 1.0f; - } - } -} - -void create_box(int x1, int y1, int x2, int y2, int c) -{ - int i, j; - if(x1>x2) { - i = x2; - x2 = x1; - x1 = i; - } - if(y1>y2) { - j = y2; - y2 = y1; - y1 = j; - } - for(j=y1; j<=y2; j++) - for(i=x1; i<=x2; i++) - create_parts(i, j, 1, c); -} - -int flood_parts(int x, int y, int c, int cm, int bm) -{ - int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT){ - c = c-100; - } - if(cm==-1) { - if(c==0) { - cm = pmap[y][x]&0xFF; - if(!cm) - return 0; - } else - cm = 0; - } - if(bm==-1) { - if(c==30) { - bm = bmap[y/CELL][x/CELL]; - if(!bm) - return 0; - if(bm==1) - cm = 0xFF; - } else - bm = 0; - } - - if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) - return 1; - - // go left as far as possible - x1 = x2 = x; - while(x1>=CELL) { - if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) - break; - x1--; - } - while(x2=CELL+dy) - for(x=x1; x<=x2; x++) - if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) - if(!flood_parts(x, y-dy, co, cm, bm)) - return 0; - if(y=XRES || y>=YRES) - return; - c = vid[y*(XRES+BARSIZE)+x]; - c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); - if(c<512) - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); - else - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); -} - -void xor_line(int x1, int y1, int x2, int y2, pixel *vid) -{ - int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) { - y += sy; - e -= 1.0f; - } - } -} - -void draw_svf_ui(pixel *vid_buf) -{ - int c; - - drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); - drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - c = svf_open ? 255 : 128; - drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); - drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); - - c = svf_login ? 255 : 128; - drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); - if(svf_open) - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); - else - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); - drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); - if(svf_open && svf_own) - drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); - - c = (svf_login && svf_open) ? 255 : 128; - - drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - - if(svf_myvote==1 && (svf_login && svf_open)){ - fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); - } else if(svf_myvote==-1 && (svf_login && svf_open)){ - fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); - } - - drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); - drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); - - drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); - if(svf_tags[0]) - drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); - else - drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); - -#ifdef HEAT_ENABLE - drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); -#else - drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-364, 14, c, c, c, 255); -#endif - - drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); - drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); - if(svf_login) - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); - else - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); - drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); - - if(sys_pause) { - fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); - } else { - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); - drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - -#ifdef HEAT_ENABLE - if(!legacy_enable) { - fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); - } else { - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } -#endif - - switch(cmode) { - case 0: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); - break; - case 1: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); - break; - case 2: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); - break; - case 3: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); - break; - case 4: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); - break; -#ifdef HEAT_ENABLE - case 5: - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - break; -#endif - } - drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - - if(svf_admin) { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); - } else if(svf_mod) { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - }//else if(amd) - // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? -} - -typedef struct ui_edit { - int x, y, w, nx; - char str[256],*def; - int focus, cursor, hide; -} ui_edit; -void ui_edit_draw(pixel *vid_buf, ui_edit *ed) -{ - int cx, i; - char echo[256], *str; - - if(ed->hide) { - for(i=0;ed->str[i];i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } else - str = ed->str; - - if(ed->str[0]) { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); - } else if(!ed->focus) - drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); - if(ed->focus) { - cx = textnwidth(str, ed->cursor); - for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); - } -} -char *shift_0="`1234567890-=[]\\;',./"; -char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; -void ui_edit_process(int mx, int my, int mb, ui_edit *ed) -{ - char ch, ts[2], echo[256], *str; - int l, i; -#ifdef RAWINPUT - char *p; -#endif - - if(mb) { - if(ed->hide) { - for(i=0;ed->str[i];i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } else - str = ed->str; - - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } else - ed->focus = 0; - } - if(ed->focus && sdl_key) { - if(ed->hide) { - for(i=0;ed->str[i];i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } else - str = ed->str; - - l = strlen(ed->str); - switch(sdl_key) { - case SDLK_HOME: - ed->cursor = 0; - break; - case SDLK_END: - ed->cursor = l; - break; - case SDLK_LEFT: - if(ed->cursor > 0) - ed->cursor --; - break; - case SDLK_RIGHT: - if(ed->cursor < l) - ed->cursor ++; - break; - case SDLK_DELETE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - ed->str[ed->cursor] = 0; - else if(ed->cursor < l) - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - break; - case SDLK_BACKSPACE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) { - if(ed->cursor > 0) - memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); - ed->cursor = 0; - } else if(ed->cursor > 0) { - ed->cursor--; - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - } - break; - default: -#ifdef RAWINPUT - if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) { - ch = sdl_key; - if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) { - if(ch>='a' && ch<='z') - ch &= ~0x20; - p = strchr(shift_0, ch); - if(p) - ch = shift_1[p-shift_0]; - } - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#else - if(sdl_ascii>=' ' && sdl_ascii<127) { - ch = sdl_ascii; - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#endif - break; - } - } -} - typedef struct ui_checkbox { - int x, y; - int focus, checked; - } ui_checkbox; - void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) - { - int w = 12; - if(ed->checked) { - drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); - } - if(ed->focus){ - drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); - } else { - drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); - } - } - void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) - { - int w = 12; - - if(mb && !mbq) { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ - ed->checked = (ed->checked)?0:1; - } - } else { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ - ed->focus = 1; - } else { - ed->focus = 0; - } - } - } - -void error_ui(pixel *vid_buf, int err, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - char *msg; - - msg = malloc(strlen(txt)+16); - if(err) - sprintf(msg, "%03d %s", err, txt); - else - sprintf(msg, "%s", txt); - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - if(err) - drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); - else - drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - free(msg); - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_ui(pixel *vid_buf, char *top, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); - drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_box(pixel *vid_buf, char *msg) -{ - int w = textwidth(msg)+16; - int x0=(XRES-w)/2,y0=(YRES-24)/2; - - clearrect(vid_buf, x0-2, y0-2, w+4, 28); - drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); -} - -int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - int ret = 0; - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); - drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); - drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); - drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) { - ret = 1; - break; - } - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) { - ret = 1; - break; - } - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - return ret; -} - -int execute_tagop(pixel *vid_buf, char *op, char *tag) -{ - int status; - char *result; - - char *names[] = {"ID", "Tag", NULL}; - char *parts[2]; - - char *uri = malloc(strlen(SERVER)+strlen(op)+36); - sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); - - parts[0] = svf_id; - parts[1] = tag; - - result = http_multipart_post( - uri, - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - free(uri); - - if(status!=200) { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 1; - } - if(result && strncmp(result, "OK", 2)) { - error_ui(vid_buf, 0, result); - free(result); - return 1; - } - - if(result[2]) { - strncpy(svf_tags, result+3, 255); - svf_id[15] = 0; - } - - if(result) - free(result); - - return 0; -} - -struct strlist { - char *str; - struct strlist *next; -}; -void strlist_add(struct strlist **list, char *str) -{ - struct strlist *item = malloc(sizeof(struct strlist)); - item->str = mystrdup(str); - item->next = *list; - *list = item; -} -int strlist_find(struct strlist **list, char *str) -{ - struct strlist *item; - for(item=*list;item;item=item->next) - if(!strcmp(item->str, str)) - return 1; - return 0; -} -void strlist_free(struct strlist **list) -{ - struct strlist *item; - while(*list) { - item = *list; - *list = (*list)->next; - free(item); - } -} - -void tag_list_ui(pixel *vid_buf) -{ - int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; - char *p,*q,s; - char *tag=NULL, *op=NULL; - ui_edit ed; - struct strlist *vote=NULL,*down=NULL; - - ed.x = x0+25; - ed.y = y0+221; - ed.w = 158; - ed.nx = 1; - ed.def = "[new tag]"; - ed.focus = 0; - ed.hide = 0; - ed.cursor = 0; - strcpy(ed.str, ""); - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - op = tag = NULL; - - drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 256); - drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); - p = svf_tags; - s = svf_tags[0] ? ' ' : 0; - y = 36 + y0; - while(s) { - q = strchr(p, ' '); - if(!q) - q = p+strlen(p); - s = *q; - *q = 0; - if(svf_own || svf_admin || svf_mod) { - drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); - d = 14; - if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) { - if(!ed1.focus) - break; - ed1.focus = 0; - ed2.focus = 1; - } - if(sdl_key==SDLK_ESCAPE) { - if(!ed1.focus && !ed2.focus) - return; - ed1.focus = 0; - ed2.focus = 0; - } - } - - strcpy(svf_user, ed1.str); - md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); - - res = http_multipart_post( - "http://" SERVER "/Login.api", - NULL, NULL, NULL, - svf_user, svf_pass, - &err, NULL); - if(err != 200) { - error_ui(vid_buf, err, http_ret_text(err)); - if(res) - free(res); - goto fail; - } - if(res && !strncmp(res, "OK", 2)) { - if(!strcmp(res, "OK ADMIN")){ - svf_admin = 1; - svf_mod = 0; - } else if(!strcmp(res, "OK MOD")){ - svf_admin = 0; - svf_mod = 1; - } else { - svf_admin = 0; - svf_mod = 0; - } - free(res); - svf_login = 1; - return; - } - if(!res) - res = mystrdup("Unspecified Error"); - error_ui(vid_buf, 0, res); - free(res); - -fail: - strcpy(svf_user, ""); - strcpy(svf_pass, ""); - svf_login = 0; - svf_own = 0; - svf_admin = 0; - svf_mod = 0; -} - -void execute_delete(pixel *vid_buf, char *id) -{ - int status; - char *result; - - char *names[] = {"ID", NULL}; - char *parts[1]; - - parts[0] = id; - - result = http_multipart_post( - "http://" SERVER "/Delete.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result) - free(result); -} - -int execute_vote(pixel *vid_buf, char *id, char *action) -{ - int status; - char *result; - - char *names[] = {"ID", "Action", NULL}; - char *parts[2]; - - parts[0] = id; - parts[1] = action; - - result = http_multipart_post( - "http://" SERVER "/Vote.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 0; - } - if(result && strncmp(result, "OK", 2)) { - error_ui(vid_buf, 0, result); - free(result); - return 0; - } - - if(result) - free(result); - return 1; -} - -static char hex[] = "0123456789ABCDEF"; -void strcaturl(char *dst, char *src) -{ - char *d; - unsigned char *s; - - for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) { - if((*s>='0' && *s<='9') || - (*s>='a' && *s<='z') || - (*s>='A' && *s<='Z')) - *(d++) = *s; - else { - *(d++) = '%'; - *(d++) = hex[*s>>4]; - *(d++) = hex[*s&15]; - } - } - *d = 0; -} - -#define THUMB_CACHE_SIZE 256 - -char *thumb_cache_id[THUMB_CACHE_SIZE]; -void *thumb_cache_data[THUMB_CACHE_SIZE]; -int thumb_cache_size[THUMB_CACHE_SIZE]; -int thumb_cache_lru[THUMB_CACHE_SIZE]; - -void thumb_cache_inval(char *id) -{ - int i,j; - for(i=0;i= THUMB_CACHE_SIZE) - return; - free(thumb_cache_id[i]); - free(thumb_cache_data[i]); - thumb_cache_id[i] = NULL; - for(j=0;j thumb_cache_lru[i]) - thumb_cache_lru[j]--; -} -void thumb_cache_add(char *id, void *thumb, int size) -{ - int i,m=-1,j=-1; - thumb_cache_inval(id); - for(i=0;i m) { - m = thumb_cache_lru[i]; - j = i; - } - } - if(i >= THUMB_CACHE_SIZE) { - thumb_cache_inval(thumb_cache_id[j]); - i = j; - } - for(j=0;j= THUMB_CACHE_SIZE) - return 0; - for(j=0;j=GRID_X*GRID_Y) - break; - if(votes) { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } else { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+5); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } else if(!strncmp(str, "TAG ", 4)) { - if(j >= TAG_MAX) { - str = p; - continue; - } - q = strchr(str+4, ' '); - if(!q) { - str = p; - continue; - } - *(q++) = 0; - tag_names[j] = mystrdup(str+4); - tag_votes[j] = atoi(q); - j++; - } else { - if(i>=GRID_X*GRID_Y) - break; - if(votes) { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } else { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - str = p; - } - if(*str) - i++; - return i; -} - -#define IMGCONNS 3 -#define TIMEOUT 100 -#define HTTP_TIMEOUT 10 - -int search_own = 0; -int search_date = 0; -int search_page = 0; -char search_expr[256] = ""; - -int search_ui(pixel *vid_buf) -{ - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; - int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; - float ry; - time_t http_last_use=HTTP_TIMEOUT; - ui_edit ed; - - - void *http = NULL; - int active = 0; - char *last = NULL; - int search = 0; - int lasttime = TIMEOUT; - char *uri; - int status; - char *results; - char *tmp, ts[64]; - - void *img_http[IMGCONNS]; - char *img_id[IMGCONNS]; - void *thumb, *data; - int thlen, dlen; - - memset(img_http, 0, sizeof(img_http)); - memset(img_id, 0, sizeof(img_id)); - - memset(search_ids, 0, sizeof(search_ids)); - memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); - memset(search_publish, 0, sizeof(search_publish)); - memset(search_owners, 0, sizeof(search_owners)); - memset(search_thumbs, 0, sizeof(search_thumbs)); - memset(search_thsizes, 0, sizeof(search_thsizes)); - - do_open = 0; - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = 65; - ed.y = 13; - ed.w = XRES-200; - ed.nx = 1; - ed.def = "[search terms]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(search_expr); - strcpy(ed.str, search_expr); - - sdl_wheel = 0; - - while(!sdl_poll()) { - uih = 0; - bq = b; - mxq = mx; - myq = my; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - if(mx!=mxq || my!=myq || sdl_wheel || b) - mmt = 0; - else if(mmt 9) { - drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); - drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); - } - - ui_edit_draw(vid_buf, &ed); - - if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) { - if(search_page) { - search_page --; - lasttime = TIMEOUT; - } - sdl_wheel = 0; - uih = 1; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) { - lasttime = TIMEOUT; - search_page ++; - page_count = exp_res; - } - sdl_wheel = 0; - uih = 1; - } - - tp = -1; - if(is_p1) { - drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); - for(gj=0;gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14);gj++) - for(gi=0;giTAG_MAX || !tag_names[pos]) - break; - if(tag_votes[0]) - i = 127+(128*tag_votes[pos])/tag_votes[0]; - else - i = 192; - w = textwidth(tag_names[pos]); - if(w>XRES/GRID_X-5) - w = XRES/GRID_X-5; - gx = (XRES/GRID_X)*gi; - gy = gj*14 + 46; - if(mx>=gx && mx=gy && my XRES/GRID_X-10) { - tmp = malloc(strlen(search_names[pos])+4); - strcpy(tmp, search_names[pos]); - j = textwidthx(tmp, XRES/GRID_X-15); - strcpy(tmp+j, "..."); - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); - free(tmp); - } else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); - j = textwidth(search_owners[pos]); - if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && - my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) { - st = 1; - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); - } else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); - if(search_thumbs[pos]) - render_thumb(search_thumbs[pos], search_thsizes[pos], 1, vid_buf, gx, gy, GRID_S); - own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); - if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) - mp = pos; - if(own) { - if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) { - mp = -1; - dp = pos; - } - } - if(mp==pos && !st) - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); - else - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); - if(own) { - if(dp == pos) - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); - else - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); - } - if(!search_publish[pos]){ - drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); - drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(view_own || svf_admin || svf_mod) { - sprintf(ts+1, "%d", search_votes[pos]); - ts[0] = 0xBB; - for(j=1; ts[j]; j++) - ts[j] = 0xBC; - ts[j-1] = 0xB9; - ts[j] = 0xBA; - ts[j+1] = 0; - w = gx+XRES/GRID_S-2-textwidth(ts); - h = gy+YRES/GRID_S-11; - drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); - for(j=0; ts[j]; j++) - ts[j] -= 14; - drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); - sprintf(ts, "%d", search_votes[pos]); - for(j=0; ts[j]; j++) - ts[j] += 127; - drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); - } - if(search_scoreup[pos]>0||search_scoredown[pos]>0){ - lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); - - if(((YRES/GRID_S+3)/2)>lv){ - ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); - if(lv<8){ - ry = ry/(8-lv); - } - nyu = search_scoreup[pos]*ry; - nyd = search_scoredown[pos]*ry; - } else { - ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); - nyu = search_scoreup[pos]/ry; - nyd = search_scoredown[pos]/ry; - } - - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); - - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); - } - } - - if(mp!=-1 && mmt>=TIMEOUT/5 && !st) { - gi = mp % GRID_X; - gj = mp / GRID_X; - if(is_p1) - gj += GRID_Y-GRID_P; - gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; - gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; - i = w = textwidth(search_names[mp]); - h = YRES/GRID_Z+30; - if(w=XRES-2) gx=XRES-3-w; - if(gy<32) gy=32; - if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; - clearrect(vid_buf, gx-2, gy-3, w+4, h); - drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); - if(search_thumbs[mp]) - render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); - drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); - drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(sdl_key==SDLK_RETURN) { - if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) - lasttime = TIMEOUT; - else if(search_ids[0] && !search_ids[1]) { - bq = 0; - b = 1; - mp = 0; - } - } - if(sdl_key==SDLK_ESCAPE) - goto finish; - - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) { - search_own = !search_own; - lasttime = TIMEOUT; - } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) { - search_date = !search_date; - lasttime = TIMEOUT; - } - - if(b && !bq && dp!=-1) - if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) { - execute_delete(vid_buf, search_ids[dp]); - lasttime = TIMEOUT; - if(last) { - free(last); - last = NULL; - } - } - - if(b && !bq && tp!=-1) { - strncpy(ed.str, tag_names[tp], 255); - lasttime = TIMEOUT; - } - - if(b && !bq && mp!=-1 && st) { - sprintf(ed.str, "user:%s", search_owners[mp]); - lasttime = TIMEOUT; - } - - if(do_open==1){ - mp = 0; - } - - if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); - - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - data = http_simple_get(uri, &status, &dlen); - free(uri); - - if(status == 200) { - status = parse_save(data, dlen, 1, 0, 0); - switch(status) { - case 1: - error_ui(vid_buf, 0, "Simulation corrupted"); - break; - case 2: - error_ui(vid_buf, 0, "Simulation from a newer version"); - break; - case 3: - error_ui(vid_buf, 0, "Simulation on a too large grid"); - break; - } - if(!status) { - char *tnames[] = {"ID", NULL}; - char *tparts[1]; - int tplens[1]; - if(svf_last) - free(svf_last); - svf_last = data; - svf_lsize = dlen; - - tparts[0] = search_ids[mp]; - tplens[0] = strlen(search_ids[mp]); - data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); - - svf_open = 1; - svf_own = svf_login && !strcmp(search_owners[mp], svf_user); - svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); - - strcpy(svf_id, search_ids[mp]); - strcpy(svf_name, search_names[mp]); - if(status == 200) { - if(data) { - strncpy(svf_tags, data, 255); - svf_tags[255] = 0; - } else - svf_tags[0] = 0; - } else { - svf_tags[0] = 0; - } - - if(svf_login){ - char *names[] = {"ID", NULL}; - char *parts[1]; - parts[0] = search_ids[mp]; - data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); - if(status == 200){ - if(data){ - if(!strcmp(data, "Up")){ - svf_myvote = 1; - } else if(!strcmp(data, "Down")){ - svf_myvote = -1; - } else { - svf_myvote = 0; - } - } else { - svf_myvote = 0; - } - } else { - svf_myvote = 0; - } - } - } else { - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - } - } else - error_ui(vid_buf, status, http_ret_text(status)); - - if(data) - free(data); - goto finish; - } - - if(!last) - search = 1; - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) { - search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) { - search_page = 0; - page_count = 0; - } - free(last); - last = NULL; - } else - search = 0; - - if(search && lasttime>=TIMEOUT) { - lasttime = 0; - last = mystrdup(ed.str); - last_own = search_own; - last_date = search_date; - last_page = search_page; - active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); - if(search_own || svf_admin || svf_mod) - tmp = "&ShowVotes=true"; - else - tmp = ""; - if(!search_own && !search_date && !*last) { - if(search_page) { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); - } else { - exp_res = GRID_X*GRID_P; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); - } - } else { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); - } - strcaturl(uri, last); - if(search_own) { - strcaturl(uri, " user:"); - strcaturl(uri, svf_user); - } - if(search_date) - strcaturl(uri, " sort:date"); - http = http_async_req_start(http, uri, NULL, 0, 1); - if(svf_login){ - http_auth_headers(http, svf_user, svf_pass); - } - http_last_use = time(NULL); - free(uri); - } - - if(active && http_async_req_status(http)) { - http_last_use = time(NULL); - results = http_async_req_stop(http, &status, NULL); - view_own = last_own; - if(status == 200) - page_count = search_results(results, last_own||svf_admin||svf_mod); - is_p1 = (exp_res < GRID_X*GRID_Y); - free(results); - active = 0; - } - - if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) { - http_async_req_close(http); - http = NULL; - } - - for(i=0;i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) { - if(stamp_page) { - stamp_page --; - } - sdl_wheel = 0; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; -} - -void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) -{ - char t[2]; - t[0] = ch; - t[1] = 0; - if(flag) { - fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); - } else { - drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); - } -} - -void render_signs(pixel *vid_buf) -{ - int i, j, x, y, w, h, dx, dy; - for(i=0; i 18) ? -1 : 1; - for(j=0; j<4; j++) { - drawpixel(vid_buf, x, y, 192, 192, 192, 255); - x+=dx; - y+=dy; - } - } -} - -void add_sign_ui(pixel *vid_buf, int mx, int my) -{ - int i, w, h, x, y, nm=0, ju; - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; - ui_edit ed; - - // check if it is an existing sign - for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) - break; - } - // else look for empty spot - if(i >= MAXSIGNS) { - nm = 1; - for(i=0; i= MAXSIGNS) - return; - - if(nm) { - signs[i].x = mx; - signs[i].y = my; - signs[i].ju = 1; - } - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = x0+25; - ed.y = y0+25; - ed.w = 158; - ed.nx = 1; - ed.def = "[message]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(signs[i].text); - strcpy(ed.str, signs[i].text); - ju = signs[i].ju; - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed); - drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); - draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); - draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); - draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); - - if(!nm) { - drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); - drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); - drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); - } - - drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) - ju = 0; - if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) - ju = 1; - if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) - ju = 2; - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) { - signs[i].text[0] = 0; - return; - } - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) { - if(!ed.focus) - return; - ed.focus = 0; - } - } - - strcpy(signs[i].text, ed.str); - signs[i].ju = ju; -} - -/*********************************************************** - * CONFIG FILE * - ***********************************************************/ - -char http_proxy[256] = ""; - -void save_string(FILE *f, char *str) -{ - int li = strlen(str); - unsigned char lb[2]; - lb[0] = li; - lb[1] = li >> 8; - fwrite(lb, 2, 1, f); - fwrite(str, li, 1, f); -} - -int load_string(FILE *f, char *str, int max) -{ - int li; - unsigned char lb[2]; - fread(lb, 2, 1, f); - li = lb[0] | (lb[1] << 8); - if(li > max) { - str[0] = 0; - return 1; - } - fread(str, li, 1, f); - str[li] = 0; - return 0; -} - -unsigned char last_major=0, last_minor=0, update_flag=0; - -void save_presets(int do_update) -{ - FILE *f=fopen("powder.def", "wb"); - unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; - unsigned char tmp = sdl_scale; - if(!f) - return; - fwrite(sig, 1, 4, f); - save_string(f, svf_user); - save_string(f, svf_pass); - fwrite(&tmp, 1, 1, f); - tmp = cmode; - fwrite(&tmp, 1, 1, f); - tmp = svf_admin; - fwrite(&tmp, 1, 1, f); - tmp = svf_mod; - fwrite(&tmp, 1, 1, f); - save_string(f, http_proxy); - tmp = SAVE_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = MINOR_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = do_update; - fwrite(&tmp, 1, 1, f); - fclose(f); -} - -void load_presets(void) -{ - FILE *f=fopen("powder.def", "rb"); - unsigned char sig[4], tmp; - if(!f) - return; - fread(sig, 1, 4, f); - if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66){ - if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F){ - if(fseek(f, -3, SEEK_END)){ - remove("powder.def"); - return; - } - if(fread(sig, 1, 3, f) != 3){ - remove("powder.def"); - goto fail; - } - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; - } - fclose(f); - remove("powder.def"); - return; - } - if(load_string(f, svf_user, 63)) - goto fail; - if(load_string(f, svf_pass, 63)) - goto fail; - svf_login = !!svf_user[0]; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - sdl_scale = (tmp == 2) ? 2 : 1; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; -#ifdef HEAT_ENABLE - cmode = tmp%6; -#else - cmode = tmp%5; -#endif - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_admin = tmp; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_mod = tmp; - if(load_string(f, http_proxy, 255)) - goto fail; - if(fread(sig, 1, 3, f) != 3) - goto fail; - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; -fail: - fclose(f); -} - -void dim_copy(pixel *dst, pixel *src) -{ - int i,r,g,b; - for(i=0;i0) - r--; - if(g>0) - g--; - if(b>0) - b--; - dst[i] = PIXRGB(r,g,b); - } -} - -unsigned int fire_alpha[CELL*3][CELL*3]; -void prepare_alpha(void) -{ - int x,y,i,j; - float temp[CELL*3][CELL*3]; - memset(temp, 0, sizeof(temp)); - for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; - fire_g[j][i] = g>4 ? g-4 : 0; - fire_b[j][i] = b>4 ? b-4 : 0; - } -} - -int zoom_en = 0; -int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; -int zoom_wx=0, zoom_wy=0; -void render_zoom(pixel *img) -{ - int x, y, i, j; - pixel pix; - drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); - drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); - clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); - for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) { - xor_pixel(x+i, y+j, vid); - if(j) xor_pixel(x+i, y-j, vid); - if(i) xor_pixel(x-i, y+j, vid); - if(i&&j) xor_pixel(x-i, y-j, vid); - } - } else { - int tc; - c = (r/CELL) * CELL; - x = (x/CELL) * CELL; - y = (y/CELL) * CELL; - - tc = !((c%(CELL*2))==0); - - x -= c/2; - y -= c/2; - - x += tc*(CELL/2); - y += tc*(CELL/2); - - for(i=0; i2){ - pthread_t pth; - pthread_create(&pth,NULL,update_air_th,""); - } else { - update_air(); - } -#else - update_air(); -#endif - } - if(cmode==0 || cmode==1) { - draw_air(vid_buf); - } else if(cmode==2) { - memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); - memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); - } else { - memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); - } - update_particles(vid_buf); - - if(cmode==2) { - if(!fire_fc) { - dim_copy(fire_bg, vid_buf); - } else { - memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); - } - fire_fc = (fire_fc+1) % 3; - } - if(cmode==3||cmode==4) - render_fire(vid_buf); - - render_signs(vid_buf); - - //clearrect(vid_buf, 0, YRES, XRES, MENUSIZE); - memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); - //memset(vid_buf+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1)); - clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); - - // Old Menu, you will be missed; but not forgotten :( - /* for(i=0; iSAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) - old_version = 1; -#else - if(sscanf(ver_data, "%d.%d", &major, &minor)==2) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) - old_version = 1; -#endif - free(ver_data); - } - http_ver_check = NULL; - } - do_check = (do_check+1) & 15; - } - - if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) - if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")){ - break; - } - //break; - if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) { - if(load_mode) { - free(load_img); - free(load_data); - load_mode = 0; - load_data = NULL; - load_img = NULL; - } - if(it > 50) - it = 50; - if(sdl_key=='k' && stamps[1].name[0]) { - j = stamp_ui(vid_buf); - if(j>=0) - load_data = stamp_load(j, &load_size); - else - load_data = NULL; - } else - load_data = stamp_load(0, &load_size); - if(load_data) { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - if(sdl_key=='s') { - if(it > 50) - it = 50; - save_mode = 1; - } - if(sdl_key=='1'){ - set_cmode(0); - } - if(sdl_key=='2'){ - set_cmode(1); - } - if(sdl_key=='3'){ - set_cmode(2); - } - if(sdl_key=='4'){ - set_cmode(3); - } - if(sdl_key=='5'){ - set_cmode(4); - } - if(sdl_key=='6'){ - set_cmode(5); - } - if(sdl_key==SDLK_SPACE) - sys_pause = !sys_pause; - if(sdl_key=='p') - dump_frame(vid_buf, XRES, YRES, XRES); - if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ - if(clipboard_ready==1){ - load_data = malloc(clipboard_length); - memcpy(load_data, clipboard_data, clipboard_length); - load_size = clipboard_length; - if(load_data) { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - } - if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ - save_mode = 1; - copy_mode = 2; - } - if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ - save_mode = 1; - copy_mode = 1; - } else if(sdl_key=='c') { -#ifdef HEAT_ENABLE - set_cmode((cmode+1) % 6); -#else - set_cmode((cmode+1) % 5); -#endif - if(it > 50) - it = 50; - } -#ifdef INTERNAL - if(sdl_key=='v') - vs = !vs; - if(vs) - dump_frame(vid_buf, XRES, YRES, XRES); -#endif - - if(sdl_wheel) { - if(sdl_zoom_trig==1){ - ZSIZE += sdl_wheel; - if(ZSIZE>32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - sdl_wheel = 0; - } else { - bs += sdl_wheel; - if(bs>16) - bs = 16; - if(bs<0) - bs = 0; - sdl_wheel = 0; - /*if(su >= PT_NUM) { - if(sl < PT_NUM) - su = sl; - if(sr < PT_NUM) - su = sr; - }*/ - } - } - - bq = b; - b = SDL_GetMouseState(&x, &y); - - for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy - && x0 && y0 && x>8)>=NPART || !cr)){ -#ifdef BETA - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); -#else - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); -#endif - } else { - sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); - } - } -#endif - mx = x; - my = y; - if(update_flag) { - info_box(vid_buf, "Finalizing update..."); - if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) { - update_cleanup(); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } else { - if(update_finish()) - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - else - info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); - } - update_flag = 0; - } - - if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && - x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) { - tmp = malloc(64); -#ifdef BETA - if(is_beta){ - sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); - } else { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); - } -#else - sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); -#endif - if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) { - free(tmp); - tmp = download_ui(vid_buf, my_uri, &i); - if(tmp) { - save_presets(1); - if(update_start(tmp, i)) { - update_cleanup(); - save_presets(0); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } else - return 0; - } - } else - free(tmp); - } - if(y>=sdl_scale*(YRES+(MENUSIZE-20))) { - if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0){ - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0){ - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0){ - db = (svf_myvote==1) ? 273 : 274; - if(da < 51) - da ++; - } -#ifdef HEAT_ENABLE - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) { -#else - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-365))*sdl_scale) && svf_login && svf_open) { -#endif - db = svf_own ? 257 : 256; - if(da < 51) - da ++; -#ifdef HEAT_ENABLE - } else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) { - db = 270; - if(da < 51) - da ++; -#endif - } else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) { - db = 266; - if(da < 51) - da ++; - } else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) { - db = 259; - if(svf_open && svf_own && x<=55*sdl_scale) - db = 258; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) { - db = svf_login ? 261 : 260; - if(svf_admin) { - db = 268; - } else if(svf_mod) { - db = 271; - } - if(da < 51) - da ++; - } else if(x>=sdl_scale && x<=17*sdl_scale) { - db = 262; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) { - db = sys_pause ? 264 : 263; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) { - db = 267; - if(da < 51) - da ++; - } else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) { - db = 265; - if(da < 51) - da ++; - } else if(da > 0) - da --; - } else - if(da > 0) - da --; - - if(!sdl_zoom_trig && zoom_en==1) - zoom_en = 0; - - if(sdl_key==Z_keysym && zoom_en==2) - zoom_en = 1; - - if(load_mode) { - load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); - load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); - if(load_x+load_w>XRES) load_x=XRES-load_w; - if(load_y+load_h>YRES) load_y=YRES-load_h; - if(load_x<0) load_x=0; - if(load_y<0) load_y=0; - if(bq==1 && !b) { - parse_save(load_data, load_size, 0, load_x, load_y); - free(load_data); - free(load_img); - load_mode = 0; - } else if(bq==4 && !b) { - free(load_data); - free(load_img); - load_mode = 0; - } - } else if(save_mode==1) { - save_x = (mx/sdl_scale)/CELL; - save_y = (my/sdl_scale)/CELL; - if(save_x >= XRES/CELL) save_x = XRES/CELL-1; - if(save_y >= YRES/CELL) save_y = YRES/CELL-1; - save_w = 1; - save_h = 1; - if(b==1){ - save_mode = 2; - } else if(b==4){ - save_mode = 0; - copy_mode = 0; - } - } else if(save_mode==2) { - save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; - save_h = (my/sdl_scale+CELL/2)/CELL - save_y; - if(save_w>XRES/CELL) save_w = XRES/CELL; - if(save_h>YRES/CELL) save_h = YRES/CELL; - if(save_w<1) save_w = 1; - if(save_h<1) save_h = 1; - if(!b) { - if(copy_mode==1){ - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - } else if(copy_mode==2){ - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - } else { - stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - save_mode = 0; - } - } - } else if(sdl_zoom_trig && zoom_en<2) { - x /= sdl_scale; - y /= sdl_scale; - x -= ZSIZE/2; - y -= ZSIZE/2; - if(x<0) x=0; - if(y<0) y=0; - if(x>XRES-ZSIZE) x=XRES-ZSIZE; - if(y>YRES-ZSIZE) y=YRES-ZSIZE; - zoom_x = x; - zoom_y = y; - zoom_wx = (x 50) - it = 50; - x /= sdl_scale; - y /= sdl_scale; - if(y>=YRES+(MENUSIZE-20)) { - if(!lb) { - if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ - if(execute_vote(vid_buf, svf_id, "Up")){ - svf_myvote = 1; - } - } - if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ - if(execute_vote(vid_buf, svf_id, "Down")){ - svf_myvote = -1; - } - } -#ifdef HEAT_ENABLE - if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) -#else - if(x>=219 && x<=(XRES+BARSIZE-(510-365)) && svf_login && svf_open) -#endif - tag_list_ui(vid_buf); -#ifdef HEAT_ENABLE - if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) { - legacy_enable = !legacy_enable; - } -#endif - if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) { - memset(signs, 0, sizeof(signs)); - memset(pv, 0, sizeof(pv)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(fvx, 0, sizeof(fvx)); - memset(fvy, 0, sizeof(fvy)); - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(parts, 0, sizeof(particle)*NPART); - for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) { - login_ui(vid_buf); - if(svf_login) - save_presets(0); - } - if(x>=37 && x<=187 && svf_login) { - if(!svf_open || !svf_own || x>51) { - if(save_name_ui(vid_buf)) - execute_save(vid_buf); - } else - execute_save(vid_buf); - while(!sdl_poll()) - if(!SDL_GetMouseState(&x, &y)) - break; - b = bq = 0; - } - if(x>=1 && x<=17) { - search_ui(vid_buf); - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - } - if(x>=19 && x<=35 && svf_last && svf_open) - parse_save(svf_last, svf_lsize, 1, 0, 0); - if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { -#ifdef HEAT_ENABLE - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 6); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+5) % 6); -#else - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 5); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+4) % 5); -#endif - save_presets(0); - } - if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) - sys_pause = !sys_pause; - lb = 0; - } - } else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)){ - c = sl = cr&0xFF; - } else { - //Something - } - } - //create_parts(x, y, bs, SPC_AIR); - lx = x; - ly = y; - lb = 0; - lm = 0; - } else { - create_parts(x, y, bs, c); - lx = x; - ly = y; - lb = b; - lm = 0; - } - } - } - } else { - if(lb && lm) { - x /= sdl_scale; - y /= sdl_scale; - c = (lb&1) ? sl : sr; - su = c; - if(lm == 1) { - if(c!=127 || lx<0 || ly<0 || lx>=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) - create_line(lx, ly, x, y, bs, c); - } else - create_box(lx, ly, x, y, c); - lm = 0; - } - lb = 0; - } - - if(load_mode) { - draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); - xor_rect(vid_buf, load_x, load_y, load_w, load_h); - } - - if(save_mode) { - xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - da = 51; - db = 269; - } - - if(zoom_en!=1 && !load_mode && !save_mode) - render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); - - if(zoom_en) - render_zoom(vid_buf); - - if(da) - switch(db) { - case 256: - drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); - break; - case 257: - drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); - break; - case 258: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); - break; - case 259: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); - break; - case 260: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); - break; - case 261: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); - break; - case 262: - drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); - break; - case 263: - drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); - break; - case 264: - drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); - break; - case 265: - drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); - break; - case 266: - drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); - break; - case 267: - drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); - break; - case 268: - drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); - break; - case 269: - drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); - break; - case 270: - drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); - break; - case 271: - drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); - break; - case 272: - drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); - break; - case 273: - drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); - break; - case 274: - drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); - break; - case 275: - drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); - break; - default: - drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); - } - if(itc) { - itc--; - drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); - } - if(it) { - it--; - //if(fbi_img) - //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); - drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); - } - - if(old_version) { - clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); -#ifdef BETA - if(is_beta){ - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); - } else { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); - } -#else - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); -#endif - drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); - } - /*#ifdef MT - pthread_join(pth2,NULL); - #endif*/ - - if(hud_enable){ - currentTime = SDL_GetTicks(); - if(currentTime-past>=16) { - past = SDL_GetTicks(); - FPS++; - } - if(currentTime-pastFPS>=1000) { -#ifdef BETA - sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#else - sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#endif - FPSB = FPS; - FPS = 0; - pastFPS = currentTime; - } -#ifdef HEAT_ENABLE - if(sdl_zoom_trig){ - if(x +#include +#include +#include +#include +#include +#include +//#include +#ifdef MT +#include +#include +#endif + +#ifdef WIN32 +#include +#else +#include +#include +#endif + + +#include "version.h" +#include "http.h" +#include "md5.h" +#include "update.h" + +#define SERVER "powder.hardwired.org.uk" + +#undef PLOSS + +#ifdef MENUV3 +#define MENUSIZE 40 +#else +#define MENUSIZE 20 +#endif +#define BARSIZE 14 +#define XRES 612 +#define YRES 384 +#define NPART XRES*YRES + +#define ZSIZE_D 16 +#define ZFACTOR_D 8 +unsigned char ZFACTOR = 256/ZSIZE_D; +unsigned char ZSIZE = ZSIZE_D; + +#define CELL 4 +#define ISTP (CELL/2) +#define CFDS (4.0f/CELL) + +typedef unsigned char uint8; + +#ifdef HEAT_ENABLE +#include "hmap.h" +#endif + +#ifdef PIX16 +#define PIXELSIZE 2 +typedef unsigned short pixel; +#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) +#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) +#define PIXR(x) (((x)>>8)&0xF8) +#define PIXG(x) (((x)>>3)&0xFC) +#define PIXB(x) (((x)<<3)&0xF8) +#else +#define PIXELSIZE 4 +typedef unsigned int pixel; +#ifdef PIX32BGR +#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) +#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) +#define PIXR(x) ((x)&0xFF) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)>>16) +#else +#ifdef PIX32BGRA +#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) +#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) +#define PIXR(x) (((x)>>8)&0xFF) +#define PIXG(x) (((x)>>16)&0xFF) +#define PIXB(x) (((x)>>24)) +#else +#define PIXPACK(x) (x) +#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) +#define PIXR(x) ((x)>>16) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)&0xFF) +#endif +#endif +#endif + +char *it_msg = +"\brThe Powder Toy\n" +"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" +"\n" +"\bgControl+C/V/X are Copy, Paste and cut respectively.\n" +"\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" +"\bgPick your material from the menu using mouse left/right buttons.\n" +"Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" +"Shift+drag will create straight lines of particles.\n" +"Ctrl+drag will result in filled rectangles.\n" +"Ctrl+Shift+click will flood-fill a closed area.\n" +"Middle click or Alt+Click to \"sample\" the particles.\n" +"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" +"Use 'S' to save parts of the window as 'stamps'.\n" +"'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" +"'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" +"Use the mouse scroll wheel to change the tool size for particles.\n" +"'Q' will quit the application.\n" +"The spacebar can be used to pause physics.\n" +"'P' will take a screenshot and save it into the current directory.\n" +"\n" +"\brhttp://powder.hardwired.org.uk/\n" +"\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" +"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powder.hardwired.org.uk\bg)\n" +"\n" +"\bgSpecial thanks to Brian Ledbetter for maintaining ports & server development in the past." +"\nand CW for hosting the original server.\n" +"\bgTo use online features such as saving, you need to register at: \brhttp://powder.hardwired.org.uk/Register.html" +; + +typedef struct { + int start, inc; + pixel *vid; +} upstruc; + +#ifdef BETA +char *old_ver_msg_beta = "A new beta is available - click here!"; +#endif +char *old_ver_msg = "A new version is available - click here!"; +#ifdef HEAT_ENABLE +float mheat = 0.0f; +#endif + +int do_open = 0; +int sys_pause = 0; +int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. + +int amd = 0; + +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + +#define MAXSIGNS 16 + +struct sign { + int x,y,ju; + char text[256]; +} signs[MAXSIGNS]; + +/*********************************************************** + * AIR FLOW SIMULATOR * + ***********************************************************/ + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; +unsigned cmode = 3; + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; +#define TSTEPP 0.3f +#define TSTEPV 0.4f +#define VADV 0.3f +#define VLOSS 0.999f +#define PLOSS 0.9999f +int numCores = 1; +float kernel[9]; +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} + +int core_count(){ + int numCPU = 1; +#ifdef MT +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; +#else +#ifdef MACOSX + numCPU = 4; +#else + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); +#endif +#endif + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); +#endif + return numCPU; +} + +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} + +void *update_air_th(void *arg) +{ + update_air(); + return NULL; +} + +unsigned clamp_flt(float f, float min, float max) +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +float restrict_flt(float f, float min, float max){ + if(fmax) + return max; + return f; +} + +void draw_air(pixel *vid) +{ + int x, y, i, j; + pixel c; + + if(cmode == 2) + return; + + for(y=0; y 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; j=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE)){ + return 1; + } + + if((r&0xFF)==PT_VOID){ + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL){ + parts[i].type=PT_NONE; +#ifdef HEAT_ENABLE + if(!legacy_enable){ + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } +#endif + return 0; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]){ + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE){ + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])){ + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + +#ifdef HEAT_ENABLE + if(t==SPC_HEAT||t==SPC_COOL){ + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP){ + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } else { + return -1; + } + } +#endif + if(t==SPC_AIR){ + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } else + i = p; + + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[t].heat; +#endif + if(t==PT_ACID){ + parts[i].life = 75; + } + //Testing + /*if(t==PT_WOOD){ + parts[i].life = 150; + }*/ + //End Testing + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NBLE) + parts[i].life = 0; + if(t==PT_NEUT) { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f){ + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } else { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //} + } + + pmap[y][x] = t|(i<<8); + + return i; +} + +void delete_part(int x, int y) +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + 255*PIXR(t)) >> 8; + g = (a*g + 255*PIXG(t)) >> 8; + b = (a*b + 255*PIXB(t)) >> 8; + if(r>255) + r = 255; + if(g>255) + g = 255; + if(b>255) + b = 255; + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); + +int is_wire(int x, int y) +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} +int is_wire_off(int x, int y) +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y=XRES || y>=YRES || + bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS||t==PT_NBLE) { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); +#endif + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) { + if(pv[y/CELL][x/CELL]>1.0f) { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } else { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + + if(ptypes[t].diffusion) { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } else { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) { + mv -= ISTP; + if(mv <= 0.0f) { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_OILL; + if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) + t = parts[i].type = PT_GASS; +#ifdef HEAT_ENABLE + } +#endif + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_BGLA; + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1){ + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1){ + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + +#ifdef HEAT_ENABLE + if(!legacy_enable){ + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)){ + for(nx=-1; nx<2; nx++) { + for(ny=-1; ny<2; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) { + for(ny=-1; ny<2; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid){ + if(t==PT_LAVA&&parts[i].ctype){ + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp){ + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } else { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)){ + if(pstates[t].liquid==PT_LAVA){ + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } else if(t==PT_ICEI&&parts[i].ctype){ + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } else { + t = parts[i].type = pstates[t].liquid; + } + }else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS){ + t = parts[i].type = pstates[t].liquid; + }else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)){ + if(t==PT_SLTW&&1>rand()%6){ + t = parts[i].type = PT_SALT; + } else { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f){ + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA){ + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_CSCN&&parts[i].temp>24.0f){ + pt = parts[i].temp -= 2.5f; + } + if(t==PT_HSCN&&parts[i].temp>24.0f){ + pt = parts[i].temp -= 2.5f; + } + #endif + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx0){ + int ttx = (rand()%3)-1; + r = pmap[y-1][x+ttx]; + if(parts[i].life>50){ + if((pmap[y-1][x+ttx]&0xFF)==PT_NONE){ + create_part(-1, x+ttx, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx]>>8].life = parts[i].life-1; + parts[pmap[y-1][x+ttx]>>8].vx = ttx; + } + if((pmap[y-1][x+ttx-1]&0xFF)==PT_NONE){ + create_part(-1, x+ttx-1, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx-1]>>8].life = 0; + } + if((pmap[y-1][x+ttx+1]&0xFF)==PT_NONE){ + create_part(-1, x+ttx+1, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx+1]>>8].life = 0; + } + parts[i].life = 0; + } else if(parts[i].life>10) { + //int ttx = (rand()%3)-parts[i].vx; + //create_part(-1, x+ttx, y-1, PT_WOOD); + //r = pmap[y-1][x+ttx]; + //parts[r>>8].life = parts[i].life-1; + //parts[i].life = 0; + } + } else*/ + if(t==PT_THDR){ + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ){ + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)){ + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } else { + t = parts[i].type = PT_NONE; + } + } + } + } else if(t==PT_ICEI || t==PT_SNOW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } +#ifndef HEAT_ENABLE + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; +#else + if(legacy_enable){ + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } +#endif + } + } + else if(t==PT_HSCN||t==PT_CSCN) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } else if((r&0xFF)==PT_LAVA && 1>(rand()%250)){ + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_WTRV; + //parts[r>>8].type = PT_WTRV; +#else + if(legacy_enable){ + t = parts[i].type = PT_WTRV; + } +#endif + } else if((r&0xFF)==PT_SALT && 1>(rand()%250)) { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)){ + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)){ + t = parts[i].type = PT_SLTW; + } +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_SLTW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; +#else + if(legacy_enable){ + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } +#endif + } else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) { + //t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WTRV) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; +#ifdef HEAT_ENABLE + if(legacy_enable){ +#endif + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } +#ifdef HEAT_ENABLE + } +#endif + +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; +#else + if(legacy_enable){ + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } +#endif + } + } + } + // END PLANT + // ACID + else if(t==PT_ACID) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID){ + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD){ + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } else if (parts[i].life==50){ + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + //END ACID :D + else if(t==PT_NEUT) { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) { + if(33>rand()%100) { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } else { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT){ + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + // } else if(((r&0xFF)!=PT_PHOT&&(r&0xFF)!=PT_NONE&&(r&0xFF)!=PT_CLNE)) { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + // }// else if((r&0xFF)!=PT_PLEX){ + // parts[i].life = 4; + // parts[i].type = PT_FIRE + //} + } + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { + parts[r>>8].type = PT_FIRE; +#ifdef HEAT_ENABLE + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); +#endif + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; //LOL + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; +#ifndef HEAT_ENABLE + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && (t!=PT_FIRE || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) { + if(t!=PT_LAVA || parts[i].life>0) { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } else { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { + kill_part(r>>8); + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + //t = parts[i].type = PT_METL; + goto killed; + } + } +#else + if(legacy_enable){ + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) { + if(t!=PT_LAVA || parts[i].life>0) { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } else { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { + kill_part(r>>8); + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + //t = parts[i].type = PT_METL; + goto killed; + } + } + } +#endif + //Bitches now know about my semi-conductor :( + if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; +#ifdef HEAT_ENABLE + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; +#endif + } + } + if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5){ + if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN){ + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE) + { + parts[i].temp = 3500; + } + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { + parts[i].life = rand()%150+50; + parts[i].type = PT_PLSM; + parts[i].ctype = PT_NBLE; + parts[i].temp = 3500; + pv[y/CELL][x/CELL] += 1; + } +} + killed: + if(parts[i].type == PT_NONE) + continue; + } + + if(t==PT_CLNE) { + if(!parts[i].ctype) { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx=XRES-CELL || + ny=YRES-CELL) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) { + if(nx!=x && try_move(i, x, y, nx, y)) { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ny!=y && try_move(i, x, y, x, ny)) { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ny!=y && try_move(i, x, y, x-r, ny)) { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(nx!=x && try_move(i, x, y, nx, y+r)) { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(nx!=x && try_move(i, x, y, nx, y-r)) { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) { + kill_part(i); + continue; + } else if(try_move(i, x, y, 2*x-nx, ny)) { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } else if(try_move(i, x, y, nx, 2*y-ny)) { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } else { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + + justdraw: + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) { + kill_part(i); + continue; + } +#ifdef HEAT_ENABLE + if(cmode!=CM_HEAT){ + +#endif + if(t==PT_ACID) { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28));//if(parts[i].life<=49) parts[i].life = 50; + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + //vid[ny*(XRES+BARSIZE)+nx] = //(cr<<16)+(cb<<18)+cg;//ptypes[t].pcolors/-(parts[i].life-255); + blendpixel(vid, nx, ny, cr, cg, cb, 255);//(parts[i].life-46)*28 + if(cmode==4){ + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + }else if(t==PT_NEUT) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } else { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + }else if(t==PT_PHOT) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_THDR) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLSM) { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4) { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_FIRE && parts[i].life) { + if(cmode == 3||cmode==4) { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } else { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_LAVA && parts[i].life) { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4) { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } else if(t==PT_LAVA || t==PT_SPRK) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4) { + if(t == PT_LAVA) { + cr = 3; + cg = i%2; + cb = 0; + } else { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; +#ifdef HEAT_ENABLE + } else { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } +#endif + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID){ + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + + } + +} + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb){ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +} + +void update_particles_i_th(void *arg){ + upstruc *newup = (upstruc*)arg; + update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); + return; +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) { + if(emap[y][x]) { + cr = cg = cb = 128; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) { + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } else { + for(y=0; y>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) { + if(emap[y][x]) { + cr = cg = cb = 128; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) { + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9){ + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + +#ifdef MT + if(numCores > 1) { + InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); + for(pc = 0; pc=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} + +void update_particles_th(void *arg) +{ + update_particles((pixel*)arg); + return; +} + +/*********************************************************** + * SDL OUTPUT * + ***********************************************************/ + +int sdl_scale = 1; +SDL_Surface *sdl_scrn; +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +#include "icon.h" +void sdl_seticon(void) +{ +#ifdef WIN32 + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else +#ifdef MACOSX + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#endif +#endif +} + +void sdl_open(void) +{ + if(SDL_Init(SDL_INIT_VIDEO)<0) { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); +#ifdef PIX16 + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); +#else + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); +#endif + if(!sdl_scrn) { + fprintf(stderr, "Creating window: %s\n", SDL_GetError()); + exit(1); + } + SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); + sdl_seticon(); + SDL_EnableUNICODE(1); + //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +} + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0;jpitch/PIXELSIZE; + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + int i,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0;jpitch/PIXELSIZE; + } + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) +{ + if(sdl_scale == 2) + sdl_blit_2(x, y, w, h, src, pitch); + else + sdl_blit_1(x, y, w, h, src, pitch); +} + +int frame_idx=0; +void dump_frame(pixel *src, int w, int h, int pitch) +{ + char frame_name[32]; + int j,i; + unsigned char c[3]; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"wb"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0;j=0 && x=0 && yPT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } else + d = c; + + if(size < XRES*YRES) { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0;y+scl<=YRES;y+=scl) { + sx = 0; + for(x=0;x+scl<=XRES;x+=scl) { + a = 0; + r = g = b = 0; + for(j=0;j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +static char *mystrdup(char *s) +{ + char *x; + if(s) { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +void *build_save(int *size, int x0, int y0, int w, int h) +{ +#ifdef HEAT_ENABLE + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; +#else + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*6+MAXSIGNS*262), *c; +#endif + int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); + int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + // save the required air state + for(y=by0; y255) i=255; + d[p++] = i; + } + for(y=by0; y255) i=255; + d[p++] = i; + } + + // save the particle map + for(i=0; i=x0 && x=y0 && y255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } + } + for(j=0; j255) tttemp=255; + d[p++] = tttemp; + } + } +#endif + for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + + i = (p*101+99)/100 + 612; + c = malloc(i); + c[0] = 0x66; + c[1] = 0x75; + c[2] = 0x43; + c[3] = legacy_enable; + c[4] = SAVE_VERSION; + c[5] = CELL; + c[6] = bw; + c[7] = bh; + c[8] = p; + c[9] = p >> 8; + c[10] = p >> 16; + c[11] = p >> 24; + + i -= 12; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) { + free(d); + free(c); + return NULL; + } + free(d); + + *size = i+12; + return c; +} + +int parse_save(void *save, int size, int replace, int x0, int y0) +{ + unsigned char *d,*c=save; + int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; + int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; + int fp[NPART], nf=0; + + if(size<16) + return 1; + if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) + return 1; + if(c[4]>SAVE_VERSION) + return 2; + ver = c[4]; + +#ifdef HEAT_ENABLE + if(ver<34){ + legacy_enable = 1; + } else { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } +#endif + + bw = c[6]; + bh = c[7]; + if(bx0+bw > XRES/CELL) + bx0 = XRES/CELL - bw; + if(by0+bh > YRES/CELL) + by0 = YRES/CELL - bh; + if(bx0 < 0) + bx0 = 0; + if(by0 < 0) + by0 = 0; + + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) + return 3; + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + return 1; + size = i; + + if(size < bw*bh) + return 1; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + if(replace) { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); + } + + // make a catalog of free parts + memset(pmap, 0, sizeof(pmap)); + for(i=0; i= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } + for(y=by0; y= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + + // load the particle map + i = 0; + pty = p; + for(y=y0;y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j) { + if(pmap[y][x]) { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } else if(i < nf) { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + + // load particle properties + for(j=0; j= size) + goto corrupt; + if(i < NPART) { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + } else + p += 2; + } + } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } + } +#ifdef HEAT_ENABLE + for(j=0; j=34&&legacy_beta==0){ + if(p >= size){ + goto corrupt; + } + if(i <= NPART) { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } else { + p++; + } + } else { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } + } +#endif + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + + if(p >= size) + goto version1; + j = d[p++]; + for(i=0; i size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0;y= size) + goto corrupt; + j=d[p++]; + if(j0) + fb[y*w+x] = ptypes[j].pcolors; + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +/* NO, I DON'T THINK SO + #include "fbi.h" + + pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) + { + unsigned char *tmp; + pixel *res; + int i; + + tmp = malloc(width*height*3); + if(!tmp) + return NULL; + res = malloc(width*height*PIXELSIZE); + if(!res) { + free(tmp); + return NULL; + } + + i = width*height*3; + if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { + free(res); + free(tmp); + return NULL; + } + + for(i=0; i1) { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } + *qw = w; + *qh = h; + return q; +} + +#define GRID_X 5 +#define GRID_Y 4 +#define GRID_P 3 +#define GRID_S 6 +#define GRID_Z 3 + +void stamp_gen_thumb(int i) +{ + char fn[64]; + void *data; + int size, factor_x, factor_y; + pixel *tmp; + + if(stamps[i].thumb) { + free(stamps[i].thumb); + stamps[i].thumb = NULL; + } + + sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); + data = file_load(fn, &size); + + if(data) { + stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); + if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } + } + + free(data); +} + +int clipboard_ready = 0; +void *clipboard_data = 0; +int clipboard_length = 0; + +void stamp_save(int x, int y, int w, int h) +{ + FILE *f; + int n; + char fn[64], sn[16]; + void *s=build_save(&n, x, y, w, h); + +#ifdef WIN32 + _mkdir("stamps"); +#else + mkdir("stamps", 0755); +#endif + + stamp_gen_name(sn); + sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); + + f = fopen(fn, "wb"); + if(!f) + return; + fwrite(s, n, 1, f); + fclose(f); + + free(s); + + if(stamps[STAMP_MAX-1].thumb) + free(stamps[STAMP_MAX-1].thumb); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); + memset(stamps, 0, sizeof(struct stamp_info)); + if(stamp_count0) { + memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); + memcpy(stamps, &tmp, sizeof(struct stamp_info)); + + stamp_update(); + } + + return data; +} + +void stamp_init(void) +{ + int i; + FILE *f; + + memset(stamps, 0, sizeof(stamps)); + + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); + if(!f) + return; + for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) + return; + if(a!=255) { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +{ + int i, j, w, bn = 0, ba = 0; + char *rp = font_data + font_ptrs[c]; + w = *(rp++); + for(j=0; j>= 2; + bn -= 2; + } + return x + w; +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +{ + int sx = x; + for(;*s;s++) { + if(*s == '\n') { + x = sx; + y += FONT_H+2; + } else if(*s == '\b') { + switch(s[1]) { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + return x; +} + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +{ + int i; + for(i=0; i<=w; i++) { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); + } + for(i=1; i=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + if(*s) + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); + return x; +} + +int textnwidth(char *s, int n) +{ + int x = 0; + for(;*s;s++) { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} +int textwidthx(char *s, int w) +{ + int x=0,n=0,cw; + for(;*s;s++) { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; + } + return n; +} + +/*********************************************************** + * MAIN PROGRAM * + ***********************************************************/ + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) +{ + int x, y, i, j, c; + int bo = b; + if(iswall==1){ + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b){ + case WL_WALLELEC: + for(j=1; j<15; j++){ + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } else { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) { + for(i=1; i<6+j; i++) { + if(!(i&j&1)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) { + if(i&j&1) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<13; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) { + for(i=14; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } else { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } +} + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) +{ + int i, j, c; + if(b>=121){ + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b){ + case WL_WALLELEC: + for(j=1; j<15; j++){ + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } else { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) { + for(i=1; i<6+j; i++) { + if(!(i&j&1)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) { + if(i&j&1) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<13; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) { + for(i=14; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } else { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; +} + +void draw_menu(pixel *vid_buf, int i, int hover){ + + //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); +#ifdef MENUV3 + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i){ + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } +#else + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); +#endif +} + +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr){ + int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + rows = ceil((float)msections[i].itemcount/16.0f); + height = (ceil((float)msections[i].itemcount/16.0f)*18); + width = restrict_flt(msections[i].itemcount*31, 0, 16*31); + //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); + h = -1; + x = XRES-BARSIZE-26; + y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; + sy = y; + //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); + fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); + fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); + drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); + if(i==SC_WALL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM){ + if(x-26<=60){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else if(i==SC_SPECIAL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ + if(x-26<=60){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else { + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1){ + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } else { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else if(i==SC_SPECIAL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ + if(x-26<=20){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else { + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1){ + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } else { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1){ + *sl = h; + } + if(b==4&&h!=-1){ + *sr = h; + } + } + +int create_parts(int x, int y, int r, int c) +{ + int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; + + if(c == 125) { + i = x / CELL; + j = y / CELL; + for(v=-1;v<2;v++) + for(u=-1;u<2;u++) + if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } +} + +void create_box(int x1, int y1, int x2, int y2, int c) +{ + int i, j; + if(x1>x2) { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT){ + c = c-100; + } + if(cm==-1) { + if(c==0) { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } else + cm = 0; + } + if(bm==-1) { + if(c==30) { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(y=XRES || y>=YRES) + return; + c = vid[y*(XRES+BARSIZE)+x]; + c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); + if(c<512) + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + else + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); +} + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) { + y += sy; + e -= 1.0f; + } + } +} + +void draw_svf_ui(pixel *vid_buf) +{ + int c; + + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); + drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + c = svf_open ? 255 : 128; + drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); + drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); + + c = svf_login ? 255 : 128; + drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); + if(svf_open) + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + else + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); + if(svf_open && svf_own) + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)){ + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } else if(svf_myvote==-1 && (svf_login && svf_open)){ + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); + if(svf_tags[0]) + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + else + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + +#ifdef HEAT_ENABLE + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); +#else + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-364, 14, c, c, c, 255); +#endif + + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); + drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); + if(svf_login) + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + else + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); + + if(sys_pause) { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + +#ifdef HEAT_ENABLE + if(!legacy_enable) { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } +#endif + + switch(cmode) { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; +#ifdef HEAT_ENABLE + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; +#endif + } + drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(svf_admin) { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } else if(svf_mod) { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? +} + +typedef struct ui_edit { + int x, y, w, nx; + char str[256],*def; + int focus, cursor, hide; +} ui_edit; +void ui_edit_draw(pixel *vid_buf, ui_edit *ed) +{ + int cx, i; + char echo[256], *str; + + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + if(ed->str[0]) { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) { + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } else + ed->focus = 0; + } + if(ed->focus && sdl_key) { + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } else if(ed->cursor > 0) { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} + typedef struct ui_checkbox { + int x, y; + int focus, checked; + } ui_checkbox; + void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) + { + int w = 12; + if(ed->checked) { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus){ + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } else { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } + } + void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) + { + int w = 12; + + if(mb && !mbq) { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ + ed->checked = (ed->checked)?0:1; + } + } else { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ + ed->focus = 1; + } else { + ed->focus = 0; + } + } + } + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +struct strlist { + char *str; + struct strlist *next; +}; +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list;item;item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) { + item = *list; + *list = (*list)->next; + free(item); + } +} + +void tag_list_ui(pixel *vid_buf) +{ + int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; + char *p,*q,s; + char *tag=NULL, *op=NULL; + ui_edit ed; + struct strlist *vote=NULL,*down=NULL; + + ed.x = x0+25; + ed.y = y0+221; + ed.w = 158; + ed.nx = 1; + ed.def = "[new tag]"; + ed.focus = 0; + ed.hide = 0; + ed.cursor = 0; + strcpy(ed.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + op = tag = NULL; + + drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 256); + drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); + p = svf_tags; + s = svf_tags[0] ? ' ' : 0; + y = 36 + y0; + while(s) { + q = strchr(p, ' '); + if(!q) + q = p+strlen(p); + s = *q; + *q = 0; + if(svf_own || svf_admin || svf_mod) { + drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); + d = 14; + if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) { + if(!strcmp(res, "OK ADMIN")){ + svf_admin = 1; + svf_mod = 0; + } else if(!strcmp(res, "OK MOD")){ + svf_admin = 0; + svf_mod = 1; + } else { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} + +static char hex[] = "0123456789ABCDEF"; +void strcaturl(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +#define THUMB_CACHE_SIZE 256 + +char *thumb_cache_id[THUMB_CACHE_SIZE]; +void *thumb_cache_data[THUMB_CACHE_SIZE]; +int thumb_cache_size[THUMB_CACHE_SIZE]; +int thumb_cache_lru[THUMB_CACHE_SIZE]; + +void thumb_cache_inval(char *id) +{ + int i,j; + for(i=0;i= THUMB_CACHE_SIZE) + return; + free(thumb_cache_id[i]); + free(thumb_cache_data[i]); + thumb_cache_id[i] = NULL; + for(j=0;j thumb_cache_lru[i]) + thumb_cache_lru[j]--; +} +void thumb_cache_add(char *id, void *thumb, int size) +{ + int i,m=-1,j=-1; + thumb_cache_inval(id); + for(i=0;i m) { + m = thumb_cache_lru[i]; + j = i; + } + } + if(i >= THUMB_CACHE_SIZE) { + thumb_cache_inval(thumb_cache_id[j]); + i = j; + } + for(j=0;j= THUMB_CACHE_SIZE) + return 0; + for(j=0;j=GRID_X*GRID_Y) + break; + if(votes) { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } else { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } else if(!strncmp(str, "TAG ", 4)) { + if(j >= TAG_MAX) { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } else { + if(i>=GRID_X*GRID_Y) + break; + if(votes) { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } else { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + do_open = 0; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) { + if(search_page) { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0;gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14);gj++) + for(gi=0;giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]) + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, vid_buf, gx, gy, GRID_S); + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]){ + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0){ + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv){ + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8){ + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } else { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1){ + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) { + if(data) { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } else + svf_tags[0] = 0; + } else { + svf_tags[0] = 0; + } + + if(svf_login){ + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200){ + if(data){ + if(!strcmp(data, "Up")){ + svf_myvote = 1; + } else if(!strcmp(data, "Down")){ + svf_myvote = -1; + } else { + svf_myvote = 0; + } + } else { + svf_myvote = 0; + } + } else { + svf_myvote = 0; + } + } + } else { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + search = 1; + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } else + search = 0; + + if(search && lasttime>=TIMEOUT) { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) { + if(search_page) { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } else { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } else { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login){ + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + page_count = search_results(results, last_own||svf_admin||svf_mod); + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) { + http_async_req_close(http); + http = NULL; + } + + for(i=0;i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) { + if(stamp_page) { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; +} + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) +{ + char t[2]; + t[0] = ch; + t[1] = 0; + if(flag) { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } else { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + } +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + for(i=0; i 18) ? -1 : 1; + for(j=0; j<4; j++) { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +/*********************************************************** + * CONFIG FILE * + ***********************************************************/ + +char http_proxy[256] = ""; + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; +} + +unsigned char last_major=0, last_minor=0, update_flag=0; + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66){ + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F){ + if(fseek(f, -3, SEEK_END)){ + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3){ + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; +#ifdef HEAT_ENABLE + cmode = tmp%6; +#else + cmode = tmp%5; +#endif + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void dim_copy(pixel *dst, pixel *src) +{ + int i,r,g,b; + for(i=0;i0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +unsigned int fire_alpha[CELL*3][CELL*3]; +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } else { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i2){ + pthread_t pth; + pthread_create(&pth,NULL,update_air_th,""); + } else { + update_air(); + } +#else + update_air(); +#endif + } + if(cmode==0 || cmode==1) { + draw_air(vid_buf); + } else if(cmode==2) { + memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); + memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); + } else { + memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); + } + update_particles(vid_buf); + + if(cmode==2) { + if(!fire_fc) { + dim_copy(fire_bg, vid_buf); + } else { + memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); + } + fire_fc = (fire_fc+1) % 3; + } + if(cmode==3||cmode==4) + render_fire(vid_buf); + + render_signs(vid_buf); + + //clearrect(vid_buf, 0, YRES, XRES, MENUSIZE); + memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); + //memset(vid_buf+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1)); + clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); + + // Old Menu, you will be missed; but not forgotten :( + /* for(i=0; iSAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; +#else + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; +#endif + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")){ + break; + } + //break; + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) { + if(load_mode) { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } else + load_data = stamp_load(0, &load_size); + if(load_data) { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1'){ + set_cmode(0); + } + if(sdl_key=='2'){ + set_cmode(1); + } + if(sdl_key=='3'){ + set_cmode(2); + } + if(sdl_key=='4'){ + set_cmode(3); + } + if(sdl_key=='5'){ + set_cmode(4); + } + if(sdl_key=='6'){ + set_cmode(5); + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ + if(clipboard_ready==1){ + load_data = malloc(clipboard_length); + memcpy(load_data, clipboard_data, clipboard_length); + load_size = clipboard_length; + if(load_data) { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + } + if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ + save_mode = 1; + copy_mode = 2; + } + if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ + save_mode = 1; + copy_mode = 1; + } else if(sdl_key=='c') { +#ifdef HEAT_ENABLE + set_cmode((cmode+1) % 6); +#else + set_cmode((cmode+1) % 5); +#endif + if(it > 50) + it = 50; + } +#ifdef INTERNAL + if(sdl_key=='v') + vs = !vs; + if(vs) + dump_frame(vid_buf, XRES, YRES, XRES); +#endif + + if(sdl_wheel) { + if(sdl_zoom_trig==1){ + ZSIZE += sdl_wheel; + if(ZSIZE>32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } else { + bs += sdl_wheel; + if(bs>16) + bs = 16; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)){ +#ifdef BETA + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); +#else + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); +#endif + } else { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } +#endif + mx = x; + my = y; + if(update_flag) { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } else { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } + + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) { + tmp = malloc(64); +#ifdef BETA + if(is_beta){ + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } else { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } +#else + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); +#endif + if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) { + free(tmp); + tmp = download_ui(vid_buf, my_uri, &i); + if(tmp) { + save_presets(1); + if(update_start(tmp, i)) { + update_cleanup(); + save_presets(0); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } else + return 0; + } + } else + free(tmp); + } + if(y>=sdl_scale*(YRES+(MENUSIZE-20))) { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0){ + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0){ + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0){ + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } +#ifdef HEAT_ENABLE + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) { +#else + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-365))*sdl_scale) && svf_login && svf_open) { +#endif + db = svf_own ? 257 : 256; + if(da < 51) + da ++; +#ifdef HEAT_ENABLE + } else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) { + db = 270; + if(da < 51) + da ++; +#endif + } else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) { + db = 266; + if(da < 51) + da ++; + } else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) { + db = svf_login ? 261 : 260; + if(svf_admin) { + db = 268; + } else if(svf_mod) { + db = 271; + } + if(da < 51) + da ++; + } else if(x>=sdl_scale && x<=17*sdl_scale) { + db = 262; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) { + db = 267; + if(da < 51) + da ++; + } else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) { + db = 265; + if(da < 51) + da ++; + } else if(da > 0) + da --; + } else + if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } else if(bq==4 && !b) { + free(load_data); + free(load_img); + load_mode = 0; + } + } else if(save_mode==1) { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1){ + save_mode = 2; + } else if(b==4){ + save_mode = 0; + copy_mode = 0; + } + } else if(save_mode==2) { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) { + if(copy_mode==1){ + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + } else if(copy_mode==2){ + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + } else { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } + } else if(sdl_zoom_trig && zoom_en<2) { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) { + if(!lb) { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ + if(execute_vote(vid_buf, svf_id, "Up")){ + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ + if(execute_vote(vid_buf, svf_id, "Down")){ + svf_myvote = -1; + } + } +#ifdef HEAT_ENABLE + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) +#else + if(x>=219 && x<=(XRES+BARSIZE-(510-365)) && svf_login && svf_open) +#endif + tag_list_ui(vid_buf); +#ifdef HEAT_ENABLE + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) { + legacy_enable = !legacy_enable; + } +#endif + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) { + if(!svf_open || !svf_own || x>51) { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { +#ifdef HEAT_ENABLE + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 6); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+5) % 6); +#else + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 5); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+4) % 5); +#endif + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)){ + c = sl = cr&0xFF; + } else { + //Something + } + } + //create_parts(x, y, bs, SPC_AIR); + lx = x; + ly = y; + lb = 0; + lm = 0; + } else { + create_parts(x, y, bs, c); + lx = x; + ly = y; + lb = b; + lm = 0; + } + } + } + } else { + if(lb && lm) { + x /= sdl_scale; + y /= sdl_scale; + c = (lb&1) ? sl : sr; + su = c; + if(lm == 1) { + if(c!=127 || lx<0 || ly<0 || lx>=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) { + it--; + //if(fbi_img) + //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta){ + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } else { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + /*#ifdef MT + pthread_join(pth2,NULL); + #endif*/ + + if(hud_enable){ + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } +#ifdef HEAT_ENABLE + if(sdl_zoom_trig){ + if(x Date: Fri, 30 Jul 2010 22:48:33 +0100 Subject: [PATCH 009/237] Changes to HUD in Zoom mode, NBLE fixes, BTRY added, LCRY added. --- powder.c | 229 ++++++++++++++++++++++++++++++++++-------------------- version.h | 4 +- 2 files changed, 146 insertions(+), 87 deletions(-) diff --git a/powder.c b/powder.c index 23289192b..b594bd782 100644 --- a/powder.c +++ b/powder.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include //#include @@ -558,7 +558,9 @@ struct menu_section msections[] = { #define PT_ETRD 50 #define PT_NICE 51 #define PT_NBLE 52 -#define PT_NUM 53 +#define PT_BTRY 53 +#define PT_LCRY 54 +#define PT_NUM 55 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -612,13 +614,14 @@ const struct part_type ptypes[] = { {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_OTHER, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_OTHER, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_OTHER, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable."}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_OTHER, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_OTHER, -250.0f, 46, "Nitrogen Ice."}, {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, }; #ifdef HEAT_ENABLE @@ -681,7 +684,8 @@ const struct part_state pstates[] = { /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, -209.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2000.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; #endif static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -689,63 +693,65 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = { /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N */ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B */ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L */ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L */ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C */ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r */ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0}, + /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, }; #define FLAG_STAGNANT 1 @@ -1143,15 +1149,16 @@ void update_particles_i(pixel *vid, int start, int inc){ goto justdraw; if(parts[i].life&&t!=PT_ACID&&t!=PT_WOOD&&t!=PT_NBLE) { - parts[i].life--; - if(parts[i].life<=0 && t!=PT_WIRE && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD) { + if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) + parts[i].life--; + if(parts[i].life<=0 && t!=PT_WIRE && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY) { kill_part(i); continue; } if(parts[i].life<=0 && t==PT_SPRK) { t = parts[i].ctype; #ifdef HEAT_ENABLE - if(t!=PT_WIRE&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM) + if(t!=PT_WIRE&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) parts[i].temp = R_TEMP; #endif if(!t) @@ -1746,8 +1753,7 @@ void update_particles_i(pixel *vid, int start, int inc){ if((r&0xFF)==PT_PLNT && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; } - } - else if(t==PT_PHOT){ + } else if(t==PT_PHOT){ rt = 3 + (int)pv[y/CELL][x/CELL]; for(nx=0; nx<1; nx++) for(ny=0; ny<1; ny++) @@ -1760,13 +1766,46 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].vx *= 0.995; parts[i].vy *= 0.995; } - // } else if(((r&0xFF)!=PT_PHOT&&(r&0xFF)!=PT_NONE&&(r&0xFF)!=PT_CLNE)) { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - // }// else if((r&0xFF)!=PT_PLEX){ - // parts[i].life = 4; - // parts[i].type = PT_FIRE - //} + } + } else if(t==PT_LCRY){ + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK){ + if(parts[r>>8].ctype==PT_PSCN) { + parts[i].life = 10; + } else if(parts[r>>8].ctype==PT_NSCN) { + parts[i].life = 9; + } + } + if(rt==PT_LCRY){ + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0){ + parts[i].life = 9; + } else if(parts[i].life==0&&parts[r>>8].life==10){ + parts[i].life = 10; + } + } + } + } else if(t==PT_BTRY){ + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0) { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + parts[r>>8].type = PT_SPRK; + } } } if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { @@ -1886,7 +1925,6 @@ void update_particles_i(pixel *vid, int start, int inc){ } } #endif - //Bitches now know about my semi-conductor :( if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)){ @@ -1937,19 +1975,15 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[r>>8].ctype = rt; } } - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE) - { - parts[i].temp = 3500; - } - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) - { + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { parts[i].life = rand()%150+50; parts[i].type = PT_PLSM; parts[i].ctype = PT_NBLE; parts[i].temp = 3500; pv[y/CELL][x/CELL] += 1; - } -} + } + } killed: if(parts[i].type == PT_NONE) continue; @@ -2201,7 +2235,32 @@ void update_particles_i(pixel *vid, int start, int inc){ blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } else if(t==PT_PLSM) { + } else if(t==PT_LCRY) { + if(cmode == 3||cmode==4) { + //cr = R/8; + //cg = G/8; + //cb = B/8; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); + //x = nx/CELL; + //y = ny/CELL; + //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = 0x50+(parts[i].life*10); + cg = 0x50+(parts[i].life*10); + cb = 0x50+(parts[i].life*10); + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + }else if(t==PT_PLSM) { float ttemp = parts[i].life; int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); uint8 R = plasma_data[caddress]; @@ -8479,7 +8538,7 @@ int main(int argc, char *argv[]) pastFPS = currentTime; } #ifdef HEAT_ENABLE - if(sdl_zoom_trig){ + if(sdl_zoom_trig||zoom_en){ if(x Date: Sat, 31 Jul 2010 12:05:51 +0100 Subject: [PATCH 010/237] Menu sections enhancements, new glyphs for new sections --- font.h | 4 ++-- powder.c | 47 ++++++++++++++++++++++++----------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/font.h b/font.h index 1eb1b54cf..68ac6841b 100755 --- a/font.h +++ b/font.h @@ -20,8 +20,8 @@ */ #define FONT_H 10 char font_data[] = { - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xcc, 0x00, 0x00, 0x0a, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xff, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x80, 0xff, 0x2f, 0xfc, 0xff, 0xc3, 0x07, 0x3d, 0x3c, 0xc0, 0xc3, 0x03, 0x3c, 0x7c, 0xd0, 0xc3, 0xff, 0x3f, 0xf8, 0xff, 0x02, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, }; short font_ptrs[] = { - 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e56, 0x0e66, 0x0e76, 0x0e86, 0x0e96, 0x0ea6, 0x0eb6, 0x0ec6, 0x0ed6, 0x0ee6, 0x0ef6, 0x0f06, 0x0f16, 0x0f26, 0x0f36, 0x0f46, 0x0f56, 0x0f66, 0x0f76, 0x0f86, 0x0f96, 0x0fa6, 0x0fb6, 0x0fc6, 0x0fd6, 0x0fe6, 0x0ff6, 0x1006, 0x1016, 0x1026, 0x1036, 0x1046, 0x1056, 0x1066, 0x1076, 0x1086, 0x1096, 0x10a6, 0x10b6, 0x10c6, 0x10d6, 0x10e6, 0x10f6, 0x1106, 0x1116, 0x1126, 0x1136, + 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, }; \ No newline at end of file diff --git a/powder.c b/powder.c index b594bd782..18c92efb8 100644 --- a/powder.c +++ b/powder.c @@ -453,14 +453,15 @@ const struct menu_wall mwalls[] = { }; #define SC_WALL 0 -#define SC_SPECIAL 6 -#define SC_OTHER 7 +#define SC_SPECIAL 8 +#define SC_POWDERS 5 +#define SC_SOLIDS 6 #define SC_ELEC 1 #define SC_EXPLOSIVE 2 #define SC_GAS 3 #define SC_LIQUID 4 -#define SC_NUCLEAR 5 -#define SC_TOTAL 8 +#define SC_NUCLEAR 7 +#define SC_TOTAL 9 struct menu_section msections[] = { {"\xC1", "Walls", 0}, @@ -468,10 +469,10 @@ struct menu_section msections[] = { {"\xC3", "Explosives", 0}, {"\xC5", "Gasses", 0}, {"\xC4", "Liquids", 0}, + {"\xD0", "Powders", 0}, + {"\xD1", "Solids", 0}, {"\xC6", "Radioactive", 0}, {"\xCC", "Special", 0}, - {"\xC0", "Other", 0}, - }; #define CM_HEAT 5 @@ -567,40 +568,40 @@ struct menu_section msections[] = { #define MIN_TEMP -273 const struct part_type ptypes[] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_OTHER, R_TEMP+0.0f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_OTHER, R_TEMP+0.0f, 70, "Very light dust. Flammable."}, + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Very light dust. Flammable."}, {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Flammable."}, {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_OTHER, R_TEMP+0.0f, 150, "Heavy particles. Meltable."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Heavy particles. Meltable."}, {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 97, "Light dust. Explosive."}, {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 50, "Liquid. Pressure sensitive explosive."}, {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Solid. Duplicates any particles it touches."}, {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_OTHER, R_TEMP+0.0f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_OTHER, R_TEMP+-50.0f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Conducts electricity. Meltable."}, {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_OTHER, R_TEMP+-30.0f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_OTHER, R_TEMP+0.0f, 164, "Solid. Flammable."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f, 164, "Solid. Flammable."}, {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 60, "Neutrons. Interact with matter in odd ways."}, {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_OTHER, R_TEMP+0.0f, 65, "Plant, drinks water and grows."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 65, "Plant, drinks water and grows."}, {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f, 34, "Dissolves almost everything."}, {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Hole, will drain away any particles."}, {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_OTHER, R_TEMP+0.0f, 100, "Concrete, stronger than stone."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f, 100, "Concrete, stronger than stone."}, {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_OTHER, R_TEMP+0.0f, 110, "Salt, dissolves in water."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 110, "Salt, dissolves in water."}, {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f, 75, "Saltwater, conducts electricity, difficult to freeze."}, {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_OTHER, R_TEMP+0.0f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_OTHER, R_TEMP+0.0f, 211, "Broken metal."}, + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f, 211, "Broken metal."}, {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f, 251, "Photons. Travel in straight lines."}, {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_OTHER, R_TEMP+0.0f, 44, "Wax. Melts at moderately high temperatures."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 44, "Wax. Melts at moderately high temperatures."}, {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f, 44, "Liquid Wax."}, {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, @@ -611,14 +612,14 @@ const struct part_type ptypes[] = { {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f, 170, "Liquid Rubidium."}, {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_OTHER, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_OTHER, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_OTHER, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_OTHER, -250.0f, 46, "Nitrogen Ice."}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f, 46, "Nitrogen Ice."}, {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, From 27b3fc9549fa9e3dc7e11f1d828291feebbec92e Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 31 Jul 2010 12:09:15 +0100 Subject: [PATCH 011/237] Updates font files missed in the last commit --- Resources/Font-Data | Bin 4422 -> 4442 bytes Resources/Font-Pointers | Bin 512 -> 512 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Font-Data b/Resources/Font-Data index 1abf887519ef352056ae302bfdea96ec8327b40a..a38415251c4672b7a0a27e45d10cef660ced29bc 100644 GIT binary patch delta 63 zcmV-F0KosoBHALbMh-Fxz%c+Y0YEeW%m4ri0QdsnzkvTQ{{Q>`{|W#Afd4Q2|HB78 VJix;PJbci@|3CQu0<%O8;sQWE9JK%d delta 16 XcmcbmbWCZ38{g(Cz6VT`yZ96UJNE`r diff --git a/Resources/Font-Pointers b/Resources/Font-Pointers index 4826cc60b212f4c0657174631b4a52b3d7b7df7d..621258b8240d3a4489dc661c661b8b77476a772a 100644 GIT binary patch delta 101 zcmV~$p$!Bf6a>&*vI;RX-%8am&doC@SgHt*oM|rmmr>rESi<1&fwm8cH2` delta 101 zcmV~$F%7^V00h7^X&C>X1qnz%LM5#Voo2kXlm)Bpeg From 66c815ab38c560399ff837951582f4e97f07056e Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Sat, 31 Jul 2010 06:10:33 -0700 Subject: [PATCH 012/237] Battery "Bug" - triclops --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 18c92efb8..eb3d1388a 100644 --- a/powder.c +++ b/powder.c @@ -1802,7 +1802,7 @@ void update_particles_i(pixel *vid, int start, int inc){ if((r>>8)>=NPART || !r) continue; rt = parts[r>>8].type; - if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0) { + if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) { parts[r>>8].life = 4; parts[r>>8].ctype = rt; parts[r>>8].type = PT_SPRK; From 74502a4b55bc4d5d77c7690e3ca2bc83c0f9e2fd Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 8 Aug 2010 20:48:18 +0100 Subject: [PATCH 013/237] Adds Switch, Insulator (triclops), updates info screen. Add background to text on HUD and 'h' toggles HUD visibility --- powder.c | 519 ++++++++++++++++-------------------------------------- version.h | 2 +- 2 files changed, 157 insertions(+), 364 deletions(-) mode change 100644 => 100755 powder.c diff --git a/powder.c b/powder.c old mode 100644 new mode 100755 index eb3d1388a..b5e456c9a --- a/powder.c +++ b/powder.c @@ -3,6 +3,8 @@ * * Copyright (c) 2008 - 2010 Stanislaw Skowronek. * Copyright (c) 2010 Simon Robertshaw + * Copyright (c) 2010 Skresanov Savely + * Copyright (c) 2010 Bryan Who? * * 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 @@ -26,11 +28,6 @@ #include #include #include -//#include -#ifdef MT -#include -#include -#endif #ifdef WIN32 #include @@ -44,8 +41,9 @@ #include "http.h" #include "md5.h" #include "update.h" +#include "hmap.h" -#define SERVER "powder.hardwired.org.uk" +#define SERVER "powdertoy.co.uk" #undef PLOSS @@ -70,10 +68,6 @@ unsigned char ZSIZE = ZSIZE_D; typedef unsigned char uint8; -#ifdef HEAT_ENABLE -#include "hmap.h" -#endif - #ifdef PIX16 #define PIXELSIZE 2 typedef unsigned short pixel; @@ -129,13 +123,14 @@ char *it_msg = "The spacebar can be used to pause physics.\n" "'P' will take a screenshot and save it into the current directory.\n" "\n" -"\brhttp://powder.hardwired.org.uk/\n" +"\brhttp://powdertoy.co.uk/\n" "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" -"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powder.hardwired.org.uk\bg)\n" +"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" +"\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" +"\bgCopyright (c) 2010 Bryan Who? (New elements)\n" "\n" -"\bgSpecial thanks to Brian Ledbetter for maintaining ports & server development in the past." -"\nand CW for hosting the original server.\n" -"\bgTo use online features such as saving, you need to register at: \brhttp://powder.hardwired.org.uk/Register.html" +"\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" +"\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" ; typedef struct { @@ -147,9 +142,7 @@ typedef struct { char *old_ver_msg_beta = "A new beta is available - click here!"; #endif char *old_ver_msg = "A new version is available - click here!"; -#ifdef HEAT_ENABLE float mheat = 0.0f; -#endif int do_open = 0; int sys_pause = 0; @@ -399,14 +392,11 @@ struct part_type { int hardness; int menu; int menusection; -//#ifdef HEAT_ENABLE //Locked on float heat; unsigned char hconduct; -//#endif const char *descs; }; -#ifdef HEAT_ENABLE struct part_state { char state; int solid; @@ -418,7 +408,6 @@ struct part_state { int burn; float btemp; }; -#endif struct menu_section { char *icon; @@ -544,7 +533,7 @@ struct menu_section msections[] = { #define PT_PSCN 35 #define PT_NSCN 36 #define PT_LNTG 37 -#define PT_FOAM 38 +#define PT_INSL 38 #define PT_BHOL 39 #define PT_WHOL 40 #define PT_RBDM 41 @@ -561,7 +550,9 @@ struct menu_section msections[] = { #define PT_NBLE 52 #define PT_BTRY 53 #define PT_LCRY 54 -#define PT_NUM 55 +#define PT_SWCH 55 +#define PT_SMKE 56 +#define PT_NUM 57 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -606,7 +597,7 @@ const struct part_type ptypes[] = { {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f, 70, "Liquid Nitrogen. Very cold."}, - {"FOAM", PIXPACK(0xD0D08A), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 2, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 1, "Foam, Very good thermal insulator"}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 2, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f, 255, "Black hole, sucks in other particles and heats up."}, {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f, 255, "White hole, pushes other particles away."}, {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, @@ -623,15 +614,16 @@ const struct part_type ptypes[] = { {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 0, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, }; -#ifdef HEAT_ENABLE #define ST_NONE 0 #define ST_SOLID 1 #define ST_LIQUID 2 #define ST_GAS 3 const struct part_state pstates[] = { - // Name Solid Frzp Liquid Mpnt Gas Bpoint + // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, @@ -687,8 +679,9 @@ const struct part_state pstates[] = { /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2000.0f}, /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; -#endif static const unsigned char can_move[PT_NUM][PT_NUM] = { /* A B */ /* A 0 1 | B ligher than A */ @@ -698,61 +691,63 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = { /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C */ /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r */ /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, + /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1}, + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, }; #define FLAG_STAGNANT 1 @@ -760,9 +755,7 @@ typedef struct { int type; int life, ctype; float x, y, vx, vy; -#ifdef HEAT_ENABLE float temp; -#endif int flags; } particle; particle *parts; @@ -794,7 +787,7 @@ int try_move(int i, int x, int y, int nx, int ny) if(r && (r>>8)>8].type; - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE)){ + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))){ return 1; } @@ -804,11 +797,9 @@ int try_move(int i, int x, int y, int nx, int ny) } if((r&0xFF)==PT_BHOL){ parts[i].type=PT_NONE; -#ifdef HEAT_ENABLE if(!legacy_enable){ parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; } -#endif return 0; } @@ -875,7 +866,6 @@ int create_part(int p, int x, int y, int t) if(x<0 || y<0 || x>=XRES || y>=YRES) return -1; -#ifdef HEAT_ENABLE if(t==SPC_HEAT||t==SPC_COOL){ if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8>=PT_NUM)?PT_NONE:pmr>>8].type; +} int nearest_part(int ci, int t){ int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); int ndistance = 0; @@ -1131,13 +1121,11 @@ int nearest_part(int ci, int t){ } void create_line(int x1, int y1, int x2, int y2, int r, int c); void update_particles_i(pixel *vid, int start, int inc){ - int i, j, x, y, t, nx, ny, r, a, cr,cg,cb, s, rt, fe, nt, lpv, nearp; + int i, j, x, y, t, nx, ny, r, a, cr,cg,cb, s, rt, fe, nt, lpv, nearp, pavg; float mv, dx, dy, ix, iy, lx, ly; -#ifdef HEAT_ENABLE float pt = R_TEMP; float c_heat = 0.0f; int h_count = 0; -#endif int starti = (start*-1); for(i=start; i<(NPART-starti); i+=inc) if(parts[i].type) { @@ -1149,7 +1137,7 @@ void update_particles_i(pixel *vid, int start, int inc){ if(sys_pause) goto justdraw; - if(parts[i].life&&t!=PT_ACID&&t!=PT_WOOD&&t!=PT_NBLE) { + if(parts[i].life && t!=PT_ACID && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; if(parts[i].life<=0 && t!=PT_WIRE && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY) { @@ -1158,10 +1146,8 @@ void update_particles_i(pixel *vid, int start, int inc){ } if(parts[i].life<=0 && t==PT_SPRK) { t = parts[i].ctype; -#ifdef HEAT_ENABLE if(t!=PT_WIRE&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) parts[i].temp = R_TEMP; -#endif if(!t) t = PT_WIRE; parts[i].type = t; @@ -1223,9 +1209,7 @@ void update_particles_i(pixel *vid, int start, int inc){ if((ptypes[t].explosive&2) && pv[y/CELL][x/CELL]>2.5f) { parts[i].life = rand()%80+180; rt = parts[i].type = PT_FIRE; -#ifdef HEAT_ENABLE parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); -#endif pv[y/CELL][x/CELL] += 0.25f * CFDS; t = PT_FIRE; } @@ -1298,18 +1282,14 @@ void update_particles_i(pixel *vid, int start, int inc){ if((pmap[y+ny][x+nx]&0xFF)!=t) nt = 1; } -#ifdef HEAT_ENABLE if(legacy_enable){ -#endif if(t==PT_WTRV && pv[y/CELL][x/CELL]>4.0f) t = parts[i].type = PT_DSTW; if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) t = parts[i].type = PT_OILL; if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) t = parts[i].type = PT_GASS; -#ifdef HEAT_ENABLE } -#endif if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) @@ -1334,7 +1314,6 @@ void update_particles_i(pixel *vid, int start, int inc){ } } -#ifdef HEAT_ENABLE if(!legacy_enable){ int ctemp = pv[y/CELL][x/CELL]*2; c_heat = 0.0f; @@ -1346,7 +1325,7 @@ void update_particles_i(pixel *vid, int start, int inc){ r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0){ h_count++; c_heat += parts[r>>8].temp; } @@ -1360,7 +1339,7 @@ void update_particles_i(pixel *vid, int start, int inc){ r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0){ parts[r>>8].temp = parts[i].temp; } } @@ -1424,7 +1403,6 @@ void update_particles_i(pixel *vid, int start, int inc){ if(t==PT_HSCN&&parts[i].temp>24.0f){ pt = parts[i].temp -= 2.5f; } - #endif if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) { nx = x % CELL; @@ -1460,32 +1438,6 @@ void update_particles_i(pixel *vid, int start, int inc){ set_emap(nx, ny); fe = 0; - /*if(t==PT_WOOD && parts[i].life>0){ - int ttx = (rand()%3)-1; - r = pmap[y-1][x+ttx]; - if(parts[i].life>50){ - if((pmap[y-1][x+ttx]&0xFF)==PT_NONE){ - create_part(-1, x+ttx, y-1, PT_WOOD); - parts[pmap[y-1][x+ttx]>>8].life = parts[i].life-1; - parts[pmap[y-1][x+ttx]>>8].vx = ttx; - } - if((pmap[y-1][x+ttx-1]&0xFF)==PT_NONE){ - create_part(-1, x+ttx-1, y-1, PT_WOOD); - parts[pmap[y-1][x+ttx-1]>>8].life = 0; - } - if((pmap[y-1][x+ttx+1]&0xFF)==PT_NONE){ - create_part(-1, x+ttx+1, y-1, PT_WOOD); - parts[pmap[y-1][x+ttx+1]>>8].life = 0; - } - parts[i].life = 0; - } else if(parts[i].life>10) { - //int ttx = (rand()%3)-parts[i].vx; - //create_part(-1, x+ttx, y-1, PT_WOOD); - //r = pmap[y-1][x+ttx]; - //parts[r>>8].life = parts[i].life-1; - //parts[i].life = 0; - } - } else*/ if(t==PT_THDR){ for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) @@ -1521,14 +1473,6 @@ void update_particles_i(pixel *vid, int start, int inc){ t = parts[i].type = PT_SLTW; parts[r>>8].type = PT_SLTW; } -#ifndef HEAT_ENABLE - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; -#else if(legacy_enable){ if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { t = parts[i].type = PT_ICEI; @@ -1537,7 +1481,6 @@ void update_particles_i(pixel *vid, int start, int inc){ if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) t = parts[i].type = PT_WATR; } -#endif } } else if(t==PT_HSCN||t==PT_CSCN) { @@ -1581,15 +1524,8 @@ void update_particles_i(pixel *vid, int start, int inc){ r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { -#ifndef HEAT_ENABLE + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) { t = parts[i].type = PT_WTRV; - //parts[r>>8].type = PT_WTRV; -#else - if(legacy_enable){ - t = parts[i].type = PT_WTRV; - } -#endif } else if((r&0xFF)==PT_SALT && 1>(rand()%250)) { t = parts[i].type = PT_SLTW; parts[r>>8].type = PT_SLTW; @@ -1600,17 +1536,11 @@ void update_particles_i(pixel *vid, int start, int inc){ if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)){ t = parts[i].type = PT_SLTW; } -#ifdef HEAT_ENABLE if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)){ -#else - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ -#endif parts[i].life = 4; t = parts[i].type = PT_FIRE; } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; } } else if(t==PT_SLTW) { @@ -1621,34 +1551,19 @@ void update_particles_i(pixel *vid, int start, int inc){ r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { -#ifndef HEAT_ENABLE - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; -#else - if(legacy_enable){ + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) { t = parts[i].type = PT_SALT; parts[r>>8].type = PT_WTRV; - } -#endif } else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) { - //t = parts[i].type = PT_SLTW; parts[r>>8].type = PT_SLTW; } -#ifdef HEAT_ENABLE if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ -#else - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ -#endif parts[i].life = 4; t = parts[i].type = PT_FIRE; } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; } - } - else if(t==PT_WTRV) { + } else if(t==PT_WTRV) { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && @@ -1656,44 +1571,23 @@ void update_particles_i(pixel *vid, int start, int inc){ r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; -#ifdef HEAT_ENABLE - if(legacy_enable){ -#endif - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) { t = parts[i].type = PT_WATR; parts[r>>8].type = PT_WATR; } -#ifdef HEAT_ENABLE - } -#endif -#ifdef HEAT_ENABLE if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ -#else - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ -#endif parts[i].life = 4; t = parts[i].type = PT_FIRE; } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000)) { -#ifndef HEAT_ENABLE + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) { t = parts[i].type = PT_WATR; if(1>(rand()%1000)) parts[r>>8].type = PT_WATR; -#else - if(legacy_enable){ - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } -#endif } } - } - // END PLANT - // ACID - else if(t==PT_ACID) { + } else if(t==PT_ACID) { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && x+nx>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL) || t!=PT_SPRK) && (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; -#ifdef HEAT_ENABLE parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); -#endif parts[r>>8].life = rand()%80+180; if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; //LOL + pv[y/CELL][x/CELL] += 0.25f * CFDS; continue; } lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; if(lpv < 1) lpv = 1; -#ifndef HEAT_ENABLE - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && (t!=PT_FIRE || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && - ptypes[rt].meltable*lpv>(rand()%1000)) { - if(t!=PT_LAVA || parts[i].life>0) { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } else { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = PT_METL; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { - kill_part(r>>8); - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - //t = parts[i].type = PT_METL; - goto killed; - } - } -#else if(legacy_enable){ if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && ptypes[rt].meltable*lpv>(rand()%1000)) { @@ -1919,28 +1764,25 @@ void update_particles_i(pixel *vid, int start, int inc){ if(t==PT_LAVA) { parts[i].life = 0; t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - //t = parts[i].type = PT_METL; + parts[i].ctype = PT_NONE; goto killed; } } } -#endif + pavg = parts_avg(i, r>>8); if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)){ + if(!(rt==PT_PSCN&&parts[i].ctype==PT_NSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp>=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ){ parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; parts[r>>8].ctype = rt; -#ifdef HEAT_ENABLE if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) parts[r>>8].temp = parts[r>>8].temp+10.0f; -#endif } } if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)>8].temp>100.0f)){ + if((parts[i].ctype==PT_NSCN||parts[i].ctype==PT_HSCN||(parts[i].ctype==PT_PSCN&&parts[r>>8].temp>100.0f))&&pavg != PT_INSL){ parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; parts[r>>8].ctype = rt; @@ -1948,7 +1790,7 @@ void update_particles_i(pixel *vid, int start, int inc){ } if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)>8].temp<100.0f)){ + if((parts[i].ctype==PT_NSCN||parts[i].ctype==PT_CSCN||(parts[i].ctype==PT_PSCN&&parts[r>>8].temp<100.0f))&&pavg != PT_INSL){ parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; parts[r>>8].ctype = rt; @@ -1983,7 +1825,12 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].ctype = PT_NBLE; parts[i].temp = 3500; pv[y/CELL][x/CELL] += 1; - } + } + if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) + { + parts[i].type = PT_SWCH; + parts[i].life = 10; + } } killed: if(parts[i].type == PT_NONE) @@ -2005,9 +1852,36 @@ void update_particles_i(pixel *vid, int start, int inc){ } if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) { - parts[i].type = PT_NBLE; - parts[i].life = 0; + parts[i].type = PT_NBLE; + parts[i].life = 0; } + //if (t==PT_FIRE && parts[i].life <=1) + //{ + // parts[i].type = PT_SMKE; + // parts[i].life = 0; + //} + if(t==PT_SWCH) + { + for(nx=-2; nx<3; nx++){ + for(ny=-2; ny<3; ny++){ + r =pmap[y+ny][x+nx]; + pavg = parts_avg(i, r>>8); + if(parts[r>>8].type == PT_SPRK&&abs(nx)+abs(ny)<4) + { + if(parts[r>>8].ctype == PT_PSCN&&pavg != PT_INSL) + parts[i].life = 10; + if(parts[r>>8].ctype == PT_NSCN&&pavg != PT_INSL) + parts[i].life = 0; + if(!(parts[r>>8].ctype == PT_PSCN||parts[r>>8].ctype == PT_NSCN)&&parts[i].life == 10&&pavg != PT_INSL){ + parts[i].type = PT_SPRK; + parts[i].ctype = PT_SWCH; + parts[i].life = 4; + } + } + } + } + } + nx = (int)(parts[i].x+0.5f); ny = (int)(parts[i].y+0.5f); @@ -2138,20 +2012,16 @@ void update_particles_i(pixel *vid, int start, int inc){ kill_part(i); continue; } -#ifdef HEAT_ENABLE if(cmode!=CM_HEAT){ - -#endif if(t==PT_ACID) { if(parts[i].life>255) parts[i].life = 255; if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28));//if(parts[i].life<=49) parts[i].life = 50; + s = (255/((parts[i].life-46)*28)); if(s==0) s = 1; cr = PIXR(ptypes[t].pcolors)/s; cg = PIXG(ptypes[t].pcolors)/s; cb = PIXB(ptypes[t].pcolors)/s; - //vid[ny*(XRES+BARSIZE)+nx] = //(cr<<16)+(cb<<18)+cg;//ptypes[t].pcolors/-(parts[i].life-255); - blendpixel(vid, nx, ny, cr, cg, cb, 255);//(parts[i].life-46)*28 + blendpixel(vid, nx, ny, cr, cg, cb, 255); if(cmode==4){ blendpixel(vid, nx+1, ny, cr, cg, cb, 223); blendpixel(vid, nx-1, ny, cr, cg, cb, 223); @@ -2211,6 +2081,10 @@ void update_particles_i(pixel *vid, int start, int inc){ blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } + } else if(t==PT_SWCH && parts[i].life == 10) { + x = nx; + y = ny; + blendpixel(vid,x,y,17,217,24,255); } else if(t==PT_THDR) { if(cmode == 3||cmode==4) { vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; @@ -2362,7 +2236,6 @@ void update_particles_i(pixel *vid, int start, int inc){ } } else vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; -#ifdef HEAT_ENABLE } else { float ttemp = parts[i].temp+(-MIN_TEMP); int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); @@ -2372,7 +2245,6 @@ void update_particles_i(pixel *vid, int start, int inc){ vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); //blendpixel(vid, nx+1, ny, R, G, B, 255); } -#endif if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID){ uint8 R = PIXR(ptypes[t].pcolors); uint8 G = PIXG(ptypes[t].pcolors); @@ -3127,11 +2999,7 @@ static char *mystrdup(char *s) void *build_save(int *size, int x0, int y0, int w, int h) { -#ifdef HEAT_ENABLE unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; -#else - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*6+MAXSIGNS*262), *c; -#endif int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; @@ -3198,7 +3066,6 @@ void *build_save(int *size, int x0, int y0, int w, int h) if(i) d[p++] = (parts[i-1].life+3)/4; } -#ifdef HEAT_ENABLE for(j=0; j 50) it = 50; } @@ -8017,7 +7832,6 @@ int main(int argc, char *argv[]) x = (((x/sdl_scale-zoom_wx)/ZFACTOR)+zoom_x)*sdl_scale; y = (((y/sdl_scale-zoom_wy)/ZFACTOR)+zoom_y)*sdl_scale; } -#ifdef HEAT_ENABLE if(y>0 && y0 && x=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) { -#else - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-365))*sdl_scale) && svf_login && svf_open) { -#endif db = svf_own ? 257 : 256; if(da < 51) da ++; -#ifdef HEAT_ENABLE } else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) { db = 270; if(da < 51) da ++; -#endif } else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) { db = 266; if(da < 51) @@ -8237,17 +8044,11 @@ int main(int argc, char *argv[]) svf_myvote = -1; } } -#ifdef HEAT_ENABLE if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) -#else - if(x>=219 && x<=(XRES+BARSIZE-(510-365)) && svf_login && svf_open) -#endif tag_list_ui(vid_buf); -#ifdef HEAT_ENABLE if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) { legacy_enable = !legacy_enable; } -#endif if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) { memset(signs, 0, sizeof(signs)); memset(pv, 0, sizeof(pv)); @@ -8263,10 +8064,7 @@ int main(int argc, char *argv[]) parts[NPART-1].life = -1; pfree = 0; -#ifdef HEAT_ENABLE - legacy_enable = 0; -#endif - + legacy_enable = 0; svf_myvote = 0; svf_open = 0; svf_publish = 0; @@ -8306,17 +8104,10 @@ int main(int argc, char *argv[]) if(x>=19 && x<=35 && svf_last && svf_open) parse_save(svf_last, svf_lsize, 1, 0, 0); if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { -#ifdef HEAT_ENABLE if(b & SDL_BUTTON_LMASK) set_cmode((cmode+1) % 6); if(b & SDL_BUTTON_RMASK) set_cmode((cmode+5) % 6); -#else - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 5); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+4) % 5); -#endif save_presets(0); } if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) @@ -8538,18 +8329,20 @@ int main(int argc, char *argv[]) FPS = 0; pastFPS = currentTime; } -#ifdef HEAT_ENABLE if(sdl_zoom_trig||zoom_en){ - if(x Date: Mon, 9 Aug 2010 19:21:09 +0100 Subject: [PATCH 014/237] Change behaviour of 2 elements: GLAS is not impervious to ACID, fixes invisible plasma bug with battery --- powder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index b5e456c9a..14a43319a 100755 --- a/powder.c +++ b/powder.c @@ -604,7 +604,7 @@ const struct part_type ptypes[] = { {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f, 170, "Liquid Rubidium."}, {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, @@ -1347,7 +1347,7 @@ void update_particles_i(pixel *vid, int start, int inc){ } if(pt>=pstates[t].btemp&&pstates[t].burn) { t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE) + if(t==PT_FIRE||t==PT_PLSM) parts[i].life = rand()%50+120; } else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid){ From af573753cff935bc4086f5551656f48f8c4e83d4 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 9 Aug 2010 19:26:58 +0100 Subject: [PATCH 015/237] Correction of Bryans full name --- powder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index 14a43319a..1b77a8af3 100755 --- a/powder.c +++ b/powder.c @@ -4,7 +4,7 @@ * Copyright (c) 2008 - 2010 Stanislaw Skowronek. * Copyright (c) 2010 Simon Robertshaw * Copyright (c) 2010 Skresanov Savely - * Copyright (c) 2010 Bryan Who? + * Copyright (c) 2010 Bryan Hoyle * * 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 @@ -127,7 +127,7 @@ char *it_msg = "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" -"\bgCopyright (c) 2010 Bryan Who? (New elements)\n" +"\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" "\n" "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" From b33438254d78377f10ccd10a10db590c80807962 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Aug 2010 12:12:29 +0100 Subject: [PATCH 016/237] Fixes to makefile and fixes error in particle_avg function. --- Makefile | 108 ++++++++++++++++++++++++++++--------------------------- powder.c | 2 +- 2 files changed, 56 insertions(+), 54 deletions(-) diff --git a/Makefile b/Makefile index 90fed1c77..3ea7ded60 100755 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ SOURCES := powder.c http.c md5.c update.c HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h -CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -fgnu89-inline +CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations LFLAGS := -lSDL -lm -lbz2 LFLAGS_MTW32 := -lpthreadGC2 @@ -10,79 +10,81 @@ MFLAGS_MT := -march=k8 -DX86 -DX86_SSE3 -DMT -msse3 MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE - +COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe powder: $(SOURCES) $(HEADERS) - gcc -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + $(COMPILER) -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 powder-sse3: $(SOURCES) $(HEADERS) - gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 + strip $@ powder-mt: $(SOURCES) $(HEADERS) - gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -DLIN32 + strip $@ powder-sse2: $(SOURCES) $(HEADERS) - gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) +$(MFLAGS_SSE2) $(SOURCES) -DLIN32 + strip $@ powder-sse: $(SOURCES) $(HEADERS) - gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 + strip $@ powder-64-sse3: $(SOURCES) $(HEADERS) - gcc -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 - strip $@ + $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 powder-64-sse2: $(SOURCES) $(HEADERS) - gcc -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 - strip $@ + $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 + strip $@ powder-res.o: powder-res.rc powder.ico - i586-mingw32msvc-windres powder-res.rc powder-res.o + i586-mingw32msvc-windres powder-res.rc powder-res.o powder-sse3.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-mt.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_MT) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS_MTW32) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_MT) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS_MTW32) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-sse2.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) +powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-sse.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-x: $(SOURCES) $(HEADERS) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa - strip $@ + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa + strip $@ powder-x-mt: $(SOURCES) $(HEADERS) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa powder-src.tar.bz2: *.c *.h *.rc *.ico Makefile - mkdir powder-src - cp *.c *.h *.rc *.ico Makefile powder-src/ - tar cfj powder-src.tar.bz2 powder-src - rm -rf powder-src + mkdir powder-src + cp *.c *.h *.rc *.ico Makefile powder-src/ + tar cfj powder-src.tar.bz2 powder-src + rm -rf powder-src release: $(LINUX_TARG) $(WIN32_TARG) powder-src.tar.bz2 - tar cfz powder-linux.tar.gz $(LINUX_TARG) - cp /usr/i586-mingw32msvc/bin/SDL.dll . - zip powder-win32.zip $(WIN32_TARG) SDL.dll - mkdir -p release - mv powder-linux.tar.gz release/ - mv powder-win32.zip release/ - mv powder-src.tar.bz2 release/ - cp powder-sse.exe powder.exe - rm -f release/powder.zip - zip release/powder.zip powder.exe SDL.dll - cp powder-64-sse2 release/powder64 - rm -f release/powder64.gz - gzip release/powder64 - rm -f release/powder.gz - cp powder-sse release/powder - gzip release/powder - cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. - rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe + tar cfz powder-linux.tar.gz $(LINUX_TARG) + cp /usr/i586-mingw32msvc/bin/SDL.dll . + zip powder-win32.zip $(WIN32_TARG) SDL.dll + mkdir -p release + mv powder-linux.tar.gz release/ + mv powder-win32.zip release/ + mv powder-src.tar.bz2 +release/ + cp powder-sse.exe powder.exe + rm -f release/powder.zip + zip release/powder.zip powder.exe SDL.dll + cp powder-64-sse2 release/powder64 + rm -f release/powder64.gz + gzip release/powder64 + rm -f release/powder.gz + cp powder-sse release/powder + gzip release/powder + cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. + rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe \ No newline at end of file diff --git a/powder.c b/powder.c index 1b77a8af3..f8a9baa69 100755 --- a/powder.c +++ b/powder.c @@ -1099,7 +1099,7 @@ void set_emap(int x, int y) } int parts_avg(int ci, int ni){ int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; - return parts[(pmr>>8>=PT_NUM)?PT_NONE:pmr>>8].type; + return parts[(pmr>>8>=NPART)?PT_NONE:pmr>>8].type; } int nearest_part(int ci, int t){ int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); From ab8f1ff8edcba965acfab6554daf5b41ab5aa457 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Aug 2010 13:48:32 +0100 Subject: [PATCH 017/237] Fix makefile --- Makefile | 104 +++++++++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/Makefile b/Makefile index 3ea7ded60..9d8360f45 100755 --- a/Makefile +++ b/Makefile @@ -15,76 +15,74 @@ LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe powder: $(SOURCES) $(HEADERS) - $(COMPILER) -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + $(COMPILER) -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 powder-sse3: $(SOURCES) $(HEADERS) - $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 + strip $@ powder-mt: $(SOURCES) $(HEADERS) - $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -DLIN32 + strip $@ powder-sse2: $(SOURCES) $(HEADERS) - $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) -$(MFLAGS_SSE2) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN32 + strip $@ powder-sse: $(SOURCES) $(HEADERS) - $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 - strip $@ + $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 + strip $@ powder-64-sse3: $(SOURCES) $(HEADERS) - $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + strip $@ powder-64-sse2: $(SOURCES) $(HEADERS) - $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 - strip $@ + $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 + strip $@ powder-res.o: powder-res.rc powder.ico - i586-mingw32msvc-windres powder-res.rc powder-res.o + i586-mingw32msvc-windres powder-res.rc powder-res.o powder-sse3.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-mt.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_MT) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS_MTW32) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_MT) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS_MTW32) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-sse2.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) -powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-sse.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ powder-x: $(SOURCES) $(HEADERS) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa - strip $@ + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa + strip $@ powder-x-mt: $(SOURCES) $(HEADERS) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa powder-src.tar.bz2: *.c *.h *.rc *.ico Makefile - mkdir powder-src - cp *.c *.h *.rc *.ico Makefile powder-src/ - tar cfj powder-src.tar.bz2 powder-src - rm -rf powder-src + mkdir powder-src + cp *.c *.h *.rc *.ico Makefile powder-src/ + tar cfj powder-src.tar.bz2 powder-src + rm -rf powder-src release: $(LINUX_TARG) $(WIN32_TARG) powder-src.tar.bz2 - tar cfz powder-linux.tar.gz $(LINUX_TARG) - cp /usr/i586-mingw32msvc/bin/SDL.dll . - zip powder-win32.zip $(WIN32_TARG) SDL.dll - mkdir -p release - mv powder-linux.tar.gz release/ - mv powder-win32.zip release/ - mv powder-src.tar.bz2 -release/ - cp powder-sse.exe powder.exe - rm -f release/powder.zip - zip release/powder.zip powder.exe SDL.dll - cp powder-64-sse2 release/powder64 - rm -f release/powder64.gz - gzip release/powder64 - rm -f release/powder.gz - cp powder-sse release/powder - gzip release/powder - cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. - rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe \ No newline at end of file + tar cfz powder-linux.tar.gz $(LINUX_TARG) + cp /usr/i586-mingw32msvc/bin/SDL.dll ./ + zip powder-win32.zip $(WIN32_TARG) SDL.dll + mkdir -p release + mv powder-linux.tar.gz release/ + mv powder-win32.zip release/ + mv powder-src.tar.bz2 release/ + cp powder-sse.exe powder.exe + rm -f release/powder.zip + zip release/powder.zip powder.exe SDL.dll + cp powder-64-sse2 release/powder64 + rm -f release/powder64.gz + gzip release/powder64 + rm -f release/powder.gz + cp powder-sse release/powder + gzip release/powder + cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. + rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe \ No newline at end of file From d215842080aaf21003879edeed6151387412fa9d Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Aug 2010 18:06:14 +0100 Subject: [PATCH 018/237] Stickman - courtesy of savask --- powder.c | 680 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 596 insertions(+), 84 deletions(-) diff --git a/powder.c b/powder.c index f8a9baa69..3b4dfac17 100755 --- a/powder.c +++ b/powder.c @@ -550,9 +550,10 @@ struct menu_section msections[] = { #define PT_NBLE 52 #define PT_BTRY 53 #define PT_LCRY 54 -#define PT_SWCH 55 -#define PT_SMKE 56 -#define PT_NUM 57 +#define PT_STKM 55 +#define PT_SWCH 56 +#define PT_SMKE 57 +#define PT_NUM 58 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -614,6 +615,7 @@ const struct part_type ptypes[] = { {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 0, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, }; @@ -679,6 +681,7 @@ const struct part_state pstates[] = { /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2000.0f}, /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; @@ -687,66 +690,67 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = { /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L */ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C */ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r */ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0}, + /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1}, + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, }; @@ -759,6 +763,8 @@ typedef struct { int flags; } particle; particle *parts; +float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index +int isplayer = 0; //It shows is player spawned or not void menu_count(void){ int i=0; @@ -802,6 +808,11 @@ int try_move(int i, int x, int y, int nx, int ny) } return 0; } + + if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide + { + return 1; + } if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]){ return 1; @@ -934,14 +945,19 @@ int create_part(int p, int x, int y, int t) } else i = p; - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; + if(t!=PT_STKM) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[t].heat; +#endif + } if(t==PT_ACID){ parts[i].life = 75; } @@ -983,7 +999,46 @@ int create_part(int p, int x, int y, int t) //} } - pmap[y][x] = t|(i<<8); + if(t!=PT_STKM) + pmap[y][x] = t|(i<<8); + else + { + if(isplayer==0) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = PT_STKM; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 100; + parts[i].ctype = 0; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[t].heat; +#endif + player[2] = PT_DUST; + player[3] = x-1; //Setting legs positions + player[4] = y+6; + player[5] = x-1; + player[6] = y+6; + + player[7] = x-3; + player[8] = y+12; + player[9] = x-3; + player[10] = y+12; + + player[11] = x+1; + player[12] = y+6; + player[13] = x+1; + player[14] = y+6; + + player[15] = x+3; + player[16] = y+12; + player[17] = x+3; + player[18] = y+12; + + isplayer = 1; + } + } return i; } @@ -1016,6 +1071,55 @@ void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } +int sign(float i) //Signum function +{ + if (i<0) + return -1; + if (i>0) + return 1; + return 0; +} + +void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line +{ + int dx, dy, i, sx, sy, check, e, x, y; + + dx = abs(x1-x2); + dy = abs(y1-y2); + sx = sign(x2-x1); + sy = sign(y2-y1); + x = x1; + y = y1; + check = 0; + + if (dy>dx) + { + dx = dx+dy; + dy = dx-dy; + dx = dx-dy; + check = 1; + } + + e = (dy<<2)-dx; + for (i=0; i<=dx; i++) + { + vid[x+y*a] =PIXRGB(r, g, b); + if (e>=0) + { + if (check==1) + x = x+sx; + else + y = y+sy; + e = e-(dx<<2); + } + if (check==1) + y = y+sy; + else + x = x+sx; + e = e+(dy<<2); + } +} + void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; @@ -1099,7 +1203,11 @@ void set_emap(int x, int y) } int parts_avg(int ci, int ni){ int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; - return parts[(pmr>>8>=NPART)?PT_NONE:pmr>>8].type; + if((pmr>>8)>8].type; + } else { + return PT_NONE; + } } int nearest_part(int ci, int t){ int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); @@ -1122,7 +1230,7 @@ int nearest_part(int ci, int t){ void create_line(int x1, int y1, int x2, int y2, int r, int c); void update_particles_i(pixel *vid, int start, int inc){ int i, j, x, y, t, nx, ny, r, a, cr,cg,cb, s, rt, fe, nt, lpv, nearp, pavg; - float mv, dx, dy, ix, iy, lx, ly; + float mv, dx, dy, ix, iy, lx, ly, d, pp; float pt = R_TEMP; float c_heat = 0.0f; int h_count = 0; @@ -1137,7 +1245,7 @@ void update_particles_i(pixel *vid, int start, int inc){ if(sys_pause) goto justdraw; - if(parts[i].life && t!=PT_ACID && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH) { + if(parts[i].life && t!=PT_ACID && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; if(parts[i].life<=0 && t!=PT_WIRE && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY) { @@ -1169,14 +1277,14 @@ void update_particles_i(pixel *vid, int start, int inc){ if(x<0 || y<0 || x>=XRES || y>=YRES || - bmap[y/CELL][x/CELL]==1 || + ((bmap[y/CELL][x/CELL]==1 || bmap[y/CELL][x/CELL]==8 || bmap[y/CELL][x/CELL]==9 || (bmap[y/CELL][x/CELL]==2) || (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) { + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) { kill_part(i); continue; } @@ -1837,6 +1945,316 @@ void update_particles_i(pixel *vid, int start, int inc){ continue; } + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; + + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } + + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; + + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; + + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; + + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; + + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; player[10] += 2; player[5] += 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; player[18] += 2; player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; player[10] += 1; player[5] += 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; player[18] += 1; player[13] +=1; + } + } + } + + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; player[10] += 2; player[5] -= 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; player[18] += 2; player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; player[10] += 1; player[5] -= 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; player[18] += 1; player[13] -= 1; + } + + } + } + + //Searching for particles near head + //r = 10; + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(pmap[ny+y][nx+x] && (pmap[ny+y][nx+x]&0xFF)!=0xFF + && pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID + //&& (abs(nx-x)+abs(ny-y))>8); + } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } + + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); + + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + if(pstates[pmap[ny][nx]&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + parts[pmap[ny][nx]>>8].vx = parts[pmap[ny][nx]>>8].vx + 5*((((int)player[1])&0x02) == 0x02) + - 5*(((int)(player[1])&0x01) == 0x01); + } + } + + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; player[10] += 1; player[18] += 1; + } + + } + + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; player[4] += (player[4]-player[8])*d; + + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; player[12] += (player[12]-player[16])*d; + + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; player[4] += (player[4]-parts[i].y)*d; + + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; player[12] += (player[12]-parts[i].y)*d; + + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; + + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } + + //Collision checks + for(ny = 0; ny<=2+(int)parts[i].vy; ny++) + { + r = pmap[(int)(player[8]-ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] -= ny+1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } + + r = pmap[(int)(player[16]-ny)][(int)(player[15]+0.5)]; + + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] -= ny+1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } + + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } + + } + + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } + + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } + + //If legs touch something + r = pmap[(int)(player[8]+1.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && (r&0xFF)!=0xFF) //If on charge + { + parts[i].life -= (int)(rand()/1000)+38; + } + + if ((r&0xFF)!=0xFF) //If hot + { + if(parts[r>>8].temp>=50) + { + parts[i].life -= 5; + player[16] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + r = pmap[(int)(player[16]+1.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && (r&0xFF)!=0xFF) //If on charge + { + parts[i].life -= (int)(rand()/1000)+38; + } + + if((r&0xFF)!=0xFF) //If hot + { + if(parts[r>>8].temp>=50) + { + parts[i].life -= 5; + player[8] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } + if(t==PT_CLNE) { if(!parts[i].ctype) { for(nx=-1; nx<2; nx++) @@ -1844,7 +2262,7 @@ void update_particles_i(pixel *vid, int start, int inc){ if(x+nx>=0 && y+ny>0 && x+nx255) parts[i].life = 255; if(parts[i].life<47) parts[i].life = 48; @@ -2296,6 +2732,7 @@ void update_particles(pixel *vid) pthread_t *InterThreads; #endif + isplayer = 0; //Needed for player spawning memset(pmap, 0, sizeof(pmap)); r = rand()%2; for(j=0; j= PT_NUM) goto corrupt; - if(j) { + if(j && !(isplayer == 1 && j==PT_STKM)) { if(pmap[y][x]) { k = pmap[y][x]>>8; parts[k].type = j; @@ -3270,6 +3739,31 @@ int parse_save(void *save, int size, int replace, int x0, int y0) if(i < NPART) { parts[i].vx = (d[p++]-127.0f)/16.0f; parts[i].vy = (d[p++]-127.0f)/16.0f; + if(parts[i].type == PT_STKM) + { + player[2] = PT_DUST; + + player[3] = parts[i].x-1; //Setting legs positions + player[4] = parts[i].y+6; + player[5] = parts[i].x-1; + player[6] = parts[i].y+6; + + player[7] = parts[i].x-3; + player[8] = parts[i].y+12; + player[9] = parts[i].x-3; + player[10] = parts[i].y+12; + + player[11] = parts[i].x+1; + player[12] = parts[i].y+6; + player[13] = parts[i].x+1; + player[14] = parts[i].y+6; + + player[15] = parts[i].x+3; + player[16] = parts[i].y+12; + player[17] = parts[i].x+3; + player[18] = parts[i].y+12; + + } } else p += 2; } @@ -3463,7 +3957,25 @@ pixel *prerender_save(void *save, int size, int *width, int *height) goto corrupt; j=d[p++]; if(j0) - fb[y*w+x] = ptypes[j].pcolors; + { + if(j==PT_STKM) //Stickman should be drawed another way + { + //Stickman drawing + for(k=-2; k<=1; k++) + { + fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); + fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); + fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); + fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); + } + draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); + draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); + draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); + draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); + } + else + fb[y*w+x] = ptypes[j].pcolors; + } } free(d); @@ -8349,4 +8861,4 @@ int main(int argc, char *argv[]) http_done(); return 0; -} \ No newline at end of file +} From 51c8a487bb6a69f157997a621d521ff2f59a9625 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Aug 2010 19:15:20 +0100 Subject: [PATCH 019/237] Fix Stickman crashes, update version number --- powder.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/powder.c b/powder.c index 3b4dfac17..5ac8e3307 100755 --- a/powder.c +++ b/powder.c @@ -2060,6 +2060,8 @@ void update_particles_i(pixel *vid, int start, int inc){ for(nx = -2; nx <= 2; nx++) for(ny = 0; ny>=-2; ny--) { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; if(pmap[ny+y][nx+x] && (pmap[ny+y][nx+x]&0xFF)!=0xFF && pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID //&& (abs(nx-x)+abs(ny-y))>8)>8)>8)>8)>8)>8].temp>=50) { @@ -2232,12 +2237,12 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].life -= 1; r = pmap[(int)(player[16]+1.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && (r&0xFF)!=0xFF) //If on charge + if((r&0xFF)==PT_SPRK && r && (r>>8)>8)>8].temp>=50) { @@ -2262,7 +2267,8 @@ void update_particles_i(pixel *vid, int start, int inc){ if(x+nx>=0 && y+ny>0 && x+nx Date: Wed, 11 Aug 2010 20:40:24 +0100 Subject: [PATCH 020/237] Fixes stickman wall bug and version number --- powder.c | 4 ++-- version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/powder.c b/powder.c index 5ac8e3307..deb023934 100755 --- a/powder.c +++ b/powder.c @@ -2151,7 +2151,7 @@ void update_particles_i(pixel *vid, int start, int inc){ r = pmap[(int)(player[8]-ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) //For left leg - if (r && (r>>8)>8) Date: Thu, 12 Aug 2010 19:11:32 +0100 Subject: [PATCH 021/237] Bugfixes for Switch and Stickman, enable Smoke, Speed improvements for search --- powder.c | 166 +++++++++++++++++++++++++++++++++++++----------------- version.h | 2 +- 2 files changed, 114 insertions(+), 54 deletions(-) diff --git a/powder.c b/powder.c index deb023934..1bda64d82 100755 --- a/powder.c +++ b/powder.c @@ -3,7 +3,6 @@ * * Copyright (c) 2008 - 2010 Stanislaw Skowronek. * Copyright (c) 2010 Simon Robertshaw - * Copyright (c) 2010 Skresanov Savely * Copyright (c) 2010 Bryan Hoyle * * This program is free software; you can redistribute it and/or modify @@ -598,7 +597,7 @@ const struct part_type ptypes[] = { {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 2, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f, 255, "Black hole, sucks in other particles and heats up."}, {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f, 255, "White hole, pushes other particles away."}, {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, @@ -760,6 +759,7 @@ typedef struct { int life, ctype; float x, y, vx, vy; float temp; + float pavg[2]; int flags; } particle; particle *parts; @@ -945,6 +945,9 @@ int create_part(int p, int x, int y, int t) } else i = p; + if(t==PT_GLAS){ + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + } if(t!=PT_STKM) { parts[i].x = (float)x; @@ -1203,7 +1206,7 @@ void set_emap(int x, int y) } int parts_avg(int ci, int ni){ int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; - if((pmr>>8)>8) < NPART && (pmr>>8) >= 0){ return parts[pmr>>8].type; } else { return PT_NONE; @@ -1400,8 +1403,15 @@ void update_particles_i(pixel *vid, int start, int inc){ } if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; - if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - t = parts[i].type = PT_BGLA; + //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + // t = parts[i].type = PT_BGLA; + if(t==PT_GLAS){ + parts[i].pavg[0] = parts[i].pavg[1]; + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f){ + parts[i].type = PT_BGLA; + } + } if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) t = parts[i].type = PT_SNOW; if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) { @@ -1802,14 +1812,16 @@ void update_particles_i(pixel *vid, int start, int inc){ if((r>>8)>=NPART || !r) continue; rt = parts[r>>8].type; + if(parts_avg(i,r>>8) != PT_INSL){ if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) { parts[r>>8].life = 4; parts[r>>8].ctype = rt; parts[r>>8].type = PT_SPRK; } } + } } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && @@ -1877,7 +1889,33 @@ void update_particles_i(pixel *vid, int start, int inc){ } } } + if(rt==PT_SWCH && t==PT_SPRK){ + if(parts[r>>8].life<10&&parts[r>>8].life>0) + parts[r>>8].life--; + pavg = parts_avg(r>>8, i); + if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) + parts[r>>8].life = 10; + if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) + parts[r>>8].life = 9; + if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].ctype = PT_SWCH; + parts[r>>8].life = 4; + } + } pavg = parts_avg(i, r>>8); + if(t==PT_SWCH&&pavg!= PT_INSL){ + if(parts[r>>8].type == PT_SWCH){ + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0){ + parts[i].life = 9; + } else if(parts[i].life==0&&parts[r>>8].life==10){ + parts[i].life = 10; + } + } + + } + pavg = parts_avg(i, r>>8); + if(pavg != PT_INSL){ if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ){ @@ -1926,6 +1964,7 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[r>>8].ctype = rt; } } + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) { parts[i].life = rand()%150+50; @@ -1940,6 +1979,7 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].life = 10; } } + } killed: if(parts[i].type == PT_NONE) continue; @@ -2054,6 +2094,12 @@ void update_particles_i(pixel *vid, int start, int inc){ } } + + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); //Searching for particles near head //r = 10; @@ -2094,17 +2140,16 @@ void update_particles_i(pixel *vid, int start, int inc){ { ny -= 2*(rand()%2)+1; r = pmap[ny][nx]; - if(r && (r>>8)>8].vx = parts[pmap[ny][nx]>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - - 5*(((int)(player[1])&0x01) == 0x01); + if(!((r>>8)>=NPART)){ + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + } } } @@ -2221,7 +2266,7 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].life -= (int)(rand()/1000)+38; } - if (r && (r>>8)0 && (r>>8)>8].temp>=50) { @@ -2242,7 +2287,7 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].life -= (int)(rand()/1000)+38; } - if(r && (r>>8)0 && (r>>8)>8].temp>=50) { @@ -2279,31 +2324,10 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].type = PT_NBLE; parts[i].life = 0; } - //if (t==PT_FIRE && parts[i].life <=1) - //{ - // parts[i].type = PT_SMKE; - // parts[i].life = 0; - //} - if(t==PT_SWCH) + if (t==PT_FIRE && parts[i].life <=1) { - for(nx=-2; nx<3; nx++){ - for(ny=-2; ny<3; ny++){ - r =pmap[y+ny][x+nx]; - pavg = parts_avg(i, r>>8); - if(parts[r>>8].type == PT_SPRK&&abs(nx)+abs(ny)<4) - { - if(parts[r>>8].ctype == PT_PSCN&&pavg != PT_INSL) - parts[i].life = 10; - if(parts[r>>8].ctype == PT_NSCN&&pavg != PT_INSL) - parts[i].life = 0; - if(!(parts[r>>8].ctype == PT_PSCN||parts[r>>8].ctype == PT_NSCN)&&parts[i].life == 10&&pavg != PT_INSL){ - parts[i].type = PT_SPRK; - parts[i].ctype = PT_SWCH; - parts[i].life = 4; - } - } - } - } + t = parts[i].type = PT_SMKE; + parts[i].life = rand()%20+250; } nx = (int)(parts[i].x+0.5f); @@ -2527,6 +2551,28 @@ void update_particles_i(pixel *vid, int start, int inc){ x = nx; y = ny; blendpixel(vid,x,y,17,217,24,255); + } else if(t==PT_SMKE) { + if(cmode == 3||cmode==4) { + x = nx/CELL; + y = ny/CELL; + cg = 10; + cb = 10; + cr = 10; + cg += fire_g[y][x]; if(cg > 50) cg = 50; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 50) cb = 50; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 50) cr = 50; fire_r[y][x] = cr; + } else { + for(x=-3;x<4;x++){ + for(y=-3;y<4;y++){ + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,100,100,100,30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,100,100,100,10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,100,100,100,20); + } + } + } } else if(t==PT_THDR) { if(cmode == 3||cmode==4) { vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; @@ -6724,6 +6770,8 @@ int search_ui(pixel *vid_buf) { int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + int thumb_drawn[GRID_X*GRID_Y]; + pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); float ry; time_t http_last_use=HTTP_TIMEOUT; ui_edit ed; @@ -6744,17 +6792,21 @@ int search_ui(pixel *vid_buf) void *thumb, *data; int thlen, dlen; + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + memset(img_http, 0, sizeof(img_http)); memset(img_id, 0, sizeof(img_id)); memset(search_ids, 0, sizeof(search_ids)); memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); memset(search_publish, 0, sizeof(search_publish)); memset(search_owners, 0, sizeof(search_owners)); memset(search_thumbs, 0, sizeof(search_thumbs)); memset(search_thsizes, 0, sizeof(search_thsizes)); + + memset(thumb_drawn, 0, sizeof(thumb_drawn)); do_open = 0; @@ -6789,9 +6841,11 @@ int search_ui(pixel *vid_buf) mmt = 0; else if(mmt=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) mp = pos; @@ -7150,9 +7206,9 @@ int search_ui(pixel *vid_buf) goto finish; } - if(!last) + if(!last){ search = 1; - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) { + } else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) { search = 1; if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) { search_page = 0; @@ -7194,6 +7250,7 @@ int search_ui(pixel *vid_buf) } if(search_date) strcaturl(uri, " sort:date"); + http = http_async_req_start(http, uri, NULL, 0, 1); if(svf_login){ http_auth_headers(http, svf_user, svf_pass); @@ -7206,8 +7263,11 @@ int search_ui(pixel *vid_buf) http_last_use = time(NULL); results = http_async_req_stop(http, &status, NULL); view_own = last_own; - if(status == 200) + if(status == 200){ page_count = search_results(results, last_own||svf_admin||svf_mod); + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + } is_p1 = (exp_res < GRID_X*GRID_Y); free(results); active = 0; @@ -8684,7 +8744,7 @@ int main(int argc, char *argv[]) } else if((sdl_mod & (KMOD_LALT||KMOD_RALT)) || b==SDL_BUTTON_MIDDLE){ if(y>0 && y0 && x>8)>=NPART || !cr)){ c = sl = cr&0xFF; } else { @@ -8867,4 +8927,4 @@ int main(int argc, char *argv[]) http_done(); return 0; -} +} \ No newline at end of file diff --git a/version.h b/version.h index 872531ac4..4bb0d658d 100755 --- a/version.h +++ b/version.h @@ -21,7 +21,7 @@ #define VERSION_H #define SAVE_VERSION 40 -#define MINOR_VERSION 2 +#define MINOR_VERSION 3 #define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. #define MENUV3 From c93561a2e5c4f04aef524e4e846474a379b46321 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 12 Aug 2010 19:22:43 +0100 Subject: [PATCH 022/237] Bugfixes for Switch and Stickman, enable Smoke, Speed improvements for search --- powder.c | 1 + 1 file changed, 1 insertion(+) diff --git a/powder.c b/powder.c index 1bda64d82..90b11be12 100755 --- a/powder.c +++ b/powder.c @@ -3,6 +3,7 @@ * * Copyright (c) 2008 - 2010 Stanislaw Skowronek. * Copyright (c) 2010 Simon Robertshaw + * Copyright (c) 2010 Skresanov Savely * Copyright (c) 2010 Bryan Hoyle * * This program is free software; you can redistribute it and/or modify From 1a629e91004f504098c8f30733b18d9c8f2f2b75 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 12 Aug 2010 20:10:59 +0100 Subject: [PATCH 023/237] Switch fix --- powder.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/powder.c b/powder.c index 90b11be12..a09af367d 100755 --- a/powder.c +++ b/powder.c @@ -1823,6 +1823,11 @@ void update_particles_i(pixel *vid, int start, int inc){ } } if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) { + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && @@ -1891,8 +1896,6 @@ void update_particles_i(pixel *vid, int start, int inc){ } } if(rt==PT_SWCH && t==PT_SPRK){ - if(parts[r>>8].life<10&&parts[r>>8].life>0) - parts[r>>8].life--; pavg = parts_avg(r>>8, i); if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) parts[r>>8].life = 10; @@ -1903,17 +1906,6 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[r>>8].ctype = PT_SWCH; parts[r>>8].life = 4; } - } - pavg = parts_avg(i, r>>8); - if(t==PT_SWCH&&pavg!= PT_INSL){ - if(parts[r>>8].type == PT_SWCH){ - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0){ - parts[i].life = 9; - } else if(parts[i].life==0&&parts[r>>8].life==10){ - parts[i].life = 10; - } - } - } pavg = parts_avg(i, r>>8); if(pavg != PT_INSL){ @@ -1977,7 +1969,7 @@ void update_particles_i(pixel *vid, int start, int inc){ if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) { parts[i].type = PT_SWCH; - parts[i].life = 10; + parts[i].life = 11; } } } From 7433c2767e514f16bf46a365d68704fae257d518 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 12 Aug 2010 20:21:00 +0100 Subject: [PATCH 024/237] More Switch fix --- powder.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/powder.c b/powder.c index a09af367d..ce4549c6b 100755 --- a/powder.c +++ b/powder.c @@ -1895,6 +1895,16 @@ void update_particles_i(pixel *vid, int start, int inc){ } } } + pavg = parts_avg(i, r>>8); + if(t==PT_SWCH&&pavg!= PT_INSL){ + if(parts[r>>8].type == PT_SWCH){ + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0){ + parts[i].life = 9; + } else if(parts[i].life==0&&parts[r>>8].life==10){ + parts[i].life = 10; + } + } + } if(rt==PT_SWCH && t==PT_SPRK){ pavg = parts_avg(r>>8, i); if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) From c77c550eac5dc4cc8538b778be57fbf1be5cbe6d Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 13 Aug 2010 12:02:24 +0100 Subject: [PATCH 025/237] Fix stickman spawning bug, allows INSL to burn --- powder.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/powder.c b/powder.c index ce4549c6b..8f9c6e807 100755 --- a/powder.c +++ b/powder.c @@ -598,7 +598,7 @@ const struct part_type ptypes[] = { {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f, 255, "Black hole, sucks in other particles and heats up."}, {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f, 255, "White hole, pushes other particles away."}, {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, @@ -2151,6 +2151,8 @@ void update_particles_i(pixel *vid, int start, int inc){ else { create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)||(r>>8)<0) parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); } } From e02d78c85d41bb8add66e80a84f8b7b3e3270033 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 13 Aug 2010 12:15:07 +0100 Subject: [PATCH 026/237] Fixes my tragic attempt at logic. --- powder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index 8f9c6e807..5a34b56f4 100755 --- a/powder.c +++ b/powder.c @@ -2152,8 +2152,8 @@ void update_particles_i(pixel *vid, int start, int inc){ { create_part(-1, nx, ny, player[2]); r = pmap[ny][nx]; - if(!((r>>8)>=NPART)||(r>>8)<0) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if( ((r>>8) < NPART) && (r>>8)>=0 ) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); } } } From 48bfba2677292e4502b25f718d252ca009efce5e Mon Sep 17 00:00:00 2001 From: savask Date: Fri, 13 Aug 2010 19:09:24 +0800 Subject: [PATCH 027/237] Fixed bug with checking for dangerous particle near foot. Collide code a liitle more logical now. --- powder.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/powder.c b/powder.c index 5a34b56f4..0d4a8f5ad 100755 --- a/powder.c +++ b/powder.c @@ -2196,9 +2196,9 @@ void update_particles_i(pixel *vid, int start, int inc){ } //Collision checks - for(ny = 0; ny<=2+(int)parts[i].vy; ny++) + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) { - r = pmap[(int)(player[8]-ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) //For left leg if (r && (r&0xFF)!=PT_STKM) @@ -2214,13 +2214,13 @@ void update_particles_i(pixel *vid, int start, int inc){ } else { - player[8] -= ny+1; + player[8] += ny-1; parts[i].vy -= 0.5*parts[i].vy; } player[9] = player[7]; } - r = pmap[(int)(player[16]-ny)][(int)(player[15]+0.5)]; + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; //For right leg if (r && (r&0xFF)!=PT_STKM) @@ -2236,7 +2236,7 @@ void update_particles_i(pixel *vid, int start, int inc){ } else { - player[16] -= ny+1; + player[16] += ny-1; parts[i].vy -= 0.5*parts[i].vy; } player[17] = player[15]; @@ -2265,7 +2265,7 @@ void update_particles_i(pixel *vid, int start, int inc){ } //If legs touch something - r = pmap[(int)(player[8]+1.5)][(int)(player[7]+0.5)]; + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; if((r&0xFF)==PT_SPRK && r && (r>>8)>8) Date: Fri, 13 Aug 2010 22:45:31 +0800 Subject: [PATCH 028/237] Added dynamic signs. {t} - temperature, {p} - pressure --- powder.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/powder.c b/powder.c index 0d4a8f5ad..4d49b41b8 100755 --- a/powder.c +++ b/powder.c @@ -7494,11 +7494,20 @@ int stamp_ui(pixel *vid_buf) void get_sign_pos(int i, int *x0, int *y0, int *w, int *h) { - *w = textwidth(signs[i].text) + 5; - *h = 14; - *x0 = (signs[i].ju == 2) ? signs[i].x - *w : - (signs[i].ju == 1) ? signs[i].x - *w/2 : signs[i].x; - *y0 = (signs[i].y > 18) ? signs[i].y - 18 : signs[i].y + 4; + //Changing width if sign have special content + if(strcmp(signs[i].text, "{p}")==0) + *w = textwidth("Pressure: -000.00"); + + if(strcmp(signs[i].text, "{t}")==0) + *w = textwidth("Temp: 0000.00"); + + //Ususal width + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + *w = textwidth(signs[i].text) + 5; + *h = 14; + *x0 = (signs[i].ju == 2) ? signs[i].x - *w : + (signs[i].ju == 1) ? signs[i].x - *w/2 : signs[i].x; + *y0 = (signs[i].y > 18) ? signs[i].y - 18 : signs[i].y + 4; } void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) @@ -7518,12 +7527,32 @@ void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) void render_signs(pixel *vid_buf) { int i, j, x, y, w, h, dx, dy; + char buff[30]; //Buffer for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature + else + sprintf(buff, "Temp: 0.00"); //...tempirature + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + //Usual text + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); x = signs[i].x; y = signs[i].y; dx = 1 - signs[i].ju; From 5960855c328f09538bc04d95c11f1e16b1a3af8e Mon Sep 17 00:00:00 2001 From: savask Date: Sat, 14 Aug 2010 00:48:09 +0800 Subject: [PATCH 029/237] Fixed bugs with LN2. Now cold (-30) harms stick man. --- powder.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/powder.c b/powder.c index 4d49b41b8..c003ccd83 100755 --- a/powder.c +++ b/powder.c @@ -2042,7 +2042,8 @@ void update_particles_i(pixel *vid, int start, int inc){ //Go left if (((int)(player[0])&0x01) == 0x01) { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID) + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { @@ -2071,7 +2072,8 @@ void update_particles_i(pixel *vid, int start, int inc){ //Go right if (((int)(player[0])&0x02) == 0x02) { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID) + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { @@ -2111,13 +2113,10 @@ void update_particles_i(pixel *vid, int start, int inc){ { if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) continue; - if(pmap[ny+y][nx+x] && (pmap[ny+y][nx+x]&0xFF)!=0xFF - && pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID - //&& (abs(nx-x)+abs(ny-y))>8); } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) { parts[i].life -= (102-parts[i].life)/2; @@ -2203,7 +2203,7 @@ void update_particles_i(pixel *vid, int start, int inc){ //For left leg if (r && (r&0xFF)!=PT_STKM) { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS) //Liquid checks + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks { if(parts[i].y<(player[8]-10)) parts[i].vy = 1; @@ -2225,7 +2225,7 @@ void update_particles_i(pixel *vid, int start, int inc){ //For right leg if (r && (r&0xFF)!=PT_STKM) { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS) + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) { if(parts[i].y<(player[16]-10)) parts[i].vy = 1; @@ -2271,11 +2271,11 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].life -= (int)(rand()/1000)+38; } - if (r>0 && (r>>8)0 && (r>>8)>8].temp>=50) + if(parts[r>>8].temp>=50 || parts[r>>8].temp<=-30) { - parts[i].life -= 5; + parts[i].life -= 2; player[16] -= 1; } } @@ -2292,11 +2292,11 @@ void update_particles_i(pixel *vid, int start, int inc){ parts[i].life -= (int)(rand()/1000)+38; } - if(r>0 && (r>>8)0 && (r>>8)>8].temp>=50) + if(parts[r>>8].temp>=50 || parts[r>>8].temp<=-30) { - parts[i].life -= 5; + parts[i].life -= 2; player[8] -= 1; } } From 854f10924d992d6b0b42150650760685a87c73a7 Mon Sep 17 00:00:00 2001 From: savask Date: Sat, 14 Aug 2010 01:11:03 +0800 Subject: [PATCH 030/237] Fixed WHOL and BHOL bug. --- powder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index c003ccd83..b9e362c6a 100755 --- a/powder.c +++ b/powder.c @@ -2107,13 +2107,13 @@ void update_particles_i(pixel *vid, int start, int inc){ set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); //Searching for particles near head - //r = 10; for(nx = -2; nx <= 2; nx++) for(ny = 0; ny>=-2; ny--) { if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM) + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) { player[2] = pmap[ny+y][nx+x]&0xFF; //Current element From 1a724d6f7fd8625986e47ccd13bfb45316c6e7ab Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Aug 2010 12:28:27 +0100 Subject: [PATCH 031/237] INSL burnable, pretty water vapour --- powder.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index b9e362c6a..a83c041d4 100755 --- a/powder.c +++ b/powder.c @@ -617,7 +617,7 @@ const struct part_type ptypes[] = { {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 0, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, }; #define ST_NONE 0 @@ -2575,7 +2575,29 @@ void update_particles_i(pixel *vid, int start, int inc){ blendpixel(vid,x+nx,y+ny,100,100,100,10); if (abs(x)+abs(y) == 2) blendpixel(vid,x+nx,y+ny,100,100,100,20); - } + } + } + } + } else if(t==PT_WTRV) { + if(cmode == 3||cmode==4) { + x = nx/CELL; + y = ny/CELL; + cg = PIXG(ptypes[t].pcolors)/3; + cb = PIXB(ptypes[t].pcolors)/3; + cr = PIXR(ptypes[t].pcolors)/3; + cg += fire_g[y][x]; if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; fire_r[y][x] = cr; + } else { + for(x=-3;x<4;x++){ + for(y=-3;y<4;y++){ + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); + } } } } else if(t==PT_THDR) { From 077fbb56ae234b5da54386805f4b77f938618dc2 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Aug 2010 12:54:56 +0100 Subject: [PATCH 032/237] Few changes to source and makefile --- Makefile | 5 ++++- powder.c | 16 ++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 9d8360f45..e5b5f9eae 100755 --- a/Makefile +++ b/Makefile @@ -10,12 +10,15 @@ MFLAGS_MT := -march=k8 -DX86 -DX86_SSE3 -DMT -msse3 MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE +FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lpthread -lbz2 COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe powder: $(SOURCES) $(HEADERS) $(COMPILER) -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 +powder-debug: $(SOURCES) $(HEADERS) + $(COMPILER) -m64 -o$@ $(FLAGS_DBUG) -DLIN64 $(SOURCES) powder-sse3: $(SOURCES) $(HEADERS) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 @@ -57,7 +60,7 @@ powder-sse.exe: $(SOURCES) $(HEADERS) powder-res.o strip $@ chmod 0644 $@ powder-x: $(SOURCES) $(HEADERS) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -ggdb strip $@ powder-x-mt: $(SOURCES) $(HEADERS) gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa diff --git a/powder.c b/powder.c index a83c041d4..6ef760837 100755 --- a/powder.c +++ b/powder.c @@ -328,7 +328,7 @@ void *update_air_th(void *arg) return NULL; } -unsigned clamp_flt(float f, float min, float max) +inline unsigned clamp_flt(float f, float min, float max) { if(fmax) @@ -871,7 +871,7 @@ void kill_part(int i) pfree = i; } -int create_part(int p, int x, int y, int t) +inline int create_part(int p, int x, int y, int t) { int i; @@ -1061,7 +1061,7 @@ void delete_part(int x, int y) pmap[y][x] = 0; // just in case } -void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) @@ -1205,7 +1205,7 @@ void set_emap(int x, int y) set_emap(x, y+1); } } -int parts_avg(int ci, int ni){ +inline int parts_avg(int ci, int ni){ int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; if((pmr>>8) < NPART && (pmr>>8) >= 0){ return parts[pmr>>8].type; @@ -3457,7 +3457,7 @@ void *build_thumb(int *size, int bzip2) return d; } -void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) { unsigned char *d,*c=thumb; @@ -4339,7 +4339,7 @@ void del_stamp(int d) #include "font.h" -void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) @@ -4353,7 +4353,7 @@ void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } -int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) { int i, j, w, bn = 0, ba = 0; char *rp = font_data + font_ptrs[c]; From 08a1f64d20726eba11a71296183b11dab2c6dc03 Mon Sep 17 00:00:00 2001 From: savask Date: Sun, 15 Aug 2010 21:08:42 +0800 Subject: [PATCH 033/237] Stick man HP now is visible if mouse is in his head. --- powder.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 6ef760837..5d223c91f 100755 --- a/powder.c +++ b/powder.c @@ -2468,6 +2468,16 @@ void update_particles_i(pixel *vid, int start, int inc){ if(cmode!=CM_HEAT){ if(t==PT_STKM) //Just draw head here { + char buff[10]; //Buffer for HP + int mx, my; //Mouse position + + SDL_GetMouseState(&mx, &my); //Get mouse state for check + if(mx>(nx-3) && mx<(nx+3) && my<(ny+3) && my>(ny-3)) + { + sprintf(buff, "%3d", (int)parts[i].life); + drawtext(vid, mx-8-2*(parts[i].life<100)-2*(parts[i].life<10), my-12, buff, 255, 255, 255, 255); + } + for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p { s = XRES+BARSIZE; @@ -3510,7 +3520,7 @@ int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int p g += PIXG(ptypes[t].pcolors); b += PIXB(ptypes[t].pcolors); a ++; - } + } } if(a) { a = 256/a; @@ -3518,6 +3528,7 @@ int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int p g = (g*a)>>8; b = (b*a)>>8; } + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); sx++; } From 47189f6c163d7b21a0f2b362ad50f9489ec088fe Mon Sep 17 00:00:00 2001 From: savask Date: Mon, 16 Aug 2010 01:01:20 +0800 Subject: [PATCH 034/237] Now stick man is visible in heat view. Bug with zoom fixed. Added 2 variables: mousex and mousey. They hold cursor position. --- powder.c | 65 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/powder.c b/powder.c index 5d223c91f..6c0415a12 100755 --- a/powder.c +++ b/powder.c @@ -766,6 +766,7 @@ typedef struct { particle *parts; float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index int isplayer = 0; //It shows is player spawned or not +int mousex, mousey = 0; //They contain mouse position void menu_count(void){ int i=0; @@ -2469,27 +2470,25 @@ void update_particles_i(pixel *vid, int start, int inc){ if(t==PT_STKM) //Just draw head here { char buff[10]; //Buffer for HP - int mx, my; //Mouse position - SDL_GetMouseState(&mx, &my); //Get mouse state for check - if(mx>(nx-3) && mx<(nx+3) && my<(ny+3) && my>(ny-3)) + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head { - sprintf(buff, "%3d", (int)parts[i].life); - drawtext(vid, mx-8-2*(parts[i].life<100)-2*(parts[i].life<10), my-12, buff, 255, 255, 255, 255); + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); } for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; - vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; - vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; - vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; - } - draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); - draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); - draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); - draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; + vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; + vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; + vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; + } + draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); + draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); + draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); + draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); isplayer = 1; //It's a secret. Tssss... } @@ -2767,8 +2766,35 @@ void update_particles_i(pixel *vid, int start, int inc){ uint8 R = color_data[caddress]; uint8 G = color_data[caddress+1]; uint8 B = color_data[caddress+2]; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); + + if(t==PT_STKM) //Stick man should be visible in heat mode + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); + vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); + vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); + vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); + } + draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); + draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); + draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); + draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + } + else + { + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } } if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID){ uint8 R = PIXR(ptypes[t].pcolors); @@ -8860,7 +8886,10 @@ int main(int argc, char *argv[]) } if(zoom_en!=1 && !load_mode && !save_mode) + { render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + mousex = mx/sdl_scale; mousey = my/sdl_scale; + } if(zoom_en) render_zoom(vid_buf); From 13e71cee6d60b692fb057ede892330a4082c3447 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Aug 2010 21:35:40 +0100 Subject: [PATCH 035/237] Particle Flags, Removed some HEAT_ENABLES --- powder.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/powder.c b/powder.c index 6c0415a12..f8d7f86c8 100755 --- a/powder.c +++ b/powder.c @@ -395,6 +395,7 @@ struct part_type { float heat; unsigned char hconduct; const char *descs; + unsigned char props; }; struct part_state { @@ -558,6 +559,13 @@ struct menu_section msections[] = { #define R_TEMP 22 #define MAX_TEMP 3500 #define MIN_TEMP -273 + +static unsigned char TYPE_PART = 0b0001 << 4; +static unsigned char TYPE_LIQUID = 0b0010 << 4; +static unsigned char TYPE_SOLID = 0b0100 << 4; +static unsigned char TYPE_GAS = 0b1000 << 4; +static unsigned char PROP_CONDUCTS = 0b0001 >> 4; + const struct part_type ptypes[] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, @@ -959,9 +967,7 @@ inline int create_part(int p, int x, int y, int t) parts[i].vy = 0; parts[i].life = 0; parts[i].ctype = 0; -#ifdef HEAT_ENABLE parts[i].temp = ptypes[t].heat; -#endif } if(t==PT_ACID){ parts[i].life = 75; @@ -1017,9 +1023,7 @@ inline int create_part(int p, int x, int y, int t) parts[i].vy = 0; parts[i].life = 100; parts[i].ctype = 0; -#ifdef HEAT_ENABLE parts[i].temp = ptypes[t].heat; -#endif player[2] = PT_DUST; player[3] = x-1; //Setting legs positions player[4] = y+6; From 3bc93478bb2ba0a8ffb2e976f4acd65e743c1a7c Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Aug 2010 21:38:35 +0100 Subject: [PATCH 036/237] props -> properties --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index f8d7f86c8..8d63d6fa2 100755 --- a/powder.c +++ b/powder.c @@ -395,7 +395,7 @@ struct part_type { float heat; unsigned char hconduct; const char *descs; - unsigned char props; + unsigned char properties; }; struct part_state { From c86c224265e9f1048e996f1461f10fa6782da065 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 05:05:08 +0800 Subject: [PATCH 037/237] added gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..c66d7cb2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.*.swp +powder-64-sse3 +powder.def +powder-debug +gmon.out From 6bd48d059f3c10c2a3a9e080e3bb91bebab283de Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 17:20:12 +0800 Subject: [PATCH 038/237] formatted source code --- font.h | 10 +- http.c | 1178 ++-- md5.c | 67 +- md5.h | 9 +- powder.c | 15589 +++++++++++++++++++++++++++++------------------------ update.c | 117 +- 6 files changed, 9311 insertions(+), 7659 deletions(-) mode change 100755 => 100644 font.h mode change 100755 => 100644 http.c mode change 100755 => 100644 md5.c mode change 100755 => 100644 md5.h mode change 100755 => 100644 powder.c mode change 100755 => 100644 update.c diff --git a/font.h b/font.h old mode 100755 new mode 100644 index 68ac6841b..ffed99506 --- a/font.h +++ b/font.h @@ -19,9 +19,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ #define FONT_H 10 -char font_data[] = { - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xcc, 0x00, 0x00, 0x0a, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xff, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x80, 0xff, 0x2f, 0xfc, 0xff, 0xc3, 0x07, 0x3d, 0x3c, 0xc0, 0xc3, 0x03, 0x3c, 0x7c, 0xd0, 0xc3, 0xff, 0x3f, 0xf8, 0xff, 0x02, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, +char font_data[] = +{ + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xcc, 0x00, 0x00, 0x0a, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xff, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x80, 0xff, 0x2f, 0xfc, 0xff, 0xc3, 0x07, 0x3d, 0x3c, 0xc0, 0xc3, 0x03, 0x3c, 0x7c, 0xd0, 0xc3, 0xff, 0x3f, 0xf8, 0xff, 0x02, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, }; -short font_ptrs[] = { - 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, +short font_ptrs[] = +{ + 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, }; \ No newline at end of file diff --git a/http.c b/http.c old mode 100755 new mode 100644 index 74bafa29c..85ba9f0d4 --- a/http.c +++ b/http.c @@ -72,10 +72,11 @@ static struct sockaddr_in http_proxy; static char *mystrdup(char *s) { char *x; - if(s) { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; + if(s) + { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; } return s; } @@ -84,21 +85,22 @@ static int splituri(char *uri, char **host, char **path) { char *p=uri,*q,*x,*y; if(!strncmp(p, "http://", 7)) - p += 7; + p += 7; q = strchr(p, '/'); if(!q) - q = p + strlen(p); + q = p + strlen(p); x = malloc(q-p+1); if(*q) - y = mystrdup(q); + y = mystrdup(q); else - y = mystrdup("/"); + y = mystrdup("/"); strncpy(x, p, q-p); x[q-p] = 0; - if(q==p || x[q-p-1]==':') { - free(x); - free(y); - return 1; + if(q==p || x[q-p-1]==':') + { + free(x); + free(y); + return 1; } *host = x; *path = y; @@ -110,7 +112,7 @@ static char *getserv(char *host) char *q, *x = mystrdup(host); q = strchr(x, ':'); if(q) - *q = 0; + *q = 0; return x; } @@ -119,32 +121,35 @@ static char *getport(char *host) char *p, *q; q = strchr(host, ':'); if(q) - p = mystrdup(q+1); + p = mystrdup(q+1); else - p = mystrdup("80"); + p = mystrdup("80"); return p; } static int resolve(char *dns, char *srv, struct sockaddr_in *addr) { struct addrinfo hnt, *res = 0; - if(http_use_proxy) { - memcpy(addr, &http_proxy, sizeof(struct sockaddr_in)); - return 0; + if(http_use_proxy) + { + memcpy(addr, &http_proxy, sizeof(struct sockaddr_in)); + return 0; } memset(&hnt, 0, sizeof(hnt)); hnt.ai_family = AF_INET; hnt.ai_socktype = SOCK_STREAM; if(getaddrinfo(dns, srv, &hnt, &res)) - return 1; - if(res) { - if(res->ai_family != AF_INET) { - freeaddrinfo(res); - return 1; - } - memcpy(addr, res->ai_addr, res->ai_addrlen); - freeaddrinfo(res); - return 0; + return 1; + if(res) + { + if(res->ai_family != AF_INET) + { + freeaddrinfo(res); + return 1; + } + memcpy(addr, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + return 0; } return 1; } @@ -155,20 +160,21 @@ void http_init(char *proxy) #ifdef WIN32 WSADATA wsadata; if(!WSAStartup(MAKEWORD(2,2), &wsadata)) - http_up = 1; + http_up = 1; #else signal(SIGPIPE, SIG_IGN); http_up = 1; #endif - if(proxy) { - host = getserv(proxy); - port = getport(proxy); - if(resolve(host, port, &http_proxy)) - http_up = 0; - else - http_use_proxy = 1; - free(host); - free(port); + if(proxy) + { + host = getserv(proxy); + port = getport(proxy); + if(resolve(host, port, &http_proxy)) + http_up = 0; + else + http_use_proxy = 1; + free(host); + free(port); } } @@ -189,7 +195,8 @@ void http_done(void) #define HTS_XMIT 4 #define HTS_RECV 5 #define HTS_DONE 6 -struct http_ctx { +struct http_ctx +{ int state; time_t last; int keep; @@ -213,54 +220,63 @@ struct http_ctx { void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep) { struct http_ctx *cx = ctx; - if(!ctx) { - ctx = calloc(1, sizeof(struct http_ctx)); - cx = ctx; - cx->fd = PERROR; + if(!ctx) + { + ctx = calloc(1, sizeof(struct http_ctx)); + cx = ctx; + cx->fd = PERROR; } - if(!cx->hbuf) { - cx->hbuf = malloc(256); - cx->hlen = 256; + if(!cx->hbuf) + { + cx->hbuf = malloc(256); + cx->hlen = 256; } - if(!http_up) { - cx->ret = 604; - cx->state = HTS_DONE; - return ctx; + if(!http_up) + { + cx->ret = 604; + cx->state = HTS_DONE; + return ctx; } - if(cx->state!=HTS_STRT && cx->state!=HTS_IDLE) { - fprintf(stderr, "HTTP: unclean request restart state.\n"); - exit(1); + if(cx->state!=HTS_STRT && cx->state!=HTS_IDLE) + { + fprintf(stderr, "HTTP: unclean request restart state.\n"); + exit(1); } cx->keep = keep; cx->ret = 600; - if(splituri(uri, &cx->host, &cx->path)) { - cx->ret = 601; - cx->state = HTS_DONE; - return ctx; + if(splituri(uri, &cx->host, &cx->path)) + { + cx->ret = 601; + cx->state = HTS_DONE; + return ctx; } - if(http_use_proxy) { - free(cx->path); - cx->path = mystrdup(uri); + if(http_use_proxy) + { + free(cx->path); + cx->path = mystrdup(uri); } - if(cx->fdhost && strcmp(cx->host, cx->fdhost)) { - free(cx->fdhost); - cx->fdhost = NULL; - PCLOSE(cx->fd); - cx->fd = PERROR; - cx->state = HTS_STRT; + if(cx->fdhost && strcmp(cx->host, cx->fdhost)) + { + free(cx->fdhost); + cx->fdhost = NULL; + PCLOSE(cx->fd); + cx->fd = PERROR; + cx->state = HTS_STRT; } - if(data) { - if(!dlen) - dlen = strlen(data); - cx->txd = malloc(dlen); - memcpy(cx->txd, data, dlen); - cx->txdl = dlen; - } else - cx->txdl = 0; + if(data) + { + if(!dlen) + dlen = strlen(data); + cx->txd = malloc(dlen); + memcpy(cx->txd, data, dlen); + cx->txdl = dlen; + } + else + cx->txdl = 0; cx->contlen = 0; cx->chunked = 0; @@ -286,76 +302,92 @@ void http_async_add_header(void *ctx, char *name, char *data) static void process_header(struct http_ctx *cx, char *str) { char *p; - if(cx->chunkhdr) { - p = strchr(str, ';'); - if(p) - *p = 0; - cx->rxtogo = strtoul(str, NULL, 16); - cx->chunkhdr = 0; - if(!cx->rxtogo) - cx->chunked = 0; + if(cx->chunkhdr) + { + p = strchr(str, ';'); + if(p) + *p = 0; + cx->rxtogo = strtoul(str, NULL, 16); + cx->chunkhdr = 0; + if(!cx->rxtogo) + cx->chunked = 0; } - if(!str[0]) { - cx->rxtogo = cx->contlen; - cx->chunkhdr = cx->chunked; - if(!cx->contlen && !cx->chunked && cx->ret!=100) - cx->state = HTS_DONE; - return; + if(!str[0]) + { + cx->rxtogo = cx->contlen; + cx->chunkhdr = cx->chunked; + if(!cx->contlen && !cx->chunked && cx->ret!=100) + cx->state = HTS_DONE; + return; } - if(!strncmp(str, "HTTP/", 5)) { - p = strchr(str, ' '); - if(!p) { - cx->ret = 603; - cx->state = HTS_DONE; - return; - } - p++; - cx->ret = atoi(p); - return; + if(!strncmp(str, "HTTP/", 5)) + { + p = strchr(str, ' '); + if(!p) + { + cx->ret = 603; + cx->state = HTS_DONE; + return; + } + p++; + cx->ret = atoi(p); + return; } - if(!strncmp(str, "Content-Length: ", 16)) { - cx->contlen = atoi(str+16); - return; + if(!strncmp(str, "Content-Length: ", 16)) + { + cx->contlen = atoi(str+16); + return; } - if(!strcmp(str, "Transfer-Encoding: chunked")) { - cx->chunked = 1; - return; + if(!strcmp(str, "Transfer-Encoding: chunked")) + { + cx->chunked = 1; + return; } - if(!strcmp(str, "Connection: close")) { - cx->cclose = 1; - return; + if(!strcmp(str, "Connection: close")) + { + cx->cclose = 1; + return; } } static void process_byte(struct http_ctx *cx, char ch) { - if(cx->rxtogo) { - cx->rxtogo--; + if(cx->rxtogo) + { + cx->rxtogo--; - if(!cx->rbuf) { - cx->rbuf = malloc(256); - cx->rlen = 256; - } - if(cx->rptr >= cx->rlen-1) { - cx->rlen *= 2; - cx->rbuf = realloc(cx->rbuf, cx->rlen); - } - cx->rbuf[cx->rptr++] = ch; + if(!cx->rbuf) + { + cx->rbuf = malloc(256); + cx->rlen = 256; + } + if(cx->rptr >= cx->rlen-1) + { + cx->rlen *= 2; + cx->rbuf = realloc(cx->rbuf, cx->rlen); + } + cx->rbuf[cx->rptr++] = ch; - if(!cx->rxtogo && !cx->chunked) - cx->state = HTS_DONE; - } else { - if(ch == '\n') { - cx->hbuf[cx->hptr] = 0; - process_header(cx, cx->hbuf); - cx->hptr = 0; - } else if(ch != '\r') { - if(cx->hptr >= cx->hlen-1) { - cx->hlen *= 2; - cx->hbuf = realloc(cx->hbuf, cx->hlen); - } - cx->hbuf[cx->hptr++] = ch; - } + if(!cx->rxtogo && !cx->chunked) + cx->state = HTS_DONE; + } + else + { + if(ch == '\n') + { + cx->hbuf[cx->hptr] = 0; + process_header(cx, cx->hbuf); + cx->hptr = 0; + } + else if(ch != '\r') + { + if(cx->hptr >= cx->hlen-1) + { + cx->hlen *= 2; + cx->hbuf = realloc(cx->hbuf, cx->hlen); + } + cx->hbuf[cx->hptr++] = ch; + } } } @@ -369,152 +401,164 @@ int http_async_req_status(void *ctx) unsigned long tmp2; #endif - switch(cx->state) { + switch(cx->state) + { case HTS_STRT: - dns = getserv(cx->host); - srv = getport(cx->host); - if(resolve(dns, srv, &cx->addr)) { - free(dns); - free(srv); - cx->state = HTS_DONE; - cx->ret = 602; - return 1; - } - free(dns); - free(srv); - cx->state = HTS_RSLV; - return 0; + dns = getserv(cx->host); + srv = getport(cx->host); + if(resolve(dns, srv, &cx->addr)) + { + free(dns); + free(srv); + cx->state = HTS_DONE; + cx->ret = 602; + return 1; + } + free(dns); + free(srv); + cx->state = HTS_RSLV; + return 0; case HTS_RSLV: - cx->state = HTS_CONN; - cx->last = now; - return 0; + cx->state = HTS_CONN; + cx->last = now; + return 0; case HTS_CONN: - if(cx->fd == PERROR) { - cx->fd = socket(AF_INET, SOCK_STREAM, 0); - if(cx->fd == PERROR) - goto fail; - cx->fdhost = mystrdup(cx->host); + if(cx->fd == PERROR) + { + cx->fd = socket(AF_INET, SOCK_STREAM, 0); + if(cx->fd == PERROR) + goto fail; + cx->fdhost = mystrdup(cx->host); #ifdef WIN32 - tmp2 = 1; - if(ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR) - goto fail; + tmp2 = 1; + if(ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR) + goto fail; #else - tmp = fcntl(cx->fd, F_GETFL); - if(tmp < 0) - goto fail; - if(fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0) - goto fail; + tmp = fcntl(cx->fd, F_GETFL); + if(tmp < 0) + goto fail; + if(fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0) + goto fail; #endif - } - if(!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr))) - cx->state = HTS_IDLE; + } + if(!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr))) + cx->state = HTS_IDLE; #ifdef WIN32 - else if(PERRNO==WSAEISCONN) - cx->state = HTS_IDLE; + else if(PERRNO==WSAEISCONN) + cx->state = HTS_IDLE; #endif #ifdef MACOSX - else if(PERRNO==EISCONN) - cx->state = HTS_IDLE; + else if(PERRNO==EISCONN) + cx->state = HTS_IDLE; #endif - else if(PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY + else if(PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY #ifdef WIN32 - && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL + && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL #endif - ) - goto fail; - if(now-cx->last>http_timeout) - goto timeout; - return 0; + ) + goto fail; + if(now-cx->last>http_timeout) + goto timeout; + return 0; case HTS_IDLE: - if(cx->txdl) { - // generate POST - cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen); - cx->tptr = 0; - cx->tlen = 0; - cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path); - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); - if(!cx->keep) - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); - if(cx->thdr) { - memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); - cx->tlen += cx->thlen; - free(cx->thdr); - cx->thdr = NULL; - cx->thlen = 0; - } - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl); + if(cx->txdl) + { + // generate POST + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); + if(cx->thdr) + { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl); #ifdef BETA - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); #else - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); #endif - cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); - memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl); - cx->tlen += cx->txdl; - free(cx->txd); - cx->txd = NULL; - cx->txdl = 0; - } else { - // generate GET - cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen); - cx->tptr = 0; - cx->tlen = 0; - cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path); - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); - if(cx->thdr) { - memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); - cx->tlen += cx->thlen; - free(cx->thdr); - cx->thdr = NULL; - cx->thlen = 0; - } - if(!cx->keep) - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl); + cx->tlen += cx->txdl; + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; + } + else + { + // generate GET + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(cx->thdr) + { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); #ifdef BETA - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); #else - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); #endif - cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); - } - cx->state = HTS_XMIT; - cx->last = now; - return 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + } + cx->state = HTS_XMIT; + cx->last = now; + return 0; case HTS_XMIT: - tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0); - if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) - goto fail; - if(tmp!=PERROR) { - cx->tptr += tmp; - if(cx->tptr == cx->tlen) { - cx->tptr = 0; - cx->tlen = 0; - if(cx->tbuf) - free(cx->tbuf); - cx->state = HTS_RECV; - } - cx->last = now; - } - if(now-cx->last>http_timeout) - goto timeout; - return 0; + tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) + { + cx->tptr += tmp; + if(cx->tptr == cx->tlen) + { + cx->tptr = 0; + cx->tlen = 0; + if(cx->tbuf) + free(cx->tbuf); + cx->state = HTS_RECV; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; case HTS_RECV: - tmp = recv(cx->fd, buf, CHUNK, 0); - if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) - goto fail; - if(tmp!=PERROR) { - for(i=0;istate == HTS_DONE) - return 1; - } - cx->last = now; - } - if(now-cx->last>http_timeout) - goto timeout; - return 0; + tmp = recv(cx->fd, buf, CHUNK, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) + { + for(i=0; istate == HTS_DONE) + return 1; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; case HTS_DONE: - return 1; + return 1; } return 0; @@ -535,37 +579,42 @@ char *http_async_req_stop(void *ctx, int *ret, int *len) char *rxd; if(cx->state != HTS_DONE) - while(!http_async_req_status(ctx)) ; + while(!http_async_req_status(ctx)) ; - if(cx->host) { - free(cx->host); - cx->host = NULL; + if(cx->host) + { + free(cx->host); + cx->host = NULL; } - if(cx->path) { - free(cx->path); - cx->path = NULL; + if(cx->path) + { + free(cx->path); + cx->path = NULL; } - if(cx->txd) { - free(cx->txd); - cx->txd = NULL; - cx->txdl = 0; + if(cx->txd) + { + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; } - if(cx->hbuf) { - free(cx->hbuf); - cx->hbuf = NULL; + if(cx->hbuf) + { + free(cx->hbuf); + cx->hbuf = NULL; } - if(cx->thdr) { - free(cx->thdr); - cx->thdr = NULL; - cx->thlen = 0; + if(cx->thdr) + { + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; } if(ret) - *ret = cx->ret; + *ret = cx->ret; if(len) - *len = cx->rptr; + *len = cx->rptr; if(cx->rbuf) - cx->rbuf[cx->rptr] = 0; + cx->rbuf[cx->rptr] = 0; rxd = cx->rbuf; cx->rbuf = NULL; cx->rlen = 0; @@ -573,17 +622,20 @@ char *http_async_req_stop(void *ctx, int *ret, int *len) cx->contlen = 0; if(!cx->keep) - http_async_req_close(ctx); - else if(cx->cclose) { - PCLOSE(cx->fd); - cx->fd = PERROR; - if(cx->fdhost) { - free(cx->fdhost); - cx->fdhost = NULL; - } - cx->state = HTS_STRT; - } else - cx->state = HTS_IDLE; + http_async_req_close(ctx); + else if(cx->cclose) + { + PCLOSE(cx->fd); + cx->fd = PERROR; + if(cx->fdhost) + { + free(cx->fdhost); + cx->fdhost = NULL; + } + cx->state = HTS_STRT; + } + else + cx->state = HTS_IDLE; return rxd; } @@ -592,23 +644,24 @@ void http_async_get_length(void *ctx, int *total, int *done) { struct http_ctx *cx = ctx; if(done) - *done = cx->rptr; + *done = cx->rptr; if(total) - *total = cx->contlen; + *total = cx->contlen; } void http_async_req_close(void *ctx) { struct http_ctx *cx = ctx; void *tmp; - if(cx->host) { - cx->keep = 1; - tmp = http_async_req_stop(ctx, NULL, NULL); - if(tmp) - free(tmp); + if(cx->host) + { + cx->keep = 1; + tmp = http_async_req_stop(ctx, NULL, NULL); + if(tmp) + free(tmp); } if(cx->fdhost) - free(cx->fdhost); + free(cx->fdhost); PCLOSE(cx->fd); free(ctx); } @@ -616,55 +669,60 @@ void http_async_req_close(void *ctx) char *http_simple_get(char *uri, int *ret, int *len) { void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); - if(!ctx) { - if(ret) - *ret = 600; - if(len) - *len = 0; - return NULL; + if(!ctx) + { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; } return http_async_req_stop(ctx, ret, len); } static char hex[] = "0123456789abcdef"; void http_auth_headers(void *ctx, char *user, char *pass) { - char *tmp; + char *tmp; int i; unsigned char hash[16]; unsigned int m; struct md5_context md5; - - if(user) { - http_async_add_header(ctx, "X-Auth-User", user); - if(pass) { - md5_init(&md5); - md5_update(&md5, (unsigned char *)user, strlen(user)); - md5_update(&md5, (unsigned char *)"-", 1); - m = 0; - - md5_update(&md5, (unsigned char *)pass, strlen(pass)); - md5_final(hash, &md5); - tmp = malloc(33); - for(i=0;i<16;i++) { - tmp[i*2] = hex[hash[i]>>4]; - tmp[i*2+1] = hex[hash[i]&15]; - } - tmp[32] = 0; - http_async_add_header(ctx, "X-Auth-Hash", tmp); - free(tmp); - } + + if(user) + { + http_async_add_header(ctx, "X-Auth-User", user); + if(pass) + { + md5_init(&md5); + md5_update(&md5, (unsigned char *)user, strlen(user)); + md5_update(&md5, (unsigned char *)"-", 1); + m = 0; + + md5_update(&md5, (unsigned char *)pass, strlen(pass)); + md5_final(hash, &md5); + tmp = malloc(33); + for(i=0; i<16; i++) + { + tmp[i*2] = hex[hash[i]>>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } } } char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len) { - void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); + void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); - if(!ctx) { - if(ret) - *ret = 600; - if(len) - *len = 0; - return NULL; + if(!ctx) + { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; } return http_async_req_stop(ctx, ret, len); } @@ -672,83 +730,144 @@ char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len) char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len) { void *ctx = http_async_req_start(NULL, uri, data, dlen, 0); - if(!ctx) { - if(ret) - *ret = 600; - if(len) - *len = 0; - return NULL; + if(!ctx) + { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; } return http_async_req_stop(ctx, ret, len); } char *http_ret_text(int ret) { - switch(ret) { - case 100: return "Continue"; - case 101: return "Switching Protocols"; - case 102: return "Processing"; + switch(ret) + { + case 100: + return "Continue"; + case 101: + return "Switching Protocols"; + case 102: + return "Processing"; - case 200: return "OK"; - case 201: return "Created"; - case 202: return "Accepted"; - case 203: return "Non-Authoritative Information"; - case 204: return "No Content"; - case 205: return "Reset Content"; - case 206: return "Partial Content"; - case 207: return "Multi-Status"; + case 200: + return "OK"; + case 201: + return "Created"; + case 202: + return "Accepted"; + case 203: + return "Non-Authoritative Information"; + case 204: + return "No Content"; + case 205: + return "Reset Content"; + case 206: + return "Partial Content"; + case 207: + return "Multi-Status"; - case 300: return "Multiple Choices"; - case 301: return "Moved Permanently"; - case 302: return "Found"; - case 303: return "See Other"; - case 304: return "Not Modified"; - case 305: return "Use Proxy"; - case 306: return "Switch Proxy"; - case 307: return "Temporary Redirect"; + case 300: + return "Multiple Choices"; + case 301: + return "Moved Permanently"; + case 302: + return "Found"; + case 303: + return "See Other"; + case 304: + return "Not Modified"; + case 305: + return "Use Proxy"; + case 306: + return "Switch Proxy"; + case 307: + return "Temporary Redirect"; - case 400: return "Bad Request"; - case 401: return "Unauthorized"; - case 402: return "Payment Required"; - case 403: return "Forbidden"; - case 404: return "Not Found"; - case 405: return "Method Not Allowed"; - case 406: return "Not Acceptable"; - case 407: return "Proxy Authentication Required"; - case 408: return "Request Timeout"; - case 409: return "Conflict"; - case 410: return "Gone"; - case 411: return "Length Required"; - case 412: return "Precondition Failed"; - case 413: return "Request Entity Too Large"; - case 414: return "Request URI Too Long"; - case 415: return "Unsupported Media Type"; - case 416: return "Requested Range Not Satisfiable"; - case 417: return "Expectation Failed"; - case 422: return "Unprocessable Entity"; - case 423: return "Locked"; - case 424: return "Failed Dependency"; - case 425: return "Unordered Collection"; - case 426: return "Upgrade Required"; + case 400: + return "Bad Request"; + case 401: + return "Unauthorized"; + case 402: + return "Payment Required"; + case 403: + return "Forbidden"; + case 404: + return "Not Found"; + case 405: + return "Method Not Allowed"; + case 406: + return "Not Acceptable"; + case 407: + return "Proxy Authentication Required"; + case 408: + return "Request Timeout"; + case 409: + return "Conflict"; + case 410: + return "Gone"; + case 411: + return "Length Required"; + case 412: + return "Precondition Failed"; + case 413: + return "Request Entity Too Large"; + case 414: + return "Request URI Too Long"; + case 415: + return "Unsupported Media Type"; + case 416: + return "Requested Range Not Satisfiable"; + case 417: + return "Expectation Failed"; + case 422: + return "Unprocessable Entity"; + case 423: + return "Locked"; + case 424: + return "Failed Dependency"; + case 425: + return "Unordered Collection"; + case 426: + return "Upgrade Required"; - case 500: return "Internal Server Error"; - case 501: return "Not Implemented"; - case 502: return "Bad Gateway"; - case 503: return "Service Unavailable"; - case 504: return "Gateway Timeout"; - case 505: return "HTTP Version Not Supported"; - case 506: return "Variant Also Negotiates"; - case 507: return "Insufficient Storage"; - case 509: return "Bandwidth Limit Exceeded"; - case 510: return "Not Extended"; + case 500: + return "Internal Server Error"; + case 501: + return "Not Implemented"; + case 502: + return "Bad Gateway"; + case 503: + return "Service Unavailable"; + case 504: + return "Gateway Timeout"; + case 505: + return "HTTP Version Not Supported"; + case 506: + return "Variant Also Negotiates"; + case 507: + return "Insufficient Storage"; + case 509: + return "Bandwidth Limit Exceeded"; + case 510: + return "Not Extended"; - case 600: return "Internal Client Error"; - case 601: return "Unsupported Protocol"; - case 602: return "Server Not Found"; - case 603: return "Malformed Response"; - case 604: return "Network Not Available"; - case 605: return "Request Timed Out"; - default: return "Unknown Status Code"; + case 600: + return "Internal Client Error"; + case 601: + return "Unsupported Protocol"; + case 602: + return "Server Not Found"; + case 603: + return "Malformed Response"; + case 604: + return "Network Not Available"; + case 605: + return "Request Timed Out"; + default: + return "Unknown Status Code"; } } char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len) @@ -761,153 +880,172 @@ char *http_multipart_post(char *uri, char **names, char **parts, int *plens, cha int blen = 0; unsigned int map[62], m; struct md5_context md5; - //struct md5_context md52; + //struct md5_context md52; int own_plen = 0; - if(names) { - if(!plens) { - own_plen = 1; - for(i=0;names[i];i++) ; - plens = calloc(i, sizeof(int)); - for(i=0;names[i];i++) - plens[i] = strlen(parts[i]); - } + if(names) + { + if(!plens) + { + own_plen = 1; + for(i=0; names[i]; i++) ; + plens = calloc(i, sizeof(int)); + for(i=0; names[i]; i++) + plens[i] = strlen(parts[i]); + } - retry: - if(blen >= 31) - goto fail; - memset(map, 0, 62*sizeof(int)); - for(i=0;names[i];i++) { - for(j=0;j='0' && ch<='9') - map[ch-'0']++; - else if(ch>='A' && ch<='Z') - map[ch-'A'+10]++; - else if(ch>='a' && ch<='z') - map[ch-'a'+36]++; - } - } - m = ~0; - j = 61; - for(i=0;i<62;i++) - if(map[i]= 31) + goto fail; + memset(map, 0, 62*sizeof(int)); + for(i=0; names[i]; i++) + { + for(j=0; j='0' && ch<='9') + map[ch-'0']++; + else if(ch>='A' && ch<='Z') + map[ch-'A'+10]++; + else if(ch>='a' && ch<='z') + map[ch-'a'+36]++; + } + } + m = ~0; + j = 61; + for(i=0; i<62; i++) + if(map[i]>4]; - tmp[i*2+1] = hex[hash[i]&15]; - } - tmp[32] = 0; - http_async_add_header(ctx, "X-Auth-Hash", tmp); - free(tmp); - } + md5_update(&md5, (unsigned char *)pass, strlen(pass)); + md5_final(hash, &md5); + tmp = malloc(33); + for(i=0; i<16; i++) + { + tmp[i*2] = hex[hash[i]>>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } } - if(data) { - tmp = malloc(32+strlen((char *)boundary)); - sprintf(tmp, "multipart/form-data, boundary=%s", boundary); - http_async_add_header(ctx, "Content-type", tmp); - free(tmp); - free(data); + if(data) + { + tmp = malloc(32+strlen((char *)boundary)); + sprintf(tmp, "multipart/form-data, boundary=%s", boundary); + http_async_add_header(ctx, "Content-type", tmp); + free(tmp); + free(data); } if(own_plen) - free(plens); + free(plens); return http_async_req_stop(ctx, ret, len); fail: if(data) - free(data); + free(data); if(own_plen) - free(plens); + free(plens); if(ret) - *ret = 600; + *ret = 600; if(len) - *len = 0; + *len = 0; return NULL; } diff --git a/md5.c b/md5.c old mode 100755 new mode 100644 index 874d2c147..2e348e675 --- a/md5.c +++ b/md5.c @@ -33,34 +33,37 @@ void md5_update(struct md5_context *ctx, unsigned char const *buf, unsigned len) // update bit count t = ctx->bits[0]; if((ctx->bits[0] = (t + ((unsigned)len << 3)) & 0xffffffff) < t) - ctx->bits[1]++; // carry + ctx->bits[1]++; // carry ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; // use leading data to top up the buffer - if(t) { - unsigned char *p = ctx->in + t; + if(t) + { + unsigned char *p = ctx->in + t; - t = 64-t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - md5_transform(ctx->buf, ctx->in); - buf += t; - len -= t; + t = 64-t; + if (len < t) + { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + md5_transform(ctx->buf, ctx->in); + buf += t; + len -= t; } // following 64-byte chunks - while(len >= 64) { - memcpy(ctx->in, buf, 64); - md5_transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; + while(len >= 64) + { + memcpy(ctx->in, buf, 64); + md5_transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; } // save rest of bytes for later @@ -84,14 +87,17 @@ void md5_final(unsigned char digest[16], struct md5_context *ctx) count = 64 - 1 - count; // Pad out to 56 mod 64 - if(count < 8) { - // we need to finish a whole block before padding - memset(p, 0, count); - md5_transform(ctx->buf, ctx->in); - memset(ctx->in, 0, 56); - } else { - // just pad to 56 bytes - memset(p, 0, count-8); + if(count < 8) + { + // we need to finish a whole block before padding + memset(p, 0, count); + md5_transform(ctx->buf, ctx->in); + memset(ctx->in, 0, 56); + } + else + { + // just pad to 56 bytes + memset(p, 0, count-8); } // append length & final transform @@ -121,7 +127,7 @@ void md5_transform(unsigned buf[4], const unsigned char inraw[64]) int i; for (i = 0; i < 16; ++i) - in[i] = getu32 (inraw + 4 * i); + in[i] = getu32 (inraw + 4 * i); a = buf[0]; b = buf[1]; @@ -210,15 +216,16 @@ void md5_ascii(char *result, unsigned char const *buf, unsigned len) int i; if(len==0) - len = strlen((char *)buf); + len = strlen((char *)buf); md5_init(&md5); md5_update(&md5, buf, len); md5_final(hash, &md5); - for(i=0;i<16;i++) { - result[i*2] = hex[(hash[i]>>4)&0xF]; - result[i*2+1] = hex[hash[i]&0x0F]; + for(i=0; i<16; i++) + { + result[i*2] = hex[(hash[i]>>4)&0xF]; + result[i*2+1] = hex[hash[i]&0x0F]; } result[32] = 0; } diff --git a/md5.h b/md5.h old mode 100755 new mode 100644 index 3f675d62a..2ae3ae843 --- a/md5.h +++ b/md5.h @@ -1,10 +1,11 @@ #ifndef MD5_H #define MD5_H -struct md5_context { - unsigned buf[4]; - unsigned bits[2]; - unsigned char in[64]; +struct md5_context +{ + unsigned buf[4]; + unsigned bits[2]; + unsigned char in[64]; }; void md5_init(struct md5_context *context); diff --git a/powder.c b/powder.c old mode 100755 new mode 100644 index 8d63d6fa2..ffc656891 --- a/powder.c +++ b/powder.c @@ -103,39 +103,40 @@ typedef unsigned int pixel; #endif char *it_msg = -"\brThe Powder Toy\n" -"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" -"\n" -"\bgControl+C/V/X are Copy, Paste and cut respectively.\n" -"\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" -"\bgPick your material from the menu using mouse left/right buttons.\n" -"Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" -"Shift+drag will create straight lines of particles.\n" -"Ctrl+drag will result in filled rectangles.\n" -"Ctrl+Shift+click will flood-fill a closed area.\n" -"Middle click or Alt+Click to \"sample\" the particles.\n" -"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" -"Use 'S' to save parts of the window as 'stamps'.\n" -"'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" -"'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" -"Use the mouse scroll wheel to change the tool size for particles.\n" -"'Q' will quit the application.\n" -"The spacebar can be used to pause physics.\n" -"'P' will take a screenshot and save it into the current directory.\n" -"\n" -"\brhttp://powdertoy.co.uk/\n" -"\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" -"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" -"\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" -"\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" -"\n" -"\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" -"\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" -; + "\brThe Powder Toy\n" + "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" + "\n" + "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" + "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" + "\bgPick your material from the menu using mouse left/right buttons.\n" + "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" + "Shift+drag will create straight lines of particles.\n" + "Ctrl+drag will result in filled rectangles.\n" + "Ctrl+Shift+click will flood-fill a closed area.\n" + "Middle click or Alt+Click to \"sample\" the particles.\n" + "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" + "Use 'S' to save parts of the window as 'stamps'.\n" + "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" + "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" + "Use the mouse scroll wheel to change the tool size for particles.\n" + "'Q' will quit the application.\n" + "The spacebar can be used to pause physics.\n" + "'P' will take a screenshot and save it into the current directory.\n" + "\n" + "\brhttp://powdertoy.co.uk/\n" + "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" + "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" + "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" + "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" + "\n" + "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" + "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" + ; -typedef struct { - int start, inc; - pixel *vid; +typedef struct +{ + int start, inc; + pixel *vid; } upstruc; #ifdef BETA @@ -156,7 +157,8 @@ unsigned char fire_b[YRES/CELL][XRES/CELL]; #define MAXSIGNS 16 -struct sign { +struct sign +{ int x,y,ju; char text[256]; } signs[MAXSIGNS]; @@ -185,138 +187,148 @@ void make_kernel(void) int i, j; float s = 0.0f; for(j=-1; j<2; j++) - for(i=-1; i<2; i++) { - kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); - s += kernel[(i+1)+3*(j+1)]; - } + for(i=-1; i<2; i++) + { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } s = 1.0f / s; for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - kernel[(i+1)+3*(j+1)] *= s; + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; } -int core_count(){ - int numCPU = 1; +int core_count() +{ + int numCPU = 1; #ifdef MT #ifdef WIN32 - SYSTEM_INFO sysinfo; - GetSystemInfo( &sysinfo ); - numCPU = sysinfo.dwNumberOfProcessors; + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; #else #ifdef MACOSX - numCPU = 4; + numCPU = 4; #else - numCPU = sysconf( _SC_NPROCESSORS_ONLN ); + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); #endif #endif - - printf("Cpus: %d\n", numCPU); - if(numCPU>1) - printf("Multithreading enabled\n"); - else - printf("Multithreading disabled\n"); + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); #endif - return numCPU; + return numCPU; } void update_air(void) { int x, y, i, j; float dp, dx, dy, f, tx, ty; - + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; - if(dp < -256.0f) dp = -256.0f; - if(dx > 256.0f) dx = 256.0f; - if(dx < -256.0f) dx = -256.0f; - if(dy > 256.0f) dy = 256.0f; - if(dy < -256.0f) dy = -256.0f; - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } + for(x=0; x0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } memcpy(vx, ovx, sizeof(vx)); memcpy(vy, ovy, sizeof(vy)); memcpy(pv, opv, sizeof(pv)); @@ -324,57 +336,62 @@ void update_air(void) void *update_air_th(void *arg) { - update_air(); - return NULL; + update_air(); + return NULL; } inline unsigned clamp_flt(float f, float min, float max) { if(fmax) - return 255; + return 255; return (int)(255.0f*(f-min)/(max-min)); } -inline float restrict_flt(float f, float min, float max){ - if(fmax) - return max; - return f; + return max; + return f; } void draw_air(pixel *vid) { int x, y, i, j; pixel c; - + if(cmode == 2) - return; - + return; + for(y=0; y 0.0f) - c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); - else - c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); - } else - c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), - clamp_flt(pv[y][x], 0.0f, 8.0f), - clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); - for(j=0; j 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } + else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; j> 4; -const struct part_type ptypes[] = { - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f, 164, "Solid. Flammable."}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, +const struct part_type ptypes[] = +{ + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Flammable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f, 164, "Solid. Flammable."}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, }; #define ST_NONE 0 #define ST_SOLID 1 #define ST_LIQUID 2 #define ST_GAS 3 -const struct part_state pstates[] = { - // Name Solid Frzp Liquid Mpnt Gas Bpoint - /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GASS, 50.0f, PT_NONE, 0.0f}, - /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2500.0f}, - /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 710.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LAVA */ {ST_LIQUID, PT_METL, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, - /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, - /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_OILL, -40.0f, PT_NONE, 50.0f, PT_FIRE, 300.0f}, - /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, - /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 500.0f}, - /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 300.0f}, - /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 0.0f, PT_DSTW, 98.0f, PT_NONE, 100.0f, PT_NONE, 0.0f}, - /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 850.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DSTW */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, - /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 900.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SLTW */ {ST_LIQUID, PT_ICEI, -40.0f, PT_NONE, 0.0f, PT_WTRV, 110.0f, PT_NONE, 0.0f}, - /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2100.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 46.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* MWAX */ {ST_LIQUID, PT_WAX, 45.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, - /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, -210.0f, PT_NONE, 0.0f, PT_NONE, -195.8f, PT_NONE, 0.0f}, - /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 39.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, - /* LRBD */ {ST_LIQUID, PT_RBDM, 38.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, - /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, -209.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2000.0f}, - /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, +const struct part_state pstates[] = +{ + // Name Solid Frzp Liquid Mpnt Gas Bpoint + /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GASS, 50.0f, PT_NONE, 0.0f}, + /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2500.0f}, + /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 710.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_METL, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_OILL, -40.0f, PT_NONE, 50.0f, PT_FIRE, 300.0f}, + /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 500.0f}, + /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 300.0f}, + /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 0.0f, PT_DSTW, 98.0f, PT_NONE, 100.0f, PT_NONE, 0.0f}, + /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 850.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, + /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 900.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SLTW */ {ST_LIQUID, PT_ICEI, -40.0f, PT_NONE, 0.0f, PT_WTRV, 110.0f, PT_NONE, 0.0f}, + /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2100.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 46.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* MWAX */ {ST_LIQUID, PT_WAX, 45.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, -210.0f, PT_NONE, 0.0f, PT_NONE, -195.8f, PT_NONE, 0.0f}, + /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 39.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, + /* LRBD */ {ST_LIQUID, PT_RBDM, 38.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, + /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, -209.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2000.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; -static const unsigned char can_move[PT_NUM][PT_NUM] = { - /* A B */ - /* A 0 1 | B ligher than A */ - /* B 1 0 | A heavier than B */ - - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, +static const unsigned char can_move[PT_NUM][PT_NUM] = +{ + /* A B */ + /* A 0 1 | B ligher than A */ + /* B 1 0 | A heavier than B */ + + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0}, + /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1}, + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, }; #define FLAG_STAGNANT 1 -typedef struct { +typedef struct +{ int type; int life, ctype; float x, y, vx, vy; - float temp; - float pavg[2]; + float temp; + float pavg[2]; int flags; } particle; particle *parts; @@ -776,13 +802,15 @@ float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is int isplayer = 0; //It shows is player spawned or not int mousex, mousey = 0; //They contain mouse position -void menu_count(void){ - int i=0; - msections[SC_WALL].itemcount = UI_WALLCOUNT-4; - msections[SC_SPECIAL].itemcount = 4; - for(i=0; i=XRES || ny>=YRES) - return 0; + return 0; if(x==nx && y==ny) - return 1; + return 1; r = pmap[ny][nx]; if(r && (r>>8)>8].type; - - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))){ - return 1; - } - - if((r&0xFF)==PT_VOID){ - parts[i].type=PT_NONE; - return 0; - } - if((r&0xFF)==PT_BHOL){ - parts[i].type=PT_NONE; - if(!legacy_enable){ - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; - } - return 0; - } + r = (r&~0xFF) | parts[r>>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + { + return 1; + } + + if((r&0xFF)==PT_VOID) + { + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL) + { + parts[i].type=PT_NONE; + if(!legacy_enable) + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } + return 0; + } + + if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide + { + return 1; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) + { + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) + { + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + { + return 0; + } - if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide - { - return 1; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]){ - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE){ - return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])){ - return 0; - } - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; + return 0; if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; + return 0; if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - - if(parts[i].type==PT_CNCT && y= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; + if(r && (r>>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; } - + return 1; } @@ -869,13 +906,13 @@ void kill_part(int i) { int x, y; parts[i].type = PT_NONE; - + x = (int)(parts[i].x+0.5f); y = (int)(parts[i].y+0.5f); - + if(x>=0 && y>=0 && x=XRES || y>=YRES) - return -1; - - if(t==SPC_HEAT||t==SPC_COOL){ - if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); - } - if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP){ - parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); - } - return pmap[y][x]>>8; - } else { - return -1; - } - } - if(t==SPC_AIR){ - pv[y/CELL][x/CELL] += 0.03f; - if(y+CELL>8].type = PT_SPRK; - parts[pmap[y][x]>>8].life = 4; - parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; - pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; - return pmap[y][x]>>8; + return -1; + + if(t==SPC_HEAT||t==SPC_COOL) + { + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) + { + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } + else + { + return -1; + } + } + if(t==SPC_AIR) + { + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) + { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } + else + i = p; + + if(t==PT_GLAS) + { + parts[i].pavg[1] = pv[y/CELL][x/CELL]; } - - if(p==-1) { - if(pmap[y][x]) - return -1; - if(pfree == -1) - return -1; - i = pfree; - pfree = parts[i].life; - } else - i = p; - - if(t==PT_GLAS){ - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - } if(t!=PT_STKM) { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; } - if(t==PT_ACID){ - parts[i].life = 75; - } - //Testing - /*if(t==PT_WOOD){ - parts[i].life = 150; - }*/ - //End Testing + if(t==PT_ACID) + { + parts[i].life = 75; + } + //Testing + /*if(t==PT_WOOD){ + parts[i].life = 150; + }*/ + //End Testing if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_PLSM) - parts[i].life = rand()%150+50; + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; if(t==PT_LAVA) - parts[i].life = rand()%120+240; + parts[i].life = rand()%120+240; if(t==PT_NBLE) - parts[i].life = 0; - if(t==PT_NEUT) { - float r = (rand()%128+128)/127.0f; - float a = (rand()%360)*3.14159f/180.0f; - parts[i].life = rand()%480+480; - parts[i].vx = r*cosf(a); - parts[i].vy = r*sinf(a); + parts[i].life = 0; + if(t==PT_NEUT) + { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); } - if(t==PT_PHOT) { - float r = (rand()%3-1)*3; - float a = (rand()%3-1)*3; - parts[i].life = 680; - if(a==0.0f&&r==0.0f){ - parts[i].life = 0; - parts[i].type = PT_NONE; - return -1; - } else { - parts[i].vx = a; - parts[i].vy = r; - } - //} else { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - //} + if(t==PT_PHOT) + { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f) + { + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } + else + { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //} } - + if(t!=PT_STKM) - pmap[y][x] = t|(i<<8); + pmap[y][x] = t|(i<<8); else { - if(isplayer==0) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = PT_STKM; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 100; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - player[2] = PT_DUST; - player[3] = x-1; //Setting legs positions - player[4] = y+6; - player[5] = x-1; - player[6] = y+6; + if(isplayer==0) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = PT_STKM; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 100; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + player[2] = PT_DUST; + player[3] = x-1; //Setting legs positions + player[4] = y+6; + player[5] = x-1; + player[6] = y+6; - player[7] = x-3; - player[8] = y+12; - player[9] = x-3; - player[10] = y+12; + player[7] = x-3; + player[8] = y+12; + player[9] = x-3; + player[10] = y+12; - player[11] = x+1; - player[12] = y+6; - player[13] = x+1; - player[14] = y+6; + player[11] = x+1; + player[12] = y+6; + player[13] = x+1; + player[14] = y+6; - player[15] = x+3; - player[16] = y+12; - player[17] = x+3; - player[18] = y+12; + player[15] = x+3; + player[16] = y+12; + player[17] = x+3; + player[18] = y+12; - isplayer = 1; - } + isplayer = 1; + } } - + return i; } void delete_part(int x, int y) { unsigned i; - + if(x<0 || y<0 || x>=XRES || y>=YRES) - return; + return; i = pmap[y][x]; if(!i || (i>>8)>=NPART) - return; - + return; + kill_part(i>>8); pmap[y][x] = 0; // just in case } @@ -1070,78 +1127,79 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - if(a!=255) { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; } vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } int sign(float i) //Signum function { - if (i<0) - return -1; - if (i>0) - return 1; - return 0; -} + if (i<0) + return -1; + if (i>0) + return 1; + return 0; +} void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line { - int dx, dy, i, sx, sy, check, e, x, y; + int dx, dy, i, sx, sy, check, e, x, y; - dx = abs(x1-x2); - dy = abs(y1-y2); - sx = sign(x2-x1); - sy = sign(y2-y1); - x = x1; - y = y1; - check = 0; + dx = abs(x1-x2); + dy = abs(y1-y2); + sx = sign(x2-x1); + sy = sign(y2-y1); + x = x1; + y = y1; + check = 0; - if (dy>dx) - { - dx = dx+dy; - dy = dx-dy; - dx = dx-dy; - check = 1; - } + if (dy>dx) + { + dx = dx+dy; + dy = dx-dy; + dx = dx-dy; + check = 1; + } - e = (dy<<2)-dx; - for (i=0; i<=dx; i++) - { - vid[x+y*a] =PIXRGB(r, g, b); - if (e>=0) - { - if (check==1) - x = x+sx; - else - y = y+sy; - e = e-(dx<<2); - } - if (check==1) - y = y+sy; - else - x = x+sx; - e = e+(dy<<2); - } + e = (dy<<2)-dx; + for (i=0; i<=dx; i++) + { + vid[x+y*a] =PIXRGB(r, g, b); + if (e>=0) + { + if (check==1) + x = x+sx; + else + y = y+sy; + e = e-(dx<<2); + } + if (check==1) + y = y+sy; + else + x = x+sx; + e = e+(dy<<2); + } } void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) - return; + return; t = vid[y*(XRES+BARSIZE)+x]; r = (a*r + 255*PIXR(t)) >> 8; g = (a*g + 255*PIXG(t)) >> 8; b = (a*b + 255*PIXB(t)) >> 8; if(r>255) - r = 255; + r = 255; if(g>255) - g = 255; + g = 255; if(b>255) b = 255; vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); @@ -1161,1685 +1219,2060 @@ int is_wire_off(int x, int y) void set_emap(int x, int y) { int x1, x2; - + if(!is_wire_off(x, y)) - return; - + return; + // go left as far as possible x1 = x2 = x; - while(x1>0) { - if(!is_wire_off(x1-1, y)) - break; - x1--; + while(x1>0) + { + if(!is_wire_off(x1-1, y)) + break; + x1--; } - while(x21 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) - set_emap(x1, y-2); + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); else if(y>0) - for(x=x1; x<=x2; x++) - if(is_wire_off(x, y-1)) { - if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) - set_emap(x, y-1); - } - + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) + { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + if(y>8) < NPART && (pmr>>8) >= 0){ - return parts[pmr>>8].type; - } else { - return PT_NONE; - } +inline int parts_avg(int ci, int ni) +{ + int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; + if((pmr>>8) < NPART && (pmr>>8) >= 0) + { + return parts[pmr>>8].type; + } + else + { + return PT_NONE; + } } -int nearest_part(int ci, int t){ - int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); - int ndistance = 0; - int id = -1; - int i = 0; - int cx = (int)parts[ci].x; - int cy = (int)parts[ci].y; - for(i=0; i=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) { - kill_part(i); - continue; - } - - vx[y/CELL][x/CELL] *= ptypes[t].airloss; - vy[y/CELL][x/CELL] *= ptypes[t].airloss; - vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; - vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS||t==PT_NBLE) { - if(pv[y/CELL][x/CELL]<3.5f) - pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); - if(y+CELL2.5f) { - parts[i].life = rand()%80+180; - rt = parts[i].type = PT_FIRE; - parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - pv[y/CELL][x/CELL] += 0.25f * CFDS; - t = PT_FIRE; - } - - parts[i].vx *= ptypes[t].loss; - parts[i].vy *= ptypes[t].loss; - - if(t==PT_DFRM && !parts[i].life) { - if(pv[y/CELL][x/CELL]>1.0f) { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - parts[i].life = rand()%80+300; - } - } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - - if(ptypes[t].diffusion) { - parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - } - - // interpolator + float pt = R_TEMP; + float c_heat = 0.0f; + int h_count = 0; + int starti = (start*-1); + for(i=start; i<(NPART-starti); i+=inc) + if(parts[i].type) + { + + lx = parts[i].x; + ly = parts[i].y; + t = parts[i].type; + + if(sys_pause) + goto justdraw; + + if(parts[i].life && t!=PT_ACID && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM) + { + if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) + parts[i].life--; + if(parts[i].life<=0 && t!=PT_WIRE && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY) + { + kill_part(i); + continue; + } + if(parts[i].life<=0 && t==PT_SPRK) + { + t = parts[i].ctype; + if(t!=PT_WIRE&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) + parts[i].temp = R_TEMP; + if(!t) + t = PT_WIRE; + parts[i].type = t; + parts[i].life = 4; + if(t == PT_WATR) + parts[i].life = 64; + if(t == PT_SLTW) + parts[i].life = 54; + } + } + + if(t==PT_SPRK&&parts[i].ctype==PT_SPRK) + { + kill_part(i); + continue; + } + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + + if(x<0 || y<0 || x>=XRES || y>=YRES || + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS||t==PT_NBLE) + { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) + { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) + { + if(pv[y/CELL][x/CELL]>1.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } + else + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + + if(ptypes[t].diffusion) + { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator #ifdef WIN32 - mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); #else - mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); #endif - if(mv < ISTP) { - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - } else { - dx = parts[i].vx*ISTP/mv; - dy = parts[i].vy*ISTP/mv; - ix = parts[i].x; - iy = parts[i].y; - while(1) { - mv -= ISTP; - if(mv <= 0.0f) { - // nothing found - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - break; - } - ix += dx; - iy += dy; - nx = (int)(ix+0.5f); - ny = (int)(iy+0.5f); - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) { - parts[i].x = ix; - parts[i].y = iy; - break; - } - } - } - - a = nt = 0; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx4.0f) - t = parts[i].type = PT_DSTW; - if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) - t = parts[i].type = PT_OILL; - if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) - t = parts[i].type = PT_GASS; - } - if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - // t = parts[i].type = PT_BGLA; - if(t==PT_GLAS){ - parts[i].pavg[0] = parts[i].pavg[1]; - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f){ - parts[i].type = PT_BGLA; - } - } - if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) - t = parts[i].type = PT_SNOW; - if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) { - t = PT_NEUT; - create_part(i, x, y, t); - } - - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1){ - nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1){ - create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[nearp].type = PT_SPRK; - parts[nearp].life = 9; - parts[nearp].ctype = PT_ETRD; - } - } - - if(!legacy_enable){ - int ctemp = pv[y/CELL][x/CELL]*2; - c_heat = 0.0f; - h_count = 0; - if(ptypes[t].hconduct>(rand()%250)){ - for(nx=-1; nx<2; nx++) { - for(ny=-1; ny<2; ny++) { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0){ - h_count++; - c_heat += parts[r>>8].temp; - } - } - } - } - pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); - for(nx=-1; nx<2; nx++) { - for(ny=-1; ny<2; ny++) { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0){ - parts[r>>8].temp = parts[i].temp; - } - } - } - } - if(pt>=pstates[t].btemp&&pstates[t].burn) { - t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE||t==PT_PLSM) - parts[i].life = rand()%50+120; - } - else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid){ - if(t==PT_LAVA&&parts[i].ctype){ - parts[i].life = 0; - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp){ - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } else { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)){ - if(pstates[t].liquid==PT_LAVA){ - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } else if(t==PT_ICEI&&parts[i].ctype){ - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } else { - t = parts[i].type = pstates[t].liquid; - } - }else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS){ - t = parts[i].type = pstates[t].liquid; - }else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)){ - if(t==PT_SLTW&&1>rand()%6){ - t = parts[i].type = PT_SALT; - } else { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - } - } - if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f){ - float atemp = parts[i].temp + (-MIN_TEMP); - pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; - } - if(t==PT_LAVA){ - parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - } - pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); - } - } - if(t==PT_CSCN&&parts[i].temp>24.0f){ - pt = parts[i].temp -= 2.5f; - } - if(t==PT_HSCN&&parts[i].temp>24.0f){ - pt = parts[i].temp -= 2.5f; - } - - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) { - nx = x % CELL; - if(nx == 0) - nx = x/CELL - 1; - else if(nx == CELL-1) - nx = x/CELL + 1; - else - nx = x/CELL; - ny = y % CELL; - if(ny == 0) - ny = y/CELL - 1; - else if(ny == CELL-1) - ny = y/CELL + 1; - else - ny = y/CELL; - if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ){ - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - } else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) { - pv[y/CELL][x/CELL] += 100.0f; - if(legacy_enable&&1>(rand()%200)){ - parts[i].life = rand()%50+120; - t = parts[i].type = PT_FIRE; - } else { - t = parts[i].type = PT_NONE; - } - } - } - } else if(t==PT_ICEI || t==PT_SNOW) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if(legacy_enable){ - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; - } - } - } - else if(t==PT_HSCN||t==PT_CSCN) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) { - parts[i].temp = 200.0f; - } - } - } - //PLANT - else if(t==PT_PLNT) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR && 1>(rand()%250)) { - t = parts[i].type = PT_PLNT; - parts[r>>8].type = PT_PLNT; - } else if((r&0xFF)==PT_LAVA && 1>(rand()%250)){ - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WATR||t==PT_DSTW) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) { - t = parts[i].type = PT_WTRV; - } else if((r&0xFF)==PT_SALT && 1>(rand()%250)) { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)){ - t = parts[i].type = PT_WATR; - } - if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)){ - t = parts[i].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)){ - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_SLTW) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) { - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; - } else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) { - parts[r>>8].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } else if(t==PT_WTRV) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) { - t = parts[i].type = PT_WATR; - parts[r>>8].type = PT_WATR; - } - - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) { - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } - } - } else if(t==PT_ACID) { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)!=PT_ACID){ - if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD){ - t = parts[i].type = PT_FIRE; - parts[i].life = 4; - parts[r>>8].type = PT_FIRE; - parts[r>>8].life = 4; - } else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) { - parts[i].life--; - parts[r>>8].type = PT_NONE; - } else if (parts[i].life==50){ - parts[i].life = 0; - t = parts[i].type = PT_NONE; - } - } - } - } else if(t==PT_NEUT) { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) { - if(33>rand()%100) { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); - } else { - create_part(r>>8, x+nx, y+ny, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - fe ++; - } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) - parts[r>>8].type = PT_DUST; - if((r&0xFF)==PT_WATR && 15>(rand()%100)) - parts[r>>8].type = PT_DSTW; - if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_DFRM; - if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_OILL; - if((r&0xFF)==PT_OILL && 5>(rand()%1000)) - parts[r>>8].type = PT_GASS; - if((r&0xFF)==PT_PLNT && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - } - } else if(t==PT_PHOT){ - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=0; nx<1; nx++) - for(ny=0; ny<1; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - } - } else if(t==PT_LCRY){ - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK){ - if(parts[r>>8].ctype==PT_PSCN) { - parts[i].life = 10; - } else if(parts[r>>8].ctype==PT_NSCN) { - parts[i].life = 9; - } - } - if(rt==PT_LCRY){ - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0){ - parts[i].life = 9; - } else if(parts[i].life==0&&parts[r>>8].life==10){ - parts[i].life = 10; - } - } - } - } else if(t==PT_BTRY){ - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts_avg(i,r>>8) != PT_INSL){ - if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) { - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - parts[r>>8].type = PT_SPRK; - } - } - } - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) { - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) - continue; - rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { - parts[r>>8].type = PT_FIRE; - parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - parts[r>>8].life = rand()%80+180; - if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; - continue; - } - lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; - if(lpv < 1) lpv = 1; - if(legacy_enable){ - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && - ptypes[rt].meltable*lpv>(rand()%1000)) { - if(t!=PT_LAVA || parts[i].life>0) { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } else { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = PT_METL; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { - kill_part(r>>8); - if(t==PT_FIRE) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE; - goto killed; - } - } - } - pavg = parts_avg(i, r>>8); - if(t==PT_SWCH&&pavg!= PT_INSL){ - if(parts[r>>8].type == PT_SWCH){ - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0){ - parts[i].life = 9; - } else if(parts[i].life==0&&parts[r>>8].life==10){ - parts[i].life = 10; - } - } - } - if(rt==PT_SWCH && t==PT_SPRK){ - pavg = parts_avg(r>>8, i); - if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) - parts[r>>8].life = 10; - if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) - parts[r>>8].life = 9; - if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL){ - parts[r>>8].type = PT_SPRK; - parts[r>>8].ctype = PT_SWCH; - parts[r>>8].life = 4; - } - } - pavg = parts_avg(i, r>>8); - if(pavg != PT_INSL){ - if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ){ - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; - } - } - if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL){ - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL){ - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 6; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5){ - if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN){ - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) - { - parts[i].life = rand()%150+50; - parts[i].type = PT_PLSM; - parts[i].ctype = PT_NBLE; - parts[i].temp = 3500; - pv[y/CELL][x/CELL] += 1; - } - if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) - { - parts[i].type = PT_SWCH; - parts[i].life = 11; - } - } - } - killed: - if(parts[i].type == PT_NONE) - continue; - } - - if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; - - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } + if(mv < ISTP) + { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } + else + { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) + { + mv -= ISTP; + if(mv <= 0.0f) + { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) + { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; - - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; - - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; - - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_OILL; + if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) + t = parts[i].type = PT_GASS; + } + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + // t = parts[i].type = PT_BGLA; + if(t==PT_GLAS) + { + parts[i].pavg[0] = parts[i].pavg[1]; + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) + { + parts[i].type = PT_BGLA; + } + } + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) + { + t = PT_NEUT; + create_part(i, x, y, t); + } - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; player[10] += 2; player[5] += 2; - } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) + { + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1) + { + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; player[18] += 2; player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; player[10] += 1; player[5] += 1; - } + if(!legacy_enable) + { + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)) + { + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) + { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE||t==PT_PLSM) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) + { + if(t==PT_LAVA&&parts[i].ctype) + { + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) + { + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } + else + { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } + else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) + { + if(pstates[t].liquid==PT_LAVA) + { + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } + else if(t==PT_ICEI&&parts[i].ctype) + { + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else + { + t = parts[i].type = pstates[t].liquid; + } + } + else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) + { + t = parts[i].type = pstates[t].liquid; + } + else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) + { + if(t==PT_SLTW&&1>rand()%6) + { + t = parts[i].type = PT_SALT; + } + else + { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) + { + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA) + { + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_CSCN&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + if(t==PT_HSCN&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; player[18] += 1; player[13] +=1; - } - } - } - - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; player[10] += 2; player[5] -= 2; - } + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) + { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) + { + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } + else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) + { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)) + { + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } + else + { + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_ICEI || t==PT_SNOW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if(legacy_enable) + { + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } + } + } + else if(t==PT_HSCN||t==PT_CSCN) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) + { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) + { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } + else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%250)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; - } - } - - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + } + } + } + else if(t==PT_SLTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) + { + parts[r>>8].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } + } + } + } + else if(t==PT_WTRV) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } - - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)){ - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 ) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - } - } - } + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } + } + } + else if(t==PT_ACID) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID) + { + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) + { + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } + else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) + { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } + else if (parts[i].life==50) + { + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_NEUT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) + { + if(33>rand()%100) + { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } + else + { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + } + } + else if(t==PT_LCRY) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_LCRY) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_BTRY) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts_avg(i,r>>8) != PT_INSL) + { + if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + parts[r>>8].type = PT_SPRK; + } + } + } + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) + { + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + { + parts[r>>8].type = PT_FIRE; + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; + if(legacy_enable) + { + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) + { + if(t!=PT_LAVA || parts[i].life>0) + { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } + else + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) + { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) + { + kill_part(r>>8); + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE; + goto killed; + } + } + } + pavg = parts_avg(i, r>>8); + if(t==PT_SWCH&&pavg!= PT_INSL) + { + if(parts[r>>8].type == PT_SWCH) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + if(rt==PT_SWCH && t==PT_SPRK) + { + pavg = parts_avg(r>>8, i); + if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) + parts[r>>8].life = 10; + if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) + parts[r>>8].life = 9; + if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].ctype = PT_SWCH; + parts[r>>8].life = 4; + } + } + pavg = parts_avg(i, r>>8); + if(pavg != PT_INSL) + { + if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; + } + } + if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) + { + if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) + { + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; player[10] += 1; player[18] += 1; - } + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { + parts[i].life = rand()%150+50; + parts[i].type = PT_PLSM; + parts[i].ctype = PT_NBLE; + parts[i].temp = 3500; + pv[y/CELL][x/CELL] += 1; + } + if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) + { + parts[i].type = PT_SWCH; + parts[i].life = 11; + } + } + } +killed: + if(parts[i].type == PT_NONE) + continue; + } - } - - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; player[4] += (player[4]-player[8])*d; - - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; player[12] += (player[12]-player[16])*d; - - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; player[4] += (player[4]-parts[i].y)*d; - - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; player[12] += (player[12]-parts[i].y)*d; + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } - - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } - - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } - isplayer = 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } - if(t==PT_CLNE) { - if(!parts[i].ctype) { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx=XRES-CELL || - ny=YRES-CELL) { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - continue; - } - - rt = parts[i].flags & FLAG_STAGNANT; - parts[i].flags &= ~FLAG_STAGNANT; - if(!try_move(i, x, y, nx, ny)) { - parts[i].x = lx; - parts[i].y = ly; - if(ptypes[t].falldown) { - if(nx!=x && try_move(i, x, y, nx, y)) { - parts[i].x = ix; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(ny!=y && try_move(i, x, y, x, ny)) { - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else { - r = (rand()%2)*2-1; - if(ny!=y && try_move(i, x, y, x+r, ny)) { - parts[i].x += r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(ny!=y && try_move(i, x, y, x-r, ny)) { - parts[i].x -= r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(nx!=x && try_move(i, x, y, nx, y+r)) { - parts[i].x = ix; - parts[i].y += r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(nx!=x && try_move(i, x, y, nx, y-r)) { - parts[i].x = ix; - parts[i].y -= r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) { - s = 0; - if(!rt || nt) - rt = 50; - else - rt = 10; - for(j=x+r; j>=0 && j>=x-rt && j0) - r = 1; - else - r = -1; - if(s) - for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) { - kill_part(i); - continue; - } else if(try_move(i, x, y, 2*x-nx, ny)) { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } else if(try_move(i, x, y, nx, 2*y-ny)) { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } else { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } - } - - justdraw: - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) { - kill_part(i); - continue; - } - if(cmode!=CM_HEAT){ - if(t==PT_STKM) //Just draw head here - { - char buff[10]; //Buffer for HP + } + } - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; - vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; - vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; - vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; - } - draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); - draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); - draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); - draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } - isplayer = 1; //It's a secret. Tssss... - } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } - if(t==PT_ACID) { - if(parts[i].life>255) parts[i].life = 255; - if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28)); - if(s==0) s = 1; - cr = PIXR(ptypes[t].pcolors)/s; - cg = PIXG(ptypes[t].pcolors)/s; - cb = PIXB(ptypes[t].pcolors)/s; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - if(cmode==4){ - blendpixel(vid, nx+1, ny, cr, cg, cb, 223); - blendpixel(vid, nx-1, ny, cr, cg, cb, 223); - blendpixel(vid, nx, ny+1, cr, cg, cb, 223); - blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); - } - }else if(t==PT_NEUT) { - if(cmode == 3||cmode==4) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 8; - cb = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } else { - cr = 0x20; - cg = 0xE0; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - }else if(t==PT_PHOT) { - if(cmode == 3||cmode==4) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } else { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_SWCH && parts[i].life == 10) { - x = nx; - y = ny; - blendpixel(vid,x,y,17,217,24,255); - } else if(t==PT_SMKE) { - if(cmode == 3||cmode==4) { - x = nx/CELL; - y = ny/CELL; - cg = 10; - cb = 10; - cr = 10; - cg += fire_g[y][x]; if(cg > 50) cg = 50; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 50) cb = 50; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > 50) cr = 50; fire_r[y][x] = cr; - } else { - for(x=-3;x<4;x++){ - for(y=-3;y<4;y++){ - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny,100,100,100,30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,100,100,100,10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,100,100,100,20); - } - } - } - } else if(t==PT_WTRV) { - if(cmode == 3||cmode==4) { - x = nx/CELL; - y = ny/CELL; - cg = PIXG(ptypes[t].pcolors)/3; - cb = PIXB(ptypes[t].pcolors)/3; - cr = PIXR(ptypes[t].pcolors)/3; - cg += fire_g[y][x]; if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; fire_r[y][x] = cr; - } else { - for(x=-3;x<4;x++){ - for(y=-3;y<4;y++){ - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); - } - } - } - } else if(t==PT_THDR) { - if(cmode == 3||cmode==4) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 16; - cb = 20; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } else { - cr = 0xFF; - cg = 0xFF; - cb = 0xA0; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_LCRY) { - if(cmode == 3||cmode==4) { - //cr = R/8; - //cg = G/8; - //cb = B/8; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); - //x = nx/CELL; - //y = ny/CELL; - //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } else { - cr = 0x50+(parts[i].life*10); - cg = 0x50+(parts[i].life*10); - cb = 0x50+(parts[i].life*10); - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - }else if(t==PT_PLSM) { - float ttemp = parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = plasma_data[caddress]; - uint8 G = plasma_data[caddress+1]; - uint8 B = plasma_data[caddress+2]; - if(cmode == 3||cmode==4) { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } else { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_FIRE && parts[i].life) { - if(cmode == 3||cmode==4) { - cr = parts[i].life / 4; - cg = parts[i].life / 16; - cb = parts[i].life / 32; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } else { - cr = parts[i].life * 8; - cg = parts[i].life * 2; - cb = parts[i].life; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_LAVA && parts[i].life) { - cr = parts[i].life * 2 + 0xE0; - cg = parts[i].life * 1 + 0x50; - cb = parts[i].life/2 + 0x10; - if(cr>255) cr = 255; - if(cg>192) cg = 192; - if(cb>128) cb = 128; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 64); - blendpixel(vid, nx-1, ny, cr, cg, cb, 64); - blendpixel(vid, nx, ny+1, cr, cg, cb, 64); - blendpixel(vid, nx, ny-1, cr, cg, cb, 64); - if(cmode == 3||cmode==4) { - cr /= 32; - cg /= 32; - cb /= 32; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } else if(t==PT_LAVA || t==PT_SPRK) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - if(cmode == 3 || cmode==4) { - if(t == PT_LAVA) { - cr = 3; - cg = i%2; - cb = 0; - } else { - cr = 8; - cg = 12; - cb = 16; - } - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } else - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - } else { - float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); - uint8 R = color_data[caddress]; - uint8 G = color_data[caddress+1]; - uint8 B = color_data[caddress+2]; + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); - if(t==PT_STKM) //Stick man should be visible in heat mode - { - char buff[10]; //Buffer for HP + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 ) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + } + } + } - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } + + } + + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; + + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; + + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; + + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; + + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; + + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } + + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } + + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } + + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } + + } + + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } + + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } + + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } + + if(t==PT_CLNE) + { + if(!parts[i].ctype) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx=XRES-CELL || + ny=YRES-CELL) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) + { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) + { + if(nx!=x && try_move(i, x, y, nx, y)) + { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x, ny)) + { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else + { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) + { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x-r, ny)) + { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y+r)) + { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y-r)) + { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) + { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) + { + kill_part(i); + continue; + } + else if(try_move(i, x, y, 2*x-nx, ny)) + { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } + else if(try_move(i, x, y, nx, 2*y-ny)) + { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } + else + { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + +justdraw: + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) + { + kill_part(i); + continue; + } + if(cmode!=CM_HEAT) + { + if(t==PT_STKM) //Just draw head here + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; + vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; + vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; + vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; + } + draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); + draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); + draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); + draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + + isplayer = 1; //It's a secret. Tssss... + } + + if(t==PT_ACID) + { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28)); + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + if(cmode==4) + { + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + } + else if(t==PT_NEUT) + { + if(cmode == 3||cmode==4) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_PHOT) + { + if(cmode == 3||cmode==4) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_SWCH && parts[i].life == 10) + { + x = nx; + y = ny; + blendpixel(vid,x,y,17,217,24,255); + } + else if(t==PT_SMKE) + { + if(cmode == 3||cmode==4) + { + x = nx/CELL; + y = ny/CELL; + cg = 10; + cb = 10; + cr = 10; + cg += fire_g[y][x]; + if(cg > 50) cg = 50; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 50) cb = 50; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 50) cr = 50; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,100,100,100,30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,100,100,100,10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,100,100,100,20); + } + } + } + } + else if(t==PT_WTRV) + { + if(cmode == 3||cmode==4) + { + x = nx/CELL; + y = ny/CELL; + cg = PIXG(ptypes[t].pcolors)/3; + cb = PIXB(ptypes[t].pcolors)/3; + cr = PIXR(ptypes[t].pcolors)/3; + cg += fire_g[y][x]; + if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); + } + } + } + } + else if(t==PT_THDR) + { + if(cmode == 3||cmode==4) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LCRY) + { + if(cmode == 3||cmode==4) + { + //cr = R/8; + //cg = G/8; + //cb = B/8; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); + //x = nx/CELL; + //y = ny/CELL; + //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } + else + { + cr = 0x50+(parts[i].life*10); + cg = 0x50+(parts[i].life*10); + cb = 0x50+(parts[i].life*10); + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_PLSM) + { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_FIRE && parts[i].life) + { + if(cmode == 3||cmode==4) + { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LAVA && parts[i].life) + { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4) + { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else if(t==PT_LAVA || t==PT_SPRK) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4) + { + if(t == PT_LAVA) + { + cr = 3; + cg = i%2; + cb = 0; + } + else + { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + } + else + { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + + if(t==PT_STKM) //Stick man should be visible in heat mode + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); + vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); + vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); + vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); + } + draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); + draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); + draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); + draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + } + else + { + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } + } + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) + { + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + + } - for(r=-2; r<=1; r++) - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); - vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); - vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); - vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); - } - draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); - draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); - draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); - draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); - } - else - { - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); - } - } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID){ - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); - - //if(vid[(ny-1)*YRES+(nx-1)]!=0){ - // blendpixel(vid, nx, ny-1, R, G, B, 46); - //} - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - - } - } -void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb){ - blendpixel(vid, x+1, y, cr, cg, cb, 112); - blendpixel(vid, x-1, y, cr, cg, cb, 112); - blendpixel(vid, x, y+1, cr, cg, cb, 112); - blendpixel(vid, x, y-1, cr, cg, cb, 112); - - blendpixel(vid, x+1, y-1, cr, cg, cb, 64); - blendpixel(vid, x-1, y-1, cr, cg, cb, 64); - blendpixel(vid, x+1, y+1, cr, cg, cb, 64); - blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) +{ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); } -void update_particles_i_th(void *arg){ - upstruc *newup = (upstruc*)arg; - update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); - return; +void update_particles_i_th(void *arg) +{ + upstruc *newup = (upstruc*)arg; + update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); + return; } void update_particles(pixel *vid) @@ -2847,390 +3280,560 @@ void update_particles(pixel *vid) int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; float lx, ly; #ifdef MT - int pt = 0, pc = 0; - pthread_t *InterThreads; + int pt = 0, pc = 0; + pthread_t *InterThreads; #endif - + isplayer = 0; //Needed for player spawning memset(pmap, 0, sizeof(pmap)); r = rand()%2; - for(j=0; j=0 && y>=0 && x=0 && y>=0 && x>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) { - if(emap[y][x]) { - cr = cg = cb = 128; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) { - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==13) { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } else { - for(y=0; y>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) { - if(emap[y][x]) { - cr = cg = cb = 128; - cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) { - for(j=0; j 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(bmap[y][x]==9){ - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; - cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } - + if(cmode==4) + { + for(y=0; y>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + else + { + for(y=0; y>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + #ifdef MT - if(numCores > 1) { - InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); - for(pc = 0; pc 1) + { + InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); + for(pc = 0; pc=XRES || ny<0 || ny>=YRES) - break; - addpixel(vid, nx, ny, 255, 255, 255, 64); - i = nx/CELL; - j = ny/CELL; - lx += vx[j][i]*0.125f; - ly += vy[j][i]*0.125f; - if(bmap[j][i]==5 && i!=x && j!=y) - break; - } - drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); - } - + for(x=0; x=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + } void update_particles_th(void *arg) { - update_particles((pixel*)arg); - return; + update_particles((pixel*)arg); + return; } /*********************************************************** @@ -3246,11 +3849,11 @@ int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; void sdl_seticon(void) { #ifdef WIN32 - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else +#else #ifdef MACOSX - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); #else SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); @@ -3261,7 +3864,8 @@ void sdl_seticon(void) void sdl_open(void) { - if(SDL_Init(SDL_INIT_VIDEO)<0) { + if(SDL_Init(SDL_INIT_VIDEO)<0) + { fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); exit(1); } @@ -3271,14 +3875,15 @@ void sdl_open(void) #else sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); #endif - if(!sdl_scrn) { + if(!sdl_scrn) + { fprintf(stderr, "Creating window: %s\n", SDL_GetError()); exit(1); } SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); sdl_seticon(); SDL_EnableUNICODE(1); - //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); } void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) @@ -3289,10 +3894,11 @@ void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) if(SDL_LockSurface(sdl_scrn)<0) return; dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0;jpitch/PIXELSIZE; - src+=pitch; + for(j=0; jpitch/PIXELSIZE; + src+=pitch; } if(SDL_MUSTLOCK(sdl_scrn)) SDL_UnlockSurface(sdl_scrn); @@ -3308,15 +3914,18 @@ void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) if(SDL_LockSurface(sdl_scrn)<0) return; dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0;jpitch/PIXELSIZE; - } - src+=pitch; + for(j=0; jpitch/PIXELSIZE; + } + src+=pitch; } if(SDL_MUSTLOCK(sdl_scrn)) SDL_UnlockSurface(sdl_scrn); @@ -3325,9 +3934,9 @@ void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) { if(sdl_scale == 2) - sdl_blit_2(x, y, w, h, src, pitch); + sdl_blit_2(x, y, w, h, src, pitch); else - sdl_blit_1(x, y, w, h, src, pitch); + sdl_blit_1(x, y, w, h, src, pitch); } int frame_idx=0; @@ -3340,14 +3949,16 @@ void dump_frame(pixel *src, int w, int h, int pitch) sprintf(frame_name,"frame%04d.ppm",frame_idx); f=fopen(frame_name,"wb"); fprintf(f,"P6\n%d %d\n255\n",w,h); - for(j=0;j=0 && x=0 && y=0 && x=0 && yPT_NUM) - return 2; - if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) - return 3; - i = XRES*YRES; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) - return 1; - size = i; - } else - d = c; - - if(size < XRES*YRES) { - if(bzip2) - free(d); - return 1; - } - - sy = 0; - for(y=0;y+scl<=YRES;y+=scl) { - sx = 0; - for(x=0;x+scl<=XRES;x+=scl) { - a = 0; - r = g = b = 0; - for(j=0;j=PT_NUM) - goto corrupt; - r += PIXR(ptypes[t].pcolors); - g += PIXG(ptypes[t].pcolors); - b += PIXB(ptypes[t].pcolors); - a ++; - } - } - if(a) { - a = 256/a; - r = (r*a)>>8; - g = (g*a)>>8; - b = (b*a)>>8; - } - - drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); - sx++; - } - sy++; - } - + if(bzip2) - free(d); + { + if(size<16) + return 1; + if(c[3]!=0x74 || c[2]!=0x49 || c[1]!=0x68 || c[0]!=0x53) + return 1; + if(c[4]>PT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } + else + d = c; + + if(size < XRES*YRES) + { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0; y+scl<=YRES; y+=scl) + { + sx = 0; + for(x=0; x+scl<=XRES; x+=scl) + { + a = 0; + r = g = b = 0; + for(j=0; j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) + { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); return 0; - + corrupt: if(bzip2) - free(d); + free(d); return 1; } static char *mystrdup(char *s) { char *x; - if(s) { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; + if(s) + { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; } return s; } void *build_save(int *size, int x0, int y0, int w, int h) { - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; - + // normalize coordinates x0 = bx0*CELL; y0 = by0*CELL; w = bw *CELL; h = bh *CELL; - + // save the required air state for(y=by0; y255) i=255; - d[p++] = i; - } + for(x=bx0; x255) i=255; + d[p++] = i; + } for(y=by0; y255) i=255; - d[p++] = i; - } - + for(x=bx0; x255) i=255; + d[p++] = i; + } + // save the particle map for(i=0; i=x0 && x=y0 && y=x0 && x=y0 && y255) x=255; - if(y<0) y=0; - if(y>255) y=255; - d[p++] = x; - d[p++] = y; - } + for(j=0; j255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } } - for(j=0; j255) tttemp=255; - d[p++] = tttemp; - } + for(j=0; j255) tttemp=255; + d[p++] = tttemp; + } } - for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; - d[p++] = (signs[i].y-y0); - d[p++] = (signs[i].y-y0)>>8; - d[p++] = signs[i].ju; - x = strlen(signs[i].text); - d[p++] = x; - memcpy(d+p, signs[i].text, x); - p+=x; - } - + if(signs[i].text[0] && + signs[i].x>=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + i = (p*101+99)/100 + 612; c = malloc(i); c[0] = 0x66; @@ -3706,16 +4347,17 @@ void *build_save(int *size, int x0, int y0, int w, int h) c[9] = p >> 8; c[10] = p >> 16; c[11] = p >> 24; - + i -= 12; - - if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) { - free(d); - free(c); - return NULL; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) + { + free(d); + free(c); + return NULL; } free(d); - + *size = i+12; return c; } @@ -3726,251 +4368,286 @@ int parse_save(void *save, int size, int replace, int x0, int y0) int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; int fp[NPART], nf=0; - + if(size<16) - return 1; + return 1; if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) - return 1; + return 1; if(c[4]>SAVE_VERSION) - return 2; + return 2; ver = c[4]; - - if(ver<34){ - legacy_enable = 1; - } else { - if(c[3]==1||c[3]==0) - legacy_enable = c[3]; - else - legacy_beta = 1; - } - + + if(ver<34) + { + legacy_enable = 1; + } + else + { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } + bw = c[6]; bh = c[7]; if(bx0+bw > XRES/CELL) - bx0 = XRES/CELL - bw; + bx0 = XRES/CELL - bw; if(by0+bh > YRES/CELL) - by0 = YRES/CELL - bh; + by0 = YRES/CELL - bh; if(bx0 < 0) - bx0 = 0; + bx0 = 0; if(by0 < 0) - by0 = 0; - + by0 = 0; + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) - return 3; + return 3; i = (unsigned)c[8]; i |= ((unsigned)c[9])<<8; i |= ((unsigned)c[10])<<16; i |= ((unsigned)c[11])<<24; d = malloc(i); if(!d) - return 1; - + return 1; + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - return 1; + return 1; size = i; - + if(size < bw*bh) - return 1; - + return 1; + // normalize coordinates x0 = bx0*CELL; y0 = by0*CELL; w = bw *CELL; h = bh *CELL; - - if(replace) { - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(signs, 0, sizeof(signs)); - memset(parts, 0, sizeof(particle)*NPART); - memset(pmap, 0, sizeof(pmap)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(pv, 0, sizeof(pv)); + + if(replace) + { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); } - + // make a catalog of free parts memset(pmap, 0, sizeof(pmap)); for(i=0; i= size) - goto corrupt; - fvx[y][x] = (d[p++]-127.0f)/64.0f; - } + for(x=bx0; x= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } for(y=by0; y= size) - goto corrupt; - fvy[y][x] = (d[p++]-127.0f)/64.0f; - } - + for(x=bx0; x= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + // load the particle map i = 0; pty = p; - for(y=y0;y= size) - goto corrupt; - j=d[p++]; - if(j >= PT_NUM) - goto corrupt; - if(j && !(isplayer == 1 && j==PT_STKM)) { - if(pmap[y][x]) { - k = pmap[y][x]>>8; - parts[k].type = j; - parts[k].x = (float)x; - parts[k].y = (float)y; - m[(x-x0)+(y-y0)*w] = k+1; - } else if(i < nf) { - parts[fp[i]].type = j; - parts[fp[i]].x = (float)x; - parts[fp[i]].y = (float)y; - m[(x-x0)+(y-y0)*w] = fp[i]+1; - i++; - } else - m[(x-x0)+(y-y0)*w] = NPART+1; - } - } - + for(y=y0; y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j && !(isplayer == 1 && j==PT_STKM)) + { + if(pmap[y][x]) + { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } + else if(i < nf) + { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } + else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + // load particle properties - for(j=0; j= size) - goto corrupt; - if(i < NPART) { - parts[i].vx = (d[p++]-127.0f)/16.0f; - parts[i].vy = (d[p++]-127.0f)/16.0f; - if(parts[i].type == PT_STKM) - { - player[2] = PT_DUST; + for(j=0; j= size) + goto corrupt; + if(i < NPART) + { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + if(parts[i].type == PT_STKM) + { + player[2] = PT_DUST; - player[3] = parts[i].x-1; //Setting legs positions - player[4] = parts[i].y+6; - player[5] = parts[i].x-1; - player[6] = parts[i].y+6; + player[3] = parts[i].x-1; //Setting legs positions + player[4] = parts[i].y+6; + player[5] = parts[i].x-1; + player[6] = parts[i].y+6; - player[7] = parts[i].x-3; - player[8] = parts[i].y+12; - player[9] = parts[i].x-3; - player[10] = parts[i].y+12; + player[7] = parts[i].x-3; + player[8] = parts[i].y+12; + player[9] = parts[i].x-3; + player[10] = parts[i].y+12; - player[11] = parts[i].x+1; - player[12] = parts[i].y+6; - player[13] = parts[i].x+1; - player[14] = parts[i].y+6; + player[11] = parts[i].x+1; + player[12] = parts[i].y+6; + player[13] = parts[i].x+1; + player[14] = parts[i].y+6; - player[15] = parts[i].x+3; - player[16] = parts[i].y+12; - player[17] = parts[i].x+3; - player[18] = parts[i].y+12; + player[15] = parts[i].x+3; + player[16] = parts[i].y+12; + player[17] = parts[i].x+3; + player[18] = parts[i].y+12; - } - } else - p += 2; - } + } + } + else + p += 2; + } } - for(j=0; j= size) - goto corrupt; - if(i <= NPART) - parts[i-1].life = d[p++]*4; - else - p++; - } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } } - for(j=0; j=34&&legacy_beta==0){ - if(p >= size){ - goto corrupt; - } - if(i <= NPART) { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } else { - p++; - } - } else { - parts[i-1].temp = ptypes[parts[i-1].type].heat; - } - } - } - for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) { - if(p >= size) - goto corrupt; - if(i <= NPART) - parts[i-1].ctype = d[p++]; - else - p++; - } + for(j=0; j=34&&legacy_beta==0) + { + if(p >= size) + { + goto corrupt; + } + if(i <= NPART) + { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } + else + { + p++; + } + } + else + { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } } - + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) + { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + if(p >= size) - goto version1; + goto version1; j = d[p++]; - for(i=0; i size) - goto corrupt; - for(k=0; k size) - goto corrupt; - if(k size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kSAVE_VERSION) - return NULL; - + return NULL; + bw = c[6]; bh = c[7]; w = bw*CELL; h = bh*CELL; - + if(c[5]!=CELL) - return NULL; - + return NULL; + i = (unsigned)c[8]; i |= ((unsigned)c[9])<<8; i |= ((unsigned)c[10])<<16; i |= ((unsigned)c[11])<<24; d = malloc(i); if(!d) - return NULL; + return NULL; fb = calloc(w*h, PIXELSIZE); - if(!fb) { - free(d); - return NULL; + if(!fb) + { + free(d); + return NULL; } - + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - goto corrupt; + goto corrupt; size = i; - + if(size < bw*bh) - goto corrupt; - + goto corrupt; + k = 0; for(y=0; y>1)&1; i>1)&1; i>1)&1; i>1)&1; i>1)&1; i>1)&1; i=size) - goto corrupt; - - for(y=0;y= size) - goto corrupt; - j=d[p++]; - if(j0) - { - if(j==PT_STKM) //Stickman should be drawed another way - { - //Stickman drawing - for(k=-2; k<=1; k++) - { - fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); - fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); - fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); - fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); - } - draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); - draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); - draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); - draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); - } - else - fb[y*w+x] = ptypes[j].pcolors; - } - } - + goto corrupt; + + for(y=0; y= size) + goto corrupt; + j=d[p++]; + if(j0) + { + if(j==PT_STKM) //Stickman should be drawed another way + { + //Stickman drawing + for(k=-2; k<=1; k++) + { + fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); + fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); + fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); + fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); + } + draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); + draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); + draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); + draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); + } + else + fb[y*w+x] = ptypes[j].pcolors; + } + } + free(d); *width = w; *height = h; return fb; - + corrupt: free(d); free(fb); @@ -4111,13 +4792,13 @@ corrupt: /* NO, I DON'T THINK SO #include "fbi.h" - + pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) { unsigned char *tmp; pixel *res; int i; - + tmp = malloc(width*height*3); if(!tmp) return NULL; @@ -4126,17 +4807,17 @@ corrupt: free(tmp); return NULL; } - + i = width*height*3; if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { free(res); free(tmp); return NULL; } - + for(i=0; i1) { - r = (r+c/2)/c; - g = (g+c/2)/c; - b = (b+c/2)/c; - } - q[y*w+x] = PIXRGB(r, g, b); - } + for(x=0; x1) + { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } *qw = w; *qh = h; return q; @@ -4256,28 +4947,31 @@ void stamp_gen_thumb(int i) void *data; int size, factor_x, factor_y; pixel *tmp; - - if(stamps[i].thumb) { - free(stamps[i].thumb); - stamps[i].thumb = NULL; + + if(stamps[i].thumb) + { + free(stamps[i].thumb); + stamps[i].thumb = NULL; } - + sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); data = file_load(fn, &size); - - if(data) { - stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); - if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) { - factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); - factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); - if(factor_y > factor_x) - factor_x = factor_y; - tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); - free(stamps[i].thumb); - stamps[i].thumb = tmp; - } + + if(data) + { + stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); + if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) + { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } } - + free(data); } @@ -4291,34 +4985,34 @@ void stamp_save(int x, int y, int w, int h) int n; char fn[64], sn[16]; void *s=build_save(&n, x, y, w, h); - + #ifdef WIN32 _mkdir("stamps"); #else mkdir("stamps", 0755); #endif - + stamp_gen_name(sn); sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); - + f = fopen(fn, "wb"); if(!f) - return; + return; fwrite(s, n, 1, f); fclose(f); - + free(s); - + if(stamps[STAMP_MAX-1].thumb) - free(stamps[STAMP_MAX-1].thumb); + free(stamps[STAMP_MAX-1].thumb); memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); memset(stamps, 0, sizeof(struct stamp_info)); - if(stamp_count0) { - memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); - memcpy(stamps, &tmp, sizeof(struct stamp_info)); - - stamp_update(); + return NULL; + + if(i>0) + { + memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); + memcpy(stamps, &tmp, sizeof(struct stamp_info)); + + stamp_update(); } - + return data; } @@ -4351,28 +5046,29 @@ void stamp_init(void) { int i; FILE *f; - + memset(stamps, 0, sizeof(stamps)); - + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); if(!f) - return; - for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) - return; - if(a!=255) { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; } vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } @@ -4400,50 +5097,58 @@ inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) char *rp = font_data + font_ptrs[c]; w = *(rp++); for(j=0; j>= 2; - bn -= 2; - } + for(i=0; i>= 2; + bn -= 2; + } return x + w; } int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) { int sx = x; - for(;*s;s++) { - if(*s == '\n') { - x = sx; - y += FONT_H+2; - } else if(*s == '\b') { - switch(s[1]) { - case 'w': - r = g = b = 255; - break; - case 'g': - r = g = b = 192; - break; - case 'o': - r = 255; - g = 216; - b = 32; - break; - case 'r': - r = 255; - g = b = 0; - break; - case 'b': - r = g = 0; - b = 255; - break; - } - s++; - } else - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + for(; *s; s++) + { + if(*s == '\n') + { + x = sx; + y += FONT_H+2; + } + else if(*s == '\b') + { + switch(s[1]) + { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } + else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); } return x; } @@ -4451,13 +5156,15 @@ int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) { int i; - for(i=0; i<=w; i++) { - drawpixel(vid, x+i, y, r, g, b, a); - drawpixel(vid, x+i, y+h, r, g, b, a); + for(i=0; i<=w; i++) + { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); } - for(i=1; i=w && x+textwidth(s)>=w+5) - break; - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + for(; *s; s++) + { + if(x+font_data[font_ptrs[(int)(*(unsigned char *)s)]]>=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); } if(*s) - for(i=0; i<3; i++) - x = drawchar(vid, x, y, '.', r, g, b, a); + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); return x; } int textnwidth(char *s, int n) { int x = 0; - for(;*s;s++) { - if(!n) - break; - x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - n--; + for(; *s; s++) + { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; } return x-1; } int textwidthx(char *s, int w) { int x=0,n=0,cw; - for(;*s;s++) { - cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - if(x+(cw/2) >= w) - break; - x += cw; - n++; + for(; *s; s++) + { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; } return n; } @@ -4536,842 +5246,1107 @@ int textwidthx(char *s, int w) void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) { int x, y, i, j, c; - int bo = b; - if(iswall==1){ - b = b-100; - x = (2+32*((b-22)/1)); - y = YRES+2+40; - switch(b){ - case WL_WALLELEC: - for(j=1; j<15; j++){ - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } else { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) { - for(i=1; i<6+j; i++) { - if(!(i&j&1)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) { - if(i&j&1) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<13; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) { - for(i=14; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - default: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } else { - x = 2+32*(b/2); - y = YRES+2+20*(b%2); - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - if(bo==sl || bo==sr) { - c = 0; - if(bo==sl) - c |= PIXPACK(0xFF0000); - if(bo==sr) - c |= PIXPACK(0x0000FF); - for(i=0; i<30; i++) { - vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; - } - for(j=0; j<18; j++) { - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; - } - } + int bo = b; + if(iswall==1) + { + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) + { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) + { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } } int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) { int i, j, c; - if(b>=121){ - b = b-100; - //x = (2+32*((b-22)/1)); - //y = YRES+2+40; - switch(b){ - case WL_WALLELEC: - for(j=1; j<15; j++){ - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } else { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) { - for(i=1; i<6+j; i++) { - if(!(i&j&1)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) { - if(i&j&1) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<13; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) { - for(i=14; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - if(!(i%2) && !(j%2)) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - case 40: - for(j=1; j<15; j+=2) { - for(i=1+(1&(j>>1)); i<27; i+=2) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - default: - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } else { - //x = 2+32*(b/2); - //y = YRES+2+20*(b%2); - for(j=1; j<15; j++) { - for(i=1; i<27; i++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) { - for(j=4; j<12; j++) { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) { - c = 255; - } else { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - return 26; + if(b>=121) + { + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; } -void draw_menu(pixel *vid_buf, int i, int hover){ - - //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); +void draw_menu(pixel *vid_buf, int i, int hover) +{ + + //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); #ifdef MENUV3 - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - if(hover==i){ - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); - } else { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); - } + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i) + { + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } #else - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); #endif } -void menu_ui(pixel *vid_buf, int i, int *sl, int *sr){ - int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; - pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); - fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); - memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr) +{ + int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - rows = ceil((float)msections[i].itemcount/16.0f); - height = (ceil((float)msections[i].itemcount/16.0f)*18); - width = restrict_flt(msections[i].itemcount*31, 0, 16*31); - //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); - h = -1; - x = XRES-BARSIZE-26; - y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; - sy = y; - //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); - fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); - fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); - drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); - if(i==SC_WALL){ - for(n = 122; n<122+UI_WALLCOUNT; n++){ - if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM){ - if(x-26<=60){ - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else if(i==SC_SPECIAL){ - for(n = 122; n<122+UI_WALLCOUNT; n++){ - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ - if(x-26<=60){ - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else { - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1){ - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); - } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } else { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=20) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1) + { + *sl = h; + } + if(b==4&&h!=-1) + { + *sr = h; } - //drawtext(vid_buf, XRES+2, (12*i)+2, msections[i].icon, 255, 255, 255, 255); } - void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int my){ - int h,x,y,n=0,height,width,sy,rows=0; - //bq = b; - //b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - rows = ceil((float)msections[i].itemcount/16.0f); - height = (ceil((float)msections[i].itemcount/16.0f)*18); - width = restrict_flt(msections[i].itemcount*31, 0, 16*31); - //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); - h = -1; - x = XRES-BARSIZE-26; - y = YRES+1;//(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; - sy = y; - //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); - //fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); - //drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); - //fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); - //drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); - //drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); - if(i==SC_WALL){ - for(n = 122; n<122+UI_WALLCOUNT; n++){ - if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM){ - if(x-26<=20){ - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else if(i==SC_SPECIAL){ - for(n = 122; n<122+UI_WALLCOUNT; n++){ - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ - if(x-26<=20){ - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } else { - for(n = 0; n=x+32 && mx=y && my< y+15){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } else if(n==*sl){ - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } else if(n==*sr){ - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1){ - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); - } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } else { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - if(b==1&&h!=-1){ - *sl = h; - } - if(b==4&&h!=-1){ - *sr = h; - } - } - int create_parts(int x, int y, int r, int c) { int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; - - if(c == 125) { - i = x / CELL; - j = y / CELL; - for(v=-1;v<2;v++) - for(u=-1;u<2;u++) - if(i+u>=0 && i+u=0 && j+v=0 && i+u=0 && j+v=0&&ox=0&&oy=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; float e, de; - if(cp) { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; } - if(x1 > x2) { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; } dx = x2 - x1; dy = abs(y2 - y1); e = 0.0f; if(dx) - de = dy/(float)dx; + de = dy/(float)dx; else - de = 0.0f; + de = 0.0f; y = y1; sy = (y1= 0.5f) { - y += sy; - if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) { - if(cp) - create_parts(y, x, r, c); - else - create_parts(x, y, r, c); - } - e -= 1.0f; - } + for(x=x1; x<=x2; x++) + { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + e += de; + if(e >= 0.5f) + { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) + { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } } } void create_box(int x1, int y1, int x2, int y2, int c) { int i, j; - if(x1>x2) { - i = x2; - x2 = x1; - x1 = i; + if(x1>x2) + { + i = x2; + x2 = x1; + x1 = i; } - if(y1>y2) { - j = y2; - y2 = y1; - y1 = j; + if(y1>y2) + { + j = y2; + y2 = y1; + y1 = j; } for(j=y1; j<=y2; j++) - for(i=x1; i<=x2; i++) - create_parts(i, j, 1, c); + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); } int flood_parts(int x, int y, int c, int cm, int bm) { int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT){ - c = c-100; - } - if(cm==-1) { - if(c==0) { - cm = pmap[y][x]&0xFF; - if(!cm) - return 0; - } else - cm = 0; + int co = c; + if(c>=122&&c<=122+UI_WALLCOUNT) + { + c = c-100; } - if(bm==-1) { - if(c==30) { - bm = bmap[y/CELL][x/CELL]; - if(!bm) - return 0; - if(bm==1) - cm = 0xFF; - } else - bm = 0; + if(cm==-1) + { + if(c==0) + { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } + else + cm = 0; } - + if(bm==-1) + { + if(c==30) + { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } + else + bm = 0; + } + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) - return 1; - + return 1; + // go left as far as possible x1 = x2 = x; - while(x1>=CELL) { - if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) - break; - x1--; + while(x1>=CELL) + { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; } - while(x2=CELL+dy) - for(x=x1; x<=x2; x++) - if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) - if(!flood_parts(x, y-dy, co, cm, bm)) - return 0; + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; if(y=XRES || y>=YRES) - return; + return; c = vid[y*(XRES+BARSIZE)+x]; c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); if(c<512) - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); else - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); } void xor_line(int x1, int y1, int x2, int y2, pixel *vid) { int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; float e, de; - if(cp) { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; } - if(x1 > x2) { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; } dx = x2 - x1; dy = abs(y2 - y1); e = 0.0f; if(dx) - de = dy/(float)dx; + de = dy/(float)dx; else - de = 0.0f; + de = 0.0f; y = y1; sy = (y1= 0.5f) { - y += sy; - e -= 1.0f; - } + for(x=x1; x<=x2; x++) + { + if(cp) + xor_pixel(y, x, vid); + else + xor_pixel(x, y, vid); + e += de; + if(e >= 0.5f) + { + y += sy; + e -= 1.0f; + } } } void draw_svf_ui(pixel *vid_buf) { int c; - + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - + c = svf_open ? 255 : 128; drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); - + c = svf_login ? 255 : 128; drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); if(svf_open) - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); else - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); if(svf_open && svf_own) - drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); - - c = (svf_login && svf_open) ? 255 : 128; - - drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - - if(svf_myvote==1 && (svf_login && svf_open)){ - fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); - } else if(svf_myvote==-1 && (svf_login && svf_open)){ - fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); - } - - drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); - drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); - + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } + else if(svf_myvote==-1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); if(svf_tags[0]) - drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); else - drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); - + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); if(svf_login) - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); else - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); - - if(sys_pause) { - fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); - } else { - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); - drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(sys_pause) + { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); } - if(!legacy_enable) { - fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); - } else { - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + if(!legacy_enable) + { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); } - - switch(cmode) { - case 0: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); - break; - case 1: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); - break; - case 2: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); - break; - case 3: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); - break; - case 4: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); - break; - case 5: - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - break; + else + { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + switch(cmode) + { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; } drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - - if(svf_admin) { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); - } else if(svf_mod) { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - }//else if(amd) - // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? + + if(svf_admin) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } + else if(svf_mod) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? } -typedef struct ui_edit { +typedef struct ui_edit +{ int x, y, w, nx; char str[256],*def; int focus, cursor, hide; @@ -5671,24 +6680,29 @@ void ui_edit_draw(pixel *vid_buf, ui_edit *ed) { int cx, i; char echo[256], *str; - - if(ed->hide) { - for(i=0;ed->str[i];i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } else - str = ed->str; - - if(ed->str[0]) { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); - } else if(!ed->focus) - drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); - if(ed->focus) { - cx = textnwidth(str, ed->cursor); - for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(ed->str[0]) + { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } + else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) + { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); } } char *shift_0="`1234567890-=[]\\;',./"; @@ -5700,224 +6714,259 @@ void ui_edit_process(int mx, int my, int mb, ui_edit *ed) #ifdef RAWINPUT char *p; #endif - - if(mb) { - if(ed->hide) { - for(i=0;ed->str[i];i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } else - str = ed->str; - - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } else - ed->focus = 0; + + if(mb) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; } - if(ed->focus && sdl_key) { - if(ed->hide) { - for(i=0;ed->str[i];i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } else - str = ed->str; - - l = strlen(ed->str); - switch(sdl_key) { - case SDLK_HOME: - ed->cursor = 0; - break; - case SDLK_END: - ed->cursor = l; - break; - case SDLK_LEFT: - if(ed->cursor > 0) - ed->cursor --; - break; - case SDLK_RIGHT: - if(ed->cursor < l) - ed->cursor ++; - break; - case SDLK_DELETE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - ed->str[ed->cursor] = 0; - else if(ed->cursor < l) - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - break; - case SDLK_BACKSPACE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) { - if(ed->cursor > 0) - memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); - ed->cursor = 0; - } else if(ed->cursor > 0) { - ed->cursor--; - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - } - break; - default: + if(ed->focus && sdl_key) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) + { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } + else if(ed->cursor > 0) + { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: #ifdef RAWINPUT - if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) { - ch = sdl_key; - if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) { - if(ch>='a' && ch<='z') - ch &= ~0x20; - p = strchr(shift_0, ch); - if(p) - ch = shift_1[p-shift_0]; - } - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) + { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) + { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } #else - if(sdl_ascii>=' ' && sdl_ascii<127) { - ch = sdl_ascii; - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } + if(sdl_ascii>=' ' && sdl_ascii<127) + { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } #endif - break; - } + break; + } + } +} +typedef struct ui_checkbox +{ + int x, y; + int focus, checked; +} ui_checkbox; +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) +{ + int w = 12; + if(ed->checked) + { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus) + { + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } + else + { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } +} +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) +{ + int w = 12; + + if(mb && !mbq) + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->checked = (ed->checked)?0:1; + } + } + else + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->focus = 1; + } + else + { + ed->focus = 0; + } } } - typedef struct ui_checkbox { - int x, y; - int focus, checked; - } ui_checkbox; - void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) - { - int w = 12; - if(ed->checked) { - drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); - } - if(ed->focus){ - drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); - } else { - drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); - } - } - void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) - { - int w = 12; - - if(mb && !mbq) { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ - ed->checked = (ed->checked)?0:1; - } - } else { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ - ed->focus = 1; - } else { - ed->focus = 0; - } - } - } void error_ui(pixel *vid_buf, int err, char *txt) { int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; char *msg; - + msg = malloc(strlen(txt)+16); if(err) - sprintf(msg, "%03d %s", err, txt); + sprintf(msg, "%03d %s", err, txt); else - sprintf(msg, "%s", txt); - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + sprintf(msg, "%s", txt); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } - - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - if(err) - drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); - else - drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; } - + free(msg); - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } } void info_ui(pixel *vid_buf, char *top, char *txt) { int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } - - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); - drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; } - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } } @@ -5925,7 +6974,7 @@ void info_box(pixel *vid_buf, char *msg) { int w = textwidth(msg)+16; int x0=(XRES-w)/2,y0=(YRES-24)/2; - + clearrect(vid_buf, x0-2, y0-2, w+4, 28); drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); @@ -5936,50 +6985,55 @@ int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) { int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; int ret = 0; - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } - - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); - drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); - drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); - drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) { - ret = 1; - break; - } - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) { - ret = 1; - break; - } - if(sdl_key==SDLK_ESCAPE) - break; + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) + { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; } - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } - + return ret; } @@ -5987,48 +7041,52 @@ int execute_tagop(pixel *vid_buf, char *op, char *tag) { int status; char *result; - + char *names[] = {"ID", "Tag", NULL}; char *parts[2]; - + char *uri = malloc(strlen(SERVER)+strlen(op)+36); sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); - + parts[0] = svf_id; parts[1] = tag; - + result = http_multipart_post( - uri, - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + free(uri); - - if(status!=200) { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 1; + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; } - if(result && strncmp(result, "OK", 2)) { - error_ui(vid_buf, 0, result); - free(result); - return 1; + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 1; } - - if(result[2]) { - strncpy(svf_tags, result+3, 255); - svf_id[15] = 0; + + if(result[2]) + { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; } - + if(result) - free(result); - + free(result); + return 0; } -struct strlist { +struct strlist +{ char *str; struct strlist *next; }; @@ -6042,18 +7100,19 @@ void strlist_add(struct strlist **list, char *str) int strlist_find(struct strlist **list, char *str) { struct strlist *item; - for(item=*list;item;item=item->next) - if(!strcmp(item->str, str)) - return 1; + for(item=*list; item; item=item->next) + if(!strcmp(item->str, str)) + return 1; return 0; } void strlist_free(struct strlist **list) { struct strlist *item; - while(*list) { - item = *list; - *list = (*list)->next; - free(item); + while(*list) + { + item = *list; + *list = (*list)->next; + free(item); } } @@ -6064,7 +7123,7 @@ void tag_list_ui(pixel *vid_buf) char *tag=NULL, *op=NULL; ui_edit ed; struct strlist *vote=NULL,*down=NULL; - + ed.x = x0+25; ed.y = y0+221; ed.w = 158; @@ -6074,118 +7133,131 @@ void tag_list_ui(pixel *vid_buf) ed.hide = 0; ed.cursor = 0; strcpy(ed.str, ""); - + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - op = tag = NULL; - - drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 256); - drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); - p = svf_tags; - s = svf_tags[0] ? ' ' : 0; - y = 36 + y0; - while(s) { - q = strchr(p, ' '); - if(!q) - q = p+strlen(p); - s = *q; - *q = 0; - if(svf_own || svf_admin || svf_mod) { - drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); - d = 14; - if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) { - if(!ed1.focus) - break; - ed1.focus = 0; - ed2.focus = 1; - } - if(sdl_key==SDLK_ESCAPE) { - if(!ed1.focus && !ed2.focus) - return; - ed1.focus = 0; - ed2.focus = 0; - } + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, "Server login:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\x8B", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\x8A", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + drawtext(vid_buf, x0+11, y0+44, "\x8C", 160, 144, 32, 255); + drawtext(vid_buf, x0+11, y0+44, "\x84", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+40, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed1); + ui_edit_draw(vid_buf, &ed2); + drawtext(vid_buf, x0+5, y0+69, "Sign in", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed1); + ui_edit_process(mx, my, b, &ed2); + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) + { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) + { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } } - + strcpy(svf_user, ed1.str); md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); - + res = http_multipart_post( - "http://" SERVER "/Login.api", - NULL, NULL, NULL, - svf_user, svf_pass, - &err, NULL); - if(err != 200) { - error_ui(vid_buf, err, http_ret_text(err)); - if(res) - free(res); - goto fail; + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) + { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; } - if(res && !strncmp(res, "OK", 2)) { - if(!strcmp(res, "OK ADMIN")){ - svf_admin = 1; - svf_mod = 0; - } else if(!strcmp(res, "OK MOD")){ - svf_admin = 0; - svf_mod = 1; - } else { - svf_admin = 0; - svf_mod = 0; - } - free(res); - svf_login = 1; - return; + if(res && !strncmp(res, "OK", 2)) + { + if(!strcmp(res, "OK ADMIN")) + { + svf_admin = 1; + svf_mod = 0; + } + else if(!strcmp(res, "OK MOD")) + { + svf_admin = 0; + svf_mod = 1; + } + else + { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; } if(!res) - res = mystrdup("Unspecified Error"); + res = mystrdup("Unspecified Error"); error_ui(vid_buf, 0, res); free(res); - + fail: strcpy(svf_user, ""); strcpy(svf_pass, ""); svf_login = 0; svf_own = 0; svf_admin = 0; - svf_mod = 0; + svf_mod = 0; } void execute_delete(pixel *vid_buf, char *id) { int status; char *result; - + char *names[] = {"ID", NULL}; char *parts[1]; - + parts[0] = id; - + result = http_multipart_post( - "http://" SERVER "/Delete.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; } - if(result && strncmp(result, "OK", 2)) { - error_ui(vid_buf, 0, result); - free(result); - return; + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; } - + if(result) - free(result); + free(result); } - + int execute_vote(pixel *vid_buf, char *id, char *action) { - int status; - char *result; - - char *names[] = {"ID", "Action", NULL}; - char *parts[2]; - - parts[0] = id; - parts[1] = action; - - result = http_multipart_post( - "http://" SERVER "/Vote.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 0; - } - if(result && strncmp(result, "OK", 2)) { - error_ui(vid_buf, 0, result); - free(result); - return 0; - } - - if(result) - free(result); - return 1; + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; } static char hex[] = "0123456789ABCDEF"; @@ -6550,19 +7650,21 @@ void strcaturl(char *dst, char *src) { char *d; unsigned char *s; - + for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) { - if((*s>='0' && *s<='9') || - (*s>='a' && *s<='z') || - (*s>='A' && *s<='Z')) - *(d++) = *s; - else { - *(d++) = '%'; - *(d++) = hex[*s>>4]; - *(d++) = hex[*s&15]; - } + + for(s=(unsigned char *)src; *s; s++) + { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else + { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } } *d = 0; } @@ -6577,36 +7679,39 @@ int thumb_cache_lru[THUMB_CACHE_SIZE]; void thumb_cache_inval(char *id) { int i,j; - for(i=0;i= THUMB_CACHE_SIZE) - return; + return; free(thumb_cache_id[i]); free(thumb_cache_data[i]); thumb_cache_id[i] = NULL; - for(j=0;j thumb_cache_lru[i]) - thumb_cache_lru[j]--; + for(j=0; j thumb_cache_lru[i]) + thumb_cache_lru[j]--; } void thumb_cache_add(char *id, void *thumb, int size) { int i,m=-1,j=-1; thumb_cache_inval(id); - for(i=0;i m) { - m = thumb_cache_lru[i]; - j = i; - } + for(i=0; i m) + { + m = thumb_cache_lru[i]; + j = i; + } } - if(i >= THUMB_CACHE_SIZE) { - thumb_cache_inval(thumb_cache_id[j]); - i = j; + if(i >= THUMB_CACHE_SIZE) + { + thumb_cache_inval(thumb_cache_id[j]); + i = j; } - for(j=0;j= THUMB_CACHE_SIZE) - return 0; - for(j=0;j=GRID_X*GRID_Y) - break; - if(votes) { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } else { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+5); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } else if(!strncmp(str, "TAG ", 4)) { - if(j >= TAG_MAX) { - str = p; - continue; - } - q = strchr(str+4, ' '); - if(!q) { - str = p; - continue; - } - *(q++) = 0; - tag_names[j] = mystrdup(str+4); - tag_votes[j] = atoi(q); - j++; - } else { - if(i>=GRID_X*GRID_Y) - break; - if(votes) { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } else { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - str = p; + do_open = 0; + while(1) + { + if(!*str) + break; + p = strchr(str, '\n'); + if(!p) + p = str + strlen(str); + else + *(p++) = 0; + if(!strncmp(str, "OPEN ", 5)) + { + do_open = 1; + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + else if(!strncmp(str, "TAG ", 4)) + { + if(j >= TAG_MAX) + { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) + { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } + else + { + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; } if(*str) - i++; + i++; return i; } @@ -6838,13 +7963,13 @@ int search_ui(pixel *vid_buf) { int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; - int thumb_drawn[GRID_X*GRID_Y]; - pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - float ry; + int thumb_drawn[GRID_X*GRID_Y]; + pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + float ry; time_t http_last_use=HTTP_TIMEOUT; ui_edit ed; - + void *http = NULL; int active = 0; char *last = NULL; @@ -6854,36 +7979,37 @@ int search_ui(pixel *vid_buf) int status; char *results; char *tmp, ts[64]; - + void *img_http[IMGCONNS]; char *img_id[IMGCONNS]; void *thumb, *data; int thlen, dlen; - - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); memset(img_http, 0, sizeof(img_http)); memset(img_id, 0, sizeof(img_id)); - + memset(search_ids, 0, sizeof(search_ids)); memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); - memset(search_publish, 0, sizeof(search_publish)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); memset(search_owners, 0, sizeof(search_owners)); memset(search_thumbs, 0, sizeof(search_thumbs)); memset(search_thsizes, 0, sizeof(search_thsizes)); - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - - do_open = 0; - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + + do_open = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } - + ed.x = 65; ed.y = 13; ed.w = XRES-200; @@ -6893,522 +8019,619 @@ int search_ui(pixel *vid_buf) ed.hide = 0; ed.cursor = strlen(search_expr); strcpy(ed.str, search_expr); - + sdl_wheel = 0; - - while(!sdl_poll()) { - uih = 0; - bq = b; - mxq = mx; - myq = my; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - if(mx!=mxq || my!=myq || sdl_wheel || b) - mmt = 0; - else if(mmt 9) { - drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); - drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); - } - - ui_edit_draw(vid_buf, &ed); - - if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) { - if(search_page) { - search_page --; - lasttime = TIMEOUT; - } - sdl_wheel = 0; - uih = 1; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) { - lasttime = TIMEOUT; - search_page ++; - page_count = exp_res; - } - sdl_wheel = 0; - uih = 1; - } - - tp = -1; - if(is_p1) { - drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); - for(gj=0;gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14);gj++) - for(gi=0;giTAG_MAX || !tag_names[pos]) - break; - if(tag_votes[0]) - i = 127+(128*tag_votes[pos])/tag_votes[0]; - else - i = 192; - w = textwidth(tag_names[pos]); - if(w>XRES/GRID_X-5) - w = XRES/GRID_X-5; - gx = (XRES/GRID_X)*gi; - gy = gj*14 + 46; - if(mx>=gx && mx=gy && my XRES/GRID_X-10) { - tmp = malloc(strlen(search_names[pos])+4); - strcpy(tmp, search_names[pos]); - j = textwidthx(tmp, XRES/GRID_X-15); - strcpy(tmp+j, "..."); - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); - free(tmp); - } else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); - j = textwidth(search_owners[pos]); - if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && - my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) { - st = 1; - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); - } else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); - if(search_thumbs[pos]&&thumb_drawn[pos]==0){ - render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); - thumb_drawn[pos] = 1; - } - own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); - if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) - mp = pos; - if(own) { - if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) { - mp = -1; - dp = pos; - } - } - if(mp==pos && !st) - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); - else - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); - if(own) { - if(dp == pos) - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); - else - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); - } - if(!search_publish[pos]){ - drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); - drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(view_own || svf_admin || svf_mod) { - sprintf(ts+1, "%d", search_votes[pos]); - ts[0] = 0xBB; - for(j=1; ts[j]; j++) - ts[j] = 0xBC; - ts[j-1] = 0xB9; - ts[j] = 0xBA; - ts[j+1] = 0; - w = gx+XRES/GRID_S-2-textwidth(ts); - h = gy+YRES/GRID_S-11; - drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); - for(j=0; ts[j]; j++) - ts[j] -= 14; - drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); - sprintf(ts, "%d", search_votes[pos]); - for(j=0; ts[j]; j++) - ts[j] += 127; - drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); - } - if(search_scoreup[pos]>0||search_scoredown[pos]>0){ - lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); - - if(((YRES/GRID_S+3)/2)>lv){ - ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); - if(lv<8){ - ry = ry/(8-lv); - } - nyu = search_scoreup[pos]*ry; - nyd = search_scoredown[pos]*ry; - } else { - ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); - nyu = search_scoreup[pos]/ry; - nyd = search_scoredown[pos]/ry; - } - - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); - - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); - } - } - - if(mp!=-1 && mmt>=TIMEOUT/5 && !st) { - gi = mp % GRID_X; - gj = mp / GRID_X; - if(is_p1) - gj += GRID_Y-GRID_P; - gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; - gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; - i = w = textwidth(search_names[mp]); - h = YRES/GRID_Z+30; - if(w=XRES-2) gx=XRES-3-w; - if(gy<32) gy=32; - if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; - clearrect(vid_buf, gx-2, gy-3, w+4, h); - drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); - if(search_thumbs[mp]) - render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); - drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); - drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(sdl_key==SDLK_RETURN) { - if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) - lasttime = TIMEOUT; - else if(search_ids[0] && !search_ids[1]) { - bq = 0; - b = 1; - mp = 0; - } - } - if(sdl_key==SDLK_ESCAPE) - goto finish; - - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) { - search_own = !search_own; - lasttime = TIMEOUT; - } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) { - search_date = !search_date; - lasttime = TIMEOUT; - } - - if(b && !bq && dp!=-1) - if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) { - execute_delete(vid_buf, search_ids[dp]); - lasttime = TIMEOUT; - if(last) { - free(last); - last = NULL; - } - } - - if(b && !bq && tp!=-1) { - strncpy(ed.str, tag_names[tp], 255); - lasttime = TIMEOUT; - } - - if(b && !bq && mp!=-1 && st) { - sprintf(ed.str, "user:%s", search_owners[mp]); - lasttime = TIMEOUT; - } - - if(do_open==1){ - mp = 0; - } - - if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt=TIMEOUT) { - lasttime = 0; - last = mystrdup(ed.str); - last_own = search_own; - last_date = search_date; - last_page = search_page; - active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); - if(search_own || svf_admin || svf_mod) - tmp = "&ShowVotes=true"; - else - tmp = ""; - if(!search_own && !search_date && !*last) { - if(search_page) { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); - } else { - exp_res = GRID_X*GRID_P; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); - } - } else { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); - } - strcaturl(uri, last); - if(search_own) { - strcaturl(uri, " user:"); - strcaturl(uri, svf_user); - } - if(search_date) - strcaturl(uri, " sort:date"); + clearrect(vid_buf, -1, -1, (XRES+BARSIZE)+1, YRES+MENUSIZE+1); - http = http_async_req_start(http, uri, NULL, 0, 1); - if(svf_login){ - http_auth_headers(http, svf_user, svf_pass); - } - http_last_use = time(NULL); - free(uri); - } - - if(active && http_async_req_status(http)) { - http_last_use = time(NULL); - results = http_async_req_stop(http, &status, NULL); - view_own = last_own; - if(status == 200){ - page_count = search_results(results, last_own||svf_admin||svf_mod); - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - } - is_p1 = (exp_res < GRID_X*GRID_Y); - free(results); - active = 0; - } - - if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) { - http_async_req_close(http); - http = NULL; - } - - for(i=0;i 9) + { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) + { + if(search_page) + { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) + { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) + { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) + for(gi=0; giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) + { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) + { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]&&thumb_drawn[pos]==0) + { + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); + thumb_drawn[pos] = 1; + } + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) + { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) + { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) + { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]) + { + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) + { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0) + { + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv) + { + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8) + { + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } + else + { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) + { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) + { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) + { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) + { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) + { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) + { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) + { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1) + { + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) + { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) + { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) + { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) + { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) + { + if(data) + { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } + else + svf_tags[0] = 0; + } + else + { + svf_tags[0] = 0; + } + + if(svf_login) + { + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200) + { + if(data) + { + if(!strcmp(data, "Up")) + { + svf_myvote = 1; + } + else if(!strcmp(data, "Down")) + { + svf_myvote = -1; + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + } + else + { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } + else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + { + search = 1; + } + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } + else + search = 0; + + if(search && lasttime>=TIMEOUT) + { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) + { + if(search_page) + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } + else + { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } + else + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) + { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login) + { + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) + { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + { + page_count = search_results(results, last_own||svf_admin||svf_mod); + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + } + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) + { + http_async_req_close(http); + http = NULL; + } + + for(i=0; i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) { - if(stamp_page) { - stamp_page --; - } - sdl_wheel = 0; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) + { + if(stamp_page) + { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; + if(strcmp(signs[i].text, "{t}")==0) + *w = textwidth("Temp: 0000.00"); + + //Ususal width + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + *w = textwidth(signs[i].text) + 5; + *h = 14; + *x0 = (signs[i].ju == 2) ? signs[i].x - *w : + (signs[i].ju == 1) ? signs[i].x - *w/2 : signs[i].x; + *y0 = (signs[i].y > 18) ? signs[i].y - 18 : signs[i].y + 4; } void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) @@ -7578,12 +8825,15 @@ void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) char t[2]; t[0] = ch; t[1] = 0; - if(flag) { - fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); - } else { - drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + if(flag) + { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } + else + { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); } } @@ -7592,40 +8842,42 @@ void render_signs(pixel *vid_buf) int i, j, x, y, w, h, dx, dy; char buff[30]; //Buffer for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature - else - sprintf(buff, "Temp: 0.00"); //...tempirature - drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); - } + if(signs[i].text[0]) + { + get_sign_pos(i, &x, &y, &w, &h); + clearrect(vid_buf, x, y, w, h); + drawrect(vid_buf, x, y, w, h, 192, 192, 192, 255); - //Usual text - if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) - drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); - x = signs[i].x; - y = signs[i].y; - dx = 1 - signs[i].ju; - dy = (signs[i].y > 18) ? -1 : 1; - for(j=0; j<4; j++) { - drawpixel(vid_buf, x, y, 192, 192, 192, 255); - x+=dx; - y+=dy; - } - } + //Displaying special information + if(strcmp(signs[i].text, "{p}")==0) + { + sprintf(buff, "Pressure: %3.2f", pv[signs[i].y/CELL][signs[i].x/CELL]); //...pressure + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + if(strcmp(signs[i].text, "{t}")==0) + { + if((pmap[signs[i].y][signs[i].x]>>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature + else + sprintf(buff, "Temp: 0.00"); //...tempirature + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + //Usual text + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); + x = signs[i].x; + y = signs[i].y; + dx = 1 - signs[i].ju; + dy = (signs[i].y > 18) ? -1 : 1; + for(j=0; j<4; j++) + { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } } void add_sign_ui(pixel *vid_buf, int mx, int my) @@ -7633,36 +8885,40 @@ void add_sign_ui(pixel *vid_buf, int mx, int my) int i, w, h, x, y, nm=0, ju; int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; ui_edit ed; - + // check if it is an existing sign for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) - break; - } + if(signs[i].text[0]) + { + get_sign_pos(i, &x, &y, &w, &h); + if(mx>=x && mx<=x+w && my>=y && my<=y+h) + break; + } // else look for empty spot - if(i >= MAXSIGNS) { - nm = 1; - for(i=0; i= MAXSIGNS) + { + nm = 1; + for(i=0; i= MAXSIGNS) - return; - - if(nm) { - signs[i].x = mx; - signs[i].y = my; - signs[i].ju = 1; + return; + + if(nm) + { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; } - - while(!sdl_poll()) { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; } - + ed.x = x0+25; ed.y = y0+25; ed.w = 158; @@ -7673,66 +8929,70 @@ void add_sign_ui(pixel *vid_buf, int mx, int my) ed.cursor = strlen(signs[i].text); strcpy(ed.str, signs[i].text); ju = signs[i].ju; - + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed); - drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); - draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); - draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); - draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); - - if(!nm) { - drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); - drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); - drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); - } - - drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) - ju = 0; - if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) - ju = 1; - if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) - ju = 2; - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) { - signs[i].text[0] = 0; - return; - } - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) { - if(!ed.focus) - return; - ed.focus = 0; - } + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) + { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) + { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + { + if(!ed.focus) + return; + ed.focus = 0; + } } - + strcpy(signs[i].text, ed.str); signs[i].ju = ju; } @@ -7759,9 +9019,10 @@ int load_string(FILE *f, char *str, int max) unsigned char lb[2]; fread(lb, 2, 1, f); li = lb[0] | (lb[1] << 8); - if(li > max) { - str[0] = 0; - return 1; + if(li > max) + { + str[0] = 0; + return 1; } fread(str, li, 1, f); str[li] = 0; @@ -7776,7 +9037,7 @@ void save_presets(int do_update) unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; unsigned char tmp = sdl_scale; if(!f) - return; + return; fwrite(sig, 1, 4, f); save_string(f, svf_user); save_string(f, svf_pass); @@ -7785,8 +9046,8 @@ void save_presets(int do_update) fwrite(&tmp, 1, 1, f); tmp = svf_admin; fwrite(&tmp, 1, 1, f); - tmp = svf_mod; - fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); save_string(f, http_proxy); tmp = SAVE_VERSION; fwrite(&tmp, 1, 1, f); @@ -7802,47 +9063,51 @@ void load_presets(void) FILE *f=fopen("powder.def", "rb"); unsigned char sig[4], tmp; if(!f) - return; + return; fread(sig, 1, 4, f); - if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66){ - if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F){ - if(fseek(f, -3, SEEK_END)){ - remove("powder.def"); - return; - } - if(fread(sig, 1, 3, f) != 3){ - remove("powder.def"); - goto fail; - } - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; - } - fclose(f); - remove("powder.def"); - return; - } + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) + { + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) + { + if(fseek(f, -3, SEEK_END)) + { + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3) + { + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } if(load_string(f, svf_user, 63)) - goto fail; + goto fail; if(load_string(f, svf_pass, 63)) - goto fail; + goto fail; svf_login = !!svf_user[0]; if(fread(&tmp, 1, 1, f) != 1) - goto fail; + goto fail; sdl_scale = (tmp == 2) ? 2 : 1; if(fread(&tmp, 1, 1, f) != 1) - goto fail; - cmode = tmp%6; + goto fail; + cmode = tmp%6; if(fread(&tmp, 1, 1, f) != 1) - goto fail; + goto fail; svf_admin = tmp; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_mod = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; if(load_string(f, http_proxy, 255)) - goto fail; + goto fail; if(fread(sig, 1, 3, f) != 3) - goto fail; + goto fail; last_major = sig[0]; last_minor = sig[1]; update_flag = sig[2]; @@ -7853,17 +9118,18 @@ fail: void dim_copy(pixel *dst, pixel *src) { int i,r,g,b; - for(i=0;i0) - r--; - if(g>0) - g--; - if(b>0) - b--; - dst[i] = PIXRGB(r,g,b); + for(i=0; i0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); } } @@ -7874,41 +9140,43 @@ void prepare_alpha(void) float temp[CELL*3][CELL*3]; memset(temp, 0, sizeof(temp)); for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; - fire_g[j][i] = g>4 ? g-4 : 0; - fire_b[j][i] = b>4 ? b-4 : 0; - } + for(j=0; j=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } } int zoom_en = 0; @@ -7922,61 +9190,71 @@ void render_zoom(pixel *img) drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) { - xor_pixel(x+i, y+j, vid); - if(j) xor_pixel(x+i, y-j, vid); - if(i) xor_pixel(x-i, y+j, vid); - if(i&&j) xor_pixel(x-i, y-j, vid); - } - } else { - int tc; - c = (r/CELL) * CELL; - x = (x/CELL) * CELL; - y = (y/CELL) * CELL; - - tc = !((c%(CELL*2))==0); - - x -= c/2; - y -= c/2; - - x += tc*(CELL/2); - y += tc*(CELL/2); - - for(i=0; ir*r || i*i+(j+1)*(j+1)>r*r)) + { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } + else + { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i2){ - pthread_t pth; - pthread_create(&pth,NULL,update_air_th,""); - } else { - update_air(); - } + if(numCores>2) + { + pthread_t pth; + pthread_create(&pth,NULL,update_air_th,""); + } + else + { + update_air(); + } #else - update_air(); + update_air(); #endif - } - if(cmode==0 || cmode==1) { - draw_air(vid_buf); - } else if(cmode==2) { - memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); - memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); - } else { - memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); - } - update_particles(vid_buf); - - if(cmode==2) { - if(!fire_fc) { - dim_copy(fire_bg, vid_buf); - } else { - memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); - } - fire_fc = (fire_fc+1) % 3; - } - if(cmode==3||cmode==4) - render_fire(vid_buf); - - render_signs(vid_buf); - - memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); - clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); - - draw_svf_ui(vid_buf); - - if(http_ver_check) { - if(!do_check && http_async_req_status(http_ver_check)) { - ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); - if(http_ret==200 && ver_data) { + } + if(cmode==0 || cmode==1) + { + draw_air(vid_buf); + } + else if(cmode==2) + { + memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); + memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); + } + else + { + memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); + } + update_particles(vid_buf); + + if(cmode==2) + { + if(!fire_fc) + { + dim_copy(fire_bg, vid_buf); + } + else + { + memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); + } + fire_fc = (fire_fc+1) % 3; + } + if(cmode==3||cmode==4) + render_fire(vid_buf); + + render_signs(vid_buf); + + memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); + clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); + + draw_svf_ui(vid_buf); + + if(http_ver_check) + { + if(!do_check && http_async_req_status(http_ver_check)) + { + ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); + if(http_ret==200 && ver_data) + { #ifdef BETA - if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) - old_version = 1; + if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; #else - if(sscanf(ver_data, "%d.%d", &major, &minor)==2) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) - old_version = 1; + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; #endif - free(ver_data); - } - http_ver_check = NULL; - } - do_check = (do_check+1) & 15; - } - - if(sdl_key=='q' || sdl_key==SDLK_ESCAPE){ - if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")){ - break; - } - } - if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) { - if(load_mode) { - free(load_img); - free(load_data); - load_mode = 0; - load_data = NULL; - load_img = NULL; - } - if(it > 50) - it = 50; - if(sdl_key=='k' && stamps[1].name[0]) { - j = stamp_ui(vid_buf); - if(j>=0) - load_data = stamp_load(j, &load_size); - else - load_data = NULL; - } else - load_data = stamp_load(0, &load_size); - if(load_data) { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - if(sdl_key=='s') { - if(it > 50) - it = 50; - save_mode = 1; - } - if(sdl_key=='1'){ - set_cmode(0); - } - if(sdl_key=='2'){ - set_cmode(1); - } - if(sdl_key=='3'){ - set_cmode(2); - } - if(sdl_key=='4'){ - set_cmode(3); - } - if(sdl_key=='5'){ - set_cmode(4); - } - if(sdl_key=='6'){ - set_cmode(5); - } - if(sdl_key==SDLK_SPACE) - sys_pause = !sys_pause; - if(sdl_key=='h') - hud_enable = !hud_enable; - if(sdl_key=='p') - dump_frame(vid_buf, XRES, YRES, XRES); - if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ - if(clipboard_ready==1){ - load_data = malloc(clipboard_length); - memcpy(load_data, clipboard_data, clipboard_length); - load_size = clipboard_length; - if(load_data) { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - } - if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ - save_mode = 1; - copy_mode = 2; - } - if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))){ - save_mode = 1; - copy_mode = 1; - } else if(sdl_key=='c') { - set_cmode((cmode+1) % 6); - if(it > 50) - it = 50; - } + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + { + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) + { + break; + } + } + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) + { + if(load_mode) + { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) + { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } + else + load_data = stamp_load(0, &load_size); + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') + { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1') + { + set_cmode(0); + } + if(sdl_key=='2') + { + set_cmode(1); + } + if(sdl_key=='3') + { + set_cmode(2); + } + if(sdl_key=='4') + { + set_cmode(3); + } + if(sdl_key=='5') + { + set_cmode(4); + } + if(sdl_key=='6') + { + set_cmode(5); + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='h') + hud_enable = !hud_enable; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + if(clipboard_ready==1) + { + load_data = malloc(clipboard_length); + memcpy(load_data, clipboard_data, clipboard_length); + load_size = clipboard_length; + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + } + if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 2; + } + if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 1; + } + else if(sdl_key=='c') + { + set_cmode((cmode+1) % 6); + if(it > 50) + it = 50; + } #ifdef INTERNAL - if(sdl_key=='v') - vs = !vs; - if(vs) - dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='v') + vs = !vs; + if(vs) + dump_frame(vid_buf, XRES, YRES, XRES); #endif - - if(sdl_wheel) { - if(sdl_zoom_trig==1){ - ZSIZE += sdl_wheel; - if(ZSIZE>32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - sdl_wheel = 0; - } else { - bs += sdl_wheel; - if(bs>16) - bs = 16; - if(bs<0) - bs = 0; - sdl_wheel = 0; - /*if(su >= PT_NUM) { - if(sl < PT_NUM) - su = sl; - if(sr < PT_NUM) - su = sr; - }*/ - } - } - - bq = b; - b = SDL_GetMouseState(&x, &y); - for(i=0; i32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } + else + { + bs += sdl_wheel; + if(bs>16) + bs = 16; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy - && x0 && y0 && x>8)>=NPART || !cr)){ + if(zoom_en && x>=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)) + { #ifdef BETA - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); #else - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); #endif - } else { - sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); - } - } - mx = x; - my = y; - if(update_flag) { - info_box(vid_buf, "Finalizing update..."); - if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) { - update_cleanup(); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } else { - if(update_finish()) - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - else - info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); - } - update_flag = 0; - } - - if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && - x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) { - tmp = malloc(64); -#ifdef BETA - if(is_beta){ - sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); - } else { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); - } -#else - sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); -#endif - if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) { - free(tmp); - tmp = download_ui(vid_buf, my_uri, &i); - if(tmp) { - save_presets(1); - if(update_start(tmp, i)) { - update_cleanup(); - save_presets(0); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } else - return 0; - } - } else - free(tmp); - } - if(y>=sdl_scale*(YRES+(MENUSIZE-20))) { - if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0){ - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0){ - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0){ - db = (svf_myvote==1) ? 273 : 274; - if(da < 51) - da ++; - } - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) { - db = svf_own ? 257 : 256; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) { - db = 270; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) { - db = 266; - if(da < 51) - da ++; - } else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) { - db = 259; - if(svf_open && svf_own && x<=55*sdl_scale) - db = 258; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) { - db = svf_login ? 261 : 260; - if(svf_admin) { - db = 268; - } else if(svf_mod) { - db = 271; - } - if(da < 51) - da ++; - } else if(x>=sdl_scale && x<=17*sdl_scale) { - db = 262; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) { - db = sys_pause ? 264 : 263; - if(da < 51) - da ++; - } else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) { - db = 267; - if(da < 51) - da ++; - } else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) { - db = 265; - if(da < 51) - da ++; - } else if(da > 0) - da --; - } else - if(da > 0) - da --; - - if(!sdl_zoom_trig && zoom_en==1) - zoom_en = 0; - - if(sdl_key==Z_keysym && zoom_en==2) - zoom_en = 1; - - if(load_mode) { - load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); - load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); - if(load_x+load_w>XRES) load_x=XRES-load_w; - if(load_y+load_h>YRES) load_y=YRES-load_h; - if(load_x<0) load_x=0; - if(load_y<0) load_y=0; - if(bq==1 && !b) { - parse_save(load_data, load_size, 0, load_x, load_y); - free(load_data); - free(load_img); - load_mode = 0; - } else if(bq==4 && !b) { - free(load_data); - free(load_img); - load_mode = 0; - } - } else if(save_mode==1) { - save_x = (mx/sdl_scale)/CELL; - save_y = (my/sdl_scale)/CELL; - if(save_x >= XRES/CELL) save_x = XRES/CELL-1; - if(save_y >= YRES/CELL) save_y = YRES/CELL-1; - save_w = 1; - save_h = 1; - if(b==1){ - save_mode = 2; - } else if(b==4){ - save_mode = 0; - copy_mode = 0; - } - } else if(save_mode==2) { - save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; - save_h = (my/sdl_scale+CELL/2)/CELL - save_y; - if(save_w>XRES/CELL) save_w = XRES/CELL; - if(save_h>YRES/CELL) save_h = YRES/CELL; - if(save_w<1) save_w = 1; - if(save_h<1) save_h = 1; - if(!b) { - if(copy_mode==1){ - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - } else if(copy_mode==2){ - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - } else { - stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - save_mode = 0; - } - } - } else if(sdl_zoom_trig && zoom_en<2) { - x /= sdl_scale; - y /= sdl_scale; - x -= ZSIZE/2; - y -= ZSIZE/2; - if(x<0) x=0; - if(y<0) y=0; - if(x>XRES-ZSIZE) x=XRES-ZSIZE; - if(y>YRES-ZSIZE) y=YRES-ZSIZE; - zoom_x = x; - zoom_y = y; - zoom_wx = (x 50) - it = 50; - x /= sdl_scale; - y /= sdl_scale; - if(y>=YRES+(MENUSIZE-20)) { - if(!lb) { - if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ - if(execute_vote(vid_buf, svf_id, "Up")){ - svf_myvote = 1; - } - } - if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ - if(execute_vote(vid_buf, svf_id, "Down")){ - svf_myvote = -1; - } - } - if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) - tag_list_ui(vid_buf); - if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) { - legacy_enable = !legacy_enable; - } - if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) { - memset(signs, 0, sizeof(signs)); - memset(pv, 0, sizeof(pv)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(fvx, 0, sizeof(fvx)); - memset(fvy, 0, sizeof(fvy)); - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(parts, 0, sizeof(particle)*NPART); - for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) { - login_ui(vid_buf); - if(svf_login) - save_presets(0); - } - if(x>=37 && x<=187 && svf_login) { - if(!svf_open || !svf_own || x>51) { - if(save_name_ui(vid_buf)) - execute_save(vid_buf); - } else - execute_save(vid_buf); - while(!sdl_poll()) - if(!SDL_GetMouseState(&x, &y)) - break; - b = bq = 0; - } - if(x>=1 && x<=17) { - search_ui(vid_buf); - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - } - if(x>=19 && x<=35 && svf_last && svf_open) - parse_save(svf_last, svf_lsize, 1, 0, 0); - if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 6); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+5) % 6); - save_presets(0); - } - if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) - sys_pause = !sys_pause; - lb = 0; - } - } else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)){ - c = sl = cr&0xFF; - } else { - //Something - } - } - //create_parts(x, y, bs, SPC_AIR); - lx = x; - ly = y; - lb = 0; - lm = 0; - } else { - create_parts(x, y, bs, c); - lx = x; - ly = y; - lb = b; - lm = 0; - } - } - } - } else { - if(lb && lm) { - x /= sdl_scale; - y /= sdl_scale; - c = (lb&1) ? sl : sr; - su = c; - if(lm == 1) { - if(c!=127 || lx<0 || ly<0 || lx>=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) - create_line(lx, ly, x, y, bs, c); - } else - create_box(lx, ly, x, y, c); - lm = 0; - } - lb = 0; - } - - if(load_mode) { - draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); - xor_rect(vid_buf, load_x, load_y, load_w, load_h); - } - - if(save_mode) { - xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - da = 51; - db = 269; - } - - if(zoom_en!=1 && !load_mode && !save_mode) - { - render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); - mousex = mx/sdl_scale; mousey = my/sdl_scale; - } - - if(zoom_en) - render_zoom(vid_buf); - - if(da) - switch(db) { - case 256: - drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); - break; - case 257: - drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); - break; - case 258: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); - break; - case 259: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); - break; - case 260: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); - break; - case 261: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); - break; - case 262: - drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); - break; - case 263: - drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); - break; - case 264: - drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); - break; - case 265: - drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); - break; - case 266: - drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); - break; - case 267: - drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); - break; - case 268: - drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); - break; - case 269: - drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); - break; - case 270: - drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); - break; - case 271: - drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); - break; - case 272: - drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); - break; - case 273: - drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); - break; - case 274: - drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); - break; - case 275: - drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); - break; - default: - drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); - } - if(itc) { - itc--; - drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); - } - if(it) { - it--; - //if(fbi_img) - //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); - drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); - } - - if(old_version) { - clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); -#ifdef BETA - if(is_beta){ - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); - } else { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); - } -#else - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); -#endif - drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); - } - /*#ifdef MT - pthread_join(pth2,NULL); - #endif*/ + } + else + { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } + mx = x; + my = y; + if(update_flag) + { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) + { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } - if(hud_enable){ - currentTime = SDL_GetTicks(); - if(currentTime-past>=16) { - past = SDL_GetTicks(); - FPS++; - } - if(currentTime-pastFPS>=1000) { + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) + { + tmp = malloc(64); #ifdef BETA - sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); + if(is_beta) + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } + else + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } #else - sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); #endif - FPSB = FPS; - FPS = 0; - pastFPS = currentTime; - } - if(sdl_zoom_trig||zoom_en){ - if(zoom_x=sdl_scale*(YRES+(MENUSIZE-20))) + { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) + { + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) + { + db = svf_own ? 257 : 256; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) + { + db = 270; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) + { + db = 266; + if(da < 51) + da ++; + } + else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) + { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) + { + db = svf_login ? 261 : 260; + if(svf_admin) + { + db = 268; + } + else if(svf_mod) + { + db = 271; + } + if(da < 51) + da ++; + } + else if(x>=sdl_scale && x<=17*sdl_scale) + { + db = 262; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) + { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) + { + db = 267; + if(da < 51) + da ++; + } + else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) + { + db = 265; + if(da < 51) + da ++; + } + else if(da > 0) + da --; + } + else if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) + { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) + { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } + else if(bq==4 && !b) + { + free(load_data); + free(load_img); + load_mode = 0; + } + } + else if(save_mode==1) + { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1) + { + save_mode = 2; + } + else if(b==4) + { + save_mode = 0; + copy_mode = 0; + } + } + else if(save_mode==2) + { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) + { + if(copy_mode==1) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + } + else if(copy_mode==2) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + } + else + { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } + } + else if(sdl_zoom_trig && zoom_en<2) + { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) + { + if(!lb) + { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Up")) + { + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Down")) + { + svf_myvote = -1; + } + } + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) + tag_list_ui(vid_buf); + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) + { + legacy_enable = !legacy_enable; + } + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) + { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) + { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) + { + if(!svf_open || !svf_own || x>51) + { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } + else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) + { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) + { + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 6); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+5) % 6); + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } + else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) + { + c = sl = cr&0xFF; + } + else + { + //Something + } + } + //create_parts(x, y, bs, SPC_AIR); + lx = x; + ly = y; + lb = 0; + lm = 0; + } + else + { + create_parts(x, y, bs, c); + lx = x; + ly = y; + lb = b; + lm = 0; + } + } + } + } + else + { + if(lb && lm) + { + x /= sdl_scale; + y /= sdl_scale; + c = (lb&1) ? sl : sr; + su = c; + if(lm == 1) + { + if(c!=127 || lx<0 || ly<0 || lx>=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } + else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) + { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) + { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + { + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + mousex = mx/sdl_scale; + mousey = my/sdl_scale; + } + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) + { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) + { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) + { + it--; + //if(fbi_img) + //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) + { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta) + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } + else + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + /*#ifdef MT + pthread_join(pth2,NULL); + #endif*/ + + if(hud_enable) + { + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) + { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) + { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } + if(sdl_zoom_trig||zoom_en) + { + if(zoom_x= max) { + while((res = (char)GetModuleFileName(NULL, name, max)) >= max) + { #elif defined MACOSX char *fn=malloc(64),*name=malloc(PATH_MAX), max=64, res; - if(_NSGetExecutablePath(fn, &max) != 0) { - fn = realloc(fn, max); - _NSGetExecutablePath(fn, &max); + if(_NSGetExecutablePath(fn, &max) != 0) + { + fn = realloc(fn, max); + _NSGetExecutablePath(fn, &max); } - if(realpath(fn, name) == NULL) { - free(fn); - free(name); - return NULL; + if(realpath(fn, name) == NULL) + { + free(fn); + free(name); + return NULL; } res = 1; #else char fn[64], *name=malloc(64), max=64, res; sprintf(fn, "/proc/self/exe"); memset(name, 0, max); - while((res = readlink(fn, name, max)) >= max-1) { + while((res = readlink(fn, name, max)) >= max-1) + { #endif #ifndef MACOSX - max *= 2; - name = realloc(name, max); - memset(name, 0, max); + max *= 2; + name = realloc(name, max); + memset(name, 0, max); } #endif - if(res <= 0) { - free(name); - return NULL; + if(res <= 0) + { + free(name); + return NULL; } return name; } @@ -85,34 +90,36 @@ int update_start(char *data, int len) int res = 1; if(!self) - return 1; + return 1; #ifdef WIN32 temp = malloc(strlen(self)+12); strcpy(temp, self); p = temp + strlen(temp) - 4; if(_stricmp(p, ".exe")) - p += 4; + p += 4; strcpy(p, "_update.exe"); if(!MoveFile(self, temp)) - goto fail; + goto fail; f = fopen(self, "wb"); if(!f) - goto fail; - if(fwrite(data, 1, len, f) != len) { - fclose(f); - DeleteFile(self); - goto fail; + goto fail; + if(fwrite(data, 1, len, f) != len) + { + fclose(f); + DeleteFile(self); + goto fail; } fclose(f); - if((int)ShellExecute(NULL, "open", self, NULL, NULL, SW_SHOWNORMAL) <= 32) { - DeleteFile(self); - goto fail; + if((int)ShellExecute(NULL, "open", self, NULL, NULL, SW_SHOWNORMAL) <= 32) + { + DeleteFile(self); + goto fail; } - + return 0; #else temp = malloc(strlen(self)+8); @@ -121,22 +128,25 @@ int update_start(char *data, int len) f = fopen(temp, "w"); if(!f) - goto fail; - if(fwrite(data, 1, len, f) != len) { - fclose(f); - unlink(temp); - goto fail; + goto fail; + if(fwrite(data, 1, len, f) != len) + { + fclose(f); + unlink(temp); + goto fail; } fclose(f); - if(chmod(temp, 0755)) { - unlink(temp); - goto fail; + if(chmod(temp, 0755)) + { + unlink(temp); + goto fail; } - if(rename(temp, self)) { - unlink(temp); - goto fail; + if(rename(temp, self)) + { + unlink(temp); + goto fail; } execl(self, "powder-update", NULL); @@ -158,22 +168,25 @@ int update_finish(void) strcpy(temp, self); p = temp + strlen(temp) - 4; if(_stricmp(p, ".exe")) - p += 4; + p += 4; strcpy(p, "_update.exe"); - while(!DeleteFile(temp)) { - err = GetLastError(); - if(err == ERROR_FILE_NOT_FOUND) { - // just as well, then - free(temp); - return 0; - } - Sleep(500); - timeout--; - if(timeout <= 0) { - free(temp); - return 1; - } + while(!DeleteFile(temp)) + { + err = GetLastError(); + if(err == ERROR_FILE_NOT_FOUND) + { + // just as well, then + free(temp); + return 0; + } + Sleep(500); + timeout--; + if(timeout <= 0) + { + free(temp); + return 1; + } } free(temp); #endif From 81063864a46ef5407ed10aec66c8c9d5791078e9 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 20:30:04 +0800 Subject: [PATCH 039/237] WATAAH --- powder.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/powder.c b/powder.c index ffc656891..99a3dd124 100644 --- a/powder.c +++ b/powder.c @@ -2947,6 +2947,21 @@ justdraw: } } } + else if(t==PT_WATR) + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,32,48,208,70); + } + } + } else if(t==PT_WTRV) { if(cmode == 3||cmode==4) @@ -10518,4 +10533,4 @@ int main(int argc, char *argv[]) http_done(); return 0; -} \ No newline at end of file +} From abc9efe10f90775ba47a64640d838a823504092c Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 20:34:37 +0800 Subject: [PATCH 040/237] now for destilled water too. --- powder.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 99a3dd124..c23fea318 100644 --- a/powder.c +++ b/powder.c @@ -2961,7 +2961,21 @@ justdraw: blendpixel(vid,x+nx,y+ny,32,48,208,70); } } - } + } + else if(t==PT_DSTW) + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,32,48,208,70); + } + } + else if(t==PT_WTRV) { if(cmode == 3||cmode==4) From f78eef8903f0327ed83b593d56753d52b2d02e00 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 20:35:06 +0800 Subject: [PATCH 041/237] fixed curly brackets --- powder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/powder.c b/powder.c index c23fea318..90c81fe51 100644 --- a/powder.c +++ b/powder.c @@ -2963,6 +2963,7 @@ justdraw: } } else if(t==PT_DSTW) + { for(x=-3; x<4; x++) { for(y=-3; y<4; y++) @@ -2975,7 +2976,7 @@ justdraw: blendpixel(vid,x+nx,y+ny,32,48,208,70); } } - + } else if(t==PT_WTRV) { if(cmode == 3||cmode==4) From 5ef2b6069b5455bb34a0af44db5e5c6f4ce59818 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 16 Aug 2010 13:54:36 +0100 Subject: [PATCH 042/237] Remove binary notation for other compilers --- powder.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) mode change 100644 => 100755 powder.c diff --git a/powder.c b/powder.c old mode 100644 new mode 100755 index 90c81fe51..836de9f8a --- a/powder.c +++ b/powder.c @@ -582,11 +582,11 @@ struct menu_section msections[] = #define MAX_TEMP 3500 #define MIN_TEMP -273 -static unsigned char TYPE_PART = 0b0001 << 4; -static unsigned char TYPE_LIQUID = 0b0010 << 4; -static unsigned char TYPE_SOLID = 0b0100 << 4; -static unsigned char TYPE_GAS = 0b1000 << 4; -static unsigned char PROP_CONDUCTS = 0b0001 >> 4; +static unsigned char TYPE_PART = 0x01; //1 +static unsigned char TYPE_LIQUID = 0x02; //2 +static unsigned char TYPE_SOLID = 0x04; //4 +static unsigned char TYPE_GAS = 0x08; //8 +static unsigned char PROP_CONDUCTS = 0x10; //16 const struct part_type ptypes[] = { From 9fcb23954db99934f3ea38f5ef403cfea0832345 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 16:57:20 +0200 Subject: [PATCH 043/237] Changed rendering of most liquids --- powder.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/powder.c b/powder.c index 836de9f8a..50b559916 100755 --- a/powder.c +++ b/powder.c @@ -2824,7 +2824,19 @@ justdraw: cr = PIXR(ptypes[t].pcolors)/s; cg = PIXG(ptypes[t].pcolors)/s; cb = PIXB(ptypes[t].pcolors)/s; - blendpixel(vid, nx, ny, cr, cg, cb, 255); + for(x=-2; x<2; x++) + { + for(y=-2; y<2; y++) + { + if (abs(x)+abs(y) <=0 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); + if(abs(x)+abs(y) <1 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,95); + if (abs(x)+abs(y) <= 2) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,90); + } + } + if(cmode==4) { blendpixel(vid, nx+1, ny, cr, cg, cb, 223); @@ -2870,6 +2882,22 @@ justdraw: blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } } + else if(t==PT_SLTW) + { + for(x=-3; x<3; x++) + { + for(y=-3; y<3; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,64,80,240,100); + else if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,64,80,240,70); + else if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,64,80,240,90); + } + } + + } else if(t==PT_PHOT) { if(cmode == 3||cmode==4) @@ -2956,9 +2984,9 @@ justdraw: if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) blendpixel(vid,x+nx,y+ny,32,48,208,100); if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - if (abs(x)+abs(y) == 2) blendpixel(vid,x+nx,y+ny,32,48,208,70); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,32,48,208,90); } } } From d501059c1b9439a11220163cd3e9333981bf15ff Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 17:05:39 +0200 Subject: [PATCH 044/237] Added ln2 diffusing --- powder.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/powder.c b/powder.c index 50b559916..dcca104cd 100755 --- a/powder.c +++ b/powder.c @@ -2940,6 +2940,22 @@ justdraw: y = ny; blendpixel(vid,x,y,17,217,24,255); } + else if(t==PT_LNTG) + { + for(x=-3; x<3; x++) + { + for(y=-3; y<3; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,128,160,223,100); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,128,160,223,70); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,128,160,223,90); + } + } + + } else if(t==PT_SMKE) { if(cmode == 3||cmode==4) From 9bd08247336a9be4c5ab71b98ffa40aaaab2c079 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 17:22:25 +0200 Subject: [PATCH 045/237] changed looks. still needs to be modified --- powder.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/powder.c b/powder.c index dcca104cd..8090ee3ce 100755 --- a/powder.c +++ b/powder.c @@ -2884,14 +2884,14 @@ justdraw: } else if(t==PT_SLTW) { - for(x=-3; x<3; x++) + for(x=-2; x<2; x++) { - for(y=-3; y<3; y++) + for(y=-2; y<2; y++) { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + if (abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) blendpixel(vid,x+nx,y+ny,64,80,240,100); - else if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,64,80,240,70); + else if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,64,80,240,95); else if (abs(x)+abs(y) == 2) blendpixel(vid,x+nx,y+ny,64,80,240,90); } @@ -2942,15 +2942,15 @@ justdraw: } else if(t==PT_LNTG) { - for(x=-3; x<3; x++) + for(x=-2; x<2; x++) { - for(y=-3; y<3; y++) + for(y=-2; y<2; y++) { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + if(abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) blendpixel(vid,x+nx,y+ny,128,160,223,100); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,128,160,223,70); - if (abs(x)+abs(y) == 2) + else if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,128,160,223,95); + else if (abs(x)+abs(y) == 2) blendpixel(vid,x+nx,y+ny,128,160,223,90); } } @@ -2993,14 +2993,14 @@ justdraw: } else if(t==PT_WATR) { - for(x=-3; x<4; x++) + for(x=-2; x<2; x++) { - for(y=-3; y<4; y++) + for(y=-2; y<2; y++) { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + if (abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) blendpixel(vid,x+nx,y+ny,32,48,208,100); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,32,48,208,70); + if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,32,48,208,95); if (abs(x)+abs(y) == 2) blendpixel(vid,x+nx,y+ny,32,48,208,90); } @@ -3008,16 +3008,16 @@ justdraw: } else if(t==PT_DSTW) { - for(x=-3; x<4; x++) + for(x=-2; x<2; x++) { - for(y=-3; y<4; y++) + for(y=-2; y<2; y++) { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + if (abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) blendpixel(vid,x+nx,y+ny,32,48,208,100); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,32,48,208,50); + if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,32,48,208,95); if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,32,48,208,70); + blendpixel(vid,x+nx,y+ny,32,48,208,90); } } } From 242c7097387d013758db0d5b01094225e9a15600 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 17:39:41 +0200 Subject: [PATCH 046/237] more changes with diffusion of liquids --- powder.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/powder.c b/powder.c index 8090ee3ce..a93269699 100755 --- a/powder.c +++ b/powder.c @@ -2850,6 +2850,22 @@ justdraw: blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); } } + else if(t==PT_OILL) + { + for(x=-2; x<2; x++) + { + for(y=-2; y<2; y++) + { + if (abs(x)+abs(y) <=0 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,64,64,16,100); + if(abs(x)+abs(y) <1 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,64,64,16,95); + if (abs(x)+abs(y) <= 2) + blendpixel(vid,x+nx,y+ny,64,64,16,90); + } + } + + } else if(t==PT_NEUT) { if(cmode == 3||cmode==4) From 9baf8ad869ae2e5977627210fa9be0f921a0947b Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 18:36:35 +0200 Subject: [PATCH 047/237] now it looks good and less blobby. --- powder.c | 82 +++++++++++++++++++++++--------------------------------- 1 file changed, 34 insertions(+), 48 deletions(-) diff --git a/powder.c b/powder.c index a93269699..f019485fc 100755 --- a/powder.c +++ b/powder.c @@ -2824,16 +2824,14 @@ justdraw: cr = PIXR(ptypes[t].pcolors)/s; cg = PIXG(ptypes[t].pcolors)/s; cb = PIXB(ptypes[t].pcolors)/s; - for(x=-2; x<2; x++) + for(x=-1; x<=1; x++) { - for(y=-2; y<2; y++) + for(y=-1; y<=1; y++) { - if (abs(x)+abs(y) <=0 && !(abs(x)==2||abs(y)==2)) + if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); - if(abs(x)+abs(y) <1 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,95); - if (abs(x)+abs(y) <= 2) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,90); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,50); } } @@ -2851,20 +2849,17 @@ justdraw: } } else if(t==PT_OILL) - { - for(x=-2; x<2; x++) + { + for(x=-1; x<=1; x++) { - for(y=-2; y<2; y++) + for(y=-1; y<=1; y++) { - if (abs(x)+abs(y) <=0 && !(abs(x)==2||abs(y)==2)) + if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,64,64,16,100); - if(abs(x)+abs(y) <1 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,64,64,16,95); - if (abs(x)+abs(y) <= 2) - blendpixel(vid,x+nx,y+ny,64,64,16,90); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,64,16,50); } } - } else if(t==PT_NEUT) { @@ -2900,19 +2895,16 @@ justdraw: } else if(t==PT_SLTW) { - for(x=-2; x<2; x++) + for(x=-1; x<=1; x++) { - for(y=-2; y<2; y++) + for(y=-1; y<=1; y++) { - if (abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) + if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,64,80,240,100); - else if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,64,80,240,95); - else if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,64,80,240,90); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,80,240,50); } } - } else if(t==PT_PHOT) { @@ -2958,19 +2950,16 @@ justdraw: } else if(t==PT_LNTG) { - for(x=-2; x<2; x++) + for(x=-1; x<=1; x++) { - for(y=-2; y<2; y++) + for(y=-1; y<=1; y++) { - if(abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) + if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,128,160,223,100); - else if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,128,160,223,95); - else if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,128,160,223,90); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,128,160,223,50); } } - } else if(t==PT_SMKE) { @@ -3009,31 +2998,28 @@ justdraw: } else if(t==PT_WATR) { - for(x=-2; x<2; x++) + for(x=-1; x<=1; x++) { - for(y=-2; y<2; y++) + for(y=-1; y<=1; y++) { - if (abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) + if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,32,48,208,100); - if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,32,48,208,95); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,32,48,208,90); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); } } + } else if(t==PT_DSTW) - { - for(x=-2; x<2; x++) - { - for(y=-2; y<2; y++) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) { - if (abs(x)+abs(y) <0 && !(abs(x)==2||abs(y)==2)) + if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,32,48,208,100); - if(abs(x)+abs(y) == 1 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,32,48,208,95); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,32,48,208,90); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); } } } From ed38916423873ff870f402b341ebbbc6f4d8559e Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 19:43:03 +0200 Subject: [PATCH 048/237] added test for gas --- powder.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index f019485fc..74b23fc66 100755 --- a/powder.c +++ b/powder.c @@ -2831,7 +2831,7 @@ justdraw: if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,50); + blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); } } @@ -2857,7 +2857,7 @@ justdraw: if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,64,64,16,100); else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,64,16,50); + blendpixel(vid,x+nx,y+ny,64,64,16,40); } } } @@ -3023,6 +3023,20 @@ justdraw: } } } + else if(t==PT_GASS) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,224,255,32,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,224,255,32,20); + } + } + + } else if(t==PT_WTRV) { if(cmode == 3||cmode==4) From 9f6a5b7e3b0034dd1be94dd157ce61daf02e8e07 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 19:46:47 +0200 Subject: [PATCH 049/237] Added for noble too --- powder.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/powder.c b/powder.c index 74b23fc66..9132dd6d9 100755 --- a/powder.c +++ b/powder.c @@ -3023,6 +3023,20 @@ justdraw: } } } + else if(t==PT_NBLE) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,235,73,23,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,235,73,23,20); + } + } + + } else if(t==PT_GASS) { for(x=-1; x<=1; x++) From 76a2dfac7e64c9638c83f75c8dbab62a7b1f3ebc Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 20:16:35 +0200 Subject: [PATCH 050/237] various other things --- powder.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/powder.c b/powder.c index 9132dd6d9..59c1e3eda 100755 --- a/powder.c +++ b/powder.c @@ -3023,6 +3023,35 @@ justdraw: } } } + else if(t==PT_NITR) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,224,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,224,16,50); + } + } + + } + else if(t==PT_LRBD) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,170,170,170,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,170,170,170,50); + } + } + + } + else if(t==PT_NBLE) { for(x=-1; x<=1; x++) From 40f6e4583f05d1cdd17021fc2095bd7fe8a91871 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 20:39:41 +0200 Subject: [PATCH 051/237] test --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 59c1e3eda..2acd1d6a4 100755 --- a/powder.c +++ b/powder.c @@ -3073,7 +3073,7 @@ justdraw: for(y=-1; y<=1; y++) { if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,255,32,100); + blendpixel(vid,x+nx,y+ny,224,255,32,200); else if (abs(y) != 0 || abs(x) != 0) blendpixel(vid,x+nx,y+ny,224,255,32,20); } From 9c0a95c34bf782329e01a5f582acee19058da314 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 20:42:05 +0200 Subject: [PATCH 052/237] test --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 2acd1d6a4..54f0f96b8 100755 --- a/powder.c +++ b/powder.c @@ -3073,7 +3073,7 @@ justdraw: for(y=-1; y<=1; y++) { if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,255,32,200); + blendpixel(vid,x+nx,y+ny,224,255,32,255); else if (abs(y) != 0 || abs(x) != 0) blendpixel(vid,x+nx,y+ny,224,255,32,20); } From b27e61e64a94eb084cc4e1e6e0c9d2f2dab7a4a9 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 16 Aug 2010 15:09:45 -0400 Subject: [PATCH 053/237] sorta glow-ish --- powder.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index 54f0f96b8..03c7a7f6e 100755 --- a/powder.c +++ b/powder.c @@ -3180,8 +3180,20 @@ justdraw: blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } - else if(t==PT_PLSM) + } else if(t==PT_URAN) { + cr=0x70; + cg=0x70; + cb=0x20; + blendpixel(vid, nx, ny, 255, 255, 255, 255); + blendpixel(vid, nx+1, ny, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx-1, ny, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx, ny+1, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx, ny-1, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 255); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 255); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 255); + } else if(t==PT_PLSM) { float ttemp = parts[i].life; int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); From 335bd5ecf88737b1055aaf71f1ab91f4882051e1 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 16 Aug 2010 15:31:10 -0400 Subject: [PATCH 054/237] added glow-ish uran and plut --- powder.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 12 deletions(-) diff --git a/powder.c b/powder.c index 03c7a7f6e..b3ab34d40 100755 --- a/powder.c +++ b/powder.c @@ -3181,18 +3181,63 @@ justdraw: blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } } else if(t==PT_URAN) { - cr=0x70; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, 255, 255, 255, 255); - blendpixel(vid, nx+1, ny, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx-1, ny, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx, ny+1, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx, ny-1, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 255); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 255); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 255); + cr=0x70; + cg=0x70; + cb=0x20; + blendpixel(vid, nx, ny, cr, cr, cr, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny, cr, cg, cb, 32); + blendpixel(vid, nx, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); + } else if(t==PT_PLUT) { + cr=0x40; + cg=0x70; + cb=0x20; + blendpixel(vid, nx, ny, cr, cr, cr, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny, cr, cg, cb, 32); + blendpixel(vid, nx, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); } else if(t==PT_PLSM) { float ttemp = parts[i].life; From 77646c71040182fd7871407c3fd1f404e2e4f4b0 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Aug 2010 03:09:45 +0800 Subject: [PATCH 055/237] sorta glow-ish --- powder.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index 54f0f96b8..03c7a7f6e 100755 --- a/powder.c +++ b/powder.c @@ -3180,8 +3180,20 @@ justdraw: blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } - else if(t==PT_PLSM) + } else if(t==PT_URAN) { + cr=0x70; + cg=0x70; + cb=0x20; + blendpixel(vid, nx, ny, 255, 255, 255, 255); + blendpixel(vid, nx+1, ny, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx-1, ny, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx, ny+1, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx, ny-1, cr+100, cg+100, cb+100, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 255); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 255); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 255); + } else if(t==PT_PLSM) { float ttemp = parts[i].life; int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); From 9249455ba7d1987f8b730ea585ac86b15374b4c3 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Aug 2010 03:31:10 +0800 Subject: [PATCH 056/237] added glow-ish uran and plut --- powder.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 12 deletions(-) diff --git a/powder.c b/powder.c index 03c7a7f6e..b3ab34d40 100755 --- a/powder.c +++ b/powder.c @@ -3181,18 +3181,63 @@ justdraw: blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } } else if(t==PT_URAN) { - cr=0x70; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, 255, 255, 255, 255); - blendpixel(vid, nx+1, ny, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx-1, ny, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx, ny+1, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx, ny-1, cr+100, cg+100, cb+100, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 255); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 255); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 255); + cr=0x70; + cg=0x70; + cb=0x20; + blendpixel(vid, nx, ny, cr, cr, cr, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny, cr, cg, cb, 32); + blendpixel(vid, nx, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); + } else if(t==PT_PLUT) { + cr=0x40; + cg=0x70; + cb=0x20; + blendpixel(vid, nx, ny, cr, cr, cr, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny, cr, cg, cb, 32); + blendpixel(vid, nx, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); } else if(t==PT_PLSM) { float ttemp = parts[i].life; From f6170777a158cd900832493502f9715c8393eacf Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 16 Aug 2010 15:45:41 -0400 Subject: [PATCH 057/237] added glow-ish uran and plut --- powder.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) diff --git a/powder.c b/powder.c index b3ab34d40..456f1c3a4 100755 --- a/powder.c +++ b/powder.c @@ -3209,6 +3209,90 @@ justdraw: blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); } else if(t==PT_PLUT) { cr=0x40; cg=0x70; @@ -3238,6 +3322,90 @@ justdraw: blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); + blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); + blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); } else if(t==PT_PLSM) { float ttemp = parts[i].life; From 1682788324048e4d8fc6a6fcbb7cb044cd2b6441 Mon Sep 17 00:00:00 2001 From: ief015 Date: Mon, 16 Aug 2010 16:09:22 -0400 Subject: [PATCH 058/237] > ief015 -Ctrl+Z Undo (ctrl+z will only to revert to the undo state, there is no redo, though I can change this if it becomes necessary) -I don't know what those inline keywords were for, but they were causing errors. --- powder.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/powder.c b/powder.c index 9c7d2d96a..eb5b6d6cb 100644 --- a/powder.c +++ b/powder.c @@ -5,6 +5,7 @@ * Copyright (c) 2010 Simon Robertshaw * Copyright (c) 2010 Skresanov Savely * Copyright (c) 2010 Bryan Hoyle + * Copyright (c) 2010 Nathan Cousins * * 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 @@ -113,6 +114,7 @@ char *it_msg = "Shift+drag will create straight lines of particles.\n" "Ctrl+drag will result in filled rectangles.\n" "Ctrl+Shift+click will flood-fill a closed area.\n" + "Ctrl+Z will act as Undo.\n" "Middle click or Alt+Click to \"sample\" the particles.\n" "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" "Use 'S' to save parts of the window as 'stamps'.\n" @@ -128,6 +130,7 @@ char *it_msg = "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" + "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" "\n" "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" @@ -169,11 +172,20 @@ struct sign unsigned char bmap[YRES/CELL][XRES/CELL]; unsigned char emap[YRES/CELL][XRES/CELL]; + +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; + unsigned cmode = 3; float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; #define TSTEPP 0.3f #define TSTEPV 0.4f @@ -340,7 +352,7 @@ void *update_air_th(void *arg) return NULL; } -inline unsigned clamp_flt(float f, float min, float max) +unsigned clamp_flt(float f, float min, float max) { if(f=XRES || y>=YRES) @@ -1272,7 +1288,7 @@ void set_emap(int x, int y) set_emap(x, y+1); } } -inline int parts_avg(int ci, int ni) + int parts_avg(int ci, int ni) { int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; if((pmr>>8) < NPART && (pmr>>8) >= 0) @@ -4474,7 +4490,7 @@ void *build_thumb(int *size, int bzip2) return d; } -inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) { unsigned char *d,*c=thumb; @@ -5434,7 +5450,7 @@ void del_stamp(int d) #include "font.h" -inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) @@ -5449,7 +5465,7 @@ inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } -inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) { int i, j, w, bn = 0, ba = 0; char *rp = font_data + font_ptrs[c]; @@ -9875,6 +9891,7 @@ int main(int argc, char *argv[]) #endif menu_count(); parts = calloc(sizeof(particle), NPART); + cb_parts = calloc(sizeof(particle), NPART); for(i=0; i 50) it = 50; } + if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo + { + int cbx, cby, cbi; + + for(cbi=0; cbi Date: Mon, 16 Aug 2010 16:23:46 -0400 Subject: [PATCH 059/237] readded inlines, my bad --- powder.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/powder.c b/powder.c index eb5b6d6cb..d403ff8f1 100644 --- a/powder.c +++ b/powder.c @@ -352,7 +352,7 @@ void *update_air_th(void *arg) return NULL; } -unsigned clamp_flt(float f, float min, float max) +inline unsigned clamp_flt(float f, float min, float max) { if(f=XRES || y>=YRES) @@ -1288,7 +1288,7 @@ void set_emap(int x, int y) set_emap(x, y+1); } } - int parts_avg(int ci, int ni) + inline int parts_avg(int ci, int ni) { int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; if((pmr>>8) < NPART && (pmr>>8) >= 0) @@ -5450,7 +5450,7 @@ void del_stamp(int d) #include "font.h" -void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) @@ -5465,7 +5465,7 @@ void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } -int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) { int i, j, w, bn = 0, ba = 0; char *rp = font_data + font_ptrs[c]; From b56d7a4e1ea168cb648ebf670a30b7b0891fee35 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 16 Aug 2010 16:32:15 -0400 Subject: [PATCH 060/237] pretty glow :) --- powder.c | 267 ++++++++----------------------------------------------- 1 file changed, 38 insertions(+), 229 deletions(-) diff --git a/powder.c b/powder.c index 456f1c3a4..e57bff5cc 100755 --- a/powder.c +++ b/powder.c @@ -2892,8 +2892,43 @@ justdraw: blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } - else if(t==PT_SLTW) + } else if(t==PT_PLUT) + { + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN) + { + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_SLTW) { for(x=-1; x<=1; x++) { @@ -3180,233 +3215,7 @@ justdraw: blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } else if(t==PT_URAN) { - cr=0x70; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, cr, cr, cr, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny, cr, cg, cb, 32); - blendpixel(vid, nx, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - } else if(t==PT_PLUT) { - cr=0x40; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, cr, cr, cr, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny, cr, cg, cb, 32); - blendpixel(vid, nx, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - } else if(t==PT_PLSM) + } else if(t==PT_PLSM) { float ttemp = parts[i].life; int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); From 9866b8d24bb11e5fe209a779cf5cb1ae8de53560 Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Mon, 16 Aug 2010 13:47:18 -0700 Subject: [PATCH 061/237] LOOPS --- powder.c | 259 ++++++++----------------------------------------------- 1 file changed, 34 insertions(+), 225 deletions(-) diff --git a/powder.c b/powder.c index d403ff8f1..e9adc980e 100644 --- a/powder.c +++ b/powder.c @@ -3196,232 +3196,41 @@ justdraw: blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } else if(t==PT_URAN) { - cr=0x70; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, cr, cr, cr, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny, cr, cg, cb, 32); - blendpixel(vid, nx, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); } else if(t==PT_PLUT) { - cr=0x40; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, cr, cr, cr, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny, cr, cg, cb, 32); - blendpixel(vid, nx, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN) + { + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } } else if(t==PT_PLSM) { float ttemp = parts[i].life; From 5826279c6d0bd1bf60ae106112fd00ab823adee2 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 22:52:22 +0200 Subject: [PATCH 062/237] backup files. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c66d7cb2d..ccc72b83b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ powder-64-sse3 powder.def powder-debug gmon.out +*.*.orig From 55e731c7561f3ebfc2d4286b7993c9b13851856a Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 16 Aug 2010 21:54:12 +0100 Subject: [PATCH 063/237] .orig? NOT IT MY GIT --- powder.c.orig | 10879 ------------------------------------------------ 1 file changed, 10879 deletions(-) delete mode 100755 powder.c.orig diff --git a/powder.c.orig b/powder.c.orig deleted file mode 100755 index 456f1c3a4..000000000 --- a/powder.c.orig +++ /dev/null @@ -1,10879 +0,0 @@ -/** - * Powder Toy - Main source - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * Copyright (c) 2010 Skresanov Savely - * Copyright (c) 2010 Bryan Hoyle - * - * 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 02111-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef WIN32 -#include -#else -#include -#include -#endif - - -#include "version.h" -#include "http.h" -#include "md5.h" -#include "update.h" -#include "hmap.h" - -#define SERVER "powdertoy.co.uk" - -#undef PLOSS - -#ifdef MENUV3 -#define MENUSIZE 40 -#else -#define MENUSIZE 20 -#endif -#define BARSIZE 14 -#define XRES 612 -#define YRES 384 -#define NPART XRES*YRES - -#define ZSIZE_D 16 -#define ZFACTOR_D 8 -unsigned char ZFACTOR = 256/ZSIZE_D; -unsigned char ZSIZE = ZSIZE_D; - -#define CELL 4 -#define ISTP (CELL/2) -#define CFDS (4.0f/CELL) - -typedef unsigned char uint8; - -#ifdef PIX16 -#define PIXELSIZE 2 -typedef unsigned short pixel; -#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) -#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) -#define PIXR(x) (((x)>>8)&0xF8) -#define PIXG(x) (((x)>>3)&0xFC) -#define PIXB(x) (((x)<<3)&0xF8) -#else -#define PIXELSIZE 4 -typedef unsigned int pixel; -#ifdef PIX32BGR -#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) -#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) -#define PIXR(x) ((x)&0xFF) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)>>16) -#else -#ifdef PIX32BGRA -#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) -#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) -#define PIXR(x) (((x)>>8)&0xFF) -#define PIXG(x) (((x)>>16)&0xFF) -#define PIXB(x) (((x)>>24)) -#else -#define PIXPACK(x) (x) -#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) -#define PIXR(x) ((x)>>16) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)&0xFF) -#endif -#endif -#endif - -char *it_msg = - "\brThe Powder Toy\n" - "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" - "\n" - "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" - "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" - "\bgPick your material from the menu using mouse left/right buttons.\n" - "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" - "Shift+drag will create straight lines of particles.\n" - "Ctrl+drag will result in filled rectangles.\n" - "Ctrl+Shift+click will flood-fill a closed area.\n" - "Middle click or Alt+Click to \"sample\" the particles.\n" - "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" - "Use 'S' to save parts of the window as 'stamps'.\n" - "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" - "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" - "Use the mouse scroll wheel to change the tool size for particles.\n" - "'Q' will quit the application.\n" - "The spacebar can be used to pause physics.\n" - "'P' will take a screenshot and save it into the current directory.\n" - "\n" - "\brhttp://powdertoy.co.uk/\n" - "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" - "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" - "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" - "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" - "\n" - "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" - "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" - ; - -typedef struct -{ - int start, inc; - pixel *vid; -} upstruc; - -#ifdef BETA -char *old_ver_msg_beta = "A new beta is available - click here!"; -#endif -char *old_ver_msg = "A new version is available - click here!"; -float mheat = 0.0f; - -int do_open = 0; -int sys_pause = 0; -int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. - -int amd = 0; - -unsigned char fire_r[YRES/CELL][XRES/CELL]; -unsigned char fire_g[YRES/CELL][XRES/CELL]; -unsigned char fire_b[YRES/CELL][XRES/CELL]; - -#define MAXSIGNS 16 - -struct sign -{ - int x,y,ju; - char text[256]; -} signs[MAXSIGNS]; - -/*********************************************************** - * AIR FLOW SIMULATOR * - ***********************************************************/ - -unsigned char bmap[YRES/CELL][XRES/CELL]; -unsigned char emap[YRES/CELL][XRES/CELL]; -unsigned cmode = 3; - -float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; -float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; -#define TSTEPP 0.3f -#define TSTEPV 0.4f -#define VADV 0.3f -#define VLOSS 0.999f -#define PLOSS 0.9999f -int numCores = 1; -float kernel[9]; -void make_kernel(void) -{ - int i, j; - float s = 0.0f; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - { - kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); - s += kernel[(i+1)+3*(j+1)]; - } - s = 1.0f / s; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - kernel[(i+1)+3*(j+1)] *= s; -} - -int core_count() -{ - int numCPU = 1; -#ifdef MT -#ifdef WIN32 - SYSTEM_INFO sysinfo; - GetSystemInfo( &sysinfo ); - numCPU = sysinfo.dwNumberOfProcessors; -#else -#ifdef MACOSX - numCPU = 4; -#else - numCPU = sysconf( _SC_NPROCESSORS_ONLN ); -#endif -#endif - - printf("Cpus: %d\n", numCPU); - if(numCPU>1) - printf("Multithreading enabled\n"); - else - printf("Multithreading disabled\n"); -#endif - return numCPU; -} - -void update_air(void) -{ - int x, y, i, j; - float dp, dx, dy, f, tx, ty; - - for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; - if(dp < -256.0f) dp = -256.0f; - if(dx > 256.0f) dx = 256.0f; - if(dx < -256.0f) dx = -256.0f; - if(dy > 256.0f) dy = 256.0f; - if(dy < -256.0f) dy = -256.0f; - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); -} - -void *update_air_th(void *arg) -{ - update_air(); - return NULL; -} - -inline unsigned clamp_flt(float f, float min, float max) -{ - if(fmax) - return 255; - return (int)(255.0f*(f-min)/(max-min)); -} - -inline float restrict_flt(float f, float min, float max) -{ - if(fmax) - return max; - return f; -} - -void draw_air(pixel *vid) -{ - int x, y, i, j; - pixel c; - - if(cmode == 2) - return; - - for(y=0; y 0.0f) - c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); - else - c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); - } - else - c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), - clamp_flt(pv[y][x], 0.0f, 8.0f), - clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); - for(j=0; j=XRES || ny>=YRES) - return 0; - if(x==nx && y==ny) - return 1; - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; - - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) - { - return 1; - } - - if((r&0xFF)==PT_VOID) - { - parts[i].type=PT_NONE; - return 0; - } - if((r&0xFF)==PT_BHOL) - { - parts[i].type=PT_NONE; - if(!legacy_enable) - { - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; - } - return 0; - } - - if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide - { - return 1; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - { - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) - { - return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - { - return 0; - } - - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - - if(parts[i].type==PT_CNCT && y>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; - } - - return 1; -} - -void kill_part(int i) -{ - int x, y; - parts[i].type = PT_NONE; - - x = (int)(parts[i].x+0.5f); - y = (int)(parts[i].y+0.5f); - - if(x>=0 && y>=0 && x=XRES || y>=YRES) - return -1; - - if(t==SPC_HEAT||t==SPC_COOL) - { - if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); - } - if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) - { - parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); - } - return pmap[y][x]>>8; - } - else - { - return -1; - } - } - if(t==SPC_AIR) - { - pv[y/CELL][x/CELL] += 0.03f; - if(y+CELL>8].type = PT_SPRK; - parts[pmap[y][x]>>8].life = 4; - parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; - pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; - return pmap[y][x]>>8; - } - - if(p==-1) - { - if(pmap[y][x]) - return -1; - if(pfree == -1) - return -1; - i = pfree; - pfree = parts[i].life; - } - else - i = p; - - if(t==PT_GLAS) - { - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - } - if(t!=PT_STKM) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - } - if(t==PT_ACID) - { - parts[i].life = 75; - } - //Testing - /*if(t==PT_WOOD){ - parts[i].life = 150; - }*/ - //End Testing - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_PLSM) - parts[i].life = rand()%150+50; - if(t==PT_LAVA) - parts[i].life = rand()%120+240; - if(t==PT_NBLE) - parts[i].life = 0; - if(t==PT_NEUT) - { - float r = (rand()%128+128)/127.0f; - float a = (rand()%360)*3.14159f/180.0f; - parts[i].life = rand()%480+480; - parts[i].vx = r*cosf(a); - parts[i].vy = r*sinf(a); - } - if(t==PT_PHOT) - { - float r = (rand()%3-1)*3; - float a = (rand()%3-1)*3; - parts[i].life = 680; - if(a==0.0f&&r==0.0f) - { - parts[i].life = 0; - parts[i].type = PT_NONE; - return -1; - } - else - { - parts[i].vx = a; - parts[i].vy = r; - } - //} else { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - //} - } - - if(t!=PT_STKM) - pmap[y][x] = t|(i<<8); - else - { - if(isplayer==0) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = PT_STKM; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 100; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - player[2] = PT_DUST; - player[3] = x-1; //Setting legs positions - player[4] = y+6; - player[5] = x-1; - player[6] = y+6; - - player[7] = x-3; - player[8] = y+12; - player[9] = x-3; - player[10] = y+12; - - player[11] = x+1; - player[12] = y+6; - player[13] = x+1; - player[14] = y+6; - - player[15] = x+3; - player[16] = y+12; - player[17] = x+3; - player[18] = y+12; - - isplayer = 1; - } - } - - return i; -} - -void delete_part(int x, int y) -{ - unsigned i; - - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - i = pmap[y][x]; - if(!i || (i>>8)>=NPART) - return; - - kill_part(i>>8); - pmap[y][x] = 0; // just in case -} - -inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -int sign(float i) //Signum function -{ - if (i<0) - return -1; - if (i>0) - return 1; - return 0; -} - -void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line -{ - int dx, dy, i, sx, sy, check, e, x, y; - - dx = abs(x1-x2); - dy = abs(y1-y2); - sx = sign(x2-x1); - sy = sign(y2-y1); - x = x1; - y = y1; - check = 0; - - if (dy>dx) - { - dx = dx+dy; - dy = dx-dy; - dx = dx-dy; - check = 1; - } - - e = (dy<<2)-dx; - for (i=0; i<=dx; i++) - { - vid[x+y*a] =PIXRGB(r, g, b); - if (e>=0) - { - if (check==1) - x = x+sx; - else - y = y+sy; - e = e-(dx<<2); - } - if (check==1) - y = y+sy; - else - x = x+sx; - e = e+(dy<<2); - } -} - -void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + 255*PIXR(t)) >> 8; - g = (a*g + 255*PIXG(t)) >> 8; - b = (a*b + 255*PIXB(t)) >> 8; - if(r>255) - r = 255; - if(g>255) - g = 255; - if(b>255) - b = 255; - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); - -int is_wire(int x, int y) -{ - return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; -} -int is_wire_off(int x, int y) -{ - return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; -} - -void set_emap(int x, int y) -{ - int x1, x2; - - if(!is_wire_off(x, y)) - return; - - // go left as far as possible - x1 = x2 = x; - while(x1>0) - { - if(!is_wire_off(x1-1, y)) - break; - x1--; - } - while(x21 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) - set_emap(x1, y-2); - else if(y>0) - for(x=x1; x<=x2; x++) - if(is_wire_off(x, y-1)) - { - if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) - set_emap(x, y-1); - } - - if(y>8) < NPART && (pmr>>8) >= 0) - { - return parts[pmr>>8].type; - } - else - { - return PT_NONE; - } -} -int nearest_part(int ci, int t) -{ - int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); - int ndistance = 0; - int id = -1; - int i = 0; - int cx = (int)parts[ci].x; - int cy = (int)parts[ci].y; - for(i=0; i=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) - { - kill_part(i); - continue; - } - - vx[y/CELL][x/CELL] *= ptypes[t].airloss; - vy[y/CELL][x/CELL] *= ptypes[t].airloss; - vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; - vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS||t==PT_NBLE) - { - if(pv[y/CELL][x/CELL]<3.5f) - pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); - if(y+CELL2.5f) - { - parts[i].life = rand()%80+180; - rt = parts[i].type = PT_FIRE; - parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - pv[y/CELL][x/CELL] += 0.25f * CFDS; - t = PT_FIRE; - } - - parts[i].vx *= ptypes[t].loss; - parts[i].vy *= ptypes[t].loss; - - if(t==PT_DFRM && !parts[i].life) - { - if(pv[y/CELL][x/CELL]>1.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - parts[i].life = rand()%80+300; - } - } - else - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - - if(ptypes[t].diffusion) - { - parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - } - - // interpolator -#ifdef WIN32 - mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#else - mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#endif - if(mv < ISTP) - { - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - } - else - { - dx = parts[i].vx*ISTP/mv; - dy = parts[i].vy*ISTP/mv; - ix = parts[i].x; - iy = parts[i].y; - while(1) - { - mv -= ISTP; - if(mv <= 0.0f) - { - // nothing found - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - break; - } - ix += dx; - iy += dy; - nx = (int)(ix+0.5f); - ny = (int)(iy+0.5f); - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) - { - parts[i].x = ix; - parts[i].y = iy; - break; - } - } - } - - a = nt = 0; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx4.0f) - t = parts[i].type = PT_DSTW; - if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) - t = parts[i].type = PT_OILL; - if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) - t = parts[i].type = PT_GASS; - } - if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - // t = parts[i].type = PT_BGLA; - if(t==PT_GLAS) - { - parts[i].pavg[0] = parts[i].pavg[1]; - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) - { - parts[i].type = PT_BGLA; - } - } - if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) - t = parts[i].type = PT_SNOW; - if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) - { - t = PT_NEUT; - create_part(i, x, y, t); - } - - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) - { - nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1) - { - create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[nearp].type = PT_SPRK; - parts[nearp].life = 9; - parts[nearp].ctype = PT_ETRD; - } - } - - if(!legacy_enable) - { - int ctemp = pv[y/CELL][x/CELL]*2; - c_heat = 0.0f; - h_count = 0; - if(ptypes[t].hconduct>(rand()%250)) - { - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - h_count++; - c_heat += parts[r>>8].temp; - } - } - } - } - pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - parts[r>>8].temp = parts[i].temp; - } - } - } - } - if(pt>=pstates[t].btemp&&pstates[t].burn) - { - t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE||t==PT_PLSM) - parts[i].life = rand()%50+120; - } - else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) - { - if(t==PT_LAVA&&parts[i].ctype) - { - parts[i].life = 0; - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) - { - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } - else - { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } - else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) - { - if(pstates[t].liquid==PT_LAVA) - { - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } - else if(t==PT_ICEI&&parts[i].ctype) - { - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else - { - t = parts[i].type = pstates[t].liquid; - } - } - else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) - { - t = parts[i].type = pstates[t].liquid; - } - else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) - { - if(t==PT_SLTW&&1>rand()%6) - { - t = parts[i].type = PT_SALT; - } - else - { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - } - } - if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) - { - float atemp = parts[i].temp + (-MIN_TEMP); - pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; - } - if(t==PT_LAVA) - { - parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - } - pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); - } - } - if(t==PT_CSCN&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - if(t==PT_HSCN&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) - { - nx = x % CELL; - if(nx == 0) - nx = x/CELL - 1; - else if(nx == CELL-1) - nx = x/CELL + 1; - else - nx = x/CELL; - ny = y % CELL; - if(ny == 0) - ny = y/CELL - 1; - else if(ny == CELL-1) - ny = y/CELL + 1; - else - ny = y/CELL; - if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) - { - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - } - else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) - { - pv[y/CELL][x/CELL] += 100.0f; - if(legacy_enable&&1>(rand()%200)) - { - parts[i].life = rand()%50+120; - t = parts[i].type = PT_FIRE; - } - else - { - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_ICEI || t==PT_SNOW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if(legacy_enable) - { - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; - } - } - } - else if(t==PT_HSCN||t==PT_CSCN) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) - { - parts[i].temp = 200.0f; - } - } - } - //PLANT - else if(t==PT_PLNT) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR && 1>(rand()%250)) - { - t = parts[i].type = PT_PLNT; - parts[r>>8].type = PT_PLNT; - } - else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WATR||t==PT_DSTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%250)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_WATR; - } - if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_SLTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) - { - parts[r>>8].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_WTRV) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - parts[r>>8].type = PT_WATR; - } - - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } - } - } - else if(t==PT_ACID) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)!=PT_ACID) - { - if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) - { - t = parts[i].type = PT_FIRE; - parts[i].life = 4; - parts[r>>8].type = PT_FIRE; - parts[r>>8].life = 4; - } - else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) - { - parts[i].life--; - parts[r>>8].type = PT_NONE; - } - else if (parts[i].life==50) - { - parts[i].life = 0; - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_NEUT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) - { - if(33>rand()%100) - { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); - } - else - { - create_part(r>>8, x+nx, y+ny, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - fe ++; - } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) - parts[r>>8].type = PT_DUST; - if((r&0xFF)==PT_WATR && 15>(rand()%100)) - parts[r>>8].type = PT_DSTW; - if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_DFRM; - if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_OILL; - if((r&0xFF)==PT_OILL && 5>(rand()%1000)) - parts[r>>8].type = PT_GASS; - if((r&0xFF)==PT_PLNT && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - } - } - else if(t==PT_PHOT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=0; nx<1; nx++) - for(ny=0; ny<1; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - } - } - else if(t==PT_LCRY) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_LCRY) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_BTRY) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts_avg(i,r>>8) != PT_INSL) - { - if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) - { - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - parts[r>>8].type = PT_SPRK; - } - } - } - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) - { - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) - continue; - rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) - { - parts[r>>8].type = PT_FIRE; - parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - parts[r>>8].life = rand()%80+180; - if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; - continue; - } - lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; - if(lpv < 1) lpv = 1; - if(legacy_enable) - { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && - ptypes[rt].meltable*lpv>(rand()%1000)) - { - if(t!=PT_LAVA || parts[i].life>0) - { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } - else - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) - { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = PT_METL; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) - { - kill_part(r>>8); - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE; - goto killed; - } - } - } - pavg = parts_avg(i, r>>8); - if(t==PT_SWCH&&pavg!= PT_INSL) - { - if(parts[r>>8].type == PT_SWCH) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - if(rt==PT_SWCH && t==PT_SPRK) - { - pavg = parts_avg(r>>8, i); - if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) - parts[r>>8].life = 10; - if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) - parts[r>>8].life = 9; - if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].ctype = PT_SWCH; - parts[r>>8].life = 4; - } - } - pavg = parts_avg(i, r>>8); - if(pavg != PT_INSL) - { - if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; - } - } - if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 6; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) - { - if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) - { - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) - { - parts[i].life = rand()%150+50; - parts[i].type = PT_PLSM; - parts[i].ctype = PT_NBLE; - parts[i].temp = 3500; - pv[y/CELL][x/CELL] += 1; - } - if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) - { - parts[i].type = PT_SWCH; - parts[i].life = 11; - } - } - } -killed: - if(parts[i].type == PT_NONE) - continue; - } - - if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; - - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } - - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; - - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; - - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; - - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; - - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } - - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } - - } - } - - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } - - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } - - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); - - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 ) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - } - } - } - - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } - - } - - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; - - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; - - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; - - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; - - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; - - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } - - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } - - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } - - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } - - } - - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } - - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } - - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - isplayer = 1; - } - - if(t==PT_CLNE) - { - if(!parts[i].ctype) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx=XRES-CELL || - ny=YRES-CELL) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - continue; - } - - rt = parts[i].flags & FLAG_STAGNANT; - parts[i].flags &= ~FLAG_STAGNANT; - if(!try_move(i, x, y, nx, ny)) - { - parts[i].x = lx; - parts[i].y = ly; - if(ptypes[t].falldown) - { - if(nx!=x && try_move(i, x, y, nx, y)) - { - parts[i].x = ix; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x, ny)) - { - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else - { - r = (rand()%2)*2-1; - if(ny!=y && try_move(i, x, y, x+r, ny)) - { - parts[i].x += r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x-r, ny)) - { - parts[i].x -= r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y+r)) - { - parts[i].x = ix; - parts[i].y += r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y-r)) - { - parts[i].x = ix; - parts[i].y -= r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) - { - s = 0; - if(!rt || nt) - rt = 50; - else - rt = 10; - for(j=x+r; j>=0 && j>=x-rt && j0) - r = 1; - else - r = -1; - if(s) - for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) - { - kill_part(i); - continue; - } - else if(try_move(i, x, y, 2*x-nx, ny)) - { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } - else if(try_move(i, x, y, nx, 2*y-ny)) - { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } - else - { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } - } - -justdraw: - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) - { - kill_part(i); - continue; - } - if(cmode!=CM_HEAT) - { - if(t==PT_STKM) //Just draw head here - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; - vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; - vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; - vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; - } - draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); - draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); - draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); - draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); - - isplayer = 1; //It's a secret. Tssss... - } - - if(t==PT_ACID) - { - if(parts[i].life>255) parts[i].life = 255; - if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28)); - if(s==0) s = 1; - cr = PIXR(ptypes[t].pcolors)/s; - cg = PIXG(ptypes[t].pcolors)/s; - cb = PIXB(ptypes[t].pcolors)/s; - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); - } - } - - if(cmode==4) - { - blendpixel(vid, nx+1, ny, cr, cg, cb, 223); - blendpixel(vid, nx-1, ny, cr, cg, cb, 223); - blendpixel(vid, nx, ny+1, cr, cg, cb, 223); - blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); - } - } - else if(t==PT_OILL) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,64,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,64,16,40); - } - } - } - else if(t==PT_NEUT) - { - if(cmode == 3||cmode==4) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 8; - cb = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = 0x20; - cg = 0xE0; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_SLTW) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,80,240,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,80,240,50); - } - } - } - else if(t==PT_PHOT) - { - if(cmode == 3||cmode==4) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_SWCH && parts[i].life == 10) - { - x = nx; - y = ny; - blendpixel(vid,x,y,17,217,24,255); - } - else if(t==PT_LNTG) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,128,160,223,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,128,160,223,50); - } - } - } - else if(t==PT_SMKE) - { - if(cmode == 3||cmode==4) - { - x = nx/CELL; - y = ny/CELL; - cg = 10; - cb = 10; - cr = 10; - cg += fire_g[y][x]; - if(cg > 50) cg = 50; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 50) cb = 50; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 50) cr = 50; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny,100,100,100,30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,100,100,100,10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,100,100,100,20); - } - } - } - } - else if(t==PT_WATR) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - - } - else if(t==PT_DSTW) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - } - else if(t==PT_NITR) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,224,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,224,16,50); - } - } - - } - else if(t==PT_LRBD) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,170,170,170,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,170,170,170,50); - } - } - - } - - else if(t==PT_NBLE) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,235,73,23,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,235,73,23,20); - } - } - - } - else if(t==PT_GASS) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,255,32,255); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,255,32,20); - } - } - - } - else if(t==PT_WTRV) - { - if(cmode == 3||cmode==4) - { - x = nx/CELL; - y = ny/CELL; - cg = PIXG(ptypes[t].pcolors)/3; - cb = PIXB(ptypes[t].pcolors)/3; - cr = PIXR(ptypes[t].pcolors)/3; - cg += fire_g[y][x]; - if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); - } - } - } - } - else if(t==PT_THDR) - { - if(cmode == 3||cmode==4) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 16; - cb = 20; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xA0; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LCRY) - { - if(cmode == 3||cmode==4) - { - //cr = R/8; - //cg = G/8; - //cb = B/8; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); - //x = nx/CELL; - //y = ny/CELL; - //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } - else - { - cr = 0x50+(parts[i].life*10); - cg = 0x50+(parts[i].life*10); - cb = 0x50+(parts[i].life*10); - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_URAN) { - cr=0x70; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, cr, cr, cr, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny, cr, cg, cb, 32); - blendpixel(vid, nx, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - } else if(t==PT_PLUT) { - cr=0x40; - cg=0x70; - cb=0x20; - blendpixel(vid, nx, ny, cr, cr, cr, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny, cr, cg, cb, 32); - blendpixel(vid, nx, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+1, ny+1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-1, ny-1, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+2, ny+2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-2, ny-2, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+3, ny+3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-3, ny-3, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-1, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-1, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-2, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny+3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+2, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-4, ny-3, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny+4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx-3, ny-4, cr+10, cg+10, cb+10, 32); - blendpixel(vid, nx+4, ny-4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx+4, ny+4, cr+100, cg+100, cb+100, 32); - blendpixel(vid, nx-4, ny-4, cr+100, cg+100, cb+100, 32); - } else if(t==PT_PLSM) - { - float ttemp = parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = plasma_data[caddress]; - uint8 G = plasma_data[caddress+1]; - uint8 B = plasma_data[caddress+2]; - if(cmode == 3||cmode==4) - { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_FIRE && parts[i].life) - { - if(cmode == 3||cmode==4) - { - cr = parts[i].life / 4; - cg = parts[i].life / 16; - cb = parts[i].life / 32; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = parts[i].life * 8; - cg = parts[i].life * 2; - cb = parts[i].life; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LAVA && parts[i].life) - { - cr = parts[i].life * 2 + 0xE0; - cg = parts[i].life * 1 + 0x50; - cb = parts[i].life/2 + 0x10; - if(cr>255) cr = 255; - if(cg>192) cg = 192; - if(cb>128) cb = 128; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 64); - blendpixel(vid, nx-1, ny, cr, cg, cb, 64); - blendpixel(vid, nx, ny+1, cr, cg, cb, 64); - blendpixel(vid, nx, ny-1, cr, cg, cb, 64); - if(cmode == 3||cmode==4) - { - cr /= 32; - cg /= 32; - cb /= 32; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else if(t==PT_LAVA || t==PT_SPRK) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - if(cmode == 3 || cmode==4) - { - if(t == PT_LAVA) - { - cr = 3; - cg = i%2; - cb = 0; - } - else - { - cr = 8; - cg = 12; - cb = 16; - } - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - } - else - { - float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); - uint8 R = color_data[caddress]; - uint8 G = color_data[caddress+1]; - uint8 B = color_data[caddress+2]; - - if(t==PT_STKM) //Stick man should be visible in heat mode - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); - vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); - vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); - vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); - } - draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); - draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); - draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); - draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); - } - else - { - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); - } - } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) - { - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); - - //if(vid[(ny-1)*YRES+(nx-1)]!=0){ - // blendpixel(vid, nx, ny-1, R, G, B, 46); - //} - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - - } - -} - -void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) -{ - blendpixel(vid, x+1, y, cr, cg, cb, 112); - blendpixel(vid, x-1, y, cr, cg, cb, 112); - blendpixel(vid, x, y+1, cr, cg, cb, 112); - blendpixel(vid, x, y-1, cr, cg, cb, 112); - - blendpixel(vid, x+1, y-1, cr, cg, cb, 64); - blendpixel(vid, x-1, y-1, cr, cg, cb, 64); - blendpixel(vid, x+1, y+1, cr, cg, cb, 64); - blendpixel(vid, x-1, y+1, cr, cg, cb, 64); -} - -void update_particles_i_th(void *arg) -{ - upstruc *newup = (upstruc*)arg; - update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); - return; -} - -void update_particles(pixel *vid) -{ - int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; - float lx, ly; -#ifdef MT - int pt = 0, pc = 0; - pthread_t *InterThreads; -#endif - - isplayer = 0; //Needed for player spawning - memset(pmap, 0, sizeof(pmap)); - r = rand()%2; - for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==13) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } - else - { - for(y=0; y>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==9) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } - -#ifdef MT - if(numCores > 1) - { - InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); - for(pc = 0; pc=XRES || ny<0 || ny>=YRES) - break; - addpixel(vid, nx, ny, 255, 255, 255, 64); - i = nx/CELL; - j = ny/CELL; - lx += vx[j][i]*0.125f; - ly += vy[j][i]*0.125f; - if(bmap[j][i]==5 && i!=x && j!=y) - break; - } - drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); - } - -} - -void update_particles_th(void *arg) -{ - update_particles((pixel*)arg); - return; -} - -/*********************************************************** - * SDL OUTPUT * - ***********************************************************/ - -int sdl_scale = 1; -SDL_Surface *sdl_scrn; -SDLMod sdl_mod; -int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; - -#include "icon.h" -void sdl_seticon(void) -{ -#ifdef WIN32 - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else -#ifdef MACOSX - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else - SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#endif -#endif -} - -void sdl_open(void) -{ - if(SDL_Init(SDL_INIT_VIDEO)<0) - { - fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); - exit(1); - } - atexit(SDL_Quit); -#ifdef PIX16 - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); -#else - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); -#endif - if(!sdl_scrn) - { - fprintf(stderr, "Creating window: %s\n", SDL_GetError()); - exit(1); - } - SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); - sdl_seticon(); - SDL_EnableUNICODE(1); - //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); -} - -void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} - -void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - int i,k; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - } - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} -void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) -{ - if(sdl_scale == 2) - sdl_blit_2(x, y, w, h, src, pitch); - else - sdl_blit_1(x, y, w, h, src, pitch); -} - -int frame_idx=0; -void dump_frame(pixel *src, int w, int h, int pitch) -{ - char frame_name[32]; - int j,i; - unsigned char c[3]; - FILE *f; - sprintf(frame_name,"frame%04d.ppm",frame_idx); - f=fopen(frame_name,"wb"); - fprintf(f,"P6\n%d %d\n255\n",w,h); - for(j=0; j=0 && x=0 && yPT_NUM) - return 2; - if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) - return 3; - i = XRES*YRES; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) - return 1; - size = i; - } - else - d = c; - - if(size < XRES*YRES) - { - if(bzip2) - free(d); - return 1; - } - - sy = 0; - for(y=0; y+scl<=YRES; y+=scl) - { - sx = 0; - for(x=0; x+scl<=XRES; x+=scl) - { - a = 0; - r = g = b = 0; - for(j=0; j=PT_NUM) - goto corrupt; - r += PIXR(ptypes[t].pcolors); - g += PIXG(ptypes[t].pcolors); - b += PIXB(ptypes[t].pcolors); - a ++; - } - } - if(a) - { - a = 256/a; - r = (r*a)>>8; - g = (g*a)>>8; - b = (b*a)>>8; - } - - drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); - sx++; - } - sy++; - } - - if(bzip2) - free(d); - return 0; - -corrupt: - if(bzip2) - free(d); - return 1; -} - -static char *mystrdup(char *s) -{ - char *x; - if(s) - { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; - } - return s; -} - -void *build_save(int *size, int x0, int y0, int w, int h) -{ - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; - int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); - int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - // save the required air state - for(y=by0; y255) i=255; - d[p++] = i; - } - for(y=by0; y255) i=255; - d[p++] = i; - } - - // save the particle map - for(i=0; i=x0 && x=y0 && y255) x=255; - if(y<0) y=0; - if(y>255) y=255; - d[p++] = x; - d[p++] = y; - } - } - for(j=0; j255) tttemp=255; - d[p++] = tttemp; - } - } - for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; - d[p++] = (signs[i].y-y0); - d[p++] = (signs[i].y-y0)>>8; - d[p++] = signs[i].ju; - x = strlen(signs[i].text); - d[p++] = x; - memcpy(d+p, signs[i].text, x); - p+=x; - } - - i = (p*101+99)/100 + 612; - c = malloc(i); - c[0] = 0x66; - c[1] = 0x75; - c[2] = 0x43; - c[3] = legacy_enable; - c[4] = SAVE_VERSION; - c[5] = CELL; - c[6] = bw; - c[7] = bh; - c[8] = p; - c[9] = p >> 8; - c[10] = p >> 16; - c[11] = p >> 24; - - i -= 12; - - if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) - { - free(d); - free(c); - return NULL; - } - free(d); - - *size = i+12; - return c; -} - -int parse_save(void *save, int size, int replace, int x0, int y0) -{ - unsigned char *d,*c=save; - int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; - int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; - int fp[NPART], nf=0; - - if(size<16) - return 1; - if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) - return 1; - if(c[4]>SAVE_VERSION) - return 2; - ver = c[4]; - - if(ver<34) - { - legacy_enable = 1; - } - else - { - if(c[3]==1||c[3]==0) - legacy_enable = c[3]; - else - legacy_beta = 1; - } - - bw = c[6]; - bh = c[7]; - if(bx0+bw > XRES/CELL) - bx0 = XRES/CELL - bw; - if(by0+bh > YRES/CELL) - by0 = YRES/CELL - bh; - if(bx0 < 0) - bx0 = 0; - if(by0 < 0) - by0 = 0; - - if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) - return 3; - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - return 1; - size = i; - - if(size < bw*bh) - return 1; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - if(replace) - { - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(signs, 0, sizeof(signs)); - memset(parts, 0, sizeof(particle)*NPART); - memset(pmap, 0, sizeof(pmap)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(pv, 0, sizeof(pv)); - } - - // make a catalog of free parts - memset(pmap, 0, sizeof(pmap)); - for(i=0; i= size) - goto corrupt; - fvx[y][x] = (d[p++]-127.0f)/64.0f; - } - for(y=by0; y= size) - goto corrupt; - fvy[y][x] = (d[p++]-127.0f)/64.0f; - } - - // load the particle map - i = 0; - pty = p; - for(y=y0; y= size) - goto corrupt; - j=d[p++]; - if(j >= PT_NUM) - goto corrupt; - if(j && !(isplayer == 1 && j==PT_STKM)) - { - if(pmap[y][x]) - { - k = pmap[y][x]>>8; - parts[k].type = j; - parts[k].x = (float)x; - parts[k].y = (float)y; - m[(x-x0)+(y-y0)*w] = k+1; - } - else if(i < nf) - { - parts[fp[i]].type = j; - parts[fp[i]].x = (float)x; - parts[fp[i]].y = (float)y; - m[(x-x0)+(y-y0)*w] = fp[i]+1; - i++; - } - else - m[(x-x0)+(y-y0)*w] = NPART+1; - } - } - - // load particle properties - for(j=0; j= size) - goto corrupt; - if(i < NPART) - { - parts[i].vx = (d[p++]-127.0f)/16.0f; - parts[i].vy = (d[p++]-127.0f)/16.0f; - if(parts[i].type == PT_STKM) - { - player[2] = PT_DUST; - - player[3] = parts[i].x-1; //Setting legs positions - player[4] = parts[i].y+6; - player[5] = parts[i].x-1; - player[6] = parts[i].y+6; - - player[7] = parts[i].x-3; - player[8] = parts[i].y+12; - player[9] = parts[i].x-3; - player[10] = parts[i].y+12; - - player[11] = parts[i].x+1; - player[12] = parts[i].y+6; - player[13] = parts[i].x+1; - player[14] = parts[i].y+6; - - player[15] = parts[i].x+3; - player[16] = parts[i].y+12; - player[17] = parts[i].x+3; - player[18] = parts[i].y+12; - - } - } - else - p += 2; - } - } - for(j=0; j= size) - goto corrupt; - if(i <= NPART) - parts[i-1].life = d[p++]*4; - else - p++; - } - } - for(j=0; j=34&&legacy_beta==0) - { - if(p >= size) - { - goto corrupt; - } - if(i <= NPART) - { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } - else - { - p++; - } - } - else - { - parts[i-1].temp = ptypes[parts[i-1].type].heat; - } - } - } - for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) - { - if(p >= size) - goto corrupt; - if(i <= NPART) - parts[i-1].ctype = d[p++]; - else - p++; - } - } - - if(p >= size) - goto version1; - j = d[p++]; - for(i=0; i size) - goto corrupt; - for(k=0; k size) - goto corrupt; - if(kSAVE_VERSION) - return NULL; - - bw = c[6]; - bh = c[7]; - w = bw*CELL; - h = bh*CELL; - - if(c[5]!=CELL) - return NULL; - - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return NULL; - fb = calloc(w*h, PIXELSIZE); - if(!fb) - { - free(d); - return NULL; - } - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - goto corrupt; - size = i; - - if(size < bw*bh) - goto corrupt; - - k = 0; - for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) - goto corrupt; - - for(y=0; y= size) - goto corrupt; - j=d[p++]; - if(j0) - { - if(j==PT_STKM) //Stickman should be drawed another way - { - //Stickman drawing - for(k=-2; k<=1; k++) - { - fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); - fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); - fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); - fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); - } - draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); - draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); - draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); - draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); - } - else - fb[y*w+x] = ptypes[j].pcolors; - } - } - - free(d); - *width = w; - *height = h; - return fb; - -corrupt: - free(d); - free(fb); - return NULL; -} - -/* NO, I DON'T THINK SO - #include "fbi.h" - - pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) - { - unsigned char *tmp; - pixel *res; - int i; - - tmp = malloc(width*height*3); - if(!tmp) - return NULL; - res = malloc(width*height*PIXELSIZE); - if(!res) { - free(tmp); - return NULL; - } - - i = width*height*3; - if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { - free(res); - free(tmp); - return NULL; - } - - for(i=0; i1) - { - r = (r+c/2)/c; - g = (g+c/2)/c; - b = (b+c/2)/c; - } - q[y*w+x] = PIXRGB(r, g, b); - } - *qw = w; - *qh = h; - return q; -} - -#define GRID_X 5 -#define GRID_Y 4 -#define GRID_P 3 -#define GRID_S 6 -#define GRID_Z 3 - -void stamp_gen_thumb(int i) -{ - char fn[64]; - void *data; - int size, factor_x, factor_y; - pixel *tmp; - - if(stamps[i].thumb) - { - free(stamps[i].thumb); - stamps[i].thumb = NULL; - } - - sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); - data = file_load(fn, &size); - - if(data) - { - stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); - if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) - { - factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); - factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); - if(factor_y > factor_x) - factor_x = factor_y; - tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); - free(stamps[i].thumb); - stamps[i].thumb = tmp; - } - } - - free(data); -} - -int clipboard_ready = 0; -void *clipboard_data = 0; -int clipboard_length = 0; - -void stamp_save(int x, int y, int w, int h) -{ - FILE *f; - int n; - char fn[64], sn[16]; - void *s=build_save(&n, x, y, w, h); - -#ifdef WIN32 - _mkdir("stamps"); -#else - mkdir("stamps", 0755); -#endif - - stamp_gen_name(sn); - sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); - - f = fopen(fn, "wb"); - if(!f) - return; - fwrite(s, n, 1, f); - fclose(f); - - free(s); - - if(stamps[STAMP_MAX-1].thumb) - free(stamps[STAMP_MAX-1].thumb); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); - memset(stamps, 0, sizeof(struct stamp_info)); - if(stamp_count0) - { - memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); - memcpy(stamps, &tmp, sizeof(struct stamp_info)); - - stamp_update(); - } - - return data; -} - -void stamp_init(void) -{ - int i; - FILE *f; - - memset(stamps, 0, sizeof(stamps)); - - f=fopen("stamps" PATH_SEP "stamps.def", "rb"); - if(!f) - return; - for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) -{ - int i, j, w, bn = 0, ba = 0; - char *rp = font_data + font_ptrs[c]; - w = *(rp++); - for(j=0; j>= 2; - bn -= 2; - } - return x + w; -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) -{ - int sx = x; - for(; *s; s++) - { - if(*s == '\n') - { - x = sx; - y += FONT_H+2; - } - else if(*s == '\b') - { - switch(s[1]) - { - case 'w': - r = g = b = 255; - break; - case 'g': - r = g = b = 192; - break; - case 'o': - r = 255; - g = 216; - b = 32; - break; - case 'r': - r = 255; - g = b = 0; - break; - case 'b': - r = g = 0; - b = 255; - break; - } - s++; - } - else - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - return x; -} - -void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) -{ - int i; - for(i=0; i<=w; i++) - { - drawpixel(vid, x+i, y, r, g, b, a); - drawpixel(vid, x+i, y+h, r, g, b, a); - } - for(i=1; i=w && x+textwidth(s)>=w+5) - break; - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - if(*s) - for(i=0; i<3; i++) - x = drawchar(vid, x, y, '.', r, g, b, a); - return x; -} - -int textnwidth(char *s, int n) -{ - int x = 0; - for(; *s; s++) - { - if(!n) - break; - x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - n--; - } - return x-1; -} -int textwidthx(char *s, int w) -{ - int x=0,n=0,cw; - for(; *s; s++) - { - cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - if(x+(cw/2) >= w) - break; - x += cw; - n++; - } - return n; -} - -/*********************************************************** - * MAIN PROGRAM * - ***********************************************************/ - -void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) -{ - int x, y, i, j, c; - int bo = b; - if(iswall==1) - { - b = b-100; - x = (2+32*((b-22)/1)); - y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - x = 2+32*(b/2); - y = YRES+2+20*(b%2); - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - if(bo==sl || bo==sr) - { - c = 0; - if(bo==sl) - c |= PIXPACK(0xFF0000); - if(bo==sr) - c |= PIXPACK(0x0000FF); - for(i=0; i<30; i++) - { - vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; - } - for(j=0; j<18; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; - } - } -} - -int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) -{ - int i, j, c; - if(b>=121) - { - b = b-100; - //x = (2+32*((b-22)/1)); - //y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - case 40: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - //x = 2+32*(b/2); - //y = YRES+2+20*(b%2); - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - return 26; -} - -void draw_menu(pixel *vid_buf, int i, int hover) -{ - - //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); -#ifdef MENUV3 - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - if(hover==i) - { - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); - } -#else - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); -#endif -} - -void menu_ui(pixel *vid_buf, int i, int *sl, int *sr) -{ - int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; - pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); - fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); - memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - rows = ceil((float)msections[i].itemcount/16.0f); - height = (ceil((float)msections[i].itemcount/16.0f)*18); - width = restrict_flt(msections[i].itemcount*31, 0, 16*31); - //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); - h = -1; - x = XRES-BARSIZE-26; - y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; - sy = y; - //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); - fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); - fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); - drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); - if(i==SC_WALL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=20) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - if(b==1&&h!=-1) - { - *sl = h; - } - if(b==4&&h!=-1) - { - *sr = h; - } -} - -int create_parts(int x, int y, int r, int c) -{ - int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; - - if(c == 125) - { - i = x / CELL; - j = y / CELL; - for(v=-1; v<2; v++) - for(u=-1; u<2; u++) - if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) - { - if(cp) - create_parts(y, x, r, c); - else - create_parts(x, y, r, c); - } - e -= 1.0f; - } - } -} - -void create_box(int x1, int y1, int x2, int y2, int c) -{ - int i, j; - if(x1>x2) - { - i = x2; - x2 = x1; - x1 = i; - } - if(y1>y2) - { - j = y2; - y2 = y1; - y1 = j; - } - for(j=y1; j<=y2; j++) - for(i=x1; i<=x2; i++) - create_parts(i, j, 1, c); -} - -int flood_parts(int x, int y, int c, int cm, int bm) -{ - int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) - { - c = c-100; - } - if(cm==-1) - { - if(c==0) - { - cm = pmap[y][x]&0xFF; - if(!cm) - return 0; - } - else - cm = 0; - } - if(bm==-1) - { - if(c==30) - { - bm = bmap[y/CELL][x/CELL]; - if(!bm) - return 0; - if(bm==1) - cm = 0xFF; - } - else - bm = 0; - } - - if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) - return 1; - - // go left as far as possible - x1 = x2 = x; - while(x1>=CELL) - { - if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) - break; - x1--; - } - while(x2=CELL+dy) - for(x=x1; x<=x2; x++) - if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) - if(!flood_parts(x, y-dy, co, cm, bm)) - return 0; - if(y=XRES || y>=YRES) - return; - c = vid[y*(XRES+BARSIZE)+x]; - c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); - if(c<512) - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); - else - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); -} - -void xor_line(int x1, int y1, int x2, int y2, pixel *vid) -{ - int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - e -= 1.0f; - } - } -} - -void draw_svf_ui(pixel *vid_buf) -{ - int c; - - drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); - drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - c = svf_open ? 255 : 128; - drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); - drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); - - c = svf_login ? 255 : 128; - drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); - if(svf_open) - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); - else - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); - drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); - if(svf_open && svf_own) - drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); - - c = (svf_login && svf_open) ? 255 : 128; - - drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - - if(svf_myvote==1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); - } - else if(svf_myvote==-1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); - } - - drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); - drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); - - drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); - if(svf_tags[0]) - drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); - else - drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); - - drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); - - drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); - drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); - if(svf_login) - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); - else - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); - drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); - - if(sys_pause) - { - fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); - drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - if(!legacy_enable) - { - fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - switch(cmode) - { - case 0: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); - break; - case 1: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); - break; - case 2: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); - break; - case 3: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); - break; - case 4: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); - break; - case 5: - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - break; - } - drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - - if(svf_admin) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); - } - else if(svf_mod) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - }//else if(amd) - // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? -} - -typedef struct ui_edit -{ - int x, y, w, nx; - char str[256],*def; - int focus, cursor, hide; -} ui_edit; -void ui_edit_draw(pixel *vid_buf, ui_edit *ed) -{ - int cx, i; - char echo[256], *str; - - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(ed->str[0]) - { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); - } - else if(!ed->focus) - drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); - if(ed->focus) - { - cx = textnwidth(str, ed->cursor); - for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); - } -} -char *shift_0="`1234567890-=[]\\;',./"; -char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; -void ui_edit_process(int mx, int my, int mb, ui_edit *ed) -{ - char ch, ts[2], echo[256], *str; - int l, i; -#ifdef RAWINPUT - char *p; -#endif - - if(mb) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } - else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } - else - ed->focus = 0; - } - if(ed->focus && sdl_key) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - l = strlen(ed->str); - switch(sdl_key) - { - case SDLK_HOME: - ed->cursor = 0; - break; - case SDLK_END: - ed->cursor = l; - break; - case SDLK_LEFT: - if(ed->cursor > 0) - ed->cursor --; - break; - case SDLK_RIGHT: - if(ed->cursor < l) - ed->cursor ++; - break; - case SDLK_DELETE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - ed->str[ed->cursor] = 0; - else if(ed->cursor < l) - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - break; - case SDLK_BACKSPACE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - { - if(ed->cursor > 0) - memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); - ed->cursor = 0; - } - else if(ed->cursor > 0) - { - ed->cursor--; - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - } - break; - default: -#ifdef RAWINPUT - if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) - { - ch = sdl_key; - if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) - { - if(ch>='a' && ch<='z') - ch &= ~0x20; - p = strchr(shift_0, ch); - if(p) - ch = shift_1[p-shift_0]; - } - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#else - if(sdl_ascii>=' ' && sdl_ascii<127) - { - ch = sdl_ascii; - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#endif - break; - } - } -} -typedef struct ui_checkbox -{ - int x, y; - int focus, checked; -} ui_checkbox; -void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) -{ - int w = 12; - if(ed->checked) - { - drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); - } - if(ed->focus) - { - drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); - } - else - { - drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); - } -} -void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) -{ - int w = 12; - - if(mb && !mbq) - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->checked = (ed->checked)?0:1; - } - } - else - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->focus = 1; - } - else - { - ed->focus = 0; - } - } -} - -void error_ui(pixel *vid_buf, int err, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - char *msg; - - msg = malloc(strlen(txt)+16); - if(err) - sprintf(msg, "%03d %s", err, txt); - else - sprintf(msg, "%s", txt); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - if(err) - drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); - else - drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - free(msg); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_ui(pixel *vid_buf, char *top, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); - drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_box(pixel *vid_buf, char *msg) -{ - int w = textwidth(msg)+16; - int x0=(XRES-w)/2,y0=(YRES-24)/2; - - clearrect(vid_buf, x0-2, y0-2, w+4, 28); - drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); -} - -int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - int ret = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); - drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); - drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); - drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) - { - ret = 1; - break; - } - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - { - ret = 1; - break; - } - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - return ret; -} - -int execute_tagop(pixel *vid_buf, char *op, char *tag) -{ - int status; - char *result; - - char *names[] = {"ID", "Tag", NULL}; - char *parts[2]; - - char *uri = malloc(strlen(SERVER)+strlen(op)+36); - sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); - - parts[0] = svf_id; - parts[1] = tag; - - result = http_multipart_post( - uri, - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - free(uri); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 1; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 1; - } - - if(result[2]) - { - strncpy(svf_tags, result+3, 255); - svf_id[15] = 0; - } - - if(result) - free(result); - - return 0; -} - -struct strlist -{ - char *str; - struct strlist *next; -}; -void strlist_add(struct strlist **list, char *str) -{ - struct strlist *item = malloc(sizeof(struct strlist)); - item->str = mystrdup(str); - item->next = *list; - *list = item; -} -int strlist_find(struct strlist **list, char *str) -{ - struct strlist *item; - for(item=*list; item; item=item->next) - if(!strcmp(item->str, str)) - return 1; - return 0; -} -void strlist_free(struct strlist **list) -{ - struct strlist *item; - while(*list) - { - item = *list; - *list = (*list)->next; - free(item); - } -} - -void tag_list_ui(pixel *vid_buf) -{ - int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; - char *p,*q,s; - char *tag=NULL, *op=NULL; - ui_edit ed; - struct strlist *vote=NULL,*down=NULL; - - ed.x = x0+25; - ed.y = y0+221; - ed.w = 158; - ed.nx = 1; - ed.def = "[new tag]"; - ed.focus = 0; - ed.hide = 0; - ed.cursor = 0; - strcpy(ed.str, ""); - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - op = tag = NULL; - - drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 256); - drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); - p = svf_tags; - s = svf_tags[0] ? ' ' : 0; - y = 36 + y0; - while(s) - { - q = strchr(p, ' '); - if(!q) - q = p+strlen(p); - s = *q; - *q = 0; - if(svf_own || svf_admin || svf_mod) - { - drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); - d = 14; - if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) - { - if(!ed1.focus) - break; - ed1.focus = 0; - ed2.focus = 1; - } - if(sdl_key==SDLK_ESCAPE) - { - if(!ed1.focus && !ed2.focus) - return; - ed1.focus = 0; - ed2.focus = 0; - } - } - - strcpy(svf_user, ed1.str); - md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); - - res = http_multipart_post( - "http://" SERVER "/Login.api", - NULL, NULL, NULL, - svf_user, svf_pass, - &err, NULL); - if(err != 200) - { - error_ui(vid_buf, err, http_ret_text(err)); - if(res) - free(res); - goto fail; - } - if(res && !strncmp(res, "OK", 2)) - { - if(!strcmp(res, "OK ADMIN")) - { - svf_admin = 1; - svf_mod = 0; - } - else if(!strcmp(res, "OK MOD")) - { - svf_admin = 0; - svf_mod = 1; - } - else - { - svf_admin = 0; - svf_mod = 0; - } - free(res); - svf_login = 1; - return; - } - if(!res) - res = mystrdup("Unspecified Error"); - error_ui(vid_buf, 0, res); - free(res); - -fail: - strcpy(svf_user, ""); - strcpy(svf_pass, ""); - svf_login = 0; - svf_own = 0; - svf_admin = 0; - svf_mod = 0; -} - -void execute_delete(pixel *vid_buf, char *id) -{ - int status; - char *result; - - char *names[] = {"ID", NULL}; - char *parts[1]; - - parts[0] = id; - - result = http_multipart_post( - "http://" SERVER "/Delete.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result) - free(result); -} - -int execute_vote(pixel *vid_buf, char *id, char *action) -{ - int status; - char *result; - - char *names[] = {"ID", "Action", NULL}; - char *parts[2]; - - parts[0] = id; - parts[1] = action; - - result = http_multipart_post( - "http://" SERVER "/Vote.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 0; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 0; - } - - if(result) - free(result); - return 1; -} - -static char hex[] = "0123456789ABCDEF"; -void strcaturl(char *dst, char *src) -{ - char *d; - unsigned char *s; - - for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) - { - if((*s>='0' && *s<='9') || - (*s>='a' && *s<='z') || - (*s>='A' && *s<='Z')) - *(d++) = *s; - else - { - *(d++) = '%'; - *(d++) = hex[*s>>4]; - *(d++) = hex[*s&15]; - } - } - *d = 0; -} - -#define THUMB_CACHE_SIZE 256 - -char *thumb_cache_id[THUMB_CACHE_SIZE]; -void *thumb_cache_data[THUMB_CACHE_SIZE]; -int thumb_cache_size[THUMB_CACHE_SIZE]; -int thumb_cache_lru[THUMB_CACHE_SIZE]; - -void thumb_cache_inval(char *id) -{ - int i,j; - for(i=0; i= THUMB_CACHE_SIZE) - return; - free(thumb_cache_id[i]); - free(thumb_cache_data[i]); - thumb_cache_id[i] = NULL; - for(j=0; j thumb_cache_lru[i]) - thumb_cache_lru[j]--; -} -void thumb_cache_add(char *id, void *thumb, int size) -{ - int i,m=-1,j=-1; - thumb_cache_inval(id); - for(i=0; i m) - { - m = thumb_cache_lru[i]; - j = i; - } - } - if(i >= THUMB_CACHE_SIZE) - { - thumb_cache_inval(thumb_cache_id[j]); - i = j; - } - for(j=0; j= THUMB_CACHE_SIZE) - return 0; - for(j=0; j=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+5); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - else if(!strncmp(str, "TAG ", 4)) - { - if(j >= TAG_MAX) - { - str = p; - continue; - } - q = strchr(str+4, ' '); - if(!q) - { - str = p; - continue; - } - *(q++) = 0; - tag_names[j] = mystrdup(str+4); - tag_votes[j] = atoi(q); - j++; - } - else - { - if(i>=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - str = p; - } - if(*str) - i++; - return i; -} - -#define IMGCONNS 3 -#define TIMEOUT 100 -#define HTTP_TIMEOUT 10 - -int search_own = 0; -int search_date = 0; -int search_page = 0; -char search_expr[256] = ""; - -int search_ui(pixel *vid_buf) -{ - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; - int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; - int thumb_drawn[GRID_X*GRID_Y]; - pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - float ry; - time_t http_last_use=HTTP_TIMEOUT; - ui_edit ed; - - - void *http = NULL; - int active = 0; - char *last = NULL; - int search = 0; - int lasttime = TIMEOUT; - char *uri; - int status; - char *results; - char *tmp, ts[64]; - - void *img_http[IMGCONNS]; - char *img_id[IMGCONNS]; - void *thumb, *data; - int thlen, dlen; - - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - - memset(img_http, 0, sizeof(img_http)); - memset(img_id, 0, sizeof(img_id)); - - memset(search_ids, 0, sizeof(search_ids)); - memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); - memset(search_publish, 0, sizeof(search_publish)); - memset(search_owners, 0, sizeof(search_owners)); - memset(search_thumbs, 0, sizeof(search_thumbs)); - memset(search_thsizes, 0, sizeof(search_thsizes)); - - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - - do_open = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = 65; - ed.y = 13; - ed.w = XRES-200; - ed.nx = 1; - ed.def = "[search terms]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(search_expr); - strcpy(ed.str, search_expr); - - sdl_wheel = 0; - - while(!sdl_poll()) - { - uih = 0; - bq = b; - mxq = mx; - myq = my; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - if(mx!=mxq || my!=myq || sdl_wheel || b) - mmt = 0; - else if(mmt 9) - { - drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); - drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); - } - - ui_edit_draw(vid_buf, &ed); - - if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) - { - if(search_page) - { - search_page --; - lasttime = TIMEOUT; - } - sdl_wheel = 0; - uih = 1; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) - { - lasttime = TIMEOUT; - search_page ++; - page_count = exp_res; - } - sdl_wheel = 0; - uih = 1; - } - - tp = -1; - if(is_p1) - { - drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); - for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) - for(gi=0; giTAG_MAX || !tag_names[pos]) - break; - if(tag_votes[0]) - i = 127+(128*tag_votes[pos])/tag_votes[0]; - else - i = 192; - w = textwidth(tag_names[pos]); - if(w>XRES/GRID_X-5) - w = XRES/GRID_X-5; - gx = (XRES/GRID_X)*gi; - gy = gj*14 + 46; - if(mx>=gx && mx=gy && my XRES/GRID_X-10) - { - tmp = malloc(strlen(search_names[pos])+4); - strcpy(tmp, search_names[pos]); - j = textwidthx(tmp, XRES/GRID_X-15); - strcpy(tmp+j, "..."); - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); - free(tmp); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); - j = textwidth(search_owners[pos]); - if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && - my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) - { - st = 1; - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); - if(search_thumbs[pos]&&thumb_drawn[pos]==0) - { - render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); - thumb_drawn[pos] = 1; - } - own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); - if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) - mp = pos; - if(own) - { - if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) - { - mp = -1; - dp = pos; - } - } - if(mp==pos && !st) - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); - else - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); - if(own) - { - if(dp == pos) - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); - else - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); - } - if(!search_publish[pos]) - { - drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); - drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(view_own || svf_admin || svf_mod) - { - sprintf(ts+1, "%d", search_votes[pos]); - ts[0] = 0xBB; - for(j=1; ts[j]; j++) - ts[j] = 0xBC; - ts[j-1] = 0xB9; - ts[j] = 0xBA; - ts[j+1] = 0; - w = gx+XRES/GRID_S-2-textwidth(ts); - h = gy+YRES/GRID_S-11; - drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); - for(j=0; ts[j]; j++) - ts[j] -= 14; - drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); - sprintf(ts, "%d", search_votes[pos]); - for(j=0; ts[j]; j++) - ts[j] += 127; - drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); - } - if(search_scoreup[pos]>0||search_scoredown[pos]>0) - { - lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); - - if(((YRES/GRID_S+3)/2)>lv) - { - ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); - if(lv<8) - { - ry = ry/(8-lv); - } - nyu = search_scoreup[pos]*ry; - nyd = search_scoredown[pos]*ry; - } - else - { - ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); - nyu = search_scoreup[pos]/ry; - nyd = search_scoredown[pos]/ry; - } - - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); - - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); - } - } - - if(mp!=-1 && mmt>=TIMEOUT/5 && !st) - { - gi = mp % GRID_X; - gj = mp / GRID_X; - if(is_p1) - gj += GRID_Y-GRID_P; - gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; - gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; - i = w = textwidth(search_names[mp]); - h = YRES/GRID_Z+30; - if(w=XRES-2) gx=XRES-3-w; - if(gy<32) gy=32; - if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; - clearrect(vid_buf, gx-2, gy-3, w+4, h); - drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); - if(search_thumbs[mp]) - render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); - drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); - drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(sdl_key==SDLK_RETURN) - { - if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) - lasttime = TIMEOUT; - else if(search_ids[0] && !search_ids[1]) - { - bq = 0; - b = 1; - mp = 0; - } - } - if(sdl_key==SDLK_ESCAPE) - goto finish; - - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) - { - search_own = !search_own; - lasttime = TIMEOUT; - } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) - { - search_date = !search_date; - lasttime = TIMEOUT; - } - - if(b && !bq && dp!=-1) - if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) - { - execute_delete(vid_buf, search_ids[dp]); - lasttime = TIMEOUT; - if(last) - { - free(last); - last = NULL; - } - } - - if(b && !bq && tp!=-1) - { - strncpy(ed.str, tag_names[tp], 255); - lasttime = TIMEOUT; - } - - if(b && !bq && mp!=-1 && st) - { - sprintf(ed.str, "user:%s", search_owners[mp]); - lasttime = TIMEOUT; - } - - if(do_open==1) - { - mp = 0; - } - - if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) - { - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); - - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - data = http_simple_get(uri, &status, &dlen); - free(uri); - - if(status == 200) - { - status = parse_save(data, dlen, 1, 0, 0); - switch(status) - { - case 1: - error_ui(vid_buf, 0, "Simulation corrupted"); - break; - case 2: - error_ui(vid_buf, 0, "Simulation from a newer version"); - break; - case 3: - error_ui(vid_buf, 0, "Simulation on a too large grid"); - break; - } - if(!status) - { - char *tnames[] = {"ID", NULL}; - char *tparts[1]; - int tplens[1]; - if(svf_last) - free(svf_last); - svf_last = data; - svf_lsize = dlen; - - tparts[0] = search_ids[mp]; - tplens[0] = strlen(search_ids[mp]); - data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); - - svf_open = 1; - svf_own = svf_login && !strcmp(search_owners[mp], svf_user); - svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); - - strcpy(svf_id, search_ids[mp]); - strcpy(svf_name, search_names[mp]); - if(status == 200) - { - if(data) - { - strncpy(svf_tags, data, 255); - svf_tags[255] = 0; - } - else - svf_tags[0] = 0; - } - else - { - svf_tags[0] = 0; - } - - if(svf_login) - { - char *names[] = {"ID", NULL}; - char *parts[1]; - parts[0] = search_ids[mp]; - data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); - if(status == 200) - { - if(data) - { - if(!strcmp(data, "Up")) - { - svf_myvote = 1; - } - else if(!strcmp(data, "Down")) - { - svf_myvote = -1; - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - } - else - { - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - } - } - else - error_ui(vid_buf, status, http_ret_text(status)); - - if(data) - free(data); - goto finish; - } - - if(!last) - { - search = 1; - } - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) - { - search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) - { - search_page = 0; - page_count = 0; - } - free(last); - last = NULL; - } - else - search = 0; - - if(search && lasttime>=TIMEOUT) - { - lasttime = 0; - last = mystrdup(ed.str); - last_own = search_own; - last_date = search_date; - last_page = search_page; - active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); - if(search_own || svf_admin || svf_mod) - tmp = "&ShowVotes=true"; - else - tmp = ""; - if(!search_own && !search_date && !*last) - { - if(search_page) - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); - } - else - { - exp_res = GRID_X*GRID_P; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); - } - } - else - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); - } - strcaturl(uri, last); - if(search_own) - { - strcaturl(uri, " user:"); - strcaturl(uri, svf_user); - } - if(search_date) - strcaturl(uri, " sort:date"); - - http = http_async_req_start(http, uri, NULL, 0, 1); - if(svf_login) - { - http_auth_headers(http, svf_user, svf_pass); - } - http_last_use = time(NULL); - free(uri); - } - - if(active && http_async_req_status(http)) - { - http_last_use = time(NULL); - results = http_async_req_stop(http, &status, NULL); - view_own = last_own; - if(status == 200) - { - page_count = search_results(results, last_own||svf_admin||svf_mod); - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - } - is_p1 = (exp_res < GRID_X*GRID_Y); - free(results); - active = 0; - } - - if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) - { - http_async_req_close(http); - http = NULL; - } - - for(i=0; i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) - { - if(stamp_page) - { - stamp_page --; - } - sdl_wheel = 0; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; -} - -void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) -{ - char t[2]; - t[0] = ch; - t[1] = 0; - if(flag) - { - fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); - } - else - { - drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); - } -} - -void render_signs(pixel *vid_buf) -{ - int i, j, x, y, w, h, dx, dy; - char buff[30]; //Buffer - for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature - else - sprintf(buff, "Temp: 0.00"); //...tempirature - drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); - } - - //Usual text - if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) - drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); - x = signs[i].x; - y = signs[i].y; - dx = 1 - signs[i].ju; - dy = (signs[i].y > 18) ? -1 : 1; - for(j=0; j<4; j++) - { - drawpixel(vid_buf, x, y, 192, 192, 192, 255); - x+=dx; - y+=dy; - } - } -} - -void add_sign_ui(pixel *vid_buf, int mx, int my) -{ - int i, w, h, x, y, nm=0, ju; - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; - ui_edit ed; - - // check if it is an existing sign - for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) - break; - } - // else look for empty spot - if(i >= MAXSIGNS) - { - nm = 1; - for(i=0; i= MAXSIGNS) - return; - - if(nm) - { - signs[i].x = mx; - signs[i].y = my; - signs[i].ju = 1; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = x0+25; - ed.y = y0+25; - ed.w = 158; - ed.nx = 1; - ed.def = "[message]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(signs[i].text); - strcpy(ed.str, signs[i].text); - ju = signs[i].ju; - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed); - drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); - draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); - draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); - draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); - - if(!nm) - { - drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); - drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); - drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); - } - - drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) - ju = 0; - if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) - ju = 1; - if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) - ju = 2; - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) - { - signs[i].text[0] = 0; - return; - } - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - { - if(!ed.focus) - return; - ed.focus = 0; - } - } - - strcpy(signs[i].text, ed.str); - signs[i].ju = ju; -} - -/*********************************************************** - * CONFIG FILE * - ***********************************************************/ - -char http_proxy[256] = ""; - -void save_string(FILE *f, char *str) -{ - int li = strlen(str); - unsigned char lb[2]; - lb[0] = li; - lb[1] = li >> 8; - fwrite(lb, 2, 1, f); - fwrite(str, li, 1, f); -} - -int load_string(FILE *f, char *str, int max) -{ - int li; - unsigned char lb[2]; - fread(lb, 2, 1, f); - li = lb[0] | (lb[1] << 8); - if(li > max) - { - str[0] = 0; - return 1; - } - fread(str, li, 1, f); - str[li] = 0; - return 0; -} - -unsigned char last_major=0, last_minor=0, update_flag=0; - -void save_presets(int do_update) -{ - FILE *f=fopen("powder.def", "wb"); - unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; - unsigned char tmp = sdl_scale; - if(!f) - return; - fwrite(sig, 1, 4, f); - save_string(f, svf_user); - save_string(f, svf_pass); - fwrite(&tmp, 1, 1, f); - tmp = cmode; - fwrite(&tmp, 1, 1, f); - tmp = svf_admin; - fwrite(&tmp, 1, 1, f); - tmp = svf_mod; - fwrite(&tmp, 1, 1, f); - save_string(f, http_proxy); - tmp = SAVE_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = MINOR_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = do_update; - fwrite(&tmp, 1, 1, f); - fclose(f); -} - -void load_presets(void) -{ - FILE *f=fopen("powder.def", "rb"); - unsigned char sig[4], tmp; - if(!f) - return; - fread(sig, 1, 4, f); - if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) - { - if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) - { - if(fseek(f, -3, SEEK_END)) - { - remove("powder.def"); - return; - } - if(fread(sig, 1, 3, f) != 3) - { - remove("powder.def"); - goto fail; - } - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; - } - fclose(f); - remove("powder.def"); - return; - } - if(load_string(f, svf_user, 63)) - goto fail; - if(load_string(f, svf_pass, 63)) - goto fail; - svf_login = !!svf_user[0]; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - sdl_scale = (tmp == 2) ? 2 : 1; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - cmode = tmp%6; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_admin = tmp; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_mod = tmp; - if(load_string(f, http_proxy, 255)) - goto fail; - if(fread(sig, 1, 3, f) != 3) - goto fail; - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; -fail: - fclose(f); -} - -void dim_copy(pixel *dst, pixel *src) -{ - int i,r,g,b; - for(i=0; i0) - r--; - if(g>0) - g--; - if(b>0) - b--; - dst[i] = PIXRGB(r,g,b); - } -} - -unsigned int fire_alpha[CELL*3][CELL*3]; -void prepare_alpha(void) -{ - int x,y,i,j; - float temp[CELL*3][CELL*3]; - memset(temp, 0, sizeof(temp)); - for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; - fire_g[j][i] = g>4 ? g-4 : 0; - fire_b[j][i] = b>4 ? b-4 : 0; - } -} - -int zoom_en = 0; -int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; -int zoom_wx=0, zoom_wy=0; -void render_zoom(pixel *img) -{ - int x, y, i, j; - pixel pix; - drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); - drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); - clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); - for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) - { - xor_pixel(x+i, y+j, vid); - if(j) xor_pixel(x+i, y-j, vid); - if(i) xor_pixel(x-i, y+j, vid); - if(i&&j) xor_pixel(x-i, y-j, vid); - } - } - else - { - int tc; - c = (r/CELL) * CELL; - x = (x/CELL) * CELL; - y = (y/CELL) * CELL; - - tc = !((c%(CELL*2))==0); - - x -= c/2; - y -= c/2; - - x += tc*(CELL/2); - y += tc*(CELL/2); - - for(i=0; i2) - { - pthread_t pth; - pthread_create(&pth,NULL,update_air_th,""); - } - else - { - update_air(); - } -#else - update_air(); -#endif - } - if(cmode==0 || cmode==1) - { - draw_air(vid_buf); - } - else if(cmode==2) - { - memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); - memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); - } - else - { - memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); - } - update_particles(vid_buf); - - if(cmode==2) - { - if(!fire_fc) - { - dim_copy(fire_bg, vid_buf); - } - else - { - memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); - } - fire_fc = (fire_fc+1) % 3; - } - if(cmode==3||cmode==4) - render_fire(vid_buf); - - render_signs(vid_buf); - - memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); - clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); - - draw_svf_ui(vid_buf); - - if(http_ver_check) - { - if(!do_check && http_async_req_status(http_ver_check)) - { - ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); - if(http_ret==200 && ver_data) - { -#ifdef BETA - if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) - old_version = 1; -#else - if(sscanf(ver_data, "%d.%d", &major, &minor)==2) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) - old_version = 1; -#endif - free(ver_data); - } - http_ver_check = NULL; - } - do_check = (do_check+1) & 15; - } - - if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) - { - if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) - { - break; - } - } - if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) - { - if(load_mode) - { - free(load_img); - free(load_data); - load_mode = 0; - load_data = NULL; - load_img = NULL; - } - if(it > 50) - it = 50; - if(sdl_key=='k' && stamps[1].name[0]) - { - j = stamp_ui(vid_buf); - if(j>=0) - load_data = stamp_load(j, &load_size); - else - load_data = NULL; - } - else - load_data = stamp_load(0, &load_size); - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - if(sdl_key=='s') - { - if(it > 50) - it = 50; - save_mode = 1; - } - if(sdl_key=='1') - { - set_cmode(0); - } - if(sdl_key=='2') - { - set_cmode(1); - } - if(sdl_key=='3') - { - set_cmode(2); - } - if(sdl_key=='4') - { - set_cmode(3); - } - if(sdl_key=='5') - { - set_cmode(4); - } - if(sdl_key=='6') - { - set_cmode(5); - } - if(sdl_key==SDLK_SPACE) - sys_pause = !sys_pause; - if(sdl_key=='h') - hud_enable = !hud_enable; - if(sdl_key=='p') - dump_frame(vid_buf, XRES, YRES, XRES); - if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - if(clipboard_ready==1) - { - load_data = malloc(clipboard_length); - memcpy(load_data, clipboard_data, clipboard_length); - load_size = clipboard_length; - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - } - if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 2; - } - if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 1; - } - else if(sdl_key=='c') - { - set_cmode((cmode+1) % 6); - if(it > 50) - it = 50; - } -#ifdef INTERNAL - if(sdl_key=='v') - vs = !vs; - if(vs) - dump_frame(vid_buf, XRES, YRES, XRES); -#endif - - if(sdl_wheel) - { - if(sdl_zoom_trig==1) - { - ZSIZE += sdl_wheel; - if(ZSIZE>32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - sdl_wheel = 0; - } - else - { - bs += sdl_wheel; - if(bs>16) - bs = 16; - if(bs<0) - bs = 0; - sdl_wheel = 0; - /*if(su >= PT_NUM) { - if(sl < PT_NUM) - su = sl; - if(sr < PT_NUM) - su = sr; - }*/ - } - } - - bq = b; - b = SDL_GetMouseState(&x, &y); - - for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy - && x0 && y0 && x>8)>=NPART || !cr)) - { -#ifdef BETA - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); -#else - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); -#endif - } - else - { - sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); - } - } - mx = x; - my = y; - if(update_flag) - { - info_box(vid_buf, "Finalizing update..."); - if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) - { - update_cleanup(); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - { - if(update_finish()) - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - else - info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); - } - update_flag = 0; - } - - if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && - x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) - { - tmp = malloc(64); -#ifdef BETA - if(is_beta) - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); - } - else - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); - } -#else - sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); -#endif - if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) - { - free(tmp); - tmp = download_ui(vid_buf, my_uri, &i); - if(tmp) - { - save_presets(1); - if(update_start(tmp, i)) - { - update_cleanup(); - save_presets(0); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - return 0; - } - } - else - free(tmp); - } - if(y>=sdl_scale*(YRES+(MENUSIZE-20))) - { - if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) - { - db = (svf_myvote==1) ? 273 : 274; - if(da < 51) - da ++; - } - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) - { - db = svf_own ? 257 : 256; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) - { - db = 270; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) - { - db = 266; - if(da < 51) - da ++; - } - else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) - { - db = 259; - if(svf_open && svf_own && x<=55*sdl_scale) - db = 258; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) - { - db = svf_login ? 261 : 260; - if(svf_admin) - { - db = 268; - } - else if(svf_mod) - { - db = 271; - } - if(da < 51) - da ++; - } - else if(x>=sdl_scale && x<=17*sdl_scale) - { - db = 262; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) - { - db = sys_pause ? 264 : 263; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) - { - db = 267; - if(da < 51) - da ++; - } - else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) - { - db = 265; - if(da < 51) - da ++; - } - else if(da > 0) - da --; - } - else if(da > 0) - da --; - - if(!sdl_zoom_trig && zoom_en==1) - zoom_en = 0; - - if(sdl_key==Z_keysym && zoom_en==2) - zoom_en = 1; - - if(load_mode) - { - load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); - load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); - if(load_x+load_w>XRES) load_x=XRES-load_w; - if(load_y+load_h>YRES) load_y=YRES-load_h; - if(load_x<0) load_x=0; - if(load_y<0) load_y=0; - if(bq==1 && !b) - { - parse_save(load_data, load_size, 0, load_x, load_y); - free(load_data); - free(load_img); - load_mode = 0; - } - else if(bq==4 && !b) - { - free(load_data); - free(load_img); - load_mode = 0; - } - } - else if(save_mode==1) - { - save_x = (mx/sdl_scale)/CELL; - save_y = (my/sdl_scale)/CELL; - if(save_x >= XRES/CELL) save_x = XRES/CELL-1; - if(save_y >= YRES/CELL) save_y = YRES/CELL-1; - save_w = 1; - save_h = 1; - if(b==1) - { - save_mode = 2; - } - else if(b==4) - { - save_mode = 0; - copy_mode = 0; - } - } - else if(save_mode==2) - { - save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; - save_h = (my/sdl_scale+CELL/2)/CELL - save_y; - if(save_w>XRES/CELL) save_w = XRES/CELL; - if(save_h>YRES/CELL) save_h = YRES/CELL; - if(save_w<1) save_w = 1; - if(save_h<1) save_h = 1; - if(!b) - { - if(copy_mode==1) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - } - else if(copy_mode==2) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - } - else - { - stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - save_mode = 0; - } - } - } - else if(sdl_zoom_trig && zoom_en<2) - { - x /= sdl_scale; - y /= sdl_scale; - x -= ZSIZE/2; - y -= ZSIZE/2; - if(x<0) x=0; - if(y<0) y=0; - if(x>XRES-ZSIZE) x=XRES-ZSIZE; - if(y>YRES-ZSIZE) y=YRES-ZSIZE; - zoom_x = x; - zoom_y = y; - zoom_wx = (x 50) - it = 50; - x /= sdl_scale; - y /= sdl_scale; - if(y>=YRES+(MENUSIZE-20)) - { - if(!lb) - { - if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Up")) - { - svf_myvote = 1; - } - } - if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Down")) - { - svf_myvote = -1; - } - } - if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) - tag_list_ui(vid_buf); - if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) - { - legacy_enable = !legacy_enable; - } - if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) - { - memset(signs, 0, sizeof(signs)); - memset(pv, 0, sizeof(pv)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(fvx, 0, sizeof(fvx)); - memset(fvy, 0, sizeof(fvy)); - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(parts, 0, sizeof(particle)*NPART); - for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) - { - login_ui(vid_buf); - if(svf_login) - save_presets(0); - } - if(x>=37 && x<=187 && svf_login) - { - if(!svf_open || !svf_own || x>51) - { - if(save_name_ui(vid_buf)) - execute_save(vid_buf); - } - else - execute_save(vid_buf); - while(!sdl_poll()) - if(!SDL_GetMouseState(&x, &y)) - break; - b = bq = 0; - } - if(x>=1 && x<=17) - { - search_ui(vid_buf); - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - } - if(x>=19 && x<=35 && svf_last && svf_open) - parse_save(svf_last, svf_lsize, 1, 0, 0); - if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) - { - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 6); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+5) % 6); - save_presets(0); - } - if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) - sys_pause = !sys_pause; - lb = 0; - } - } - else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) - { - c = sl = cr&0xFF; - } - else - { - //Something - } - } - //create_parts(x, y, bs, SPC_AIR); - lx = x; - ly = y; - lb = 0; - lm = 0; - } - else - { - create_parts(x, y, bs, c); - lx = x; - ly = y; - lb = b; - lm = 0; - } - } - } - } - else - { - if(lb && lm) - { - x /= sdl_scale; - y /= sdl_scale; - c = (lb&1) ? sl : sr; - su = c; - if(lm == 1) - { - if(c!=127 || lx<0 || ly<0 || lx>=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) - create_line(lx, ly, x, y, bs, c); - } - else - create_box(lx, ly, x, y, c); - lm = 0; - } - lb = 0; - } - - if(load_mode) - { - draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); - xor_rect(vid_buf, load_x, load_y, load_w, load_h); - } - - if(save_mode) - { - xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - da = 51; - db = 269; - } - - if(zoom_en!=1 && !load_mode && !save_mode) - { - render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); - mousex = mx/sdl_scale; - mousey = my/sdl_scale; - } - - if(zoom_en) - render_zoom(vid_buf); - - if(da) - switch(db) - { - case 256: - drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); - break; - case 257: - drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); - break; - case 258: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); - break; - case 259: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); - break; - case 260: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); - break; - case 261: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); - break; - case 262: - drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); - break; - case 263: - drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); - break; - case 264: - drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); - break; - case 265: - drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); - break; - case 266: - drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); - break; - case 267: - drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); - break; - case 268: - drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); - break; - case 269: - drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); - break; - case 270: - drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); - break; - case 271: - drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); - break; - case 272: - drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); - break; - case 273: - drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); - break; - case 274: - drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); - break; - case 275: - drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); - break; - default: - drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); - } - if(itc) - { - itc--; - drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); - } - if(it) - { - it--; - //if(fbi_img) - //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); - drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); - } - - if(old_version) - { - clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); -#ifdef BETA - if(is_beta) - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); - } - else - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); - } -#else - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); -#endif - drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); - } - /*#ifdef MT - pthread_join(pth2,NULL); - #endif*/ - - if(hud_enable) - { - currentTime = SDL_GetTicks(); - if(currentTime-past>=16) - { - past = SDL_GetTicks(); - FPS++; - } - if(currentTime-pastFPS>=1000) - { -#ifdef BETA - sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#else - sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#endif - FPSB = FPS; - FPS = 0; - pastFPS = currentTime; - } - if(sdl_zoom_trig||zoom_en) - { - if(zoom_x Date: Mon, 16 Aug 2010 17:11:50 -0400 Subject: [PATCH 064/237] wee --- powder.c | 1 - 1 file changed, 1 deletion(-) diff --git a/powder.c b/powder.c index 2f8642bce..750beaa83 100644 --- a/powder.c +++ b/powder.c @@ -3266,7 +3266,6 @@ justdraw: blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); } } ->>>>>>> simon/master } else if(t==PT_PLSM) { float ttemp = parts[i].life; From 664e15215dd8345b6ca54fc885492fe3fb103488 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 16 Aug 2010 17:13:46 -0400 Subject: [PATCH 065/237] change a tad bit --- powder.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/powder.c b/powder.c index 750beaa83..334884ab9 100644 --- a/powder.c +++ b/powder.c @@ -3236,10 +3236,10 @@ justdraw: cg = 0x70; cb = 0x20; blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny, cr, cg, cb, 5); + blendpixel(vid, nx-1, ny, cr, cg, cb, 5); + blendpixel(vid, nx, ny+1, cr, cg, cb, 5); + blendpixel(vid, nx, ny-1, cr, cg, cb, 5); for(int tempx = 2; tempx < 10; tempx++) { for(int tempy = 2; tempy < 10; tempy++) { blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); @@ -3254,10 +3254,10 @@ justdraw: cg = 0x70; cb = 0x20; blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny, cr, cg, cb, 5); + blendpixel(vid, nx-1, ny, cr, cg, cb, 5); + blendpixel(vid, nx, ny+1, cr, cg, cb, 5); + blendpixel(vid, nx, ny-1, cr, cg, cb, 5); for(int tempx = 2; tempx < 10; tempx++) { for(int tempy = 2; tempy < 10; tempy++) { blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); From 802e7705a2e6673e9ffd95974e88066825810bc7 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 23:18:29 +0200 Subject: [PATCH 066/237] astyle formatted --- powder.c | 202 +++++++++++++++++++++++++++---------------------------- 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/powder.c b/powder.c index 334884ab9..78e481bdf 100644 --- a/powder.c +++ b/powder.c @@ -114,7 +114,7 @@ char *it_msg = "Shift+drag will create straight lines of particles.\n" "Ctrl+drag will result in filled rectangles.\n" "Ctrl+Shift+click will flood-fill a closed area.\n" - "Ctrl+Z will act as Undo.\n" + "Ctrl+Z will act as Undo.\n" "Middle click or Alt+Click to \"sample\" the particles.\n" "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" "Use 'S' to save parts of the window as 'stamps'.\n" @@ -130,7 +130,7 @@ char *it_msg = "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" - "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" + "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" "\n" "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" @@ -1288,7 +1288,7 @@ void set_emap(int x, int y) set_emap(x, y+1); } } - inline int parts_avg(int ci, int ni) +inline int parts_avg(int ci, int ni) { int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; if((pmr>>8) < NPART && (pmr>>8) >= 0) @@ -2910,40 +2910,40 @@ justdraw: } } else if(t==PT_PLUT) { - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } } else if(t==PT_URAN) { - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } } else if(t==PT_SLTW) { for(x=-1; x<=1; x++) @@ -3232,40 +3232,40 @@ justdraw: blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } } else if(t==PT_PLUT) { - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 5); - blendpixel(vid, nx-1, ny, cr, cg, cb, 5); - blendpixel(vid, nx, ny+1, cr, cg, cb, 5); - blendpixel(vid, nx, ny-1, cr, cg, cb, 5); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 5); + blendpixel(vid, nx-1, ny, cr, cg, cb, 5); + blendpixel(vid, nx, ny+1, cr, cg, cb, 5); + blendpixel(vid, nx, ny-1, cr, cg, cb, 5); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } } else if(t==PT_URAN) { - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 5); - blendpixel(vid, nx-1, ny, cr, cg, cb, 5); - blendpixel(vid, nx, ny+1, cr, cg, cb, 5); - blendpixel(vid, nx, ny-1, cr, cg, cb, 5); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 5); + blendpixel(vid, nx-1, ny, cr, cg, cb, 5); + blendpixel(vid, nx, ny+1, cr, cg, cb, 5); + blendpixel(vid, nx, ny-1, cr, cg, cb, 5); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } } else if(t==PT_PLSM) { float ttemp = parts[i].life; @@ -9735,7 +9735,7 @@ int main(int argc, char *argv[]) #endif menu_count(); parts = calloc(sizeof(particle), NPART); - cb_parts = calloc(sizeof(particle), NPART); + cb_parts = calloc(sizeof(particle), NPART); for(i=0; i 50) it = 50; } - if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo + if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo { - int cbx, cby, cbi; + int cbx, cby, cbi; - for(cbi=0; cbi Date: Mon, 16 Aug 2010 23:22:38 +0200 Subject: [PATCH 067/237] git fails --- powder.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/powder.c b/powder.c index 78e481bdf..f173f5a47 100644 --- a/powder.c +++ b/powder.c @@ -3222,10 +3222,10 @@ justdraw: cg = 0x50+(parts[i].life*10); cb = 0x50+(parts[i].life*10); blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny, cr, cg, cb, 5); + blendpixel(vid, nx-1, ny, cr, cg, cb, 5); + blendpixel(vid, nx, ny+1, cr, cg, cb, 5); + blendpixel(vid, nx, ny-1, cr, cg, cb, 5); blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); From 60e58a7e6bf171d3969d8b840fe4e7dbf4b8d74a Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 23:26:08 +0200 Subject: [PATCH 068/237] what about now --- powder.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/powder.c b/powder.c index f173f5a47..78e481bdf 100644 --- a/powder.c +++ b/powder.c @@ -3222,10 +3222,10 @@ justdraw: cg = 0x50+(parts[i].life*10); cb = 0x50+(parts[i].life*10); blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 5); - blendpixel(vid, nx-1, ny, cr, cg, cb, 5); - blendpixel(vid, nx, ny+1, cr, cg, cb, 5); - blendpixel(vid, nx, ny-1, cr, cg, cb, 5); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); From 435e36538f8f81267439c9db2b21ac43a5e81bb5 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 23:30:48 +0200 Subject: [PATCH 069/237] test --- powder.c => powder2.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename powder.c => powder2.c (100%) diff --git a/powder.c b/powder2.c similarity index 100% rename from powder.c rename to powder2.c From c21d8a371a4a114fe08938b9a7113c72c7ea3557 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 16 Aug 2010 23:31:11 +0200 Subject: [PATCH 070/237] now? --- powder2.c | 10781 ---------------------------------------------------- 1 file changed, 10781 deletions(-) delete mode 100644 powder2.c diff --git a/powder2.c b/powder2.c deleted file mode 100644 index 78e481bdf..000000000 --- a/powder2.c +++ /dev/null @@ -1,10781 +0,0 @@ -/** - * Powder Toy - Main source - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * Copyright (c) 2010 Skresanov Savely - * Copyright (c) 2010 Bryan Hoyle - * Copyright (c) 2010 Nathan Cousins - * - * 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 02111-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef WIN32 -#include -#else -#include -#include -#endif - - -#include "version.h" -#include "http.h" -#include "md5.h" -#include "update.h" -#include "hmap.h" - -#define SERVER "powdertoy.co.uk" - -#undef PLOSS - -#ifdef MENUV3 -#define MENUSIZE 40 -#else -#define MENUSIZE 20 -#endif -#define BARSIZE 14 -#define XRES 612 -#define YRES 384 -#define NPART XRES*YRES - -#define ZSIZE_D 16 -#define ZFACTOR_D 8 -unsigned char ZFACTOR = 256/ZSIZE_D; -unsigned char ZSIZE = ZSIZE_D; - -#define CELL 4 -#define ISTP (CELL/2) -#define CFDS (4.0f/CELL) - -typedef unsigned char uint8; - -#ifdef PIX16 -#define PIXELSIZE 2 -typedef unsigned short pixel; -#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) -#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) -#define PIXR(x) (((x)>>8)&0xF8) -#define PIXG(x) (((x)>>3)&0xFC) -#define PIXB(x) (((x)<<3)&0xF8) -#else -#define PIXELSIZE 4 -typedef unsigned int pixel; -#ifdef PIX32BGR -#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) -#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) -#define PIXR(x) ((x)&0xFF) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)>>16) -#else -#ifdef PIX32BGRA -#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) -#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) -#define PIXR(x) (((x)>>8)&0xFF) -#define PIXG(x) (((x)>>16)&0xFF) -#define PIXB(x) (((x)>>24)) -#else -#define PIXPACK(x) (x) -#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) -#define PIXR(x) ((x)>>16) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)&0xFF) -#endif -#endif -#endif - -char *it_msg = - "\brThe Powder Toy\n" - "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" - "\n" - "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" - "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" - "\bgPick your material from the menu using mouse left/right buttons.\n" - "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" - "Shift+drag will create straight lines of particles.\n" - "Ctrl+drag will result in filled rectangles.\n" - "Ctrl+Shift+click will flood-fill a closed area.\n" - "Ctrl+Z will act as Undo.\n" - "Middle click or Alt+Click to \"sample\" the particles.\n" - "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" - "Use 'S' to save parts of the window as 'stamps'.\n" - "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" - "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" - "Use the mouse scroll wheel to change the tool size for particles.\n" - "'Q' will quit the application.\n" - "The spacebar can be used to pause physics.\n" - "'P' will take a screenshot and save it into the current directory.\n" - "\n" - "\brhttp://powdertoy.co.uk/\n" - "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" - "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" - "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" - "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" - "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" - "\n" - "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" - "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" - ; - -typedef struct -{ - int start, inc; - pixel *vid; -} upstruc; - -#ifdef BETA -char *old_ver_msg_beta = "A new beta is available - click here!"; -#endif -char *old_ver_msg = "A new version is available - click here!"; -float mheat = 0.0f; - -int do_open = 0; -int sys_pause = 0; -int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. - -int amd = 0; - -unsigned char fire_r[YRES/CELL][XRES/CELL]; -unsigned char fire_g[YRES/CELL][XRES/CELL]; -unsigned char fire_b[YRES/CELL][XRES/CELL]; - -#define MAXSIGNS 16 - -struct sign -{ - int x,y,ju; - char text[256]; -} signs[MAXSIGNS]; - -/*********************************************************** - * AIR FLOW SIMULATOR * - ***********************************************************/ - -unsigned char bmap[YRES/CELL][XRES/CELL]; -unsigned char emap[YRES/CELL][XRES/CELL]; - -unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -unsigned char cb_emap[YRES/CELL][XRES/CELL]; - -unsigned cmode = 3; - -float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; - -float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; - -float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; -#define TSTEPP 0.3f -#define TSTEPV 0.4f -#define VADV 0.3f -#define VLOSS 0.999f -#define PLOSS 0.9999f -int numCores = 1; -float kernel[9]; -void make_kernel(void) -{ - int i, j; - float s = 0.0f; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - { - kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); - s += kernel[(i+1)+3*(j+1)]; - } - s = 1.0f / s; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - kernel[(i+1)+3*(j+1)] *= s; -} - -int core_count() -{ - int numCPU = 1; -#ifdef MT -#ifdef WIN32 - SYSTEM_INFO sysinfo; - GetSystemInfo( &sysinfo ); - numCPU = sysinfo.dwNumberOfProcessors; -#else -#ifdef MACOSX - numCPU = 4; -#else - numCPU = sysconf( _SC_NPROCESSORS_ONLN ); -#endif -#endif - - printf("Cpus: %d\n", numCPU); - if(numCPU>1) - printf("Multithreading enabled\n"); - else - printf("Multithreading disabled\n"); -#endif - return numCPU; -} - -void update_air(void) -{ - int x, y, i, j; - float dp, dx, dy, f, tx, ty; - - for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; - if(dp < -256.0f) dp = -256.0f; - if(dx > 256.0f) dx = 256.0f; - if(dx < -256.0f) dx = -256.0f; - if(dy > 256.0f) dy = 256.0f; - if(dy < -256.0f) dy = -256.0f; - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); -} - -void *update_air_th(void *arg) -{ - update_air(); - return NULL; -} - -inline unsigned clamp_flt(float f, float min, float max) -{ - if(fmax) - return 255; - return (int)(255.0f*(f-min)/(max-min)); -} - -inline float restrict_flt(float f, float min, float max) -{ - if(fmax) - return max; - return f; -} - -void draw_air(pixel *vid) -{ - int x, y, i, j; - pixel c; - - if(cmode == 2) - return; - - for(y=0; y 0.0f) - c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); - else - c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); - } - else - c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), - clamp_flt(pv[y][x], 0.0f, 8.0f), - clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); - for(j=0; j=XRES || ny>=YRES) - return 0; - if(x==nx && y==ny) - return 1; - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; - - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) - { - return 1; - } - - if((r&0xFF)==PT_VOID) - { - parts[i].type=PT_NONE; - return 0; - } - if((r&0xFF)==PT_BHOL) - { - parts[i].type=PT_NONE; - if(!legacy_enable) - { - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; - } - return 0; - } - - if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide - { - return 1; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - { - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) - { - return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - { - return 0; - } - - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - - if(parts[i].type==PT_CNCT && y>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; - } - - return 1; -} - -void kill_part(int i) -{ - int x, y; - parts[i].type = PT_NONE; - - x = (int)(parts[i].x+0.5f); - y = (int)(parts[i].y+0.5f); - - if(x>=0 && y>=0 && x=XRES || y>=YRES) - return -1; - - if(t==SPC_HEAT||t==SPC_COOL) - { - if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); - } - if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) - { - parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); - } - return pmap[y][x]>>8; - } - else - { - return -1; - } - } - if(t==SPC_AIR) - { - pv[y/CELL][x/CELL] += 0.03f; - if(y+CELL>8].type = PT_SPRK; - parts[pmap[y][x]>>8].life = 4; - parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; - pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; - return pmap[y][x]>>8; - } - - if(p==-1) - { - if(pmap[y][x]) - return -1; - if(pfree == -1) - return -1; - i = pfree; - pfree = parts[i].life; - } - else - i = p; - - if(t==PT_GLAS) - { - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - } - if(t!=PT_STKM) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - } - if(t==PT_ACID) - { - parts[i].life = 75; - } - //Testing - /*if(t==PT_WOOD){ - parts[i].life = 150; - }*/ - //End Testing - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_PLSM) - parts[i].life = rand()%150+50; - if(t==PT_LAVA) - parts[i].life = rand()%120+240; - if(t==PT_NBLE) - parts[i].life = 0; - if(t==PT_NEUT) - { - float r = (rand()%128+128)/127.0f; - float a = (rand()%360)*3.14159f/180.0f; - parts[i].life = rand()%480+480; - parts[i].vx = r*cosf(a); - parts[i].vy = r*sinf(a); - } - if(t==PT_PHOT) - { - float r = (rand()%3-1)*3; - float a = (rand()%3-1)*3; - parts[i].life = 680; - if(a==0.0f&&r==0.0f) - { - parts[i].life = 0; - parts[i].type = PT_NONE; - return -1; - } - else - { - parts[i].vx = a; - parts[i].vy = r; - } - //} else { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - //} - } - - if(t!=PT_STKM) - pmap[y][x] = t|(i<<8); - else - { - if(isplayer==0) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = PT_STKM; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 100; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - player[2] = PT_DUST; - player[3] = x-1; //Setting legs positions - player[4] = y+6; - player[5] = x-1; - player[6] = y+6; - - player[7] = x-3; - player[8] = y+12; - player[9] = x-3; - player[10] = y+12; - - player[11] = x+1; - player[12] = y+6; - player[13] = x+1; - player[14] = y+6; - - player[15] = x+3; - player[16] = y+12; - player[17] = x+3; - player[18] = y+12; - - isplayer = 1; - } - } - - return i; -} - -void delete_part(int x, int y) -{ - unsigned i; - - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - i = pmap[y][x]; - if(!i || (i>>8)>=NPART) - return; - - kill_part(i>>8); - pmap[y][x] = 0; // just in case -} - -inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -int sign(float i) //Signum function -{ - if (i<0) - return -1; - if (i>0) - return 1; - return 0; -} - -void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line -{ - int dx, dy, i, sx, sy, check, e, x, y; - - dx = abs(x1-x2); - dy = abs(y1-y2); - sx = sign(x2-x1); - sy = sign(y2-y1); - x = x1; - y = y1; - check = 0; - - if (dy>dx) - { - dx = dx+dy; - dy = dx-dy; - dx = dx-dy; - check = 1; - } - - e = (dy<<2)-dx; - for (i=0; i<=dx; i++) - { - vid[x+y*a] =PIXRGB(r, g, b); - if (e>=0) - { - if (check==1) - x = x+sx; - else - y = y+sy; - e = e-(dx<<2); - } - if (check==1) - y = y+sy; - else - x = x+sx; - e = e+(dy<<2); - } -} - -void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + 255*PIXR(t)) >> 8; - g = (a*g + 255*PIXG(t)) >> 8; - b = (a*b + 255*PIXB(t)) >> 8; - if(r>255) - r = 255; - if(g>255) - g = 255; - if(b>255) - b = 255; - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); - -int is_wire(int x, int y) -{ - return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; -} -int is_wire_off(int x, int y) -{ - return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; -} - -void set_emap(int x, int y) -{ - int x1, x2; - - if(!is_wire_off(x, y)) - return; - - // go left as far as possible - x1 = x2 = x; - while(x1>0) - { - if(!is_wire_off(x1-1, y)) - break; - x1--; - } - while(x21 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) - set_emap(x1, y-2); - else if(y>0) - for(x=x1; x<=x2; x++) - if(is_wire_off(x, y-1)) - { - if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) - set_emap(x, y-1); - } - - if(y>8) < NPART && (pmr>>8) >= 0) - { - return parts[pmr>>8].type; - } - else - { - return PT_NONE; - } -} -int nearest_part(int ci, int t) -{ - int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); - int ndistance = 0; - int id = -1; - int i = 0; - int cx = (int)parts[ci].x; - int cy = (int)parts[ci].y; - for(i=0; i=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) - { - kill_part(i); - continue; - } - - vx[y/CELL][x/CELL] *= ptypes[t].airloss; - vy[y/CELL][x/CELL] *= ptypes[t].airloss; - vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; - vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS||t==PT_NBLE) - { - if(pv[y/CELL][x/CELL]<3.5f) - pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); - if(y+CELL2.5f) - { - parts[i].life = rand()%80+180; - rt = parts[i].type = PT_FIRE; - parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - pv[y/CELL][x/CELL] += 0.25f * CFDS; - t = PT_FIRE; - } - - parts[i].vx *= ptypes[t].loss; - parts[i].vy *= ptypes[t].loss; - - if(t==PT_DFRM && !parts[i].life) - { - if(pv[y/CELL][x/CELL]>1.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - parts[i].life = rand()%80+300; - } - } - else - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - - if(ptypes[t].diffusion) - { - parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - } - - // interpolator -#ifdef WIN32 - mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#else - mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#endif - if(mv < ISTP) - { - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - } - else - { - dx = parts[i].vx*ISTP/mv; - dy = parts[i].vy*ISTP/mv; - ix = parts[i].x; - iy = parts[i].y; - while(1) - { - mv -= ISTP; - if(mv <= 0.0f) - { - // nothing found - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - break; - } - ix += dx; - iy += dy; - nx = (int)(ix+0.5f); - ny = (int)(iy+0.5f); - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) - { - parts[i].x = ix; - parts[i].y = iy; - break; - } - } - } - - a = nt = 0; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx4.0f) - t = parts[i].type = PT_DSTW; - if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) - t = parts[i].type = PT_OILL; - if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) - t = parts[i].type = PT_GASS; - } - if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - // t = parts[i].type = PT_BGLA; - if(t==PT_GLAS) - { - parts[i].pavg[0] = parts[i].pavg[1]; - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) - { - parts[i].type = PT_BGLA; - } - } - if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) - t = parts[i].type = PT_SNOW; - if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) - { - t = PT_NEUT; - create_part(i, x, y, t); - } - - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) - { - nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1) - { - create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[nearp].type = PT_SPRK; - parts[nearp].life = 9; - parts[nearp].ctype = PT_ETRD; - } - } - - if(!legacy_enable) - { - int ctemp = pv[y/CELL][x/CELL]*2; - c_heat = 0.0f; - h_count = 0; - if(ptypes[t].hconduct>(rand()%250)) - { - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - h_count++; - c_heat += parts[r>>8].temp; - } - } - } - } - pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - parts[r>>8].temp = parts[i].temp; - } - } - } - } - if(pt>=pstates[t].btemp&&pstates[t].burn) - { - t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE||t==PT_PLSM) - parts[i].life = rand()%50+120; - } - else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) - { - if(t==PT_LAVA&&parts[i].ctype) - { - parts[i].life = 0; - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) - { - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } - else - { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } - else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) - { - if(pstates[t].liquid==PT_LAVA) - { - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } - else if(t==PT_ICEI&&parts[i].ctype) - { - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else - { - t = parts[i].type = pstates[t].liquid; - } - } - else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) - { - t = parts[i].type = pstates[t].liquid; - } - else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) - { - if(t==PT_SLTW&&1>rand()%6) - { - t = parts[i].type = PT_SALT; - } - else - { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - } - } - if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) - { - float atemp = parts[i].temp + (-MIN_TEMP); - pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; - } - if(t==PT_LAVA) - { - parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - } - pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); - } - } - if(t==PT_CSCN&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - if(t==PT_HSCN&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) - { - nx = x % CELL; - if(nx == 0) - nx = x/CELL - 1; - else if(nx == CELL-1) - nx = x/CELL + 1; - else - nx = x/CELL; - ny = y % CELL; - if(ny == 0) - ny = y/CELL - 1; - else if(ny == CELL-1) - ny = y/CELL + 1; - else - ny = y/CELL; - if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) - { - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - } - else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) - { - pv[y/CELL][x/CELL] += 100.0f; - if(legacy_enable&&1>(rand()%200)) - { - parts[i].life = rand()%50+120; - t = parts[i].type = PT_FIRE; - } - else - { - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_ICEI || t==PT_SNOW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if(legacy_enable) - { - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; - } - } - } - else if(t==PT_HSCN||t==PT_CSCN) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) - { - parts[i].temp = 200.0f; - } - } - } - //PLANT - else if(t==PT_PLNT) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR && 1>(rand()%250)) - { - t = parts[i].type = PT_PLNT; - parts[r>>8].type = PT_PLNT; - } - else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WATR||t==PT_DSTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%250)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_WATR; - } - if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_SLTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) - { - parts[r>>8].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_WTRV) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - parts[r>>8].type = PT_WATR; - } - - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } - } - } - else if(t==PT_ACID) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)!=PT_ACID) - { - if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) - { - t = parts[i].type = PT_FIRE; - parts[i].life = 4; - parts[r>>8].type = PT_FIRE; - parts[r>>8].life = 4; - } - else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) - { - parts[i].life--; - parts[r>>8].type = PT_NONE; - } - else if (parts[i].life==50) - { - parts[i].life = 0; - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_NEUT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) - { - if(33>rand()%100) - { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); - } - else - { - create_part(r>>8, x+nx, y+ny, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - fe ++; - } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) - parts[r>>8].type = PT_DUST; - if((r&0xFF)==PT_WATR && 15>(rand()%100)) - parts[r>>8].type = PT_DSTW; - if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_DFRM; - if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_OILL; - if((r&0xFF)==PT_OILL && 5>(rand()%1000)) - parts[r>>8].type = PT_GASS; - if((r&0xFF)==PT_PLNT && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - } - } - else if(t==PT_PHOT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=0; nx<1; nx++) - for(ny=0; ny<1; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - } - } - else if(t==PT_LCRY) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_LCRY) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_BTRY) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts_avg(i,r>>8) != PT_INSL) - { - if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) - { - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - parts[r>>8].type = PT_SPRK; - } - } - } - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) - { - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) - continue; - rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) - { - parts[r>>8].type = PT_FIRE; - parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - parts[r>>8].life = rand()%80+180; - if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; - continue; - } - lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; - if(lpv < 1) lpv = 1; - if(legacy_enable) - { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && - ptypes[rt].meltable*lpv>(rand()%1000)) - { - if(t!=PT_LAVA || parts[i].life>0) - { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } - else - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) - { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = PT_METL; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) - { - kill_part(r>>8); - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; - parts[i].ctype = PT_NONE; - goto killed; - } - } - } - pavg = parts_avg(i, r>>8); - if(t==PT_SWCH&&pavg!= PT_INSL) - { - if(parts[r>>8].type == PT_SWCH) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - if(rt==PT_SWCH && t==PT_SPRK) - { - pavg = parts_avg(r>>8, i); - if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) - parts[r>>8].life = 10; - if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) - parts[r>>8].life = 9; - if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].ctype = PT_SWCH; - parts[r>>8].life = 4; - } - } - pavg = parts_avg(i, r>>8); - if(pavg != PT_INSL) - { - if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; - } - } - if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 6; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) - { - if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) - { - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) - { - parts[i].life = rand()%150+50; - parts[i].type = PT_PLSM; - parts[i].ctype = PT_NBLE; - parts[i].temp = 3500; - pv[y/CELL][x/CELL] += 1; - } - if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) - { - parts[i].type = PT_SWCH; - parts[i].life = 11; - } - } - } -killed: - if(parts[i].type == PT_NONE) - continue; - } - - if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; - - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } - - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; - - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; - - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; - - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; - - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } - - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } - - } - } - - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } - - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } - - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); - - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 ) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - } - } - } - - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } - - } - - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; - - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; - - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; - - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; - - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; - - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } - - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } - - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } - - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } - - } - - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } - - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } - - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - isplayer = 1; - } - - if(t==PT_CLNE) - { - if(!parts[i].ctype) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx=XRES-CELL || - ny=YRES-CELL) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - continue; - } - - rt = parts[i].flags & FLAG_STAGNANT; - parts[i].flags &= ~FLAG_STAGNANT; - if(!try_move(i, x, y, nx, ny)) - { - parts[i].x = lx; - parts[i].y = ly; - if(ptypes[t].falldown) - { - if(nx!=x && try_move(i, x, y, nx, y)) - { - parts[i].x = ix; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x, ny)) - { - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else - { - r = (rand()%2)*2-1; - if(ny!=y && try_move(i, x, y, x+r, ny)) - { - parts[i].x += r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x-r, ny)) - { - parts[i].x -= r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y+r)) - { - parts[i].x = ix; - parts[i].y += r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y-r)) - { - parts[i].x = ix; - parts[i].y -= r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) - { - s = 0; - if(!rt || nt) - rt = 50; - else - rt = 10; - for(j=x+r; j>=0 && j>=x-rt && j0) - r = 1; - else - r = -1; - if(s) - for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) - { - kill_part(i); - continue; - } - else if(try_move(i, x, y, 2*x-nx, ny)) - { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } - else if(try_move(i, x, y, nx, 2*y-ny)) - { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } - else - { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } - } - -justdraw: - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) - { - kill_part(i); - continue; - } - if(cmode!=CM_HEAT) - { - if(t==PT_STKM) //Just draw head here - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; - vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; - vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; - vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; - } - draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); - draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); - draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); - draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); - - isplayer = 1; //It's a secret. Tssss... - } - - if(t==PT_ACID) - { - if(parts[i].life>255) parts[i].life = 255; - if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28)); - if(s==0) s = 1; - cr = PIXR(ptypes[t].pcolors)/s; - cg = PIXG(ptypes[t].pcolors)/s; - cb = PIXB(ptypes[t].pcolors)/s; - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); - } - } - - if(cmode==4) - { - blendpixel(vid, nx+1, ny, cr, cg, cb, 223); - blendpixel(vid, nx-1, ny, cr, cg, cb, 223); - blendpixel(vid, nx, ny+1, cr, cg, cb, 223); - blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); - } - } - else if(t==PT_OILL) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,64,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,64,16,40); - } - } - } - else if(t==PT_NEUT) - { - if(cmode == 3||cmode==4) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 8; - cb = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = 0x20; - cg = 0xE0; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLUT) - { - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_URAN) - { - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_SLTW) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,80,240,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,80,240,50); - } - } - } - else if(t==PT_PHOT) - { - if(cmode == 3||cmode==4) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_SWCH && parts[i].life == 10) - { - x = nx; - y = ny; - blendpixel(vid,x,y,17,217,24,255); - } - else if(t==PT_LNTG) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,128,160,223,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,128,160,223,50); - } - } - } - else if(t==PT_SMKE) - { - if(cmode == 3||cmode==4) - { - x = nx/CELL; - y = ny/CELL; - cg = 10; - cb = 10; - cr = 10; - cg += fire_g[y][x]; - if(cg > 50) cg = 50; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 50) cb = 50; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 50) cr = 50; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny,100,100,100,30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,100,100,100,10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,100,100,100,20); - } - } - } - } - else if(t==PT_WATR) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - - } - else if(t==PT_DSTW) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - } - else if(t==PT_NITR) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,224,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,224,16,50); - } - } - - } - else if(t==PT_LRBD) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,170,170,170,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,170,170,170,50); - } - } - - } - - else if(t==PT_NBLE) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,235,73,23,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,235,73,23,20); - } - } - - } - else if(t==PT_GASS) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,255,32,255); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,255,32,20); - } - } - - } - else if(t==PT_WTRV) - { - if(cmode == 3||cmode==4) - { - x = nx/CELL; - y = ny/CELL; - cg = PIXG(ptypes[t].pcolors)/3; - cb = PIXB(ptypes[t].pcolors)/3; - cr = PIXR(ptypes[t].pcolors)/3; - cg += fire_g[y][x]; - if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); - } - } - } - } - else if(t==PT_THDR) - { - if(cmode == 3||cmode==4) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 16; - cb = 20; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xA0; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LCRY) - { - if(cmode == 3||cmode==4) - { - //cr = R/8; - //cg = G/8; - //cb = B/8; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); - //x = nx/CELL; - //y = ny/CELL; - //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } - else - { - cr = 0x50+(parts[i].life*10); - cg = 0x50+(parts[i].life*10); - cb = 0x50+(parts[i].life*10); - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLUT) { - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 5); - blendpixel(vid, nx-1, ny, cr, cg, cb, 5); - blendpixel(vid, nx, ny+1, cr, cg, cb, 5); - blendpixel(vid, nx, ny-1, cr, cg, cb, 5); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_URAN) - { - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 5); - blendpixel(vid, nx-1, ny, cr, cg, cb, 5); - blendpixel(vid, nx, ny+1, cr, cg, cb, 5); - blendpixel(vid, nx, ny-1, cr, cg, cb, 5); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_PLSM) - { - float ttemp = parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = plasma_data[caddress]; - uint8 G = plasma_data[caddress+1]; - uint8 B = plasma_data[caddress+2]; - if(cmode == 3||cmode==4) - { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_FIRE && parts[i].life) - { - if(cmode == 3||cmode==4) - { - cr = parts[i].life / 4; - cg = parts[i].life / 16; - cb = parts[i].life / 32; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = parts[i].life * 8; - cg = parts[i].life * 2; - cb = parts[i].life; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LAVA && parts[i].life) - { - cr = parts[i].life * 2 + 0xE0; - cg = parts[i].life * 1 + 0x50; - cb = parts[i].life/2 + 0x10; - if(cr>255) cr = 255; - if(cg>192) cg = 192; - if(cb>128) cb = 128; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 64); - blendpixel(vid, nx-1, ny, cr, cg, cb, 64); - blendpixel(vid, nx, ny+1, cr, cg, cb, 64); - blendpixel(vid, nx, ny-1, cr, cg, cb, 64); - if(cmode == 3||cmode==4) - { - cr /= 32; - cg /= 32; - cb /= 32; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else if(t==PT_LAVA || t==PT_SPRK) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - if(cmode == 3 || cmode==4) - { - if(t == PT_LAVA) - { - cr = 3; - cg = i%2; - cb = 0; - } - else - { - cr = 8; - cg = 12; - cb = 16; - } - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - } - else - { - float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); - uint8 R = color_data[caddress]; - uint8 G = color_data[caddress+1]; - uint8 B = color_data[caddress+2]; - - if(t==PT_STKM) //Stick man should be visible in heat mode - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); - vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); - vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); - vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); - } - draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); - draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); - draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); - draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); - } - else - { - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); - } - } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) - { - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); - - //if(vid[(ny-1)*YRES+(nx-1)]!=0){ - // blendpixel(vid, nx, ny-1, R, G, B, 46); - //} - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - - } - -} - -void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) -{ - blendpixel(vid, x+1, y, cr, cg, cb, 112); - blendpixel(vid, x-1, y, cr, cg, cb, 112); - blendpixel(vid, x, y+1, cr, cg, cb, 112); - blendpixel(vid, x, y-1, cr, cg, cb, 112); - - blendpixel(vid, x+1, y-1, cr, cg, cb, 64); - blendpixel(vid, x-1, y-1, cr, cg, cb, 64); - blendpixel(vid, x+1, y+1, cr, cg, cb, 64); - blendpixel(vid, x-1, y+1, cr, cg, cb, 64); -} - -void update_particles_i_th(void *arg) -{ - upstruc *newup = (upstruc*)arg; - update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); - return; -} - -void update_particles(pixel *vid) -{ - int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; - float lx, ly; -#ifdef MT - int pt = 0, pc = 0; - pthread_t *InterThreads; -#endif - - isplayer = 0; //Needed for player spawning - memset(pmap, 0, sizeof(pmap)); - r = rand()%2; - for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==13) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } - else - { - for(y=0; y>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==9) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && !sys_pause) - emap[y][x] --; - } - } - } - -#ifdef MT - if(numCores > 1) - { - InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); - for(pc = 0; pc=XRES || ny<0 || ny>=YRES) - break; - addpixel(vid, nx, ny, 255, 255, 255, 64); - i = nx/CELL; - j = ny/CELL; - lx += vx[j][i]*0.125f; - ly += vy[j][i]*0.125f; - if(bmap[j][i]==5 && i!=x && j!=y) - break; - } - drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); - } - -} - -void update_particles_th(void *arg) -{ - update_particles((pixel*)arg); - return; -} - -/*********************************************************** - * SDL OUTPUT * - ***********************************************************/ - -int sdl_scale = 1; -SDL_Surface *sdl_scrn; -SDLMod sdl_mod; -int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; - -#include "icon.h" -void sdl_seticon(void) -{ -#ifdef WIN32 - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else -#ifdef MACOSX - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else - SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#endif -#endif -} - -void sdl_open(void) -{ - if(SDL_Init(SDL_INIT_VIDEO)<0) - { - fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); - exit(1); - } - atexit(SDL_Quit); -#ifdef PIX16 - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); -#else - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); -#endif - if(!sdl_scrn) - { - fprintf(stderr, "Creating window: %s\n", SDL_GetError()); - exit(1); - } - SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); - sdl_seticon(); - SDL_EnableUNICODE(1); - //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); -} - -void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} - -void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - int i,k; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - } - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} -void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) -{ - if(sdl_scale == 2) - sdl_blit_2(x, y, w, h, src, pitch); - else - sdl_blit_1(x, y, w, h, src, pitch); -} - -int frame_idx=0; -void dump_frame(pixel *src, int w, int h, int pitch) -{ - char frame_name[32]; - int j,i; - unsigned char c[3]; - FILE *f; - sprintf(frame_name,"frame%04d.ppm",frame_idx); - f=fopen(frame_name,"wb"); - fprintf(f,"P6\n%d %d\n255\n",w,h); - for(j=0; j=0 && x=0 && yPT_NUM) - return 2; - if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) - return 3; - i = XRES*YRES; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) - return 1; - size = i; - } - else - d = c; - - if(size < XRES*YRES) - { - if(bzip2) - free(d); - return 1; - } - - sy = 0; - for(y=0; y+scl<=YRES; y+=scl) - { - sx = 0; - for(x=0; x+scl<=XRES; x+=scl) - { - a = 0; - r = g = b = 0; - for(j=0; j=PT_NUM) - goto corrupt; - r += PIXR(ptypes[t].pcolors); - g += PIXG(ptypes[t].pcolors); - b += PIXB(ptypes[t].pcolors); - a ++; - } - } - if(a) - { - a = 256/a; - r = (r*a)>>8; - g = (g*a)>>8; - b = (b*a)>>8; - } - - drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); - sx++; - } - sy++; - } - - if(bzip2) - free(d); - return 0; - -corrupt: - if(bzip2) - free(d); - return 1; -} - -static char *mystrdup(char *s) -{ - char *x; - if(s) - { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; - } - return s; -} - -void *build_save(int *size, int x0, int y0, int w, int h) -{ - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; - int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); - int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - // save the required air state - for(y=by0; y255) i=255; - d[p++] = i; - } - for(y=by0; y255) i=255; - d[p++] = i; - } - - // save the particle map - for(i=0; i=x0 && x=y0 && y255) x=255; - if(y<0) y=0; - if(y>255) y=255; - d[p++] = x; - d[p++] = y; - } - } - for(j=0; j255) tttemp=255; - d[p++] = tttemp; - } - } - for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; - d[p++] = (signs[i].y-y0); - d[p++] = (signs[i].y-y0)>>8; - d[p++] = signs[i].ju; - x = strlen(signs[i].text); - d[p++] = x; - memcpy(d+p, signs[i].text, x); - p+=x; - } - - i = (p*101+99)/100 + 612; - c = malloc(i); - c[0] = 0x66; - c[1] = 0x75; - c[2] = 0x43; - c[3] = legacy_enable; - c[4] = SAVE_VERSION; - c[5] = CELL; - c[6] = bw; - c[7] = bh; - c[8] = p; - c[9] = p >> 8; - c[10] = p >> 16; - c[11] = p >> 24; - - i -= 12; - - if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) - { - free(d); - free(c); - return NULL; - } - free(d); - - *size = i+12; - return c; -} - -int parse_save(void *save, int size, int replace, int x0, int y0) -{ - unsigned char *d,*c=save; - int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; - int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; - int fp[NPART], nf=0; - - if(size<16) - return 1; - if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) - return 1; - if(c[4]>SAVE_VERSION) - return 2; - ver = c[4]; - - if(ver<34) - { - legacy_enable = 1; - } - else - { - if(c[3]==1||c[3]==0) - legacy_enable = c[3]; - else - legacy_beta = 1; - } - - bw = c[6]; - bh = c[7]; - if(bx0+bw > XRES/CELL) - bx0 = XRES/CELL - bw; - if(by0+bh > YRES/CELL) - by0 = YRES/CELL - bh; - if(bx0 < 0) - bx0 = 0; - if(by0 < 0) - by0 = 0; - - if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) - return 3; - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - return 1; - size = i; - - if(size < bw*bh) - return 1; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - if(replace) - { - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(signs, 0, sizeof(signs)); - memset(parts, 0, sizeof(particle)*NPART); - memset(pmap, 0, sizeof(pmap)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(pv, 0, sizeof(pv)); - } - - // make a catalog of free parts - memset(pmap, 0, sizeof(pmap)); - for(i=0; i= size) - goto corrupt; - fvx[y][x] = (d[p++]-127.0f)/64.0f; - } - for(y=by0; y= size) - goto corrupt; - fvy[y][x] = (d[p++]-127.0f)/64.0f; - } - - // load the particle map - i = 0; - pty = p; - for(y=y0; y= size) - goto corrupt; - j=d[p++]; - if(j >= PT_NUM) - goto corrupt; - if(j && !(isplayer == 1 && j==PT_STKM)) - { - if(pmap[y][x]) - { - k = pmap[y][x]>>8; - parts[k].type = j; - parts[k].x = (float)x; - parts[k].y = (float)y; - m[(x-x0)+(y-y0)*w] = k+1; - } - else if(i < nf) - { - parts[fp[i]].type = j; - parts[fp[i]].x = (float)x; - parts[fp[i]].y = (float)y; - m[(x-x0)+(y-y0)*w] = fp[i]+1; - i++; - } - else - m[(x-x0)+(y-y0)*w] = NPART+1; - } - } - - // load particle properties - for(j=0; j= size) - goto corrupt; - if(i < NPART) - { - parts[i].vx = (d[p++]-127.0f)/16.0f; - parts[i].vy = (d[p++]-127.0f)/16.0f; - if(parts[i].type == PT_STKM) - { - player[2] = PT_DUST; - - player[3] = parts[i].x-1; //Setting legs positions - player[4] = parts[i].y+6; - player[5] = parts[i].x-1; - player[6] = parts[i].y+6; - - player[7] = parts[i].x-3; - player[8] = parts[i].y+12; - player[9] = parts[i].x-3; - player[10] = parts[i].y+12; - - player[11] = parts[i].x+1; - player[12] = parts[i].y+6; - player[13] = parts[i].x+1; - player[14] = parts[i].y+6; - - player[15] = parts[i].x+3; - player[16] = parts[i].y+12; - player[17] = parts[i].x+3; - player[18] = parts[i].y+12; - - } - } - else - p += 2; - } - } - for(j=0; j= size) - goto corrupt; - if(i <= NPART) - parts[i-1].life = d[p++]*4; - else - p++; - } - } - for(j=0; j=34&&legacy_beta==0) - { - if(p >= size) - { - goto corrupt; - } - if(i <= NPART) - { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } - else - { - p++; - } - } - else - { - parts[i-1].temp = ptypes[parts[i-1].type].heat; - } - } - } - for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) - { - if(p >= size) - goto corrupt; - if(i <= NPART) - parts[i-1].ctype = d[p++]; - else - p++; - } - } - - if(p >= size) - goto version1; - j = d[p++]; - for(i=0; i size) - goto corrupt; - for(k=0; k size) - goto corrupt; - if(kSAVE_VERSION) - return NULL; - - bw = c[6]; - bh = c[7]; - w = bw*CELL; - h = bh*CELL; - - if(c[5]!=CELL) - return NULL; - - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return NULL; - fb = calloc(w*h, PIXELSIZE); - if(!fb) - { - free(d); - return NULL; - } - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - goto corrupt; - size = i; - - if(size < bw*bh) - goto corrupt; - - k = 0; - for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) - goto corrupt; - - for(y=0; y= size) - goto corrupt; - j=d[p++]; - if(j0) - { - if(j==PT_STKM) //Stickman should be drawed another way - { - //Stickman drawing - for(k=-2; k<=1; k++) - { - fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); - fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); - fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); - fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); - } - draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); - draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); - draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); - draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); - } - else - fb[y*w+x] = ptypes[j].pcolors; - } - } - - free(d); - *width = w; - *height = h; - return fb; - -corrupt: - free(d); - free(fb); - return NULL; -} - -/* NO, I DON'T THINK SO - #include "fbi.h" - - pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) - { - unsigned char *tmp; - pixel *res; - int i; - - tmp = malloc(width*height*3); - if(!tmp) - return NULL; - res = malloc(width*height*PIXELSIZE); - if(!res) { - free(tmp); - return NULL; - } - - i = width*height*3; - if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { - free(res); - free(tmp); - return NULL; - } - - for(i=0; i1) - { - r = (r+c/2)/c; - g = (g+c/2)/c; - b = (b+c/2)/c; - } - q[y*w+x] = PIXRGB(r, g, b); - } - *qw = w; - *qh = h; - return q; -} - -#define GRID_X 5 -#define GRID_Y 4 -#define GRID_P 3 -#define GRID_S 6 -#define GRID_Z 3 - -void stamp_gen_thumb(int i) -{ - char fn[64]; - void *data; - int size, factor_x, factor_y; - pixel *tmp; - - if(stamps[i].thumb) - { - free(stamps[i].thumb); - stamps[i].thumb = NULL; - } - - sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); - data = file_load(fn, &size); - - if(data) - { - stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); - if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) - { - factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); - factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); - if(factor_y > factor_x) - factor_x = factor_y; - tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); - free(stamps[i].thumb); - stamps[i].thumb = tmp; - } - } - - free(data); -} - -int clipboard_ready = 0; -void *clipboard_data = 0; -int clipboard_length = 0; - -void stamp_save(int x, int y, int w, int h) -{ - FILE *f; - int n; - char fn[64], sn[16]; - void *s=build_save(&n, x, y, w, h); - -#ifdef WIN32 - _mkdir("stamps"); -#else - mkdir("stamps", 0755); -#endif - - stamp_gen_name(sn); - sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); - - f = fopen(fn, "wb"); - if(!f) - return; - fwrite(s, n, 1, f); - fclose(f); - - free(s); - - if(stamps[STAMP_MAX-1].thumb) - free(stamps[STAMP_MAX-1].thumb); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); - memset(stamps, 0, sizeof(struct stamp_info)); - if(stamp_count0) - { - memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); - memcpy(stamps, &tmp, sizeof(struct stamp_info)); - - stamp_update(); - } - - return data; -} - -void stamp_init(void) -{ - int i; - FILE *f; - - memset(stamps, 0, sizeof(stamps)); - - f=fopen("stamps" PATH_SEP "stamps.def", "rb"); - if(!f) - return; - for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) -{ - int i, j, w, bn = 0, ba = 0; - char *rp = font_data + font_ptrs[c]; - w = *(rp++); - for(j=0; j>= 2; - bn -= 2; - } - return x + w; -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) -{ - int sx = x; - for(; *s; s++) - { - if(*s == '\n') - { - x = sx; - y += FONT_H+2; - } - else if(*s == '\b') - { - switch(s[1]) - { - case 'w': - r = g = b = 255; - break; - case 'g': - r = g = b = 192; - break; - case 'o': - r = 255; - g = 216; - b = 32; - break; - case 'r': - r = 255; - g = b = 0; - break; - case 'b': - r = g = 0; - b = 255; - break; - } - s++; - } - else - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - return x; -} - -void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) -{ - int i; - for(i=0; i<=w; i++) - { - drawpixel(vid, x+i, y, r, g, b, a); - drawpixel(vid, x+i, y+h, r, g, b, a); - } - for(i=1; i=w && x+textwidth(s)>=w+5) - break; - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - if(*s) - for(i=0; i<3; i++) - x = drawchar(vid, x, y, '.', r, g, b, a); - return x; -} - -int textnwidth(char *s, int n) -{ - int x = 0; - for(; *s; s++) - { - if(!n) - break; - x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - n--; - } - return x-1; -} -int textwidthx(char *s, int w) -{ - int x=0,n=0,cw; - for(; *s; s++) - { - cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - if(x+(cw/2) >= w) - break; - x += cw; - n++; - } - return n; -} - -/*********************************************************** - * MAIN PROGRAM * - ***********************************************************/ - -void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) -{ - int x, y, i, j, c; - int bo = b; - if(iswall==1) - { - b = b-100; - x = (2+32*((b-22)/1)); - y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - x = 2+32*(b/2); - y = YRES+2+20*(b%2); - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - if(bo==sl || bo==sr) - { - c = 0; - if(bo==sl) - c |= PIXPACK(0xFF0000); - if(bo==sr) - c |= PIXPACK(0x0000FF); - for(i=0; i<30; i++) - { - vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; - } - for(j=0; j<18; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; - } - } -} - -int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) -{ - int i, j, c; - if(b>=121) - { - b = b-100; - //x = (2+32*((b-22)/1)); - //y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - case 40: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - //x = 2+32*(b/2); - //y = YRES+2+20*(b%2); - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - return 26; -} - -void draw_menu(pixel *vid_buf, int i, int hover) -{ - - //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); -#ifdef MENUV3 - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - if(hover==i) - { - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); - } -#else - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); -#endif -} - -void menu_ui(pixel *vid_buf, int i, int *sl, int *sr) -{ - int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; - pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); - fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); - memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - rows = ceil((float)msections[i].itemcount/16.0f); - height = (ceil((float)msections[i].itemcount/16.0f)*18); - width = restrict_flt(msections[i].itemcount*31, 0, 16*31); - //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); - h = -1; - x = XRES-BARSIZE-26; - y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; - sy = y; - //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); - fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); - fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); - drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); - if(i==SC_WALL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=20) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - if(b==1&&h!=-1) - { - *sl = h; - } - if(b==4&&h!=-1) - { - *sr = h; - } -} - -int create_parts(int x, int y, int r, int c) -{ - int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; - - if(c == 125) - { - i = x / CELL; - j = y / CELL; - for(v=-1; v<2; v++) - for(u=-1; u<2; u++) - if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) - { - if(cp) - create_parts(y, x, r, c); - else - create_parts(x, y, r, c); - } - e -= 1.0f; - } - } -} - -void create_box(int x1, int y1, int x2, int y2, int c) -{ - int i, j; - if(x1>x2) - { - i = x2; - x2 = x1; - x1 = i; - } - if(y1>y2) - { - j = y2; - y2 = y1; - y1 = j; - } - for(j=y1; j<=y2; j++) - for(i=x1; i<=x2; i++) - create_parts(i, j, 1, c); -} - -int flood_parts(int x, int y, int c, int cm, int bm) -{ - int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) - { - c = c-100; - } - if(cm==-1) - { - if(c==0) - { - cm = pmap[y][x]&0xFF; - if(!cm) - return 0; - } - else - cm = 0; - } - if(bm==-1) - { - if(c==30) - { - bm = bmap[y/CELL][x/CELL]; - if(!bm) - return 0; - if(bm==1) - cm = 0xFF; - } - else - bm = 0; - } - - if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) - return 1; - - // go left as far as possible - x1 = x2 = x; - while(x1>=CELL) - { - if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) - break; - x1--; - } - while(x2=CELL+dy) - for(x=x1; x<=x2; x++) - if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) - if(!flood_parts(x, y-dy, co, cm, bm)) - return 0; - if(y=XRES || y>=YRES) - return; - c = vid[y*(XRES+BARSIZE)+x]; - c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); - if(c<512) - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); - else - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); -} - -void xor_line(int x1, int y1, int x2, int y2, pixel *vid) -{ - int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - e -= 1.0f; - } - } -} - -void draw_svf_ui(pixel *vid_buf) -{ - int c; - - drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); - drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - c = svf_open ? 255 : 128; - drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); - drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); - - c = svf_login ? 255 : 128; - drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); - if(svf_open) - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); - else - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); - drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); - if(svf_open && svf_own) - drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); - - c = (svf_login && svf_open) ? 255 : 128; - - drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - - if(svf_myvote==1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); - } - else if(svf_myvote==-1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); - } - - drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); - drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); - - drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); - if(svf_tags[0]) - drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); - else - drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); - - drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); - - drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); - drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); - if(svf_login) - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); - else - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); - drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); - - if(sys_pause) - { - fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); - drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - if(!legacy_enable) - { - fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - switch(cmode) - { - case 0: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); - break; - case 1: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); - break; - case 2: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); - break; - case 3: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); - break; - case 4: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); - break; - case 5: - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - break; - } - drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - - if(svf_admin) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); - } - else if(svf_mod) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - }//else if(amd) - // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? -} - -typedef struct ui_edit -{ - int x, y, w, nx; - char str[256],*def; - int focus, cursor, hide; -} ui_edit; -void ui_edit_draw(pixel *vid_buf, ui_edit *ed) -{ - int cx, i; - char echo[256], *str; - - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(ed->str[0]) - { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); - } - else if(!ed->focus) - drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); - if(ed->focus) - { - cx = textnwidth(str, ed->cursor); - for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); - } -} -char *shift_0="`1234567890-=[]\\;',./"; -char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; -void ui_edit_process(int mx, int my, int mb, ui_edit *ed) -{ - char ch, ts[2], echo[256], *str; - int l, i; -#ifdef RAWINPUT - char *p; -#endif - - if(mb) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } - else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } - else - ed->focus = 0; - } - if(ed->focus && sdl_key) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - l = strlen(ed->str); - switch(sdl_key) - { - case SDLK_HOME: - ed->cursor = 0; - break; - case SDLK_END: - ed->cursor = l; - break; - case SDLK_LEFT: - if(ed->cursor > 0) - ed->cursor --; - break; - case SDLK_RIGHT: - if(ed->cursor < l) - ed->cursor ++; - break; - case SDLK_DELETE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - ed->str[ed->cursor] = 0; - else if(ed->cursor < l) - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - break; - case SDLK_BACKSPACE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - { - if(ed->cursor > 0) - memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); - ed->cursor = 0; - } - else if(ed->cursor > 0) - { - ed->cursor--; - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - } - break; - default: -#ifdef RAWINPUT - if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) - { - ch = sdl_key; - if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) - { - if(ch>='a' && ch<='z') - ch &= ~0x20; - p = strchr(shift_0, ch); - if(p) - ch = shift_1[p-shift_0]; - } - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#else - if(sdl_ascii>=' ' && sdl_ascii<127) - { - ch = sdl_ascii; - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#endif - break; - } - } -} -typedef struct ui_checkbox -{ - int x, y; - int focus, checked; -} ui_checkbox; -void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) -{ - int w = 12; - if(ed->checked) - { - drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); - } - if(ed->focus) - { - drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); - } - else - { - drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); - } -} -void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) -{ - int w = 12; - - if(mb && !mbq) - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->checked = (ed->checked)?0:1; - } - } - else - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->focus = 1; - } - else - { - ed->focus = 0; - } - } -} - -void error_ui(pixel *vid_buf, int err, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - char *msg; - - msg = malloc(strlen(txt)+16); - if(err) - sprintf(msg, "%03d %s", err, txt); - else - sprintf(msg, "%s", txt); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - if(err) - drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); - else - drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - free(msg); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_ui(pixel *vid_buf, char *top, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); - drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_box(pixel *vid_buf, char *msg) -{ - int w = textwidth(msg)+16; - int x0=(XRES-w)/2,y0=(YRES-24)/2; - - clearrect(vid_buf, x0-2, y0-2, w+4, 28); - drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); -} - -int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - int ret = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); - drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); - drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); - drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) - { - ret = 1; - break; - } - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - { - ret = 1; - break; - } - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - return ret; -} - -int execute_tagop(pixel *vid_buf, char *op, char *tag) -{ - int status; - char *result; - - char *names[] = {"ID", "Tag", NULL}; - char *parts[2]; - - char *uri = malloc(strlen(SERVER)+strlen(op)+36); - sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); - - parts[0] = svf_id; - parts[1] = tag; - - result = http_multipart_post( - uri, - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - free(uri); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 1; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 1; - } - - if(result[2]) - { - strncpy(svf_tags, result+3, 255); - svf_id[15] = 0; - } - - if(result) - free(result); - - return 0; -} - -struct strlist -{ - char *str; - struct strlist *next; -}; -void strlist_add(struct strlist **list, char *str) -{ - struct strlist *item = malloc(sizeof(struct strlist)); - item->str = mystrdup(str); - item->next = *list; - *list = item; -} -int strlist_find(struct strlist **list, char *str) -{ - struct strlist *item; - for(item=*list; item; item=item->next) - if(!strcmp(item->str, str)) - return 1; - return 0; -} -void strlist_free(struct strlist **list) -{ - struct strlist *item; - while(*list) - { - item = *list; - *list = (*list)->next; - free(item); - } -} - -void tag_list_ui(pixel *vid_buf) -{ - int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; - char *p,*q,s; - char *tag=NULL, *op=NULL; - ui_edit ed; - struct strlist *vote=NULL,*down=NULL; - - ed.x = x0+25; - ed.y = y0+221; - ed.w = 158; - ed.nx = 1; - ed.def = "[new tag]"; - ed.focus = 0; - ed.hide = 0; - ed.cursor = 0; - strcpy(ed.str, ""); - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - op = tag = NULL; - - drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 256); - drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); - p = svf_tags; - s = svf_tags[0] ? ' ' : 0; - y = 36 + y0; - while(s) - { - q = strchr(p, ' '); - if(!q) - q = p+strlen(p); - s = *q; - *q = 0; - if(svf_own || svf_admin || svf_mod) - { - drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); - d = 14; - if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) - { - if(!ed1.focus) - break; - ed1.focus = 0; - ed2.focus = 1; - } - if(sdl_key==SDLK_ESCAPE) - { - if(!ed1.focus && !ed2.focus) - return; - ed1.focus = 0; - ed2.focus = 0; - } - } - - strcpy(svf_user, ed1.str); - md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); - - res = http_multipart_post( - "http://" SERVER "/Login.api", - NULL, NULL, NULL, - svf_user, svf_pass, - &err, NULL); - if(err != 200) - { - error_ui(vid_buf, err, http_ret_text(err)); - if(res) - free(res); - goto fail; - } - if(res && !strncmp(res, "OK", 2)) - { - if(!strcmp(res, "OK ADMIN")) - { - svf_admin = 1; - svf_mod = 0; - } - else if(!strcmp(res, "OK MOD")) - { - svf_admin = 0; - svf_mod = 1; - } - else - { - svf_admin = 0; - svf_mod = 0; - } - free(res); - svf_login = 1; - return; - } - if(!res) - res = mystrdup("Unspecified Error"); - error_ui(vid_buf, 0, res); - free(res); - -fail: - strcpy(svf_user, ""); - strcpy(svf_pass, ""); - svf_login = 0; - svf_own = 0; - svf_admin = 0; - svf_mod = 0; -} - -void execute_delete(pixel *vid_buf, char *id) -{ - int status; - char *result; - - char *names[] = {"ID", NULL}; - char *parts[1]; - - parts[0] = id; - - result = http_multipart_post( - "http://" SERVER "/Delete.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result) - free(result); -} - -int execute_vote(pixel *vid_buf, char *id, char *action) -{ - int status; - char *result; - - char *names[] = {"ID", "Action", NULL}; - char *parts[2]; - - parts[0] = id; - parts[1] = action; - - result = http_multipart_post( - "http://" SERVER "/Vote.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 0; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 0; - } - - if(result) - free(result); - return 1; -} - -static char hex[] = "0123456789ABCDEF"; -void strcaturl(char *dst, char *src) -{ - char *d; - unsigned char *s; - - for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) - { - if((*s>='0' && *s<='9') || - (*s>='a' && *s<='z') || - (*s>='A' && *s<='Z')) - *(d++) = *s; - else - { - *(d++) = '%'; - *(d++) = hex[*s>>4]; - *(d++) = hex[*s&15]; - } - } - *d = 0; -} - -#define THUMB_CACHE_SIZE 256 - -char *thumb_cache_id[THUMB_CACHE_SIZE]; -void *thumb_cache_data[THUMB_CACHE_SIZE]; -int thumb_cache_size[THUMB_CACHE_SIZE]; -int thumb_cache_lru[THUMB_CACHE_SIZE]; - -void thumb_cache_inval(char *id) -{ - int i,j; - for(i=0; i= THUMB_CACHE_SIZE) - return; - free(thumb_cache_id[i]); - free(thumb_cache_data[i]); - thumb_cache_id[i] = NULL; - for(j=0; j thumb_cache_lru[i]) - thumb_cache_lru[j]--; -} -void thumb_cache_add(char *id, void *thumb, int size) -{ - int i,m=-1,j=-1; - thumb_cache_inval(id); - for(i=0; i m) - { - m = thumb_cache_lru[i]; - j = i; - } - } - if(i >= THUMB_CACHE_SIZE) - { - thumb_cache_inval(thumb_cache_id[j]); - i = j; - } - for(j=0; j= THUMB_CACHE_SIZE) - return 0; - for(j=0; j=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+5); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - else if(!strncmp(str, "TAG ", 4)) - { - if(j >= TAG_MAX) - { - str = p; - continue; - } - q = strchr(str+4, ' '); - if(!q) - { - str = p; - continue; - } - *(q++) = 0; - tag_names[j] = mystrdup(str+4); - tag_votes[j] = atoi(q); - j++; - } - else - { - if(i>=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - str = p; - } - if(*str) - i++; - return i; -} - -#define IMGCONNS 3 -#define TIMEOUT 100 -#define HTTP_TIMEOUT 10 - -int search_own = 0; -int search_date = 0; -int search_page = 0; -char search_expr[256] = ""; - -int search_ui(pixel *vid_buf) -{ - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; - int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; - int thumb_drawn[GRID_X*GRID_Y]; - pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - float ry; - time_t http_last_use=HTTP_TIMEOUT; - ui_edit ed; - - - void *http = NULL; - int active = 0; - char *last = NULL; - int search = 0; - int lasttime = TIMEOUT; - char *uri; - int status; - char *results; - char *tmp, ts[64]; - - void *img_http[IMGCONNS]; - char *img_id[IMGCONNS]; - void *thumb, *data; - int thlen, dlen; - - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - - memset(img_http, 0, sizeof(img_http)); - memset(img_id, 0, sizeof(img_id)); - - memset(search_ids, 0, sizeof(search_ids)); - memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); - memset(search_publish, 0, sizeof(search_publish)); - memset(search_owners, 0, sizeof(search_owners)); - memset(search_thumbs, 0, sizeof(search_thumbs)); - memset(search_thsizes, 0, sizeof(search_thsizes)); - - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - - do_open = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = 65; - ed.y = 13; - ed.w = XRES-200; - ed.nx = 1; - ed.def = "[search terms]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(search_expr); - strcpy(ed.str, search_expr); - - sdl_wheel = 0; - - while(!sdl_poll()) - { - uih = 0; - bq = b; - mxq = mx; - myq = my; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - if(mx!=mxq || my!=myq || sdl_wheel || b) - mmt = 0; - else if(mmt 9) - { - drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); - drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); - } - - ui_edit_draw(vid_buf, &ed); - - if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) - { - if(search_page) - { - search_page --; - lasttime = TIMEOUT; - } - sdl_wheel = 0; - uih = 1; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) - { - lasttime = TIMEOUT; - search_page ++; - page_count = exp_res; - } - sdl_wheel = 0; - uih = 1; - } - - tp = -1; - if(is_p1) - { - drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); - for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) - for(gi=0; giTAG_MAX || !tag_names[pos]) - break; - if(tag_votes[0]) - i = 127+(128*tag_votes[pos])/tag_votes[0]; - else - i = 192; - w = textwidth(tag_names[pos]); - if(w>XRES/GRID_X-5) - w = XRES/GRID_X-5; - gx = (XRES/GRID_X)*gi; - gy = gj*14 + 46; - if(mx>=gx && mx=gy && my XRES/GRID_X-10) - { - tmp = malloc(strlen(search_names[pos])+4); - strcpy(tmp, search_names[pos]); - j = textwidthx(tmp, XRES/GRID_X-15); - strcpy(tmp+j, "..."); - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); - free(tmp); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); - j = textwidth(search_owners[pos]); - if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && - my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) - { - st = 1; - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); - if(search_thumbs[pos]&&thumb_drawn[pos]==0) - { - render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); - thumb_drawn[pos] = 1; - } - own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); - if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) - mp = pos; - if(own) - { - if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) - { - mp = -1; - dp = pos; - } - } - if(mp==pos && !st) - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); - else - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); - if(own) - { - if(dp == pos) - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); - else - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); - } - if(!search_publish[pos]) - { - drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); - drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(view_own || svf_admin || svf_mod) - { - sprintf(ts+1, "%d", search_votes[pos]); - ts[0] = 0xBB; - for(j=1; ts[j]; j++) - ts[j] = 0xBC; - ts[j-1] = 0xB9; - ts[j] = 0xBA; - ts[j+1] = 0; - w = gx+XRES/GRID_S-2-textwidth(ts); - h = gy+YRES/GRID_S-11; - drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); - for(j=0; ts[j]; j++) - ts[j] -= 14; - drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); - sprintf(ts, "%d", search_votes[pos]); - for(j=0; ts[j]; j++) - ts[j] += 127; - drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); - } - if(search_scoreup[pos]>0||search_scoredown[pos]>0) - { - lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); - - if(((YRES/GRID_S+3)/2)>lv) - { - ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); - if(lv<8) - { - ry = ry/(8-lv); - } - nyu = search_scoreup[pos]*ry; - nyd = search_scoredown[pos]*ry; - } - else - { - ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); - nyu = search_scoreup[pos]/ry; - nyd = search_scoredown[pos]/ry; - } - - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); - - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); - } - } - - if(mp!=-1 && mmt>=TIMEOUT/5 && !st) - { - gi = mp % GRID_X; - gj = mp / GRID_X; - if(is_p1) - gj += GRID_Y-GRID_P; - gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; - gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; - i = w = textwidth(search_names[mp]); - h = YRES/GRID_Z+30; - if(w=XRES-2) gx=XRES-3-w; - if(gy<32) gy=32; - if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; - clearrect(vid_buf, gx-2, gy-3, w+4, h); - drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); - if(search_thumbs[mp]) - render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); - drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); - drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(sdl_key==SDLK_RETURN) - { - if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) - lasttime = TIMEOUT; - else if(search_ids[0] && !search_ids[1]) - { - bq = 0; - b = 1; - mp = 0; - } - } - if(sdl_key==SDLK_ESCAPE) - goto finish; - - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) - { - search_own = !search_own; - lasttime = TIMEOUT; - } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) - { - search_date = !search_date; - lasttime = TIMEOUT; - } - - if(b && !bq && dp!=-1) - if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) - { - execute_delete(vid_buf, search_ids[dp]); - lasttime = TIMEOUT; - if(last) - { - free(last); - last = NULL; - } - } - - if(b && !bq && tp!=-1) - { - strncpy(ed.str, tag_names[tp], 255); - lasttime = TIMEOUT; - } - - if(b && !bq && mp!=-1 && st) - { - sprintf(ed.str, "user:%s", search_owners[mp]); - lasttime = TIMEOUT; - } - - if(do_open==1) - { - mp = 0; - } - - if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) - { - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); - - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - data = http_simple_get(uri, &status, &dlen); - free(uri); - - if(status == 200) - { - status = parse_save(data, dlen, 1, 0, 0); - switch(status) - { - case 1: - error_ui(vid_buf, 0, "Simulation corrupted"); - break; - case 2: - error_ui(vid_buf, 0, "Simulation from a newer version"); - break; - case 3: - error_ui(vid_buf, 0, "Simulation on a too large grid"); - break; - } - if(!status) - { - char *tnames[] = {"ID", NULL}; - char *tparts[1]; - int tplens[1]; - if(svf_last) - free(svf_last); - svf_last = data; - svf_lsize = dlen; - - tparts[0] = search_ids[mp]; - tplens[0] = strlen(search_ids[mp]); - data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); - - svf_open = 1; - svf_own = svf_login && !strcmp(search_owners[mp], svf_user); - svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); - - strcpy(svf_id, search_ids[mp]); - strcpy(svf_name, search_names[mp]); - if(status == 200) - { - if(data) - { - strncpy(svf_tags, data, 255); - svf_tags[255] = 0; - } - else - svf_tags[0] = 0; - } - else - { - svf_tags[0] = 0; - } - - if(svf_login) - { - char *names[] = {"ID", NULL}; - char *parts[1]; - parts[0] = search_ids[mp]; - data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); - if(status == 200) - { - if(data) - { - if(!strcmp(data, "Up")) - { - svf_myvote = 1; - } - else if(!strcmp(data, "Down")) - { - svf_myvote = -1; - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - } - else - { - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - } - } - else - error_ui(vid_buf, status, http_ret_text(status)); - - if(data) - free(data); - goto finish; - } - - if(!last) - { - search = 1; - } - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) - { - search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) - { - search_page = 0; - page_count = 0; - } - free(last); - last = NULL; - } - else - search = 0; - - if(search && lasttime>=TIMEOUT) - { - lasttime = 0; - last = mystrdup(ed.str); - last_own = search_own; - last_date = search_date; - last_page = search_page; - active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); - if(search_own || svf_admin || svf_mod) - tmp = "&ShowVotes=true"; - else - tmp = ""; - if(!search_own && !search_date && !*last) - { - if(search_page) - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); - } - else - { - exp_res = GRID_X*GRID_P; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); - } - } - else - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); - } - strcaturl(uri, last); - if(search_own) - { - strcaturl(uri, " user:"); - strcaturl(uri, svf_user); - } - if(search_date) - strcaturl(uri, " sort:date"); - - http = http_async_req_start(http, uri, NULL, 0, 1); - if(svf_login) - { - http_auth_headers(http, svf_user, svf_pass); - } - http_last_use = time(NULL); - free(uri); - } - - if(active && http_async_req_status(http)) - { - http_last_use = time(NULL); - results = http_async_req_stop(http, &status, NULL); - view_own = last_own; - if(status == 200) - { - page_count = search_results(results, last_own||svf_admin||svf_mod); - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - } - is_p1 = (exp_res < GRID_X*GRID_Y); - free(results); - active = 0; - } - - if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) - { - http_async_req_close(http); - http = NULL; - } - - for(i=0; i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) - { - if(stamp_page) - { - stamp_page --; - } - sdl_wheel = 0; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; -} - -void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) -{ - char t[2]; - t[0] = ch; - t[1] = 0; - if(flag) - { - fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); - } - else - { - drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); - } -} - -void render_signs(pixel *vid_buf) -{ - int i, j, x, y, w, h, dx, dy; - char buff[30]; //Buffer - for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature - else - sprintf(buff, "Temp: 0.00"); //...tempirature - drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); - } - - //Usual text - if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) - drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); - x = signs[i].x; - y = signs[i].y; - dx = 1 - signs[i].ju; - dy = (signs[i].y > 18) ? -1 : 1; - for(j=0; j<4; j++) - { - drawpixel(vid_buf, x, y, 192, 192, 192, 255); - x+=dx; - y+=dy; - } - } -} - -void add_sign_ui(pixel *vid_buf, int mx, int my) -{ - int i, w, h, x, y, nm=0, ju; - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; - ui_edit ed; - - // check if it is an existing sign - for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) - break; - } - // else look for empty spot - if(i >= MAXSIGNS) - { - nm = 1; - for(i=0; i= MAXSIGNS) - return; - - if(nm) - { - signs[i].x = mx; - signs[i].y = my; - signs[i].ju = 1; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = x0+25; - ed.y = y0+25; - ed.w = 158; - ed.nx = 1; - ed.def = "[message]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(signs[i].text); - strcpy(ed.str, signs[i].text); - ju = signs[i].ju; - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed); - drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); - draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); - draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); - draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); - - if(!nm) - { - drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); - drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); - drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); - } - - drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) - ju = 0; - if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) - ju = 1; - if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) - ju = 2; - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) - { - signs[i].text[0] = 0; - return; - } - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - { - if(!ed.focus) - return; - ed.focus = 0; - } - } - - strcpy(signs[i].text, ed.str); - signs[i].ju = ju; -} - -/*********************************************************** - * CONFIG FILE * - ***********************************************************/ - -char http_proxy[256] = ""; - -void save_string(FILE *f, char *str) -{ - int li = strlen(str); - unsigned char lb[2]; - lb[0] = li; - lb[1] = li >> 8; - fwrite(lb, 2, 1, f); - fwrite(str, li, 1, f); -} - -int load_string(FILE *f, char *str, int max) -{ - int li; - unsigned char lb[2]; - fread(lb, 2, 1, f); - li = lb[0] | (lb[1] << 8); - if(li > max) - { - str[0] = 0; - return 1; - } - fread(str, li, 1, f); - str[li] = 0; - return 0; -} - -unsigned char last_major=0, last_minor=0, update_flag=0; - -void save_presets(int do_update) -{ - FILE *f=fopen("powder.def", "wb"); - unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; - unsigned char tmp = sdl_scale; - if(!f) - return; - fwrite(sig, 1, 4, f); - save_string(f, svf_user); - save_string(f, svf_pass); - fwrite(&tmp, 1, 1, f); - tmp = cmode; - fwrite(&tmp, 1, 1, f); - tmp = svf_admin; - fwrite(&tmp, 1, 1, f); - tmp = svf_mod; - fwrite(&tmp, 1, 1, f); - save_string(f, http_proxy); - tmp = SAVE_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = MINOR_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = do_update; - fwrite(&tmp, 1, 1, f); - fclose(f); -} - -void load_presets(void) -{ - FILE *f=fopen("powder.def", "rb"); - unsigned char sig[4], tmp; - if(!f) - return; - fread(sig, 1, 4, f); - if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) - { - if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) - { - if(fseek(f, -3, SEEK_END)) - { - remove("powder.def"); - return; - } - if(fread(sig, 1, 3, f) != 3) - { - remove("powder.def"); - goto fail; - } - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; - } - fclose(f); - remove("powder.def"); - return; - } - if(load_string(f, svf_user, 63)) - goto fail; - if(load_string(f, svf_pass, 63)) - goto fail; - svf_login = !!svf_user[0]; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - sdl_scale = (tmp == 2) ? 2 : 1; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - cmode = tmp%6; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_admin = tmp; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_mod = tmp; - if(load_string(f, http_proxy, 255)) - goto fail; - if(fread(sig, 1, 3, f) != 3) - goto fail; - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; -fail: - fclose(f); -} - -void dim_copy(pixel *dst, pixel *src) -{ - int i,r,g,b; - for(i=0; i0) - r--; - if(g>0) - g--; - if(b>0) - b--; - dst[i] = PIXRGB(r,g,b); - } -} - -unsigned int fire_alpha[CELL*3][CELL*3]; -void prepare_alpha(void) -{ - int x,y,i,j; - float temp[CELL*3][CELL*3]; - memset(temp, 0, sizeof(temp)); - for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; - fire_g[j][i] = g>4 ? g-4 : 0; - fire_b[j][i] = b>4 ? b-4 : 0; - } -} - -int zoom_en = 0; -int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; -int zoom_wx=0, zoom_wy=0; -void render_zoom(pixel *img) -{ - int x, y, i, j; - pixel pix; - drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); - drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); - clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); - for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) - { - xor_pixel(x+i, y+j, vid); - if(j) xor_pixel(x+i, y-j, vid); - if(i) xor_pixel(x-i, y+j, vid); - if(i&&j) xor_pixel(x-i, y-j, vid); - } - } - else - { - int tc; - c = (r/CELL) * CELL; - x = (x/CELL) * CELL; - y = (y/CELL) * CELL; - - tc = !((c%(CELL*2))==0); - - x -= c/2; - y -= c/2; - - x += tc*(CELL/2); - y += tc*(CELL/2); - - for(i=0; i2) - { - pthread_t pth; - pthread_create(&pth,NULL,update_air_th,""); - } - else - { - update_air(); - } -#else - update_air(); -#endif - } - if(cmode==0 || cmode==1) - { - draw_air(vid_buf); - } - else if(cmode==2) - { - memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); - memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); - } - else - { - memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); - } - update_particles(vid_buf); - - if(cmode==2) - { - if(!fire_fc) - { - dim_copy(fire_bg, vid_buf); - } - else - { - memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); - } - fire_fc = (fire_fc+1) % 3; - } - if(cmode==3||cmode==4) - render_fire(vid_buf); - - render_signs(vid_buf); - - memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); - clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); - - draw_svf_ui(vid_buf); - - if(http_ver_check) - { - if(!do_check && http_async_req_status(http_ver_check)) - { - ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); - if(http_ret==200 && ver_data) - { -#ifdef BETA - if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) - old_version = 1; -#else - if(sscanf(ver_data, "%d.%d", &major, &minor)==2) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) - old_version = 1; -#endif - free(ver_data); - } - http_ver_check = NULL; - } - do_check = (do_check+1) & 15; - } - - if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) - { - if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) - { - break; - } - } - if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) - { - if(load_mode) - { - free(load_img); - free(load_data); - load_mode = 0; - load_data = NULL; - load_img = NULL; - } - if(it > 50) - it = 50; - if(sdl_key=='k' && stamps[1].name[0]) - { - j = stamp_ui(vid_buf); - if(j>=0) - load_data = stamp_load(j, &load_size); - else - load_data = NULL; - } - else - load_data = stamp_load(0, &load_size); - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - if(sdl_key=='s') - { - if(it > 50) - it = 50; - save_mode = 1; - } - if(sdl_key=='1') - { - set_cmode(0); - } - if(sdl_key=='2') - { - set_cmode(1); - } - if(sdl_key=='3') - { - set_cmode(2); - } - if(sdl_key=='4') - { - set_cmode(3); - } - if(sdl_key=='5') - { - set_cmode(4); - } - if(sdl_key=='6') - { - set_cmode(5); - } - if(sdl_key==SDLK_SPACE) - sys_pause = !sys_pause; - if(sdl_key=='h') - hud_enable = !hud_enable; - if(sdl_key=='p') - dump_frame(vid_buf, XRES, YRES, XRES); - if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - if(clipboard_ready==1) - { - load_data = malloc(clipboard_length); - memcpy(load_data, clipboard_data, clipboard_length); - load_size = clipboard_length; - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - } - if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 2; - } - if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 1; - } - else if(sdl_key=='c') - { - set_cmode((cmode+1) % 6); - if(it > 50) - it = 50; - } - if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo - { - int cbx, cby, cbi; - - for(cbi=0; cbi32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - sdl_wheel = 0; - } - else - { - bs += sdl_wheel; - if(bs>16) - bs = 16; - if(bs<0) - bs = 0; - sdl_wheel = 0; - /*if(su >= PT_NUM) { - if(sl < PT_NUM) - su = sl; - if(sr < PT_NUM) - su = sr; - }*/ - } - } - - bq = b; - b = SDL_GetMouseState(&x, &y); - - for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy - && x0 && y0 && x>8)>=NPART || !cr)) - { -#ifdef BETA - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); -#else - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); -#endif - } - else - { - sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); - } - } - mx = x; - my = y; - if(update_flag) - { - info_box(vid_buf, "Finalizing update..."); - if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) - { - update_cleanup(); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - { - if(update_finish()) - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - else - info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); - } - update_flag = 0; - } - - if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && - x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) - { - tmp = malloc(64); -#ifdef BETA - if(is_beta) - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); - } - else - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); - } -#else - sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); -#endif - if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) - { - free(tmp); - tmp = download_ui(vid_buf, my_uri, &i); - if(tmp) - { - save_presets(1); - if(update_start(tmp, i)) - { - update_cleanup(); - save_presets(0); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - return 0; - } - } - else - free(tmp); - } - if(y>=sdl_scale*(YRES+(MENUSIZE-20))) - { - if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) - { - db = (svf_myvote==1) ? 273 : 274; - if(da < 51) - da ++; - } - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) - { - db = svf_own ? 257 : 256; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) - { - db = 270; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) - { - db = 266; - if(da < 51) - da ++; - } - else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) - { - db = 259; - if(svf_open && svf_own && x<=55*sdl_scale) - db = 258; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) - { - db = svf_login ? 261 : 260; - if(svf_admin) - { - db = 268; - } - else if(svf_mod) - { - db = 271; - } - if(da < 51) - da ++; - } - else if(x>=sdl_scale && x<=17*sdl_scale) - { - db = 262; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) - { - db = sys_pause ? 264 : 263; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) - { - db = 267; - if(da < 51) - da ++; - } - else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) - { - db = 265; - if(da < 51) - da ++; - } - else if(da > 0) - da --; - } - else if(da > 0) - da --; - - if(!sdl_zoom_trig && zoom_en==1) - zoom_en = 0; - - if(sdl_key==Z_keysym && zoom_en==2) - zoom_en = 1; - - if(load_mode) - { - load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); - load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); - if(load_x+load_w>XRES) load_x=XRES-load_w; - if(load_y+load_h>YRES) load_y=YRES-load_h; - if(load_x<0) load_x=0; - if(load_y<0) load_y=0; - if(bq==1 && !b) - { - parse_save(load_data, load_size, 0, load_x, load_y); - free(load_data); - free(load_img); - load_mode = 0; - } - else if(bq==4 && !b) - { - free(load_data); - free(load_img); - load_mode = 0; - } - } - else if(save_mode==1) - { - save_x = (mx/sdl_scale)/CELL; - save_y = (my/sdl_scale)/CELL; - if(save_x >= XRES/CELL) save_x = XRES/CELL-1; - if(save_y >= YRES/CELL) save_y = YRES/CELL-1; - save_w = 1; - save_h = 1; - if(b==1) - { - save_mode = 2; - } - else if(b==4) - { - save_mode = 0; - copy_mode = 0; - } - } - else if(save_mode==2) - { - save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; - save_h = (my/sdl_scale+CELL/2)/CELL - save_y; - if(save_w>XRES/CELL) save_w = XRES/CELL; - if(save_h>YRES/CELL) save_h = YRES/CELL; - if(save_w<1) save_w = 1; - if(save_h<1) save_h = 1; - if(!b) - { - if(copy_mode==1) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - } - else if(copy_mode==2) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - } - else - { - stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - save_mode = 0; - } - } - } - else if(sdl_zoom_trig && zoom_en<2) - { - x /= sdl_scale; - y /= sdl_scale; - x -= ZSIZE/2; - y -= ZSIZE/2; - if(x<0) x=0; - if(y<0) y=0; - if(x>XRES-ZSIZE) x=XRES-ZSIZE; - if(y>YRES-ZSIZE) y=YRES-ZSIZE; - zoom_x = x; - zoom_y = y; - zoom_wx = (x 50) - it = 50; - x /= sdl_scale; - y /= sdl_scale; - if(y>=YRES+(MENUSIZE-20)) - { - if(!lb) - { - if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Up")) - { - svf_myvote = 1; - } - } - if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Down")) - { - svf_myvote = -1; - } - } - if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) - tag_list_ui(vid_buf); - if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) - { - legacy_enable = !legacy_enable; - } - if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) - { - memset(signs, 0, sizeof(signs)); - memset(pv, 0, sizeof(pv)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(fvx, 0, sizeof(fvx)); - memset(fvy, 0, sizeof(fvy)); - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(parts, 0, sizeof(particle)*NPART); - for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) - { - login_ui(vid_buf); - if(svf_login) - save_presets(0); - } - if(x>=37 && x<=187 && svf_login) - { - if(!svf_open || !svf_own || x>51) - { - if(save_name_ui(vid_buf)) - execute_save(vid_buf); - } - else - execute_save(vid_buf); - while(!sdl_poll()) - if(!SDL_GetMouseState(&x, &y)) - break; - b = bq = 0; - } - if(x>=1 && x<=17) - { - search_ui(vid_buf); - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - } - if(x>=19 && x<=35 && svf_last && svf_open) - parse_save(svf_last, svf_lsize, 1, 0, 0); - if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) - { - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 6); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+5) % 6); - save_presets(0); - } - if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) - sys_pause = !sys_pause; - lb = 0; - } - } - else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) - { - c = sl = cr&0xFF; - } - else - { - //Something - } - } - //create_parts(x, y, bs, SPC_AIR); - lx = x; - ly = y; - lb = 0; - lm = 0; - } - else - { - //Copy state before drawing any particles (for undo) - int cbx, cby, cbi; - - for(cbi=0; cbi=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) - create_line(lx, ly, x, y, bs, c); - } - else - create_box(lx, ly, x, y, c); - lm = 0; - } - lb = 0; - } - - if(load_mode) - { - draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); - xor_rect(vid_buf, load_x, load_y, load_w, load_h); - } - - if(save_mode) - { - xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - da = 51; - db = 269; - } - - if(zoom_en!=1 && !load_mode && !save_mode) - { - render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); - mousex = mx/sdl_scale; - mousey = my/sdl_scale; - } - - if(zoom_en) - render_zoom(vid_buf); - - if(da) - switch(db) - { - case 256: - drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); - break; - case 257: - drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); - break; - case 258: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); - break; - case 259: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); - break; - case 260: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); - break; - case 261: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); - break; - case 262: - drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); - break; - case 263: - drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); - break; - case 264: - drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); - break; - case 265: - drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); - break; - case 266: - drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); - break; - case 267: - drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); - break; - case 268: - drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); - break; - case 269: - drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); - break; - case 270: - drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); - break; - case 271: - drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); - break; - case 272: - drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); - break; - case 273: - drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); - break; - case 274: - drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); - break; - case 275: - drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); - break; - default: - drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); - } - if(itc) - { - itc--; - drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); - } - if(it) - { - it--; - //if(fbi_img) - //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); - drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); - } - - if(old_version) - { - clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); -#ifdef BETA - if(is_beta) - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); - } - else - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); - } -#else - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); -#endif - drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); - } - /*#ifdef MT - pthread_join(pth2,NULL); - #endif*/ - - if(hud_enable) - { - currentTime = SDL_GetTicks(); - if(currentTime-past>=16) - { - past = SDL_GetTicks(); - FPS++; - } - if(currentTime-pastFPS>=1000) - { -#ifdef BETA - sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#else - sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#endif - FPSB = FPS; - FPS = 0; - pastFPS = currentTime; - } - if(sdl_zoom_trig||zoom_en) - { - if(zoom_x Date: Mon, 16 Aug 2010 23:34:27 +0200 Subject: [PATCH 071/237] wwops --- powder.c | 10781 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 10781 insertions(+) create mode 100644 powder.c diff --git a/powder.c b/powder.c new file mode 100644 index 000000000..78e481bdf --- /dev/null +++ b/powder.c @@ -0,0 +1,10781 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * Copyright (c) 2010 Skresanov Savely + * Copyright (c) 2010 Bryan Hoyle + * Copyright (c) 2010 Nathan Cousins + * + * 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 02111-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif + + +#include "version.h" +#include "http.h" +#include "md5.h" +#include "update.h" +#include "hmap.h" + +#define SERVER "powdertoy.co.uk" + +#undef PLOSS + +#ifdef MENUV3 +#define MENUSIZE 40 +#else +#define MENUSIZE 20 +#endif +#define BARSIZE 14 +#define XRES 612 +#define YRES 384 +#define NPART XRES*YRES + +#define ZSIZE_D 16 +#define ZFACTOR_D 8 +unsigned char ZFACTOR = 256/ZSIZE_D; +unsigned char ZSIZE = ZSIZE_D; + +#define CELL 4 +#define ISTP (CELL/2) +#define CFDS (4.0f/CELL) + +typedef unsigned char uint8; + +#ifdef PIX16 +#define PIXELSIZE 2 +typedef unsigned short pixel; +#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) +#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) +#define PIXR(x) (((x)>>8)&0xF8) +#define PIXG(x) (((x)>>3)&0xFC) +#define PIXB(x) (((x)<<3)&0xF8) +#else +#define PIXELSIZE 4 +typedef unsigned int pixel; +#ifdef PIX32BGR +#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) +#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) +#define PIXR(x) ((x)&0xFF) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)>>16) +#else +#ifdef PIX32BGRA +#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) +#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) +#define PIXR(x) (((x)>>8)&0xFF) +#define PIXG(x) (((x)>>16)&0xFF) +#define PIXB(x) (((x)>>24)) +#else +#define PIXPACK(x) (x) +#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) +#define PIXR(x) ((x)>>16) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)&0xFF) +#endif +#endif +#endif + +char *it_msg = + "\brThe Powder Toy\n" + "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" + "\n" + "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" + "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" + "\bgPick your material from the menu using mouse left/right buttons.\n" + "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" + "Shift+drag will create straight lines of particles.\n" + "Ctrl+drag will result in filled rectangles.\n" + "Ctrl+Shift+click will flood-fill a closed area.\n" + "Ctrl+Z will act as Undo.\n" + "Middle click or Alt+Click to \"sample\" the particles.\n" + "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" + "Use 'S' to save parts of the window as 'stamps'.\n" + "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" + "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" + "Use the mouse scroll wheel to change the tool size for particles.\n" + "'Q' will quit the application.\n" + "The spacebar can be used to pause physics.\n" + "'P' will take a screenshot and save it into the current directory.\n" + "\n" + "\brhttp://powdertoy.co.uk/\n" + "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" + "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" + "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" + "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" + "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" + "\n" + "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" + "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" + ; + +typedef struct +{ + int start, inc; + pixel *vid; +} upstruc; + +#ifdef BETA +char *old_ver_msg_beta = "A new beta is available - click here!"; +#endif +char *old_ver_msg = "A new version is available - click here!"; +float mheat = 0.0f; + +int do_open = 0; +int sys_pause = 0; +int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. + +int amd = 0; + +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + +#define MAXSIGNS 16 + +struct sign +{ + int x,y,ju; + char text[256]; +} signs[MAXSIGNS]; + +/*********************************************************** + * AIR FLOW SIMULATOR * + ***********************************************************/ + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; + +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +unsigned cmode = 3; + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; +#define TSTEPP 0.3f +#define TSTEPV 0.4f +#define VADV 0.3f +#define VLOSS 0.999f +#define PLOSS 0.9999f +int numCores = 1; +float kernel[9]; +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} + +int core_count() +{ + int numCPU = 1; +#ifdef MT +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; +#else +#ifdef MACOSX + numCPU = 4; +#else + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); +#endif +#endif + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); +#endif + return numCPU; +} + +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} + +void *update_air_th(void *arg) +{ + update_air(); + return NULL; +} + +inline unsigned clamp_flt(float f, float min, float max) +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +inline float restrict_flt(float f, float min, float max) +{ + if(fmax) + return max; + return f; +} + +void draw_air(pixel *vid) +{ + int x, y, i, j; + pixel c; + + if(cmode == 2) + return; + + for(y=0; y 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } + else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; j=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + { + return 1; + } + + if((r&0xFF)==PT_VOID) + { + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL) + { + parts[i].type=PT_NONE; + if(!legacy_enable) + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } + return 0; + } + + if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide + { + return 1; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) + { + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) + { + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + { + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + + if(t==SPC_HEAT||t==SPC_COOL) + { + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) + { + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } + else + { + return -1; + } + } + if(t==SPC_AIR) + { + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) + { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } + else + i = p; + + if(t==PT_GLAS) + { + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + } + if(t!=PT_STKM) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + } + if(t==PT_ACID) + { + parts[i].life = 75; + } + //Testing + /*if(t==PT_WOOD){ + parts[i].life = 150; + }*/ + //End Testing + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NBLE) + parts[i].life = 0; + if(t==PT_NEUT) + { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) + { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f) + { + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } + else + { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //} + } + + if(t!=PT_STKM) + pmap[y][x] = t|(i<<8); + else + { + if(isplayer==0) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = PT_STKM; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 100; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + player[2] = PT_DUST; + player[3] = x-1; //Setting legs positions + player[4] = y+6; + player[5] = x-1; + player[6] = y+6; + + player[7] = x-3; + player[8] = y+12; + player[9] = x-3; + player[10] = y+12; + + player[11] = x+1; + player[12] = y+6; + player[13] = x+1; + player[14] = y+6; + + player[15] = x+3; + player[16] = y+12; + player[17] = x+3; + player[18] = y+12; + + isplayer = 1; + } + } + + return i; +} + +void delete_part(int x, int y) +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int sign(float i) //Signum function +{ + if (i<0) + return -1; + if (i>0) + return 1; + return 0; +} + +void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line +{ + int dx, dy, i, sx, sy, check, e, x, y; + + dx = abs(x1-x2); + dy = abs(y1-y2); + sx = sign(x2-x1); + sy = sign(y2-y1); + x = x1; + y = y1; + check = 0; + + if (dy>dx) + { + dx = dx+dy; + dy = dx-dy; + dx = dx-dy; + check = 1; + } + + e = (dy<<2)-dx; + for (i=0; i<=dx; i++) + { + vid[x+y*a] =PIXRGB(r, g, b); + if (e>=0) + { + if (check==1) + x = x+sx; + else + y = y+sy; + e = e-(dx<<2); + } + if (check==1) + y = y+sy; + else + x = x+sx; + e = e+(dy<<2); + } +} + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + 255*PIXR(t)) >> 8; + g = (a*g + 255*PIXG(t)) >> 8; + b = (a*b + 255*PIXB(t)) >> 8; + if(r>255) + r = 255; + if(g>255) + g = 255; + if(b>255) + b = 255; + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); + +int is_wire(int x, int y) +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} +int is_wire_off(int x, int y) +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) + { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) + { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y>8) < NPART && (pmr>>8) >= 0) + { + return parts[pmr>>8].type; + } + else + { + return PT_NONE; + } +} +int nearest_part(int ci, int t) +{ + int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); + int ndistance = 0; + int id = -1; + int i = 0; + int cx = (int)parts[ci].x; + int cy = (int)parts[ci].y; + for(i=0; i=XRES || y>=YRES || + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS||t==PT_NBLE) + { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) + { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) + { + if(pv[y/CELL][x/CELL]>1.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } + else + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + + if(ptypes[t].diffusion) + { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) + { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } + else + { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) + { + mv -= ISTP; + if(mv <= 0.0f) + { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) + { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_OILL; + if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) + t = parts[i].type = PT_GASS; + } + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + // t = parts[i].type = PT_BGLA; + if(t==PT_GLAS) + { + parts[i].pavg[0] = parts[i].pavg[1]; + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) + { + parts[i].type = PT_BGLA; + } + } + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) + { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) + { + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1) + { + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + + if(!legacy_enable) + { + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)) + { + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) + { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE||t==PT_PLSM) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) + { + if(t==PT_LAVA&&parts[i].ctype) + { + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) + { + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } + else + { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } + else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) + { + if(pstates[t].liquid==PT_LAVA) + { + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } + else if(t==PT_ICEI&&parts[i].ctype) + { + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else + { + t = parts[i].type = pstates[t].liquid; + } + } + else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) + { + t = parts[i].type = pstates[t].liquid; + } + else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) + { + if(t==PT_SLTW&&1>rand()%6) + { + t = parts[i].type = PT_SALT; + } + else + { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) + { + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA) + { + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_CSCN&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + if(t==PT_HSCN&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) + { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) + { + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } + else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) + { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)) + { + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } + else + { + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_ICEI || t==PT_SNOW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if(legacy_enable) + { + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } + } + } + else if(t==PT_HSCN||t==PT_CSCN) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) + { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) + { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } + else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%250)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_SLTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) + { + parts[r>>8].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_WTRV) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } + + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } + } + } + else if(t==PT_ACID) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID) + { + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) + { + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } + else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) + { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } + else if (parts[i].life==50) + { + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_NEUT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) + { + if(33>rand()%100) + { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } + else + { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + } + } + else if(t==PT_LCRY) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_LCRY) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_BTRY) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts_avg(i,r>>8) != PT_INSL) + { + if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + parts[r>>8].type = PT_SPRK; + } + } + } + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) + { + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + { + parts[r>>8].type = PT_FIRE; + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; + if(legacy_enable) + { + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) + { + if(t!=PT_LAVA || parts[i].life>0) + { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } + else + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) + { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) + { + kill_part(r>>8); + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE; + goto killed; + } + } + } + pavg = parts_avg(i, r>>8); + if(t==PT_SWCH&&pavg!= PT_INSL) + { + if(parts[r>>8].type == PT_SWCH) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + if(rt==PT_SWCH && t==PT_SPRK) + { + pavg = parts_avg(r>>8, i); + if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) + parts[r>>8].life = 10; + if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) + parts[r>>8].life = 9; + if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].ctype = PT_SWCH; + parts[r>>8].life = 4; + } + } + pavg = parts_avg(i, r>>8); + if(pavg != PT_INSL) + { + if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; + } + } + if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) + { + if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) + { + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { + parts[i].life = rand()%150+50; + parts[i].type = PT_PLSM; + parts[i].ctype = PT_NBLE; + parts[i].temp = 3500; + pv[y/CELL][x/CELL] += 1; + } + if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) + { + parts[i].type = PT_SWCH; + parts[i].life = 11; + } + } + } +killed: + if(parts[i].type == PT_NONE) + continue; + } + + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; + + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } + + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; + + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; + + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; + + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; + + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } + + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } + + } + } + + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } + + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } + + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); + + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 ) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + } + } + } + + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } + + } + + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; + + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; + + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; + + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; + + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; + + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } + + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } + + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } + + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } + + } + + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } + + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } + + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } + + if(t==PT_CLNE) + { + if(!parts[i].ctype) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx=XRES-CELL || + ny=YRES-CELL) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) + { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) + { + if(nx!=x && try_move(i, x, y, nx, y)) + { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x, ny)) + { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else + { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) + { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x-r, ny)) + { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y+r)) + { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y-r)) + { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) + { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) + { + kill_part(i); + continue; + } + else if(try_move(i, x, y, 2*x-nx, ny)) + { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } + else if(try_move(i, x, y, nx, 2*y-ny)) + { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } + else + { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + +justdraw: + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) + { + kill_part(i); + continue; + } + if(cmode!=CM_HEAT) + { + if(t==PT_STKM) //Just draw head here + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; + vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; + vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; + vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; + } + draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); + draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); + draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); + draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + + isplayer = 1; //It's a secret. Tssss... + } + + if(t==PT_ACID) + { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28)); + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); + } + } + + if(cmode==4) + { + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + } + else if(t==PT_OILL) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,64,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,64,16,40); + } + } + } + else if(t==PT_NEUT) + { + if(cmode == 3||cmode==4) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLUT) + { + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN) + { + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_SLTW) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,80,240,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,80,240,50); + } + } + } + else if(t==PT_PHOT) + { + if(cmode == 3||cmode==4) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_SWCH && parts[i].life == 10) + { + x = nx; + y = ny; + blendpixel(vid,x,y,17,217,24,255); + } + else if(t==PT_LNTG) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,128,160,223,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,128,160,223,50); + } + } + } + else if(t==PT_SMKE) + { + if(cmode == 3||cmode==4) + { + x = nx/CELL; + y = ny/CELL; + cg = 10; + cb = 10; + cr = 10; + cg += fire_g[y][x]; + if(cg > 50) cg = 50; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 50) cb = 50; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 50) cr = 50; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,100,100,100,30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,100,100,100,10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,100,100,100,20); + } + } + } + } + else if(t==PT_WATR) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + + } + else if(t==PT_DSTW) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + } + else if(t==PT_NITR) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,224,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,224,16,50); + } + } + + } + else if(t==PT_LRBD) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,170,170,170,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,170,170,170,50); + } + } + + } + + else if(t==PT_NBLE) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,235,73,23,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,235,73,23,20); + } + } + + } + else if(t==PT_GASS) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,224,255,32,255); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,224,255,32,20); + } + } + + } + else if(t==PT_WTRV) + { + if(cmode == 3||cmode==4) + { + x = nx/CELL; + y = ny/CELL; + cg = PIXG(ptypes[t].pcolors)/3; + cb = PIXB(ptypes[t].pcolors)/3; + cr = PIXR(ptypes[t].pcolors)/3; + cg += fire_g[y][x]; + if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); + } + } + } + } + else if(t==PT_THDR) + { + if(cmode == 3||cmode==4) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LCRY) + { + if(cmode == 3||cmode==4) + { + //cr = R/8; + //cg = G/8; + //cb = B/8; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); + //x = nx/CELL; + //y = ny/CELL; + //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } + else + { + cr = 0x50+(parts[i].life*10); + cg = 0x50+(parts[i].life*10); + cb = 0x50+(parts[i].life*10); + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLUT) { + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 5); + blendpixel(vid, nx-1, ny, cr, cg, cb, 5); + blendpixel(vid, nx, ny+1, cr, cg, cb, 5); + blendpixel(vid, nx, ny-1, cr, cg, cb, 5); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN) + { + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 5); + blendpixel(vid, nx-1, ny, cr, cg, cb, 5); + blendpixel(vid, nx, ny+1, cr, cg, cb, 5); + blendpixel(vid, nx, ny-1, cr, cg, cb, 5); + for(int tempx = 2; tempx < 10; tempx++) { + for(int tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_PLSM) + { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_FIRE && parts[i].life) + { + if(cmode == 3||cmode==4) + { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LAVA && parts[i].life) + { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4) + { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else if(t==PT_LAVA || t==PT_SPRK) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4) + { + if(t == PT_LAVA) + { + cr = 3; + cg = i%2; + cb = 0; + } + else + { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + } + else + { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + + if(t==PT_STKM) //Stick man should be visible in heat mode + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); + vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); + vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); + vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); + } + draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); + draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); + draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); + draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + } + else + { + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } + } + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) + { + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + + } + +} + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) +{ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +} + +void update_particles_i_th(void *arg) +{ + upstruc *newup = (upstruc*)arg; + update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); + return; +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + isplayer = 0; //Needed for player spawning + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + else + { + for(y=0; y>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + +#ifdef MT + if(numCores > 1) + { + InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); + for(pc = 0; pc=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} + +void update_particles_th(void *arg) +{ + update_particles((pixel*)arg); + return; +} + +/*********************************************************** + * SDL OUTPUT * + ***********************************************************/ + +int sdl_scale = 1; +SDL_Surface *sdl_scrn; +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +#include "icon.h" +void sdl_seticon(void) +{ +#ifdef WIN32 + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else +#ifdef MACOSX + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#endif +#endif +} + +void sdl_open(void) +{ + if(SDL_Init(SDL_INIT_VIDEO)<0) + { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); +#ifdef PIX16 + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); +#else + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); +#endif + if(!sdl_scrn) + { + fprintf(stderr, "Creating window: %s\n", SDL_GetError()); + exit(1); + } + SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); + sdl_seticon(); + SDL_EnableUNICODE(1); + //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +} + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + int i,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + } + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) +{ + if(sdl_scale == 2) + sdl_blit_2(x, y, w, h, src, pitch); + else + sdl_blit_1(x, y, w, h, src, pitch); +} + +int frame_idx=0; +void dump_frame(pixel *src, int w, int h, int pitch) +{ + char frame_name[32]; + int j,i; + unsigned char c[3]; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"wb"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0; j=0 && x=0 && yPT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } + else + d = c; + + if(size < XRES*YRES) + { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0; y+scl<=YRES; y+=scl) + { + sx = 0; + for(x=0; x+scl<=XRES; x+=scl) + { + a = 0; + r = g = b = 0; + for(j=0; j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) + { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +static char *mystrdup(char *s) +{ + char *x; + if(s) + { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +void *build_save(int *size, int x0, int y0, int w, int h) +{ + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; + int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); + int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + // save the required air state + for(y=by0; y255) i=255; + d[p++] = i; + } + for(y=by0; y255) i=255; + d[p++] = i; + } + + // save the particle map + for(i=0; i=x0 && x=y0 && y255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } + } + for(j=0; j255) tttemp=255; + d[p++] = tttemp; + } + } + for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + + i = (p*101+99)/100 + 612; + c = malloc(i); + c[0] = 0x66; + c[1] = 0x75; + c[2] = 0x43; + c[3] = legacy_enable; + c[4] = SAVE_VERSION; + c[5] = CELL; + c[6] = bw; + c[7] = bh; + c[8] = p; + c[9] = p >> 8; + c[10] = p >> 16; + c[11] = p >> 24; + + i -= 12; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) + { + free(d); + free(c); + return NULL; + } + free(d); + + *size = i+12; + return c; +} + +int parse_save(void *save, int size, int replace, int x0, int y0) +{ + unsigned char *d,*c=save; + int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; + int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; + int fp[NPART], nf=0; + + if(size<16) + return 1; + if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) + return 1; + if(c[4]>SAVE_VERSION) + return 2; + ver = c[4]; + + if(ver<34) + { + legacy_enable = 1; + } + else + { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } + + bw = c[6]; + bh = c[7]; + if(bx0+bw > XRES/CELL) + bx0 = XRES/CELL - bw; + if(by0+bh > YRES/CELL) + by0 = YRES/CELL - bh; + if(bx0 < 0) + bx0 = 0; + if(by0 < 0) + by0 = 0; + + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) + return 3; + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + return 1; + size = i; + + if(size < bw*bh) + return 1; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + if(replace) + { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); + } + + // make a catalog of free parts + memset(pmap, 0, sizeof(pmap)); + for(i=0; i= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } + for(y=by0; y= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + + // load the particle map + i = 0; + pty = p; + for(y=y0; y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j && !(isplayer == 1 && j==PT_STKM)) + { + if(pmap[y][x]) + { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } + else if(i < nf) + { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } + else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + + // load particle properties + for(j=0; j= size) + goto corrupt; + if(i < NPART) + { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + if(parts[i].type == PT_STKM) + { + player[2] = PT_DUST; + + player[3] = parts[i].x-1; //Setting legs positions + player[4] = parts[i].y+6; + player[5] = parts[i].x-1; + player[6] = parts[i].y+6; + + player[7] = parts[i].x-3; + player[8] = parts[i].y+12; + player[9] = parts[i].x-3; + player[10] = parts[i].y+12; + + player[11] = parts[i].x+1; + player[12] = parts[i].y+6; + player[13] = parts[i].x+1; + player[14] = parts[i].y+6; + + player[15] = parts[i].x+3; + player[16] = parts[i].y+12; + player[17] = parts[i].x+3; + player[18] = parts[i].y+12; + + } + } + else + p += 2; + } + } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } + } + for(j=0; j=34&&legacy_beta==0) + { + if(p >= size) + { + goto corrupt; + } + if(i <= NPART) + { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } + else + { + p++; + } + } + else + { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } + } + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) + { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + + if(p >= size) + goto version1; + j = d[p++]; + for(i=0; i size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) + { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0; y= size) + goto corrupt; + j=d[p++]; + if(j0) + { + if(j==PT_STKM) //Stickman should be drawed another way + { + //Stickman drawing + for(k=-2; k<=1; k++) + { + fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); + fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); + fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); + fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); + } + draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); + draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); + draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); + draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); + } + else + fb[y*w+x] = ptypes[j].pcolors; + } + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +/* NO, I DON'T THINK SO + #include "fbi.h" + + pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) + { + unsigned char *tmp; + pixel *res; + int i; + + tmp = malloc(width*height*3); + if(!tmp) + return NULL; + res = malloc(width*height*PIXELSIZE); + if(!res) { + free(tmp); + return NULL; + } + + i = width*height*3; + if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { + free(res); + free(tmp); + return NULL; + } + + for(i=0; i1) + { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } + *qw = w; + *qh = h; + return q; +} + +#define GRID_X 5 +#define GRID_Y 4 +#define GRID_P 3 +#define GRID_S 6 +#define GRID_Z 3 + +void stamp_gen_thumb(int i) +{ + char fn[64]; + void *data; + int size, factor_x, factor_y; + pixel *tmp; + + if(stamps[i].thumb) + { + free(stamps[i].thumb); + stamps[i].thumb = NULL; + } + + sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); + data = file_load(fn, &size); + + if(data) + { + stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); + if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) + { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } + } + + free(data); +} + +int clipboard_ready = 0; +void *clipboard_data = 0; +int clipboard_length = 0; + +void stamp_save(int x, int y, int w, int h) +{ + FILE *f; + int n; + char fn[64], sn[16]; + void *s=build_save(&n, x, y, w, h); + +#ifdef WIN32 + _mkdir("stamps"); +#else + mkdir("stamps", 0755); +#endif + + stamp_gen_name(sn); + sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); + + f = fopen(fn, "wb"); + if(!f) + return; + fwrite(s, n, 1, f); + fclose(f); + + free(s); + + if(stamps[STAMP_MAX-1].thumb) + free(stamps[STAMP_MAX-1].thumb); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); + memset(stamps, 0, sizeof(struct stamp_info)); + if(stamp_count0) + { + memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); + memcpy(stamps, &tmp, sizeof(struct stamp_info)); + + stamp_update(); + } + + return data; +} + +void stamp_init(void) +{ + int i; + FILE *f; + + memset(stamps, 0, sizeof(stamps)); + + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); + if(!f) + return; + for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +{ + int i, j, w, bn = 0, ba = 0; + char *rp = font_data + font_ptrs[c]; + w = *(rp++); + for(j=0; j>= 2; + bn -= 2; + } + return x + w; +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +{ + int sx = x; + for(; *s; s++) + { + if(*s == '\n') + { + x = sx; + y += FONT_H+2; + } + else if(*s == '\b') + { + switch(s[1]) + { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } + else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + return x; +} + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +{ + int i; + for(i=0; i<=w; i++) + { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); + } + for(i=1; i=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + if(*s) + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); + return x; +} + +int textnwidth(char *s, int n) +{ + int x = 0; + for(; *s; s++) + { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} +int textwidthx(char *s, int w) +{ + int x=0,n=0,cw; + for(; *s; s++) + { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; + } + return n; +} + +/*********************************************************** + * MAIN PROGRAM * + ***********************************************************/ + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) +{ + int x, y, i, j, c; + int bo = b; + if(iswall==1) + { + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) + { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) + { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } +} + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) +{ + int i, j, c; + if(b>=121) + { + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; +} + +void draw_menu(pixel *vid_buf, int i, int hover) +{ + + //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); +#ifdef MENUV3 + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i) + { + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } +#else + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); +#endif +} + +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr) +{ + int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + rows = ceil((float)msections[i].itemcount/16.0f); + height = (ceil((float)msections[i].itemcount/16.0f)*18); + width = restrict_flt(msections[i].itemcount*31, 0, 16*31); + //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); + h = -1; + x = XRES-BARSIZE-26; + y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; + sy = y; + //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); + fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); + fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); + drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); + if(i==SC_WALL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=20) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1) + { + *sl = h; + } + if(b==4&&h!=-1) + { + *sr = h; + } +} + +int create_parts(int x, int y, int r, int c) +{ + int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; + + if(c == 125) + { + i = x / CELL; + j = y / CELL; + for(v=-1; v<2; v++) + for(u=-1; u<2; u++) + if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) + { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } +} + +void create_box(int x1, int y1, int x2, int y2, int c) +{ + int i, j; + if(x1>x2) + { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) + { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) + { + c = c-100; + } + if(cm==-1) + { + if(c==0) + { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } + else + cm = 0; + } + if(bm==-1) + { + if(c==30) + { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } + else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) + { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(y=XRES || y>=YRES) + return; + c = vid[y*(XRES+BARSIZE)+x]; + c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); + if(c<512) + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + else + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); +} + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + e -= 1.0f; + } + } +} + +void draw_svf_ui(pixel *vid_buf) +{ + int c; + + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); + drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + c = svf_open ? 255 : 128; + drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); + drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); + + c = svf_login ? 255 : 128; + drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); + if(svf_open) + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + else + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); + if(svf_open && svf_own) + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } + else if(svf_myvote==-1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); + if(svf_tags[0]) + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + else + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); + + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); + drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); + if(svf_login) + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + else + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); + + if(sys_pause) + { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + if(!legacy_enable) + { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + switch(cmode) + { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; + } + drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(svf_admin) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } + else if(svf_mod) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? +} + +typedef struct ui_edit +{ + int x, y, w, nx; + char str[256],*def; + int focus, cursor, hide; +} ui_edit; +void ui_edit_draw(pixel *vid_buf, ui_edit *ed) +{ + int cx, i; + char echo[256], *str; + + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(ed->str[0]) + { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } + else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) + { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; + } + if(ed->focus && sdl_key) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) + { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } + else if(ed->cursor > 0) + { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) + { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) + { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) + { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} +typedef struct ui_checkbox +{ + int x, y; + int focus, checked; +} ui_checkbox; +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) +{ + int w = 12; + if(ed->checked) + { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus) + { + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } + else + { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } +} +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) +{ + int w = 12; + + if(mb && !mbq) + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->checked = (ed->checked)?0:1; + } + } + else + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->focus = 1; + } + else + { + ed->focus = 0; + } + } +} + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) + { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) + { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +struct strlist +{ + char *str; + struct strlist *next; +}; +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list; item; item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) + { + item = *list; + *list = (*list)->next; + free(item); + } +} + +void tag_list_ui(pixel *vid_buf) +{ + int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; + char *p,*q,s; + char *tag=NULL, *op=NULL; + ui_edit ed; + struct strlist *vote=NULL,*down=NULL; + + ed.x = x0+25; + ed.y = y0+221; + ed.w = 158; + ed.nx = 1; + ed.def = "[new tag]"; + ed.focus = 0; + ed.hide = 0; + ed.cursor = 0; + strcpy(ed.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + op = tag = NULL; + + drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 256); + drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); + p = svf_tags; + s = svf_tags[0] ? ' ' : 0; + y = 36 + y0; + while(s) + { + q = strchr(p, ' '); + if(!q) + q = p+strlen(p); + s = *q; + *q = 0; + if(svf_own || svf_admin || svf_mod) + { + drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); + d = 14; + if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) + { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) + { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) + { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) + { + if(!strcmp(res, "OK ADMIN")) + { + svf_admin = 1; + svf_mod = 0; + } + else if(!strcmp(res, "OK MOD")) + { + svf_admin = 0; + svf_mod = 1; + } + else + { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} + +static char hex[] = "0123456789ABCDEF"; +void strcaturl(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) + { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else + { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +#define THUMB_CACHE_SIZE 256 + +char *thumb_cache_id[THUMB_CACHE_SIZE]; +void *thumb_cache_data[THUMB_CACHE_SIZE]; +int thumb_cache_size[THUMB_CACHE_SIZE]; +int thumb_cache_lru[THUMB_CACHE_SIZE]; + +void thumb_cache_inval(char *id) +{ + int i,j; + for(i=0; i= THUMB_CACHE_SIZE) + return; + free(thumb_cache_id[i]); + free(thumb_cache_data[i]); + thumb_cache_id[i] = NULL; + for(j=0; j thumb_cache_lru[i]) + thumb_cache_lru[j]--; +} +void thumb_cache_add(char *id, void *thumb, int size) +{ + int i,m=-1,j=-1; + thumb_cache_inval(id); + for(i=0; i m) + { + m = thumb_cache_lru[i]; + j = i; + } + } + if(i >= THUMB_CACHE_SIZE) + { + thumb_cache_inval(thumb_cache_id[j]); + i = j; + } + for(j=0; j= THUMB_CACHE_SIZE) + return 0; + for(j=0; j=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + else if(!strncmp(str, "TAG ", 4)) + { + if(j >= TAG_MAX) + { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) + { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } + else + { + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + int thumb_drawn[GRID_X*GRID_Y]; + pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + + do_open = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) + { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) + { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) + { + if(search_page) + { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) + { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) + { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) + for(gi=0; giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) + { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) + { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]&&thumb_drawn[pos]==0) + { + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); + thumb_drawn[pos] = 1; + } + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) + { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) + { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) + { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]) + { + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) + { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0) + { + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv) + { + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8) + { + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } + else + { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) + { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) + { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) + { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) + { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) + { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) + { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) + { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1) + { + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) + { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) + { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) + { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) + { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) + { + if(data) + { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } + else + svf_tags[0] = 0; + } + else + { + svf_tags[0] = 0; + } + + if(svf_login) + { + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200) + { + if(data) + { + if(!strcmp(data, "Up")) + { + svf_myvote = 1; + } + else if(!strcmp(data, "Down")) + { + svf_myvote = -1; + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + } + else + { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } + else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + { + search = 1; + } + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } + else + search = 0; + + if(search && lasttime>=TIMEOUT) + { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) + { + if(search_page) + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } + else + { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } + else + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) + { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login) + { + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) + { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + { + page_count = search_results(results, last_own||svf_admin||svf_mod); + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + } + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) + { + http_async_req_close(http); + http = NULL; + } + + for(i=0; i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) + { + if(stamp_page) + { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; +} + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) +{ + char t[2]; + t[0] = ch; + t[1] = 0; + if(flag) + { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } + else + { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + } +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + char buff[30]; //Buffer + for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature + else + sprintf(buff, "Temp: 0.00"); //...tempirature + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + //Usual text + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); + x = signs[i].x; + y = signs[i].y; + dx = 1 - signs[i].ju; + dy = (signs[i].y > 18) ? -1 : 1; + for(j=0; j<4; j++) + { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) + { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) + { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) + { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) + { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +/*********************************************************** + * CONFIG FILE * + ***********************************************************/ + +char http_proxy[256] = ""; + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) + { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; +} + +unsigned char last_major=0, last_minor=0, update_flag=0; + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) + { + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) + { + if(fseek(f, -3, SEEK_END)) + { + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3) + { + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + cmode = tmp%6; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void dim_copy(pixel *dst, pixel *src) +{ + int i,r,g,b; + for(i=0; i0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +unsigned int fire_alpha[CELL*3][CELL*3]; +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) + { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } + else + { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i2) + { + pthread_t pth; + pthread_create(&pth,NULL,update_air_th,""); + } + else + { + update_air(); + } +#else + update_air(); +#endif + } + if(cmode==0 || cmode==1) + { + draw_air(vid_buf); + } + else if(cmode==2) + { + memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); + memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); + } + else + { + memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); + } + update_particles(vid_buf); + + if(cmode==2) + { + if(!fire_fc) + { + dim_copy(fire_bg, vid_buf); + } + else + { + memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); + } + fire_fc = (fire_fc+1) % 3; + } + if(cmode==3||cmode==4) + render_fire(vid_buf); + + render_signs(vid_buf); + + memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); + clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); + + draw_svf_ui(vid_buf); + + if(http_ver_check) + { + if(!do_check && http_async_req_status(http_ver_check)) + { + ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); + if(http_ret==200 && ver_data) + { +#ifdef BETA + if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; +#else + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; +#endif + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + { + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) + { + break; + } + } + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) + { + if(load_mode) + { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) + { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } + else + load_data = stamp_load(0, &load_size); + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') + { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1') + { + set_cmode(0); + } + if(sdl_key=='2') + { + set_cmode(1); + } + if(sdl_key=='3') + { + set_cmode(2); + } + if(sdl_key=='4') + { + set_cmode(3); + } + if(sdl_key=='5') + { + set_cmode(4); + } + if(sdl_key=='6') + { + set_cmode(5); + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='h') + hud_enable = !hud_enable; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + if(clipboard_ready==1) + { + load_data = malloc(clipboard_length); + memcpy(load_data, clipboard_data, clipboard_length); + load_size = clipboard_length; + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + } + if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 2; + } + if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 1; + } + else if(sdl_key=='c') + { + set_cmode((cmode+1) % 6); + if(it > 50) + it = 50; + } + if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo + { + int cbx, cby, cbi; + + for(cbi=0; cbi32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } + else + { + bs += sdl_wheel; + if(bs>16) + bs = 16; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)) + { +#ifdef BETA + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); +#else + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); +#endif + } + else + { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } + mx = x; + my = y; + if(update_flag) + { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) + { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } + + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) + { + tmp = malloc(64); +#ifdef BETA + if(is_beta) + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } + else + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } +#else + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); +#endif + if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) + { + free(tmp); + tmp = download_ui(vid_buf, my_uri, &i); + if(tmp) + { + save_presets(1); + if(update_start(tmp, i)) + { + update_cleanup(); + save_presets(0); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + return 0; + } + } + else + free(tmp); + } + if(y>=sdl_scale*(YRES+(MENUSIZE-20))) + { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) + { + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) + { + db = svf_own ? 257 : 256; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) + { + db = 270; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) + { + db = 266; + if(da < 51) + da ++; + } + else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) + { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) + { + db = svf_login ? 261 : 260; + if(svf_admin) + { + db = 268; + } + else if(svf_mod) + { + db = 271; + } + if(da < 51) + da ++; + } + else if(x>=sdl_scale && x<=17*sdl_scale) + { + db = 262; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) + { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) + { + db = 267; + if(da < 51) + da ++; + } + else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) + { + db = 265; + if(da < 51) + da ++; + } + else if(da > 0) + da --; + } + else if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) + { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) + { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } + else if(bq==4 && !b) + { + free(load_data); + free(load_img); + load_mode = 0; + } + } + else if(save_mode==1) + { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1) + { + save_mode = 2; + } + else if(b==4) + { + save_mode = 0; + copy_mode = 0; + } + } + else if(save_mode==2) + { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) + { + if(copy_mode==1) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + } + else if(copy_mode==2) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + } + else + { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } + } + else if(sdl_zoom_trig && zoom_en<2) + { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) + { + if(!lb) + { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Up")) + { + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Down")) + { + svf_myvote = -1; + } + } + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) + tag_list_ui(vid_buf); + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) + { + legacy_enable = !legacy_enable; + } + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) + { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) + { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) + { + if(!svf_open || !svf_own || x>51) + { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } + else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) + { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) + { + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 6); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+5) % 6); + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } + else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) + { + c = sl = cr&0xFF; + } + else + { + //Something + } + } + //create_parts(x, y, bs, SPC_AIR); + lx = x; + ly = y; + lb = 0; + lm = 0; + } + else + { + //Copy state before drawing any particles (for undo) + int cbx, cby, cbi; + + for(cbi=0; cbi=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } + else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) + { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) + { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + { + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + mousex = mx/sdl_scale; + mousey = my/sdl_scale; + } + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) + { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) + { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) + { + it--; + //if(fbi_img) + //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) + { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta) + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } + else + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + /*#ifdef MT + pthread_join(pth2,NULL); + #endif*/ + + if(hud_enable) + { + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) + { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) + { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } + if(sdl_zoom_trig||zoom_en) + { + if(zoom_x Date: Mon, 16 Aug 2010 23:49:32 +0200 Subject: [PATCH 072/237] added roadmap, feel free to change --- roadmap | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 roadmap diff --git a/roadmap b/roadmap new file mode 100644 index 000000000..2ac0eddfa --- /dev/null +++ b/roadmap @@ -0,0 +1,7 @@ +Next two releases: +use bitmasks where possible, add these to init list for part_types +splitting of powder.c +feature freeze +Focus on scalability +stability, possibly not use -O3 on linux, inlines where possible. +performance. From d430a352a1395e7a69e12ff79092c19de4d3657f Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Mon, 16 Aug 2010 15:35:50 -0700 Subject: [PATCH 073/237] --- roadmap | 1 + 1 file changed, 1 insertion(+) diff --git a/roadmap b/roadmap index 2ac0eddfa..98dbd4358 100644 --- a/roadmap +++ b/roadmap @@ -5,3 +5,4 @@ feature freeze Focus on scalability stability, possibly not use -O3 on linux, inlines where possible. performance. +Multithreading? \ No newline at end of file From 887895624c0b8920a377230acc0dd5ecd58ebaea Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 17 Aug 2010 10:23:01 +0200 Subject: [PATCH 074/237] now weak diffusion for molten wax. --- .powder.c.swo | Bin 0 -> 446464 bytes powder.c | 27 ++++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 .powder.c.swo diff --git a/.powder.c.swo b/.powder.c.swo new file mode 100644 index 0000000000000000000000000000000000000000..79cdebe7fbc5a1026b0b68008b0dbb0219b3a4d4 GIT binary patch literal 446464 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

D&-|DEf%Kspn4!Eqr2|wAK#bgT>Q}+9GkSSU( z5T$Wt?@AJBGQ~@P^C80{8`%HN6uea4-4vK!q#2_X4H40s)-PMd>3TtViS1ePW`VZR z53B;qG@=RBalN+l#$BBfYIaOW_R7p2Gd$D8g0}9cZp9FlWmZVPc3%uOYPb2ti>V{l za*!{<&@)J@wZ%y1l{eHgm})4(N%-tA)v*Xo^)vbe}c%s!K zQI5#m)_i^T&8s(?+eHe2o|@|)EFrLrFAJqTb;nkpqydXmF*cXn@Ftn@ulCaf9lFe` z_}`57#n>^|C^EdZ->mS`TxaE{(m|0{}!M%{o2ES1^7>N0at(rgMUFM zFaz!dw4Pq;=Wh$%fPUa%KGuKeLvL^ZoB>{k{y^vI zNq=w^=mTFzKk!7LeeOSve&CVdUf^12m0f{oULd;X<#O5tv+S{y=TYKX%x0IY!aNlLo3)&$B4D#3v@x5F76CH_+rKr*X0x=k*|3)} z-dCsBWY}hnYO`U_k#4it^%R9|R?RjW_8fU)mfyOt1NDcjM>xdX&JotqcOZ)3`FMr5`+7DZMZxLFhI0-x6!X;v1Wihwttw=Svb^Q#Xs%bfF!Mz&B( z*GQAs-nFWCsrJ=~DpHz_M!d|2p3%};wPDvB3!u?4oT9MJ8g3VMP`H`cMy2bFE21P9 z>&c4sv}QGUL&8M@ky!(wn7`S`Qhu9NiCqZFa|K7;@^fd48DPD;kD; zVr?q5E}5_^Z?8{;A1v=`BIFa{2Mey|A>`t*0tGnoiQcqX#{ZNcM_`)@?%KMH<~ynhM!CbIq`!1c)ayTGTA?>B?@ zL({b)EOR-jJ!wlimvotbolDZEE}s3r^jS|9^5MT*f9c=&DRh;5Nh?~??)bQExHf!C zSNbOXou?wDCw_v35Q=wr@#EWM5IX}D#N~hUz>1OAJ+2rYFr-Ej@KgyB$;dWD@ zq@^>lpK8iq)KZ?bkCckU*2;z%m(BQB7;E{L&{c!ylnQOxmE=g+FDRbkxcnE}p66pK z_7%G`Zc-{VU~*KXy@c&kVk*+G=ZlJq^O(<@7t$4^zYx@0=h+W<5S@OH4;&0Vh9!lb&vP%uciqDH>9@pr0vE?>?qph9sBm>6`n z%MqT$ldIKz){_WuVIs7|N-Ni4tnXYcZ zg?KhvUC-YQ)!n$=UO>f;>PEhtSKSP^w&80BZnso-@^-5W{Q}uF7A`Oxf+;EU7x~^pr9)=v86ed%yWlbrSCMut}uNz z9bKktwP~k2{$}MxGIQ^F z;Y*nAX*mm@{TE+`v-F3)vfun~6GoaN$qc{$eiPnPDiTwGn=p1?R#PexyMddPip0p^ zW~CxANU&6-qC`Vtx5Qz{Z;2-_m~ z9I^M1!|8LFBk9|@ry|G^%pn$N5H$BdPTEJxip0J`tOywqCRp*MiS}Po_nsc>CU)t+ z#dqT-r6RG!h+W+zzfvj^vklJ+o6=^A#mVv_C>Du<$4!#@u!1ZJG)0Li$W2d0z>CCe zL{x-4wmFm17MHo~SL@EYNnNJCvroo4Vv1tj*-~jK%KG%b zO*-NncE4==%}`-tNO_SMt=O1jD#Gy6XFXYX*XcJKil?{yZv3ZIB=#-dM;xMmdrIyp z6^SX#DT${r-;$V8DiX69|1IQ2`0T&id-<2xUENaDQ-5p#27PF5aiWC&0(S`@nm_%fJ)B72sjuJa9Hx3;MvF!T+F- zxB+|tTnkYHN@4yqmW56)j4;}&@1nvvoj9%l_;7af; z@Jz53Yye%L4J-yfMECI>@I~-hFb)oZ^TAH=C3GU62Oj|M2JZsXU;z9GJ;{H9r-B+d z2KImrU_JOPdG{TlJp8uuvEY(YM3*~cGCe}lozbO@<)-(J?pvyZyY?;h#{e(v>#8nV zR6THbU~=#HY==&L-M4qVW*_?c*!9(FJPU&^^R=p;rzyqPGPQQ?%GNbIbjp@~J0hnR zb=Ed-4yo%-sPn`nwDsgp`Aiet5+%2?kL~JnuA)!t%OM8K{ZElK8vqfvO2pO5+a_m*q+czq3I{RGWg;j~2U?Ie`wd znw$-B#~(bcNde|k4ow^x8`8pZ7RRwM|8PkhuH44?tzR}W)fMV3JC||ladb{?_Iq1O z9j-gNmsI^(bv(KA=~`EJbo5{{YgwjPEZg)%d0IF&d~jfJcK`6W_GC(ncN#M7hpA7@ z&t=%&V(V|KVT%+UCD|3Ech13TXi-)-8t0Yj`l3ZG5uwsrUUpgZO3pH`WJJNM$eE@Y z7A*=hVQh3{n1h&mTd64(aa7k7*@nMIt8Hs#J}C5{*4T0p-cPCEhfSm9pZrhS)<y}0qf;dpHgvsaf@$7kKWwzls=j+V0T*7jY*GfAk3 z{$w_aBjR;xGSit;vt~w0M;}*5wVroIhdJvuYj5N3r--N|0Sq44ZxW)=_w7}DBqsTq z|70SY)IM0Nb?CC8CT)Du)0tdTOYf%Ro7|yI`fynOBjYn|eX)zM+yQmy3d_Mom2y!~~&qC1CTY6C5{ zYDmsi+q`Yv7LJx%w`Iq=9XfcgXsR_G(Kjya5{cQ5(>GABE}o%#P)f>(fj-~ymC0nP?% z!QH_vzztd#06q(@0nZ1|1Ol>1fB(+ z0iF&n0vCX7;9PJfxD&V|_yP6^H-J}xtHHy;4)7K95VBKvHh4U^3pfM(7dnUQ!6$)q z6R!g=0Xo<4$>4F|;b0@UH@F4()dKVm;7#B$;0Ta@;^AO3cnG*JxFxtAUBmmq+rZPn z1dtv=XC*EK_XYO>w*j{R*Q0-U9k>ka09Ei)^a>va&jW|RS>X2IE9ep40<_oSIM@RI z0(=Gi!TZ6xz&pX~!7G8zVmt=+gL6PHxCgj1xDEI~NN`ml^!_Raf-dp7*$M#||gMk}GD6 zP#~3DRwzjPI|;`P)n@iB)keoQEXA0(Gab1Z*_arjZ;pl{34?>{G#bkLIa(|EprHYu zifB++EoKbT>INDS84A&Tt`%~_NVGwZ?+u~o!BIDT(zkPVRJ87cb$sKw{^k$r1?dz+yccp?y z9p{p0X7}x_?X#|rS9~~qeG0++OeuA78X3X(LMToNO<#-g>917iVr;Kva)B3<) zMJ~dtIAqgpHtpJ2m^AI$Sb{X|+D!O0?b=Lu$m1_YJ<4sCxN9@?JJs|Sq++v-wnYZSIq%eGg|9z%uN){2i=_cRgu1wW~fDp5LB-fI#IB3SFy zxN*5ZC246p*|g|j`8sJ?lPIDq;(@M|D{!Q^HIq#%qvIsDr|@;{=pxqgal|7Gw&@GkHga3vTAd%-fW5d6mZ zy_Wl{!ArqWuo?V6@OxzRFM}_F4}tfBtH3OHI5->hf_s3U5V_78_$>Gkcqfod{}^xt z901y1pbG8=?g;Jxev4fHAK*IhDR2#V9e6Sr0%wCW!L5Mo60~mN`QR9M2zVg4HTdoV z=F!0?!5hG{!6U&W*aen>dw^dfxBm)!3A_tj4K4?lfdk+|unWi*VFOqP9s(r)KLFeb z+!1^WSzq=D9{{pPxDxy=cnsJJE&>;VKL-oIjpzVA4?YC00dE94dqFk{z2MKmt-$r@ z1ilEq0Nw=N2wn1be|Ya4uK_mV-0F z9l>wW4cq{Sh4 ziP@p*=$gKvS}-N0B()69Dnadh$Tp{jBRB~}^C8hbRBIm!m^Y-PXWvvBZr>wIL)IWiv5t6#GTR5)WEU*>ZMyIM{C1l)x~h% zbq07f1;Tpc+w&Sv6F@wtJ73e)W37WMmW>(}k--+J+; z);80dB}MDt5?`>=nsIeeYK zxLVt1jH7JojUF!1mst)J_-}Fun@qTmCd0NNww(`0u+%G49jNrS+_(aZkBTBr3sd@} z_oL~&vmff|wJtZatZ8F4>lem zXgTHI`|Yml*XU_$ZDna@8of@MnJ?Gqwm8Z4*=4yUuN9xzfN009;`CZx`4-6gcFC>F zDa$B)8l$J-8FS=rYz9z7jo~1pS8Xql$pNo@ZZHF2lIGodRjuoYk_7ngPASW#eI=1) z=L4e9vvUH`$5axM2EQbDb%6O9f+!sIhVd+cJ|C~>uPz!nU!nT^Ai{o)#wbx6G;^7i zWGq#LFcVBQR1|7jV>>#+=LL}z0cnw>C!ZZ1shj*n3!#~@Q;>i(czI94H=K83m_F!A zKZ+{@DN|E+M2U`r&h)1?$RN-($5Pof=O~|~G;SCw`kFneMmc|gmxFg@|8iE zv;FvhvYG=8hFV%5)Wh_~;-I!$7uHHF@50icj5HFXu~w~!_LKuj{Fbqcr#WAtWq^)G z&UB>?#N4UHgA>yw4qOTxrOQ@!wt+ODg2Zsv!s4E#?C9IOYNVrUrC5}8A11ANN32Gg-PAzu5!wOUqU zA?8An{QqiX=oQG{;rjpYBHMohd>woZTn%0To&koyZqNh%0{jR$|I$e}_!;s16nqYR20Q{t51{z(4z7Wgw}3Z;E5YA@E5PHyL2v=k9t6w41HoN^ zbO7H+w!a>H0(=-q{(l9~-2Vg^0DHm3KMU0AHg8FC%6$g{p;XE;KkrMU>H0QdA!#L*(tZfop)~?^l2-(3y-XWwusNYGiIt%CJStzCL^uam$Nb8W$pO zjd362jx;qn>54OQ5)#=ZRs`epmL*l$fR5veAvA~83{EW>Jh)^KSqdY;DL%_4Z=Czs zBr%K+4@{vp)ueYaC_OScSao!Ku+>^pI(4iO{Pd;PoUk`Y zgK67TKiD0zNlP2r^hs=sf9VZooPA!ctKa_OfYh0R@j=P%)pvFCz%(bER1X|s3n87;GBC)=I8mhBwuK4?62;wEwoaq=m+nvS^fLd65isa*l1{ zCl9+N0dRM9z(Y8XqS-91sjjIei))g1Xpfx^LW#yD2{VI7&04hL*NmMFYmwvauW>QD zwWGTgwQ|-KYWcub&A18#Z4-%t+)u4G6C<7*<79oBHWh;Sm)_`_9-i5+bvG@vB#4Yb zakJmkzoXOpkBv?Zx76CH?6VB8jDkFQo4!k4wK<1zwMs*jFdK$R^a?Y1Y5d!lmC%=- z$p|d*Yi#~>Syd0+dayG~k=wM=IA1RG{SzaEVAGt^rz%n-)YaA68p7n()@Hw|z$j8X z^JAvvLnEA&jY@NySFtHhT?>;mbs6sAK(h|%TkA>h0;e|pv;h?pi2IXzvO&SLTu|9} z2`8PkLM9>I3Zd3z*occLx+aPZjIebiB-1}9XVp>!OId ze0I}Tp@Zty9~(AFJvhNIVT5xMr>i3a?Ad3Qc}$O@I!zg9J2C4emq4lykycF6ro+)V zjAjc>tWm)xrAz$;jh${Yj z2IF#HqUJ`gXtSe4V^4W0m})R(l22&wlag^@ZKTWB%tHA2VEkDllkoFY`Z<`rz(vu_ zMKEjOTx4e~j6%ZBRyY^gnTm$96iQ>J@HbY!%Tq8RVXDEv(0t58q|Jkw^K5fdgsaW` z|58NY_i5cY^Z)y}>AC^A{yOkh@Ki7fM!+yQ2eg6PgFgp9L9V|Jd=4B2`+?^Ee}g=K z2KXuRx#sjG*S`cD275sd_!zSH^TFldLeK?n2fl^e{Z63$0uF)m!8u?HxGRucegks& zr@^)0ec*Xu92^E?K>G*W7W^A>`K!P*(Efz~jx7EZ&<-8|ZUJsU2LBSc9=sfkgLd%W z$k-nNZwF5Uy+CIaO3r>X7z1|!KSYjxI(QTq1AD=CaCh(v_CEYH z(0PX9|9in4FO?X7rFmTb#(ycdGYrh@Cs;n1QNw!w8iSSDZhALK9NuoySu!?`;dsS| z;qSy(YToJHB=M!Tlg4tgaeR$ZlZ5P3(nPp%8WNGs6MJehYjH~trd#a^y(uSnDjDZC zO1vme0`v?h$;xc}f%AgcV-_i%`OM}lEh#UGI1zI}gUck%fyXssZ#rHU$^J^5`!pAp zkt|V(;{x_TQa;cE3Su_m%gzL_KP>Ck?Q?!Lz|mP}shvAZmJ=D-1J_SRt5XN%ssGh7mp|`1i-lxR?kZ@-&d8#QS3o7Kq0qEH&4lW zP_t$CNhmcBmX}m4Ql2Cl%Tyg2S>F15OH`MsyVwHPJ3JMoJZVi-uDsPYt$~?cHxrJ* zVv%w}@}zmUN&Dia-+F^pQr?a3B1DVFP={(EPjMS8huHv^Hx5v1eToCj238VQ;>^t> z&%}+E$nuv22hyNQTkMF0E<_vb-DmG%e1z+x$TP)^&xrJu# zmsOMX?D3tzS-rn710@92PbAGjM1HR9&xFJhUwX9W@Feyr8RDy zqXMl|#XiT>dME4(EN2z-n40Y5qc_6Umy`uz@)f*gm7V1>vz9XLZ838+?dJDrtERmA z%rvHgl2*okAhH(ov=|krB~u>{+1+CJ>ZYvheC^8e?;2Knm*l z|H0ti;9lV8$ot<0e+$-wWuOP#6G#{EDP;YRf+qp(8#oLu06JUn7T{~h_|gHq8N38M z7aRg>f%Xr)5t;uRKy&qP2G0aFpnU@G2fmB^|9pz{pA z4a5E!Xz#xlgXe%}gBsWamV!S6pF%I7J^prqzXZ1cpFkh*D)4MD1%|+4ptbeaf@gw$ za3;7L_zL-=ym^z?4Jhx!D_2m-TI!z~n7GJN;%vj}TaCPMv9>!W-W0dDC6P+xh$9uH zNyO$5C8}#a;x+ABAQv|mK9MDHDX=K~<0J`Tcu;Cl0^7NXwaOZ7gWAON3k!+_KON%+V;Z9heiNQ1^^8V{A5@WbAAe-K8%2`q)yfk_|Wft>DrXa71Jl z!BIjAeUUPG@Jr}$zE%QK&aK+(@mcmGSgoDXm~tJT^>eO1a^s|Coz#qzWLnlc5t~ge z(ojcHD z&6-55z{!5m?-R~2A`ONXbux_j1BWGKh?JlRNCD){qqFKBIrUfK$fPm(b+k?_Oc%0= z+#&21t0U~VH&pRqh4<3(bNFa=jUBKQS8~3y#lY77-8=K_&If8IQG-Qco`#0ZZOBx! zR4HZ1>|)W>arkJSEVF(oby+KR857@x68YqlkkDj`ck-*KJR~3MmxDMFGzZE~lUuEo z2eQm&bR;SbeC?}_93H5Rw2WZ67Kn&PYps|CX5PtmjbQxVH9jv*C@1yldT#jr&>k z-rC-!K~TP|q#;^HOI|Qqx)Ta9mmR6nHwmxxgcCV1badD(LR(y*-^Cm(q5a?#$KuTt zv|y#F4T8>Tfn%n{Nz9dveCwNkqjHo`5}Sr&^xl(QHR6k1;w78;0r5G_drW*js7$U0 zK{eomf{J;eH`Ks_QL!m|6@B+t>=R#Bd@u(%(*wsQo0$?5@*z^t=T-Wt(^|E_X~mPH zdp@5u_(j~2k$j$w`DCg_b}sGi9jPv^ZrHrBKw3%2i5DBWIP9ilTE*x}@{|di3bB>&$7iT_DX z{@>%||BoT>%jW-aU>a!8zuSPTknx`a9u6e;YahQ`gD)ZHUk1j(!$1qT54bn@JTm@A zfNc4-j(-q*54rxG;AvnGbc5S~FCfo<2)q?s1Fi(xmv0YP4zwrVw~*;&kN+AVS$`00 z1wTTTmyCZEkUf4cco#DK^T8-+1-Aj;MTVCx{yV`KSO?m`jmYe>!T)O@TYK5r--yiq zFQ6ZEf$t-$e;m9XJO>;Hec-|1d&ujW=hvQiBj5+{^xwcsfcX1FP<(}DJbaF`IQ)`S zN9p+j1)R~n7LSsO15@j$CV|4Urf(8G(v0m}Fab|F`m?a_|%Nlqvk#hj2&e-(4Zf7M+aGOb){ zrEa&ZGkf@?(J{&i-`kNx)+Y@z%Kss@X7;9vVN^xW_2&vgAF36`THY7N^oKwe&A9w&Ze)-kq)0Z(6wjbla z#f%T#oUUdeH_UT=ru}cNX8BaBXe5GI(ti5&$KAc11P8qq-RY>4XXQ) zPRef)nV8Bf#%?+E5z`B;*)vBX*ZI1ef1}WC8)McHI`ai9IcR1yj^EP~`EbLKRZTb* zXKmP;k*((eLkbtJU-j$b_V=V^G=nS~YJQ2jcU?4;L2xNgVz?C2C`Xg{umg`@uuwC2 z;rJN4axZb&xkN&l8F%H=f4t)9^>^~v_+4mr_VsW5-FzbHx~GfhObkj{M&yb^C*;(c zAUjMp_A7Q~JW03m!|WJU@zLv^FH+H-e#xTN3@!5N1XQhAk6BSd=+14NLxp(Vwbm`N zXNL;?ZZX_%=|x4fIA4caTi5#Pi~FMbTT(Xqcbu1*+e%o*CjDC#b3V4Uol93{X6y1C z%D)ji5=N)BL`S5@tdYZ*J$eISiEp?2b-IMrykH-dwVKyPyw_}k7o|%buc@{h*ZDzG z)-S~`&xSnFu{X1=OZ=)UIGrb-%7pbgb0{W?y){a5Fwee@jwqm#JhaoGlK=0CPRp}zr%}6(qt0~sW_|U#>_(1st>Aa z0yHjXam7e-+H6=&skhCYS~b-H*Z5&Em;Q3b;^s-W#I|C9(K$w}{i8>&5YzIDH%H)i89xQ=@}3`$xuRq%vw>L1)vk zf*zlKX-Rcir|t#4pu&m^u8%t@!13NH{_maJvuU#L{aH5HIUq%Zy>lSyBGQrzz=)d|ukkgc_;T zq)=kth8h3Ko56tAhQ%845PSc$whARC-hdIXGH`t zs@0*^<%Oo4l7xq{1YNW!8Q(3>xBjBBI3TaBrREudDpE8aRLRsX*s1;%t`(hWx^2hq zEhuV3m&OmfjbpmG^PNFa;mA@%LQjzH@Oo{IjOh_kE6MP}I zgA<7vK`&`SEzS>7bV@m|2y%={g$_fS5gIk-ZatgEKm+x&VlU+!X*&3RECS{|cnMsV zcuYf0=o*-%#Or&Lw8tGtv{jnYn7xXdGP$Bn%rygs#`3{HabUhkW#?X8Q^4z}g)lAU zWtS}sBB!OyOkHUz%ruCm&5Ifj+n%&0(_^j-&#d(U#zkV^QZt)2=VtSy3j4IC-sYB} znF;1FAB)*87bnpu6*VtZDsi((!hLI&@VkB~uAhobaWo7xrO{_^REBJpRzfC)&-L>z zq1PvXWS8spe7HsYibHCWZLR{7-;)3DioojS|MQ&i`X9*rTKoTOa2#9=R)YtC-y-w> zEBHqseZVYO4*nACMgHFeZVmn$x&Q6pufc_&1Kb__0X@JY!4}X99t;+NJAj{~3-}<= znS3t>PXm+S09Xy~3}o;B0`OR{1KbDv7`?!!(FOb?m;y_{kCFf11+E6)Mdp_-;2Gdt z&YSzVB)nNl&V3vaBrbI=>T&F|lHWgZ*3!?hu zraVbO(L`z`%Mbnblc2_^dreP~X?Nlb^KLn-8D}~3?l@Jxr%DGusb)sX*m&qu-inle z5n1)WHs?aFidvkenkspY6RtPet8U-n9XC#kT$WH;Y-Qzx4(~}r8jo(85swv2 zqQxGP0ewY9D^W5!h)B%Mok_Mv;g8Z~btQC}eXdWPFO$AGF=iJ!(H;?T%C8k6+jpO{ zaaZP*)Ond#8@KOZtzqO*xsZ9K36abz?OmL{iYr1kL5&NA%}+Z8@3M4ReI_Z6&{sM| zQ9h9u(iQsk{d)MW{@BEaR8o)|j}GeRajp;XYG9vHrVsIY#m_A(;t;PW zOtUV??#~f74t55{EI`YUk#BnPZ#>!c$@Q*$``&F(k^+GZfcjj zGTYi^0_*CIS>dTEPfht3`BlS3C(*dAv~8l_MFL+lG3z}c{+_sRt{G39H`{)fH=LBG zu<&3QV0IhLn!bBN!+UX{Ns&Jl({;W{ww21a#rBtPgzYciqT65bG@n{#Z#i4M;X^)Y zBr91h$y!Ofje|2zG*w8|(5<;Nzl%#=X=M~+OUH_VFAVbw)~ovJC5L@xMwNx~l`ymX za~M>6QBX>#38iSxR%`QS3+HT;@U<$>o{O6=^5qFkeKkm+nNHS}acKgBpiBZK|8GU+ zf2roJng2h}$^Rch&VMo(1(N&k58jJ>FZ=(C!F|B5k@24b&H;}f3o#&0b1YxMdbTefxiNq!QFuN-+vpJ z0=t3s-v19|{`Z0za6ZtU``<*R9l+1f0ek>F z0}O&+Bk%t^cp-QUSPt$5{sWo+#o%$^KHx_9r+xgyN7?(&+vST+(Y=0qEFUFGi>#fSBEzu zyT0f8yz#9~G&nU18`{7$^~F|}A(I=YzASfl?>hfvQebj799m0!%c+};iax7uGFco+ zxy21_n9kEf?vNYy`BV+Lec`l~(pK7_f>uIG%FAE*7y0k#C@Yr@Tb;miO}a3ZuBaNB zQIo1sZ=yLVF?Vb(A>LI9!Oba;lJRD9!_yOJJyg}=nl>M;M{(P^6Wf6Ljfa?4!m!4k z>!)5VPuTDz`JH5UE*O*7oe^S`_;DgUB8s{d6kbQQNl zP4{4_`lE>!R`HdzU5z7bT#S7=Hp4dcIJp{R%rRoQ%aE;Cb86iyN=m(}B$+pZ{F&=A z)r@2mdzz6oiXJw)=<3GyAm)+P>s9Kdw{c-RnSxfr&3P|03NXVOjkq$ej2blN(20~H zvGb3=9rc<1zs*idd%VW|TzL^L|03>Oo}bh9O!N1W^82UU8u+9Y-Rtv9K8hQI#-rc* zoq*ScMjb(3QLoC{$T;gnlb~X?x>CfH@LfrHsJ{?N0n|@_uBkt*=C@q`-`04U9;jl| zX8)F#*YYp&`Mg4~g zAoITv=*+)G;J=aeKLNDv|3To#$oFpo&jh;#?QOz>l5{f~ne zfpO3R?g+k&y#E^TXmBPt1N;jz{`0}3z%pWP6?8 zw;Sl}KF#xg9JyXL|L1_)gO4K9KNV~Qw*?3Y+6%A zYw>vt_2TzOFhub;8r>+sVg?i+!cdO@qraN-3~o6E+KqOuS%6w?J}D?X9iko&BsbE8~vEl0U!01qQ{K%!l)74|c9N7Kfnd;;OPa{Xhs>9@2AaU3w)J_iBU*<3%2 zAl#Qq1hO?1yF}`s`f>K<($XE)U1Y4LL;wCcZd(1@@UG^z622&UZjR0MiFW&7byv?8 z{l*sJEInxhjd@84)uX2;*lsKCHnPd8&zWph^V@k%&CF$TsWIDZ0Wu{{yJmMTUA4*` zrk$lX{GIwTdu=!2Yi_AEEn9Yetz5TS327^OKCSS|bHz_A)H!oTp4@oL98FVl?u?wx z-+;?BEER?6ukun{{zZQ4e{If%T$Kn~jaO31v#zANILod&>*KA5Mk*J%a>G=1koOyD zD0EIRDljScq56Ac&d8+=*mh6pVDSW#U33hfC&%CGHxhE?$L7gsI9Xz-fsosbG)p&o zI}c0^jSo*xXWGtSyAbhi?J442bM}0m30dl`DROg4TZIu72Rt{iSW(_e3VCz!9yja% z5p63Yl4X(qcR7LfQ^@=;1Din$_$e~~d%%mp6Tne$J~#&~1iwW7|0sAY7y-*b1!yh6 z%fT^l5x5WdH8TJEf%E_ugO%VGz}o?6&;MiKUf`F={W{z4gn=@17!DqDcBBrz=Oa) zpci-%ko|u8K zdFvU~y|NasxRuj@FY>-NJP%b($eONBc8bZ?Z`N%WEJ7kQXXSOlhI8U^XdHdw&@1ho z)?-`$cFkkkUuLYF{4$1%{6b3OuZzd6xlVQ?gH|2Vt!AZ9i}`Y7lrypXi!z}8*XCTv zRdF-hc+sK!>I(h)McPvh79d)mvESx9hdASWSmE6W4K~YUKYH0^Q}%~eV<$iCx;*#A zu77qvG#{Thv-9=ti`MxiU$i_h{lP)H+V3dPD=9^NcIh5xY_XuPwawgTTRE<4SzH)H z>h)Ydjik>+w142}!Ise_8kw|K7n;?gTX*zts~>c5eoi{1SzXCeko|qSNzHO(K22;D z_WX$sI%7O81m&$o`4`bt|7&wDPsN z67Wmp@wb43U>&#@_$l)E+rcjI=Rh|4ZvxK*XM_8L|3n^t9e4tejs9K0myyR`4IT$} zfEJ*6{MUeKupP94Pm{*igQH*rP@3-tN-q_nMpsRA9wtds?%rOeyL(x5HINa#3iNT+OX`BIal@tZDfWD$vjjmJ7v$Uj*HZh;( ziA|WKdC{?ggM7Wi>^n@YBH7yWL&{)VN|H9r0r zsP4|T?qyB3L?R*#DlOP*bQ%|IpNKFFpW7~vvZMZ@J<9_(^BAWRW0aFpf@L={Pb+eB zF&?k@wAQ;P9jDi*CgoC@)JULJ$j!wgm%+i(hlj^zbguN`vB{&EDX@y1*1HmtllAK2 z+w@)?Snb2DYVwV7p&b-RbEp^Yr(NYERd6z7FvhSgZVaI&7V}c`(VX;Vw93x2*<3OW z%WNx|{xsW|B=qG#f_-KPdwN(Xxq0fxT!^r5`!|E=% zo;-?%w5zqM2lV>&OP+P)?HgNUnA2+ZMBBI52y5;~{XiPGD9!0VJ(r42vg)6d?)~~Z zoCwNpasqkdUM*~8;zn;}XIt*rb01xJ4?}PpKR8n8F;q}b;N12wd_6~TP?gAO7kK@w zs$bZAECJ_|>DC9Pdp(bXLX_3vbAcKtS^ zpx!sG=oHD80g)SUF)f&ezja!_AYEpfLIK5%VI^c*_W4xnrp(r$rP(jy>$_Ok*V}65 z|1U-WJ|H=m`G590HP=5Q_dgR{2p$N2j}Acg|E~a};0*9V^Z?HQ2Z8qde=ztl`hd5B zzXKP5UT_`yfPVnm^Z#5R-N5I7=J_YUcF+NSfqvlMz|}x={dWN$LRat$ z^qmgco1fiouCsyZ2^ZC3`#Bosa!iuV=-SLcSa#bno^hD?)91jS@_ua}YbDj^1n<-E zlqq~s08NIsrfzs9U)9R#c-LSynO6%la%5u4pxxzdWmB@#$#9X@+QjbQ&9PS*nNpxa zu*U4t>@=`zMlID-Gt++dY|S#$msKZ zGQ9loq zFwa38i+Y$tccK+53Jh6WVR_ruCh7qnxVUI!RCjM zW+qk3DDiFZ94X0_cNO*})kaF(`WX(5UMETMQ@u_{C-tje<66?#g>tz$S7~{eo0W$A z)#rd*=<*YnN%3}#n(y7hmaZ9V4TX8)X=|dOD}v^d78XRCDqAO2OVVUvxR_7t{3yE; z0&Hxy&9cV_+HTEun7D&^8P=9XMi5? z7vNt>@73T@;Nf6B5D!*?<}N!keO4uGn!@M$)w%vxh11xDTqU*IjX1j+XrJXrSK==i zE;cpXtl#=7=%kWKZ1o+8A2Z|>m*AX2HjkqHs?yo zuo-BF6+S2abo4iA3er(+cN1ACf4Y+5>ywTcdGeh+foKM=xx(1EG>K43loK;fv7VxF ztJ0X@#>HRk$rOK9bT*E=xpI9nWjgfhnujJ9il=2M9H48$t2td{W1cDoT^U7Lx0zhB zCT~TGvYz=d3deF!V)q|bAwi0}x-f!HdHkX2e zw&x~P(z~|D+qQ&7=5)zjxo_!QTPx*ebNN2kl56J@n=iR*|FlZ3GsR9()Vk!AHRJz&O|eWHaypp#1^90A39q z4fcVDgQehBKzjyW1GGng)*Xz3^MLjaye)VsItHyjXmh%TkE3UJA(#Xk!D7$~zKXu# zBjEW!`UkB?co4V~_$4}ruYn1$2eg74(K~z=ybZh+TnZir{u2BO{lh1L_71oTJO%tU zI1E;TML_xSzQ(!;mHX_ag9Ik0X9i}l_M1FBFuB**nx!RpmO1)XjLk;JXIj&@wbp&+ zr0;!8jaRj}{p_~1^Lw{@mE zeQ4sy*iiNG#L?mE!1%<>q2a0Ov4Pp@=y-K(^pQtKho&o@GvU3Mj8bdv@{(2lMbUW{ znljhDx)PF*efDl`nQPLqEpt8PAr~i9ao;>;uE})SGS{4ATju7G2c>1MlFc*yF6Xem zGI`oE_ZHZ1jlfo+TZ%`!e_Sm*hR?QzFVNtc7Jh7aq@aQKMSl4{rXnUM^QG83pibZ* zX%!0`PU4_@aq6VqKd#)@R?yh{uQY`9W2S3K3r?207TRdteTbFMs2TiR`Y6lPTv=dvWu zciSkLJxP>B1-_%>{Nbsw;TgKvnc;&|12dx&N`3ayy8fxYcDB))Vv>!&MZ0t7y&@+k+8R5X(`gLpbCYXp`<5;39kD~Q5prv~ zdd|)&f5+IjuR3#RV5ZtxotWZ@oqF~D=ao%Bp`}ZgR}GI0p#US+VRscY9{QUtI9Z*ZV{ynuROY{Ea1>*8YDv zGXLwG{C~ca|6hW9|5UIZX#c+(k?lVNUJjlD{u->-<021Y7|QgWX^)_$BiF zm%*FB6+p6oA6Nr^ifn&9cs+PDcon-UjiNl7U&sy{vvQT_yO|!=fOd+9o!e(fZYC3@EouQtOjR+-yyqy9lQ|8reF)` z0-fN_KzjjdAHYY05zq~);Frkkp9QZ5&jI~l75E)|{W{Q|fa39M!HHcI{=zFRIH8kL ziAIi!OOf}UZ3MN2wA(;h(+72$&vJ594xL)UZi(+z4U8U9HT0jit?Vqp;xGwsVZ5nD z$qMS^Xod0FeS61i1wE;fJw98dl6Nm|@%v4;7L6VAq(DYXk>Z0b&g`&wWl?+3KRIx0 zJm17YL|+v`sy&Na{1}H(3XM+z%g42VUb}?j*wK*q$?9HgkcF;-@%!qEF981D(Q(f3 zz!2N3PmdP&^>SEVmdd}#U)tdtDQSGR&16tpZC_)n?OgNR($(4B9=&bts3Sw>Gg1`k zQif*fF{&|>p_)+F7V7!Dv%c$bLoQAx&GH|mko-s8oX<5m^jFTK?yuH}bizd=up(F|{GoCTAn^t+-Vfn^wFLRs9TVDn5dud--6-yN0ZV*=#bV1KF3s zo=3%rEY2#s8y0239Back(QHH8-kuM`xKvAQoYbmo=tRnnx9RBUA0C(*JjCEn8?>9s zJUYloxjN4K>LHri;&x?vcxL}Fr84emx_bAubuR6-E5?`DGjoz|V|nncp!0x%c6q3s z25=gJ&{JOboJO{@zFe9f|JcO8c@|+R)`BY0Z$fBK%ZH88w%^ z#19TvhlXc{2WMdYu>oXD6lo(96Ov}9M~8;YRdB?7kaWIs={1@m!}D z;Nv{1*1JySloq5m$%HvhFU&6w=A$erM|CBAe`YGT{seD4y`T;U@wswDaw+rwyPa_Q zeq{dVf?ePv$oQ`ZR|3uRKOS5PmIKNE|A3tTJTL|}fctoRBx%`KLdxEbZ-@g*P0?dN# zU^Vy|GQQ^WKL#ETE&^M?X7E7p9b|p&FE{}H3iN?HfL|fw`+5BP^87ty`;UX?gJIAG zwEzEak?p?*G>3l#>;+4}J;2?;C*bGD!7G7yI|Gu-W?%eQ&F_@SQg>dQ8JlUORNT*Y zbZn*!}*4(-nxW@__U;8R)ZV zCsmIw-<^tuJz1mEwUU8_Cho^)Is2xfAd9Z@KA^OvRxtHxmy48scf?X-NlL4}18=Qs z3ntPOba>5AjRO42rPL;26rYpQUx*=IoE2*05@MN-OzTQkv?}zyUu_1 z#XLN4=`iQP4@r_ZJb_Y~bMXeIB@LfdAfx0NpU5}u-R-7v2(sTCVC6ubxYoY(&EzNrVy&%|kI)`w>CNQpeh9%UewoRI)MoG%=4%L+5K>mu7*z zQf9Vwalx*s-Xjyip+`;QdXKeYkN&f5mFE&=;{1LO3LTtnYRr%qIp+OcU?|0`VPEl?$mpm6Caz1&xd<7 zVq@bNi?|s3DqvzvPqRFv0EXN!GZHr1$Ge2>wC1# zK~${j$0$B__ZF1K)LQ`~GdwVy?Cw2*(r9B@SvOJn!f1VAGFOL($bb!e0U!T4Z)A68Utqlb@-84HE##7Om$2^3w^ z`L?t~nbWWX>uRW%@kO|y?jmV3Xk7cM?Ii=oeD|Vmp;&7}S1DatW`r-(Ni&AZb*<{@ z3Ovx)sc+48KY2<-MXZ{1*1yaABv`>tMjagwJ#u)mC`Ymp>UVjDlz;KzSO(jbY_y*! z_)Tk?ylAWTHZ_B0Tt)g)YvWvZ2F(+pJL4Mdwy5gJhwyt zi9A<#Ce!;Uo5Xbm(^#=c{zpu&yjSum^8c_CQoo1XKMgJd{}22CIsa2Yw*H5}GH@U8 zdpv&w{1Z3^_JJkf9^mfad&v7A0Ivs+2K~U#|1ajb72E>60v*6}!5G*CdO$b$0(yWC zffs_KUn2Y(5^f{x&0;A$`f9s#z2bHP2p578O?0K5Y{8$1g<5)6U^ zK=uTyz}>+u!S(18UJH(Z72pr(4&DwXfbS-dHKC(p|vw~coIp=qFjhUq?5-$>`HS4s_ zk-$aGJCkjG0BTnI#W@-KAO+TTNlb2y+xL879G$k!5ycLjLm_LDsJ$gtfpWt1K%wBT zgSWj=8iMNN*pUJoWN{@IdO`o23w_-NY*jP}**a1s^nto-u{*zV7o!S!0>zMxw)#%#tsuHt?Adp=yUd}?i{%DG#)?YcJ0 zphL{Cp{qo+ZJJ5BBw7WgHO=W@`o9yYZsqFcNNWkph0K>ksMEEoD_#>(YqT1gE6fF+ z^u9T5YVp{~%vYAFQ*$XS$nadT`_nDdj4=NMOSOvg|IuRYrrUEOgfG;-G4OZO6fzMZ z?c|ZcL)Gbt!^1O&3e{J|Eua^d&`r_&vGshub}KID%*wiju8Nu`^iF|}NOPt>psucc ztr9NRbS+o25IRc*P{erWDAS*bqWa0PiiSc$gXADiqem)q)i^nl#gpV9vXvwUq0sXf z<%o3@_v0c6tNY>MNvV}hW+w7=MIXa!?t-%)L0B=j-iDb;<7no9x;hy=6_IlXlD!3CoO_z)linCdvc&?HU$$An*=VFTGp*$!PT)-z& z6Xrexrq-77bb1O*{4`ggXyiZodr)TVaMXV&x-;fU+^17u(xm)R&Vf~m(s11D|9^jE z%9l#EME=)V0J{DWng69g`~N=_ECm09y#HfxEqF6{0@wq#fX(3k;OEHvKLZ~FF91&m zmx6}^=>_fryludBlKa6dxD-4TNFVTL;K#`RZv!s@$G~dv2W0;5g4cn+1(yPy8z4Qv ze}WH#H-g85^*}ZQzeCpl7w}B511tkSLdO3BcnvrXWH0bLWc#m!tAXqV_J9^3JAu~# zok6%2bbvntUqE)h66^u1f%Y8y1kgEzmxJA)2iy+413CT$U>{fw&H$f+-{Sd8vNFA8 zfBLs5+p_PZ(z>L)xe1-8MbEqc1iUTtu$!OcTAzj`aw%1zND|#HnqBXiF9go>)dPY9LS-^HGFYTlFo6|);Co@ zKE-X0^QhNp$x&0yj0vgH#(eN*Ar3JUW}AkJ!Y;d}$^AMu;N`p$v1TS;yRA&`lfstAfm`UDgS0@G1X*bs$rvb z%6wxckJlFV)x_0&iPz$q+4iYAW&TfwrL+xyJS=VdU%^reUV}C|sS;*txDNlDD5bLt z`(}$vDeY&2mibSnl+KBz^^0^lOKHHz>u^)ck?Zzz(l(`Q(H3`?S+f;WP}&idXHrs( zkk97YvZj9L-YO@4HTzjs*2`0=9;_at>#+Hcm>2aroMK*x4GsF3f*vLx7U86wvL6uS zd;2KYijMzH94IN-V}9dkiE?3ax0tITNvNEXhpuT+U-i+Ox2@a4#L&7eJJ#*ky}A+( zlgvmf>!q6U5c$X#iSo5b=~BL;BR7(0Rjf~vK|W2)A#K>SZJQYtqSnxSQoCNn*<(sV z>ae!9PvczU5TEfpg;{Xw^x1y6H!B_ANM>D*S!|kdSo01WurOhTnZRL)zykP|)(7cC z+oEA`(K!Q}``dnQW;5+Fky}`dj)YU-q`nLn`LT=aoecHFL0=|dL{$cPI z@Hb!v>;d-#*CV(8J-8TXt^a=_uU`c;N3Zq$uLpai!NU`nkg{65=d#Ppb6;P9-A&%R7XS)y6*C7LE*vV7T+m7PmC?0QLW(Xw~%Uw21& zwMF9TtXbM(W-|4&W`E|B5(c2>CJ51jLCCwE@UI!~wIb7iyw}S;U;QQ|Y>{0|eR(dIe-XJEmSY^U|5z6?ql?5q`iZd`r$>{_?uboKSk%jxQy zbh$LUr>k$+be!VqyR4vgH?F?M=%=DqAbXYfvH6D9wv^eHx~HtUQdIdsYr*EmGz4G${~*@pxYc7of_VMV6P0CC1?#ED5qL-)Pd?+7W=SH$E1>{a_6`} zLmY-*?$)?Em{M`D+^MKIm{6g?L47I?CRDia%Y)XKaeUTn$YSOHdm^;HT(T?k{||Qp z?7t%KzZN_iJRDSk=Kud0XwUyg0?qkr{r}sM^)=5w4juyT4StQh|5@-xa3NR@eug~sCb6K5inQzC?V?v%n%a40VB%hy~L8l zeZT@3S8Hb-dNJeX$_N{nh5!XqL?WTQIF~mC@~5l*G>Kdklbf_^+HXa&l#4iv7=hmN@d?ESKa-SDst;eVwtS z9MtEATqGQsD@F25*;_bWT!!^oR}%is#BtHkmjwjbpGjnoLdxHky8Yq^vcuhYPGVo3YU(TN_j+rC)l~ zGD{lIpTd^ZfAn_+RIp^rf7Ts}k{n_cLczZ9q3h;KNs}ccDdR}ImlTw7EB^5fzuo~&4JS#IL(369QZ%Mfmr-av?OkQzzR3tZq-Oq$C&w>zCKm~n4Om@CH`gm zh(aK>qvk}FnbpR%d?fKW%lmNIZ1T;~5Ev~apHRX^OKsB+QbQE^aEk!LR=B*|F|BWkt-$Jgx4txq| zAAm=Ktw3i1-UdkS{~uBrOTi|v0rUW!L%0C^ z2AhO$fsccCf_H$IgU5i&!DXNWv;*x!DEoyQ!1drd@CI-N(Ak9@pcUMRt-^1?Z@{O) zC&Bx`>%oh_)4`*`W#Blt8@LP58He8np9Aj!uL92oPXIMA3J!sbKtDJew1InqGr<2~ z^YDA{T_Br?kAqi$=Yqcm<6t+~09wHv!5QF(lqKzJ_(@>O)&Gem?WRhk8nWP0J5g(! z4%VjU)YochX4|HNRz`~z%ue`y;S!^?2~qegB&iO!w+z+RtSK@Q%m->b(N&ar6eOs#Ep@c<@VJGWlAYs>l;mI$yy;DDP3x1O0=;3zEZUq8C0 zZ>Yx2uX<3DT83topmsi3%Z@bFh9fu$RL?`AeW=zx6fkc{NzcBs?%KRNONo*=G`n`F z)@q~j5xAbhu+T+jc;ud^^I0#01U|_VVnuG0o$&Oy_kX!jkH+-G5_s<#^@j#ORPQ9@@_-wZkoD ziB5H~*68Ti=V}e3dEIB-z1Ho1yE}QJ&*Y14EZ)#OfWD(jFSJriM8b zcRcJp-5bXZF>y4UJaM1>EROlUhGKHOGCHn+O?-w?#>S*NYNGCkpGW?Gdspw zYdMP#fdSS|M-4kl?Q`(V=j7X`kp5zh2(@E4j5`?h_mjNHm3_E|ob|h0gvl)(^fKuz z7y=@BM?#_GWy-&yq2T62&5EJe=m>(!V1BHek)9C+DSaYVm5 zu{e#F#3jkoeA(3E=Ki$4<@rbi8w>k-oRmxlw&`swyace=E7Hn(RnnGhLOyL`7*l^l zoy7&we0_P9AI&c17LzW^*KlijnUz;|JhG)WC4MBQlu<~@Gn>2p+05D9vkrG-S2c#F za1grCOK}@kS%Uk*h*;TLMMBC`v5`*H@+Vm#Askc?Ee+ zhvwv8FbzkUaBegx!Aj_?L?nJN*4Yl#u}cb#jaEy3fB?PO`<1-i=3rwe%mS55!hDZy zG{X05z8S>ddV;ok9q!hB{TdCAv#4-_n%=@ZLqO9D3>St;^!xqjiIpB3M5CT^B$Yp-)XPbg5Ite zGLbI9&@v$Z;yq{20hhlrwl>X2D6SEKsEQ)ilUjB(U4dX~V9If$wOI%F##mCBtxZ&B zBfXKnaBI*=TVzoYKdf5XY+>wgRU2vZrb8{%QC(HD;QYAS`Szjx|83}Le?f1f{*RyX z`49U28Q>H!2k;KSy8zk(0e*o_{te(OzxB~Cy3mP|E9Fde{KFX@9pc}Igz zhDIfuhc4FYmF(32#+kcqD3A0D)t@AL$MnEB#dbrM9Z$gGBza@F-=DmgOz%QBqoMDJ zn0T0y(2yiUgX!N_0EKtcDc3}u&a7PaUNShtmdp8CC(E@)no?{x=+>0zrorYE+c1-* zF5aq2JA+dev*eX%S?0#kX1U8~s<>u_AwStnRx4pZ$jkuGavs=@Gqg_Q7(z2sh7a5U z03nERe>(F@ZiYU=2v{mraq&W9q%2wiD=*w4bOBi_KRz@bD!|?C5~V@Yf%7=O9XU}F zTPrqf2V78|vq%U<#bjZx)~igj32U*{qIr$T=xW1zdknB}Tr|L%3s#`@OD5EWy6DxS z@>_0<(Dc4;tU&yWA^c4Hvu+UL*OKWH#VdYXab0PP zVza8*<7$U=W12=3U7!^^NJJ@2#rNf6qt@(9qZX50C_#~gUqXVy{p46~;PEwPWFQQ} zJ|M&m%MPYt0je_K0=XgAA{o)X8izSn26ChJnG4c_sc(=EhuF~1hx?QM$jcB17kBGC zHJezgxnv1V$2~*D3*fw2ugCl;+(255) parts[i].life = 255; if(parts[i].life<47) parts[i].life = 48; From ec1ab3fbcfcf9de58c3f14ff393dbcceffe47d05 Mon Sep 17 00:00:00 2001 From: savask Date: Tue, 17 Aug 2010 16:38:08 +0800 Subject: [PATCH 075/237] Fixed photons spawning, but it's still have some bugs. --- powder.c | 625 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 320 insertions(+), 305 deletions(-) diff --git a/powder.c b/powder.c index 9371e37b9..1e27abd07 100644 --- a/powder.c +++ b/powder.c @@ -2262,353 +2262,368 @@ killed: } if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } - } - } + } + } - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 ) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - } - } - } + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = 0; + parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } + } + } + } - } + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; + } - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } - } + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } + } - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; - isplayer = 1; - } + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } if(t==PT_CLNE) { From d6c0211c54a004fe6e61810a799562f15efc84c8 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Aug 2010 06:12:42 +0800 Subject: [PATCH 076/237] fix gas --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 1e27abd07..a46bb59bd 100644 --- a/powder.c +++ b/powder.c @@ -3152,7 +3152,7 @@ justdraw: for(y=-1; y<=1; y++) { if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,255,32,255); + blendpixel(vid,x+nx,y+ny,224,255,32,100); else if (abs(y) != 0 || abs(x) != 0) blendpixel(vid,x+nx,y+ny,224,255,32,20); } From 59fccc35fd3b6bd607db676d5f1e3855b220c292 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Aug 2010 06:39:35 +0800 Subject: [PATCH 077/237] fix mwax bug --- powder.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/powder.c b/powder.c index a46bb59bd..c9360e4fd 100644 --- a/powder.c +++ b/powder.c @@ -773,7 +773,7 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, @@ -3088,8 +3088,20 @@ justdraw: } } - } - else if(t==PT_DSTW) + } else if(t==PT_MWAX) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,0xE0,0xE0,0xAA,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,0xE0,0xE0,0xAA,50); + } + } + + } else if(t==PT_DSTW) { for(x=-1; x<=1; x++) { From 97fc7ce3307a478abe63499987b53bc2a19a7414 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Aug 2010 12:51:55 +0100 Subject: [PATCH 078/237] Changes to particle drawing (zc00gii) --- powder.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/powder.c b/powder.c index c9360e4fd..1df08e3cf 100644 --- a/powder.c +++ b/powder.c @@ -2853,8 +2853,10 @@ justdraw: { if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,224,224,170,255); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,224,170,5); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,224,224,170,20); + else + blendpixel(vid,x+nx,y+ny,224,224,170,40); } } @@ -3151,8 +3153,10 @@ justdraw: { if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,235,73,23,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,235,73,23,20); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,235,73,23,30); + else + blendpixel(vid,x+nx,y+ny,235,73,23,50); } } @@ -3164,9 +3168,11 @@ justdraw: for(y=-1; y<=1; y++) { if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,255,32,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,255,32,20); + blendpixel(vid,x+nx,y+ny,255,255,0,180); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,255,255,0,50); + else + blendpixel(vid,x+nx,y+ny,255,255,0,80); } } @@ -3275,7 +3281,7 @@ justdraw: cr = 0x40; cg = 0x70; cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx, ny, cr, cg, cb, 255); blendpixel(vid, nx+1, ny, cr, cg, cb, 5); blendpixel(vid, nx-1, ny, cr, cg, cb, 5); blendpixel(vid, nx, ny+1, cr, cg, cb, 5); @@ -3293,7 +3299,7 @@ justdraw: cr = 0x70; cg = 0x70; cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx, ny, cr, cg, cb, 255); blendpixel(vid, nx+1, ny, cr, cg, cb, 5); blendpixel(vid, nx-1, ny, cr, cg, cb, 5); blendpixel(vid, nx, ny+1, cr, cg, cb, 5); From 7076587196cdcb16a34f022bc0af6a34dbb77afc Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Aug 2010 13:10:17 +0100 Subject: [PATCH 079/237] Removed superfluous particle drawings and made blurry stuff Firemode only --- powder.c | 72 ++++++++++---------------------------------------------- 1 file changed, 12 insertions(+), 60 deletions(-) mode change 100644 => 100755 powder.c diff --git a/powder.c b/powder.c old mode 100644 new mode 100755 index 1df08e3cf..113e303c4 --- a/powder.c +++ b/powder.c @@ -2845,7 +2845,7 @@ justdraw: isplayer = 1; //It's a secret. Tssss... } - if(t==PT_MWAX) + if(t==PT_MWAX&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -2894,7 +2894,7 @@ justdraw: blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); } } - else if(t==PT_OILL) + else if(t==PT_OILL&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -2938,7 +2938,7 @@ justdraw: blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } else if(t==PT_PLUT) + } else if(t==PT_PLUT&&cmode == 3) { cr = 0x40; cg = 0x70; @@ -2956,7 +2956,7 @@ justdraw: blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); } } - } else if(t==PT_URAN) + } else if(t==PT_URAN&&cmode == 3) { cr = 0x70; cg = 0x70; @@ -2974,7 +2974,7 @@ justdraw: blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); } } - } else if(t==PT_SLTW) + } else if(t==PT_SLTW&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3029,7 +3029,7 @@ justdraw: y = ny; blendpixel(vid,x,y,17,217,24,255); } - else if(t==PT_LNTG) + else if(t==PT_LNTG&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3077,7 +3077,7 @@ justdraw: } } } - else if(t==PT_WATR) + else if(t==PT_WATR&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3090,20 +3090,7 @@ justdraw: } } - } else if(t==PT_MWAX) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,0xE0,0xE0,0xAA,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,0xE0,0xE0,0xAA,50); - } - } - - } else if(t==PT_DSTW) + } else if(t==PT_DSTW&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3116,7 +3103,7 @@ justdraw: } } } - else if(t==PT_NITR) + else if(t==PT_NITR&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3130,7 +3117,7 @@ justdraw: } } - else if(t==PT_LRBD) + else if(t==PT_LRBD&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3145,7 +3132,7 @@ justdraw: } - else if(t==PT_NBLE) + else if(t==PT_NBLE&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3161,7 +3148,7 @@ justdraw: } } - else if(t==PT_GASS) + else if(t==PT_GASS&&cmode == 3) { for(x=-1; x<=1; x++) { @@ -3277,41 +3264,6 @@ justdraw: blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } else if(t==PT_PLUT) { - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 5); - blendpixel(vid, nx-1, ny, cr, cg, cb, 5); - blendpixel(vid, nx, ny+1, cr, cg, cb, 5); - blendpixel(vid, nx, ny-1, cr, cg, cb, 5); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_URAN) - { - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 5); - blendpixel(vid, nx-1, ny, cr, cg, cb, 5); - blendpixel(vid, nx, ny+1, cr, cg, cb, 5); - blendpixel(vid, nx, ny-1, cr, cg, cb, 5); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } } else if(t==PT_PLSM) { float ttemp = parts[i].life; From 5a41f64a08162ade16d148285e469bc06529de59 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Aug 2010 13:38:43 +0100 Subject: [PATCH 080/237] Changes for Windows Compilation --- powder.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++----- version.h | 4 ++-- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/powder.c b/powder.c index 113e303c4..1913596ea 100755 --- a/powder.c +++ b/powder.c @@ -352,7 +352,11 @@ void *update_air_th(void *arg) return NULL; } +#ifdef WIN32 +_inline unsigned clamp_flt(float f, float min, float max) +#else inline unsigned clamp_flt(float f, float min, float max) +#endif { if(f=XRES || y>=YRES) @@ -1154,7 +1174,12 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } -inline int sign(float i) //Signum function +//Signum function +#ifdef WIN32 +_inline int sign(float i) +#else +inline int sign(float i) +#endif { if (i<0) return -1; @@ -1223,11 +1248,20 @@ void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); +#ifdef WIN32 +_inline int is_wire(int x, int y) +#else inline int is_wire(int x, int y) +#endif { return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; } + +#ifdef WIN32 +_inline int is_wire_off(int x, int y) +#else inline int is_wire_off(int x, int y) +#endif { return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; } @@ -1288,7 +1322,11 @@ void set_emap(int x, int y) set_emap(x, y+1); } } +#ifdef WIN32 +_inline int parts_avg(int ci, int ni) +#else inline int parts_avg(int ci, int ni) +#endif { int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; if((pmr>>8) < NPART && (pmr>>8) >= 0) @@ -2940,6 +2978,8 @@ justdraw: } } else if(t==PT_PLUT&&cmode == 3) { + int tempx; + int tempy; cr = 0x40; cg = 0x70; cb = 0x20; @@ -2948,8 +2988,8 @@ justdraw: blendpixel(vid, nx-1, ny, cr, cg, cb, 96); blendpixel(vid, nx, ny+1, cr, cg, cb, 96); blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); @@ -2958,6 +2998,8 @@ justdraw: } } else if(t==PT_URAN&&cmode == 3) { + int tempx; + int tempy; cr = 0x70; cg = 0x70; cb = 0x20; @@ -2966,8 +3008,8 @@ justdraw: blendpixel(vid, nx-1, ny, cr, cg, cb, 96); blendpixel(vid, nx, ny+1, cr, cg, cb, 96); blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(int tempx = 2; tempx < 10; tempx++) { - for(int tempy = 2; tempy < 10; tempy++) { + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); @@ -5292,7 +5334,11 @@ void del_stamp(int d) #include "font.h" +#ifdef WIN32 +_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#else inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#endif { pixel t; if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) @@ -5307,7 +5353,11 @@ inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } +#ifdef WIN32 +_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#else inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#endif { int i, j, w, bn = 0, ba = 0; char *rp = font_data + font_ptrs[c]; diff --git a/version.h b/version.h index 4bb0d658d..c306999c7 100755 --- a/version.h +++ b/version.h @@ -20,8 +20,8 @@ #ifndef VERSION_H #define VERSION_H -#define SAVE_VERSION 40 -#define MINOR_VERSION 3 +#define SAVE_VERSION 41 +#define MINOR_VERSION 0 #define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. #define MENUV3 From 5f46d7e63ec9d2a70f8b493a967ce4dbb01ab071 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 17 Aug 2010 14:55:38 +0200 Subject: [PATCH 081/237] fixed acid --- powder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index 113e303c4..8d63375bd 100755 --- a/powder.c +++ b/powder.c @@ -1025,7 +1025,7 @@ inline int create_part(int p, int x, int y, int t) { parts[i].pavg[1] = pv[y/CELL][x/CELL]; } - else if(t!=PT_STKM) + if(t!=PT_STKM) { parts[i].x = (float)x; parts[i].y = (float)y; @@ -1036,7 +1036,7 @@ inline int create_part(int p, int x, int y, int t) parts[i].ctype = 0; parts[i].temp = ptypes[t].heat; } - else if(t==PT_ACID) + if(t==PT_ACID) { parts[i].life = 75; } From 8b9ab03c142372ab1d8204389ee7210bc8600faf Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 17 Aug 2010 14:59:03 +0200 Subject: [PATCH 082/237] glass now works --- powder.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/powder.c b/powder.c index 31933684d..af0007aa0 100755 --- a/powder.c +++ b/powder.c @@ -1052,11 +1052,11 @@ inline int create_part(int p, int x, int y, int t) { parts[i].life = 75; } - //Testing - /*if(t==PT_WOOD){ + /*Testing + if(t==PT_WOOD){ parts[i].life = 150; - }*/ - //End Testing + } + End Testing*/ if(t==PT_FIRE) parts[i].life = rand()%50+120; if(t==PT_PLSM) From 52d64e6132d8bb44a03c43977f111111123c8ba4 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 17 Aug 2010 15:03:29 +0200 Subject: [PATCH 083/237] astyle --- powder.c | 670 +++++++++++++++++++++++++++---------------------------- 1 file changed, 335 insertions(+), 335 deletions(-) mode change 100755 => 100644 powder.c diff --git a/powder.c b/powder.c old mode 100755 new mode 100644 index af0007aa0..340cf1732 --- a/powder.c +++ b/powder.c @@ -1176,7 +1176,7 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) //Signum function #ifdef WIN32 -_inline int sign(float i) +_inline int sign(float i) #else inline int sign(float i) #endif @@ -2300,368 +2300,368 @@ killed: } if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } - } - } + } + } - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) - { - int random = abs(rand()%3-1)*3; - if (random==0) - { - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - } - else - { - parts[r>>8].vy = 0; - parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; - } - } + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = 0; + parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } - } - } - } + } + } + } - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } - } + } - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } - } + } - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } + if (r>0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } + if(r>0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; - isplayer = 1; - } + isplayer = 1; + } if(t==PT_CLNE) { @@ -2892,9 +2892,9 @@ justdraw: if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,224,224,170,255); else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,224,170,20); - else - blendpixel(vid,x+nx,y+ny,224,224,170,40); + blendpixel(vid,x+nx,y+ny,224,224,170,20); + else + blendpixel(vid,x+nx,y+ny,224,224,170,40); } } @@ -2978,8 +2978,8 @@ justdraw: } } else if(t==PT_PLUT&&cmode == 3) { - int tempx; - int tempy; + int tempx; + int tempy; cr = 0x40; cg = 0x70; cb = 0x20; @@ -2998,8 +2998,8 @@ justdraw: } } else if(t==PT_URAN&&cmode == 3) { - int tempx; - int tempy; + int tempx; + int tempy; cr = 0x70; cg = 0x70; cb = 0x20; @@ -3183,9 +3183,9 @@ justdraw: if ((abs(x) == 0) && (abs(y) == 0)) blendpixel(vid,x+nx,y+ny,235,73,23,100); else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,235,73,23,30); - else - blendpixel(vid,x+nx,y+ny,235,73,23,50); + blendpixel(vid,x+nx,y+ny,235,73,23,30); + else + blendpixel(vid,x+nx,y+ny,235,73,23,50); } } @@ -3197,11 +3197,11 @@ justdraw: for(y=-1; y<=1; y++) { if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,255,255,0,180); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,255,255,0,50); - else - blendpixel(vid,x+nx,y+ny,255,255,0,80); + blendpixel(vid,x+nx,y+ny,255,255,0,180); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,255,255,0,50); + else + blendpixel(vid,x+nx,y+ny,255,255,0,80); } } From 04d6a8051bd2daf6b3dff370d0802b6118ab3979 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Aug 2010 08:43:31 +0100 Subject: [PATCH 084/237] Move fancy effects to a new colour mode --- .powder.c.swo | Bin 446464 -> 0 bytes powder.c | 108 ++++++++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 47 deletions(-) delete mode 100644 .powder.c.swo diff --git a/.powder.c.swo b/.powder.c.swo deleted file mode 100644 index 79cdebe7fbc5a1026b0b68008b0dbb0219b3a4d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446464 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

~a`Cc9zFtPbNDS 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≧kw-GQ`<9dO;usnsN~!7{qa2@HL)xb!wIb1mQ<`qBx!c)UQ)c^1nn&}Ebp zIWn+xB!>m!R@SzLP>gs~mbRqG=_GYq#g?U(ZAcOhi-}&$DeK2%ZLgKo+@6*X;C=cY z^Tr=K9q|2f)l$`vD4eQ#;NCn(*nY8HbrR_r z@)vzd=0{85>ELq>k0v)Ngvn9$E12(&LUKZ%nWlUI) zv(9|;>MiPu=Uu)3Ci%V06Y51T^XoZm42E*kW21`-n@7a!7O(V4bH8{`e1KQxVzUKr zb@VOqLu!W^QU3Mfmtk-IL-~J$ADPQ@ctoExT83XtYLAfFdxZk5EPo`sBKM7Ugda-b z$Ul&&b9OO3{k_yA8iV`dcW{kg9dAJ84HnCLzGDt;O+^1p1fw;>n3x0T8Y3QEtB||D zkao0IpSYMN_A&jW*DDn)xisA{k}3O!qUEwGyNoIbTRoh7w)*>fW@7E6xGUR<0uY>DXL9Oy#wh>mmW35J{=5LUVSM)l#Hw&L?Sr;eBx|nt&DD9ww=0z4~ z%x&oo>~vYkx{xp0MX`I|RYfkiWKPS&R^b^T?}w`JSb1Zrq}$6wym8dDC0z-c({hhW zt1bH+A|$Yd7YaVsp-%L28hB1bohx#H^c2r!ZOoUBdDPdz`_ha|>SU60n_6JXtkBFC z9t@GB?A>Z=sSPchOY5uZt-Fhwp&MS4Q$r1}xIwM_6{}b-g}Bd-v6BfuwjW3}&v4FQ zelQ#2h|(zK=_Iwr$UB!auUKcrl6NWhN;%s8zWF>@GiqvxKBI-x^Xaqc! zTY3ur;0NB^mP>_s$is=em_?iQbtoPob~hp7(=f^L`Oy3d5=0-~FWfMfbwn#VL4W-l zNYQ4I;u7i@JxV9)bfufW7|OLz$*Z6}bd_~nTQkCi98^~LW6g)OHK*0I`w}s^U$FQ{ z65?{(INP$;|3@#R5Q&$+%6-Z!spKzTTXRw!_2eGq^iUEl>}qFI$7L#5602Zwu+ zHZr;^IA5OpDL*ZnYQ5KY@hx`4_TGzQ7Lc_U-^^{c7DiVd2b_(rYx$MGM%N%*>aYZV>wde`}LS+rLo$V`PrIkU})$^wk@X?iw4Ru_I zfu85pu7G7{{r0CAfMQq&FxDwr2Ja73!>mshJ?f2OQP*HdEV)yhvQ(d6Sn^F0i+s!&$r{l&4x$rbiCe0Bmh57<7+iXtouk}soMs7Q zksLF@2BMF|o6)?8*^~E&7t-Z|U6~L5j>BHXqHi#!;A^J|`>HLwiFsU|jA#`PvSyH| zn(iUYD7|<7B6LY%*65=)ul)d#_=HR4c(09*?Mn(i4DT}yHh8w!bDSS%k`g#wbJ}cY z`#4&nMl9Qn1?+mufD^5KU*;L>m5Z#TQnewd!mHzFxT0Qf#Gt!H9>K=9R=6^rQ{&{f$)3=LSS1ir ziz?z)&V#u)flE$?#jw*|H_3JwU@F*6P@rV5Qq>O3*(5uRz?^+bV(hXGBK{?|djjQ~ z#I{V?$XMxxz`3Zw0h87}Ibfaa2ul;&Qu=#gfz7}J{pVK^6ZA?8Eew8J z0-lh7q2kiTHCS9>arK4Z^I^@V`9e+7jcpM@-NHO0l$n>M#jcep(rT#&T&e?J|+0K`R;NpfpVm z#1m_w4+U_tyN{MzAWnUiB2SSK zlGBZEJWLaF(}9xW>;;?)e;Szcx$2Vk1QVFkBAu%ky()Epw#+(Cd)zv8`lr=ze`Ot~ zJs}8*{->O=aTLYzNc%b36>^SNciwZfWI0>0&(V_QxaEI5N5fRdBb=ixSAE$&O3UcY zQQDJI|MA9pL2kV9taYOHPeG0o8o^4A($pE+dZ`pgX;y81Wu2%gWqt4$RBZhJ|8Sm` zBrNn_(v#9gCK(yG*{ z8s}-!LRIQiO`WGLun&v_<<@j1{g7e2fFrfbMJI(RMy3~8H|Yem#Io0vDZ$)@aE)n3 zrgYXI#fTyeN*u4&{82_?2DO?-=IuojqT)lD_!be2O&S82%G4~RR#@|0FT1OW1RJ3N zaN}rkXpjHx9pUQLWj=L_Pp-h(rlO>#X43GpY)5@|ZAXAm#@wF}AoIVuJt06=0<%T} z;tC=3Y4dLh0YWr$B>^aWd^&YBS|sQeAT!rhQ2Jhiln4rQb7$XKB*zzbcpZ)9@e7N# z)hh@ki;8t`@p%BqU!&`_;9%S3Yj^c&cX``gJ#ANmD-+2Nk5!JaJ`c#p{Op>9%7}K$ z{)7Of-LgF)Kxwzs5D@3Xyl>MgtQFwLA}~L?gw3wiI!B+TbxMgAy?_NBJf5{;M0cWT zQs%wMLv6H*u{%g+%N^9^LuDm_-5I;WmuNAOWh;pm{?viYj`WfhRKERa02x0ZKqOJ_ zb@tJKX`oG?a4-;@0A)7=2CfCM^^F;bt+(++C4DZKMp$$vY-PK^tw}YYEsA?ZJmhXt zEkM$dGui4o%p`gLu{p$x?iF`AgfoZc>$(wqK@62 z=A6`N&gKQ=YUaK}(GbaDkOze<}P&)k;7fBO0=oPW)S3+4j_M6yUGcKlr0## z(iccp%aq*_hfkT#m|zS=z5hdk<2_7-7h)dA>R*%S&58Z%g-k$Nr$qfE(pe(@t*7K1!czHx5y{RqUZ$PEho7R25;l-v%e?j9TSD_O{aVYY7n{ zOf%nN!@BK_Sf}P|Rde&vt6}ill7lzM9_|xC43f4V3Uz-SAPF=+qc`{NPH%pW6zrM= z`W1`QO4s3*5*>@ikyaEv`R8bT7EeAdSu0R;i+lO<-SX_T=sv`zUyC-YrH4T ztFDU0)Z7@IMHB#!3c#0~TA>AzK`(%#H?f22WFYPAv{OeOg;@W7qtl$PcAE2X$+@ue zoPX*x=Xl9k(0R_Ecbc=O@8BCyd`o&L=z1+0<#y`y}U` zo#%X})0{&j=b+AWju+AWc_*pQuxAuK$fVy%PZ-^4&VNhJzjdDT@=kLul$<~8JZH~N za~4R>yv}nz)ajJkO>)N0S~_+!F6^fXbI#70MVy+(w~K9^`m=J%zRAw%>J-~2C1<$v zoS${t`|gySHaa`Jurd;E094CSyN8`8* z`PlD>`ECnOObho3k4v$i7!E&}I+@KE7VaLLt4xC+#|k?ML>vog{C4eGuf4ssh|Yd(1J7v#s(P;&g}pj%Qb7i{{)jXxmt0b#BkG z!(NaYeCXNbH2F3~nl5lQ8OyJDQCsj|eVgZP~)x}pdJU-5ONUsM|&o*b>pk4g7 z>boMZWjJ?w>Ic1}@A1@oT71sK0C~d~d0q24-}M_Ca-2_&{mMV+Gaga$w0L&=oZCTp zw=c5&f1}?`(Lv4pj5Ahu`Ny5H z7Vrt3augAUl&HBYk?Jm{!=8z~i~)NBrpr)2Yb(e?{G zyRBl!7|VMM?p{6Dv)eM1{7Iy#pRuy%FCJd;l^;XTP6|He)9VM-6?(qHNvqKvjz+d- zIO__H)t4+Sc=V6HLA!_)Tl`|n^@K07O#_+h2Boep@?oIIxy$EiC>(T{U!$VScQ3o- zQD7`8zfUH zQGA7A6M@a->N99xh&`i04MP4gd8cDO&zoYKd$qB=d-=(SACI?#=hRqZ6mNta^?Rg? zW=aR8d&_Y6FtW85xZ%e%0grQez8Y(680|k)^IW9K z?QHgW>ZM!y^ahFqp>95BeWB;D^gp|yUeA<%_UG;Ieuq|~Gf)Ae!ZqVNubi~134JIU z;z0bIhc;}i@jH*vdjwHkh9h{oea^SQ6VMhDE>TjgB@!Z+XV)Z~dO0 zYx2lKmqPt;q33IcNM7ZzBX2~SGW|}I!7?Y%qX8+Tr%l}&F{8E5?=!^WPzt8zb zVYiR``Um5T<%2ife&>Cld1|NM`6;bP2|e?k`Nfx!ZM_xLk9^%eE%bZ@m87yvP~Dwo zw@sc_=U%qB`xr=hU0V%6=0Uz3`yl*~AomLY3$1 zR_pVa6t@54p-cN6#RWb^ke-M0@ z_xgSJ)Cok^cKb}Vnr9Ch^dMubyyT~gCZ9S*rtZ$qx;1%@I_q@iztz``IClN3QnO~~ z)^5$7CL<+Tf9=%HNK=1jGX&VlT?b=z`YSu$xRn;cxL$JST}~S6Lf>>Qclhq|-HlCP-#v-;$fjUV?W@Vk zQswc8nH<`Gqh8nG@7=d7U@Yj}Z~cw1ez}~Sbk!c)gR|Hu=^Hwf%2x1BUKI`(xRw36 z_fQ!rm=xiC%gHyRDq{AnDwrHD$PoRJ$+t+{6csmB#Yt$vZB>(RHDBV=P&k?RLR3w7 zG052-Uzl7qH7Q)c^@FJ?dZel_B@#`ox(UTPVDn&a)tKa}n}|;(K2_pV&mYh8Ayd;N zKJ9$*fksgiQi=tes-0tU@Z6ul;I*_7o zL2jv4h<%|(PA=K=9>F=Qy0M_I_yWdHGXFWebvy5q3ZIOLQr{FV#VT5h$;I$EH+N_E z=QZnGJ9%9648s$7`t1NM5HRlQ8#y$9hQLOMk{Y}#lDP>ds6pt<8-Fw(gWBWu!?UW3!d6$za~=u=Xf62%}%peUx3mi5am-Gzocubsq~W zcwEFP|3psDc(;y+S&`8M5wm?E?ZUK^iv3dK{%kiQK)2eu@XVFkyYP6b+PwI)GiCQe z^+}Qi7&+(5maq9BO$7Pm3Hifj65<_sKII|3jw@5znz9-17dUDUrGyUP`MG$i3Y?PQ z;i{hBkOVW_{_IDpCMSJE8keN`Vbx?*t2!;JtE355P44myX}U?8(yGbOpi?*(N}3;4 zO};>-p+0ua5~?*ht*RhhlFj=DI1mBBe%0iQz9CI_N%LscWcN3u=_zS`Ts66eUS|=v z1M_w=_mVU}shXVe4RHEMngvypdw)Zkev)Qk)#Sb^&H3xzzpCJ3Nw%n=Ad4~8fz4S> zKR^;Ku9}?LIjn+#Rg*74JxTiNop)_g8*1&gEoj2MvVBaosf8TqRTi zRAsF6lRFdY@4Hn=f3d~6@nMF%802IMk{6VJ++QfSDeQW5^k7Fr3f9Ui_wlll)6Y-R zef%WPs`6)}Z2lq=Pf>#9OxR(YSUy-RQTg{)he^GV=CpXr( z=)9cblKpX-D3Zz^u@%g3$A7xWiVWdU|WC)nE`cN4;dD#>kE%xpc zySzCEfV};bJ!(=gZ`AnG3o*9fd{CAun?KFPC6BeG`8!0Dj2`DI^hglKDKW~(*G?TdVv>g%>ycpYu2SS4t1-CR7_ zD){%{)w;}{Zv^mIt#U3?v;coltDJ#zy$r=bV*@M!4g8*YxR<)EQ(3J1dz6`>_|P`X zDLNnrGig?JZWj2zl$uw$?!8TJCDB4vuG?&9lI4uH!F*tXI9?4}!5ZP$08X*lH8M~s z-Pgd03{Hpn9{9+moo|DNJlwnJJ5;IIkS-J_hRhW3r`nU;6|0^)7(HHTqF57#G^|Vu zva`5&pD?;5wPgzTnLN_}E1tdu`~>wZ+XR5BFNtTJ;x({6p#xp@UiXl}>eUP5xqcnb zb#@uLtGl2xC7$q+ctWKvR--J(%CjI}Od-`tj>x2<+$B>ZUKsOsdUqEP&|9m#O2H61 ze-3P$&PQw~bQWi{8;NGM+Y@i?X7QDQSYz3Zj?y-5O&5$zjIVC!Do--zWB9DO>~yyu z`He{%%TD+E(Wr*5myx8_OtBb)vj2y=cL9&8IRE&wki{U0XCt7fC@N72f`A1jEx{~o zB*CC)y#&gyRnwx>OVw_Wwn~D#i)_OZ+G4BLR@+)@TU)g%BHog437|m4s#rzwo)s0u z3Lz2l|9of8+1+r{_V@oi&;Ot2$)1@xbLR5S%scPAw-FgQf%VoSGmbt|GwNk4O=00j z6O-@e+Z!L9cL=p?`QQNf#O|*`C;jB|S#I-NkLW|!?0UKwZ*XQ7;!FAmy-8*o9>Q}3 zhmv4id+M95mk^&+RRHe!p!GTB(WfiIy*=2QmEGLBnc1uC_aC8WYgwJ$igUEmV9|Hk z|Gx=A^7}cvs)Cb3)qy!3!Rqjp)#!13@7nN;aBqWDoZpXV*wN@?&aiJTZ1%s*y3(xM z@|Fl5TnGtevjwwC3;joUKI zZlA>MjEHJV&Pik&>xmNGAR0hPUiZmY_*&0)7C$gtT2sN=-MLQmT9sG3I}h6(yf>V{WT-Bi%OA~CX|f?Lt?i&*aCCc-_X z&f;fm!JWCGc{g$2Tl6|g=kC~YSzn@gK;A>j8$a+@6t>mXKF>srwCPIF;o)4==W2JO z$#_2Fq|S$X@Oyamp`_wqQN`$9+mX0;6=5y3EKDmDw$v2j-!Aij(1< zDY~Z<-N6h%wP?66tWpnkqVJKQQb&*@(lOq-^`9h&?qk~BRFG2|e+`iJI4^Pa(^=zd zpE?zn5R%+W*OIZWsCwgOZk}lGSAAkA@qM3swSPQm#>X1-Nxn_vYRCLd`hNYm0+IYU z7i#<<$JIa#^?YU0jCYlh%Fo5ch8ap+cMpl%kIs(g{ze~%Cj?;v;7UVEIyZj3a9t?A zK2!*`J$NMqbQ#0R4VOL23b&T|I=HxOysjqGkDL}&jt?jn*wTF=_(navwnc*$DHQ{(sCSZPAdF-T;!%xv;EG3G2}^Bg8MDr zV|mscdkB>VYv00~ZRYX_^~&vTnz9V+YwAfJpZdwE z*D9M-wZ|+pyS$jjrk|7IJ6Sl{=OxCB)yR!zLXMSI7`hqX2Np>-bn2>AKZ3Q-xNmOZ z4O5*}E>~3gjA2w_(N5()|ZnK(7uyPguB}~>KT--FI zCH`V$S=Owt#h=q-$eecJ+L{83XKO${8+8Bdj1300CUOtOZ>m;`{_6U^bJ|!g)!U@s z$=TmxGDppeIGEnt%)=c$A`Zdy(8?l}?afzLg6QKfh6e?oVk+UiezTTKiIz*5mJ8Nr zR~J+Y2$!-EUAb&wd>bEBzu>lQ^_)H018N!*b8h7GNE;qhZ-TuxXP3^{PV^5w6qeF7 z9{&7bpj{60kuM?)SoBSDavxA+*H9dPDsdMcK>tK$R`H5SRUcKvTeV;ejxAhK(S7LF zp=ca)v$uioA?A88tZ8=jt*dR-Suj3H)6Gb~c^bYR&uqbgXO4NsOZzje^Gk&(mYGlh zdmAcO&U47(&ZDxb7X^$ew1o}4MZK>oL&TVEy#6G$RwBFb6Wa^y9N9Ip`h@bTc2VbOd8l+ zVtUwIVme6a-!+M*d(9>Nvo_y3zS;k0e?3H_Qv)eg-y5DJA=pxgY9uz=Fc7ALcQP`B|a{<}IGc}9X(ftaTIB)k-9_JFINn~@o3fARa zVH2ZczHx^~pK5^YYF$_;^gMVaYwCV50vx~Up3bl}PV{xws({;vpR#_*%_!QcIrOzP zOl@~Get49xC9=5&WYk(q31IapdB=6r#SW%P=aFgYuz~ITP;@w_MYETZ%lKgL z4pnBm9m={QfjOfPZL z-A{_0%v1_$s`ZB@J`>b3&0mVS7(nb>#Iv;zs>GTkWbn`>*fCU>fejzrsm4IFtYni< zkuBNXB4Z31hj>enBUE?NAS#0s1VwNY3EKUx!i8XWe-`O=CE0QRAq0{y@s4Jy1&{B6 zKuxvv)sr&X+TzT;8bCo-`EMf^oobzd)w0{v9*A%IrU;&rct_)w0o6rw_86LM#GFn;_Y@jD4xm@sEvl`~0vdy=!@Q%~%v|v; zIE$O|@FPeM{6*8D3DZGJ%PSABff8f%{#Et2~X=a&umOozD5qQ3BJs_JD^ zRd~HbFd@+ACGl+)RV%qUYJ2eF&NV6dfKK53A?T&LbUeyz{(-wS0!@&?easG^YYBKa zNO{VtUNNKq`@e6Mvp5#g4&rVD`rdxU9VRdEa8& zU=a)J?9XCwytX^hm!Rj*N#r)fTSs6#wcc$J*ZYPn)?U@wP_%tzv`C)^Zoo_AXW=Qq z!q2!nyz!H4bb3C>4i}u0n186=kKoQd`<+vWjbLM-=;a$f^R)$wI>INNljs8zizBJ= zcX+6`t|)!u%BcA|Fnep!CTCHo;1nlzBHe-W(Fd2pM-mhZ=lH}VK#y-wm1A$b@NEZH zb|5@hT?U{HtSU_aSe<7A!0K!h09M5Wn5qrI_(!3{H9pQ({WvfkpK-oaef>>Mt{e4q z!!;*Io2$sSoUBDON|SoHCiSVTp76=iQR`gJ4S&I+H=X*C?5NigRXzusqaG&-J}9dIf|Hnx|tT&yVGI^2&Z-z z)8bT_D90?sf6{D=ZNeKUW=$KfzHeT08dyQ^3D`?b4r z!`~}|_8Ojos%h=a$?E4h>gU<&XHfkdQ-(ej8Qoq(~gDQa=GH{`L{Cb>0RgCn_}Ht5rs!DdReKz#rwUp!^0!}jp%(4T1Bklen?fwDnz6uO@g>qO_W6|WrWVnC~=aOL}8O~OQ zubU#w0M87NA(sp}WXK+qTYZu;jLpc~}7@ zYC($VX~1Rx@67!X`8BlH>&ej0&=Z_>nVyX66rTDhbF}t>^++J3DC=c2>{JQOhEhbZU{(yX{UijbC5#}q#Avg(43tE|0LridxjZLexDgM zx27e$Gc`SE0@QS$2~g8-OaSODA`ssyMAv!*l&e8;$rG8?LbRh9(ZkZK$C>*M4b=F& zrYGgSsHgDN8U>h=zoWS63zJV0(~^;;5H!s6`wtW=Cnei|Sf2EU-6 zRa<)7eZEmwjn3JnyGp|s6rEoENztzGhoQQu*`?^1yhZur0?sAyp{9+4b5$uOf1~K) zhSGRruyNOb(h;jl3s;pEHO+o3zN#~$u+n%_^+VGa8WI#bBzQ?|wQC9UO+-Wgb{4z> zN+_%I|Kg~zV9(;ac;LcbH2Q5*MInX?+SG4hhTF-RnB6_LqoV3%7UaK!=s$QKG-&EfC4)TZhkUwmx=svBWjS&c(lN+>(mFBzwNRuWNrgY`15CqLf0&^1m z=wM`J)~vDG;XX3KuW{$FIe-ktGsZ`z^~WOzs=xuwN3JmFyhM1EuH}8qJ6<5@8C)9w z30@M`H)k8h88FRCN?>mLgZ^c_(+*HD{=B(K8hwt)uA3p$15R`vm?W~R#);w?k-(3g z=vgN4lj>X}27eL~G>iKIcHM;Zh3WYO4Ct&U^%HM3zTu2w20q~8E6@Vx8N~S`x904D zGh>b_!JQi?2&*PW76ywxt@$D298k7Ib{6~f^o2z$Zn^-Wl%_(E(@3NvJN)f<6VP?( z?)WP>b(vMjh=vOy?cb>xP*&9rS>9P5Z#Pm--z($h%^#q__vqWA4`;8zi+QMM-Oax@ zP2eywDC00;N?&Np4XWHRD)-EN%B}Fd$vIB;_4*?y%Xb+(_|BrOPW>RhFZ$e>e*{l9 zg?PuLDl9>g1Jn#%tMO)N9xPzcNWV!lc8FcG#eu%+Y+yyKaOS^mfYC@_R|S2*V)ae$ zVYQ&|t6%5z5Xh>2X->Pracf;Ah??aURqf{`a>t%s*WX3auZ159Hf}*^-C=~*f0$JD z+@z~k!%qW{LaODUT3Y9_c05#DZcweTEbhjX`*k*RduFnQ`5B7$edKW0ZANlFJ3R9M z2c~gOjX+@S&W&6*&*`zJq^J!J)GuK6N+j_)Ce>yQJ(nDAGPYananMb9XayG&j=TJN_Y(@tw}uEj(ZoPJpqW zJt1*Z4epXYq^4k`4esLc3_2~zn`o9)z`~uog*oDB$W685dWgQ%G}U^CYq_dsHysrAoKy_tFzFl`nVkJfue@+8C!~7{EbzW zj&!TaWz^yKEe%X5&+2~2#4 zqunwHwI1mfII)vxA55Ir5)-nyWUhQ!dHgv_hH#)$ua@0T1v#o9M5{u{HcGYYKk*Y^ zMO8CA#~!HI*!~2ITB-{}iSgMnH2=z*gA@au4qR*r^sD;Nc*mTMODUxKS@ACB@1b>O zNtedoli3msxqhYbbzAZl8ZHP#>GR|mu>riGgW%TIwa}=j8NY>k!9?cu^o6kvSPuwK zvVS2s0aPo?s@A96U%?TxjbnD_GBZ)Vk>vGtkdRSCTNr6SF5Fv_M7|YXB-!JqP3R8i zuDqE}Fbx=hU?Rx<9OaD$?3R<%B1tvZ{*GW;FOKG$!IuKYLlmPTAA zNu9p1G>+Yo>E#~7HYhFn)LHPRz#w=$qdX%;SOfZ91=VPrC7&Y-J`Khp+G%14lQ%F$zoj>^{LHcn z6}AV9UT_k>CnJ2DqIXQHGymtrOMUCbxxkKX0!?9EQ3Ys*CNM5?iX57TD0}%mq1Bq z(FdnV30gK`=3EiHB*Z<|9GbjC4f=aVj9By;e(lBPaTc7&0)y&;9;3nvUFIuYp3O!% zrS?5vR(W9)YKO?Pq6PgJEi;RycVT3V$1a%UgU?n`=f6I8EH@YB4yrq zy5gUndZMHjmvJl$%m|>ze^}k9`$&uJK<9%Tk&eD~=VynH2Qo`|10NY}!AA=k2$!J@re_GR zaQ7>o$rm<9d!6PlgEbkRh5~B%lG^re;S0=>eR*H80#T_ud6EL?gj`FPYB9l!p-5$F zsi=A`U7+q%R8_T4oi08ei0VADxp)S+1fP(ahZ8L#RrA7<3_4bfX8VN;lr?LZM;IXc zu^KqX8p2?Qt6O(oV&uroV^^Jj`Jsq=f|#ieT}mj_{Q)yKDzL+b*Hw?v3HL{AD`eDO z3-@XEzfDMg&Hnod(GDreXNDuoFTqPkd*45 zA5_~k=N zLjj}vA~P_E!nZS1d6Vs3!j1TCO73m)rN?xXrhylkay~{uVn^iLyy%y79O}gUbO_Om zYV;3%+en&Rj$c{#s9T9Ej+T6Ns57XgBEFhN!$9%F$_lr+_0lI#O=X%i0UxproB~)Xi31u_;exjgPpxArFnyx} z)35D2Zuuv@>J}byPGTf$aJvQ0%Vpi|(h%s4$lMv`-wt2hxwW%gdh>ggLbh^rG6Mft zLSc~(=7SnB<$8uBUoY~nM+nl5dur0Kb>Rwyqp`W=0gb%oiI|6bR#IC@KfvW&B4bKF?Ab%g3mZlC|7^tZV zfyDyBewc;@8FS}C|CR}K@4~+C^7zd84ihQRx1V}U{<(KUi&1^KcxaVDjtTkm3);-& z&o^lxY`)O$ZGW&U`aF<83L84bH$^>MmNru#hX#0?ufI z6MGt9K^wypbx9`PbLUb@tj*QEjmA@G(MDlPIgi4WLHAfk&5cuhw{Fa>5Snt zK7rXl4biiBddNDOq=RatFW#2g;rG`t1OR>~_87TExL55k`(%o!+Xg~aOH!?LLfhR& zIwAL7ESm$wuY0kQS5cD1H<2IZfRMym736<^HfmL5FkojcYhfGFJE~$Bt1QPM@5ADk zN>9_7cOSuGozI;5UlX+FL#Mu;uy@&qIbrx(GQ{x7>v%nVA^O4LL%?NX4Wu@^6iWLy z+}213*TAnObEIQ1dV?k~5dQ5_6FSa`swI(*Q=RDjCQ#r+?>2#Bo#-!3;4~+iFafrt zs0lcH|6>z60|9{vobE)gGyxPMI_{z`W+P7igcgY2F_m9oGEn8WO@JHRFEW8b_U-6I z6Xc5b{L6%$`+w~hzZjn!MWUfkfU3m@Y2-22MQH5qF0QBmO*(FeJMCzjm@ zlQAmkFI{Zr)ZYn3CKS(9(AExy?_BBW)gf)cL4-w`srGa!#;Kpm_xm;?Lp6{5*#@!E zY8yzNEShl8E*A1Ot?Ki|nBJujC;FgMsYDj6w?Y@0rAy`wrOu#Nu^esVf14C*2EFb> z$NZ9aL(Z_xPNW+QJPLY+uPfgOIfLF-;2jDa@=rc|Cly;BUkN2tJw5&kL{Rm2%tWlI zbeR;B%c|OpW>%*?Fi}}NqjsYR zB2088Of4)2%Byzh`T#9&cfH%S@7tDI?eGxR?6urI+~lrz&Lzg(;QCU#D|;KIuceGJ zZ=i)9rc%wXb9^kX;&h%-bF;wsU)1bjy4ZzO?b2%D@g80V?HwF1o3YRsJVl!{CXezo z>&oqy1=E+>WbG4fC_|L zatn!(jw79D)p!LYN*bg9^xm!KEAVwEb|2e?MfqsF8-Zp9d6R9F)7Zf)|G<7WHzeYt zIeU;e$d6>#jk;X*uw^w-hN#3v4Uvx1okdMOVc3GXzE!AXuv<5XzUT%npWw+6De@ME zWs3>8%jTmp> zE%Z139E_1NA|lJnrd|l(7oH=`p4{=9ql(Wq2tR;v0Wz8)2 zE7iH5uX^gMhxuxut*NFg_HlS*1$3=?$G7D(S}X#~?zW%L57p-|1&u&Iij0-!_jEfw+4Lv9gwt6F5|^TA3GFT#6I zsiyQoTRQ$qh4(p|+jw1{fLnj{C{eLQHrs}AZdqh*FH=@G?U1rlZCc&Wb=H9WaD!WZ zipk48gvMz?`7~FY>;jQyo$@w z7B`lDn=$Qz=T^IsDod698>~+=Pp`Wq)fq^-0wvq79p*%jNXMWObJDSac*LR6Zcec7 zN9h=-_llR;(k%`Iqh3sVW+x(DEpIITeE zneP^qXb#rew5tn-OXzfI1s@+D!ft6$Yadv%@JG$PA<9K&K^LCgWO~W6?}HQ{3H%i4H}!^lGg70?u76PP<@ddF(R~rUut(2Y@skS?jQVC6OX%_ zNI(}kysMZow&gIObr^2~k|kt{kIRX)4Oz;3$#OzX!d<4Wcu7vMISW>nI%``ba2P1q z?x$g4>d)U#?~izGcV}?PEDE{9?KrL9r|;@^y0=(-G0)Wo|29**3lH1r_&9MqQXO_j zKHx;JIx95~Fo*pgVkkw-ZY#zn)B*wCzBf^ha-!jhsqEa`H$5HW&{9dvTeB63>_OPa zkES^wJQsdG9dj?p^%kv&<;h~^pz2Ie_Ha|ME1ZJ1$B+#bRXT&UXuVs-iVB?1^)W_R zSS`3HAUTx%);(`%W~C>Ponun6)Jz1#snH;CVZo)XkG#5@qu*dw>4&tS_;zMFs@Soe z#f)2E)b|t>z=@EXUpthvt{EboQ@^f4K@|nHZE+pu8-zz7h$kebEulvXYRxd@KV_Cd z>o~VUKCvn6D@WMsY*wj5@}cT8(^tnsGrXjk4p^p#9YeE>y0pb&bSfU#FIm5pv!;Oy zELadt>@(azi(sQD|A@T(@ui$$7C$+WVSG$J?lmxMuYiBndhsYy9Fg-4N5ouyU_p@| z>}LR7p*2hc_A?Nq(uLNs8+Uguy#m8~*yKwm10GqY7&v1O13Y@{(7dA*1AxYMSYleS zGXK@w#b!x&&QOwpi_BDX>VUtQV$CG4r>D>XvZwFvU;KG-){}=(Pji;}Einv5ijZ+! zpe&G_k2wQ;!+khRk)_6{8bwK6Cz;~S#=gguO3B-GF{It<_h!LyvhZ@S6UI%Q!d-_M*plO=p%2-c+#;4lx)FcT}qHCTtC!x;bm zk6=#hG60f1o*%JNzKgA{nHR~!2`S~Z?FL@Sc{~xKq?jzMSy2cc{m8lNKV`PuMh%v2 z^S?jIC9^4PQq}WiReQ>3G>SA#mFa7HR!AoEShzlQEPTowOH;=}8%>6}Y}hb3dLV0o zU5zpy#hX*dzfGV3{)TRDk94q8zGVVzk{eBcJ#f7Vun(*>0rtVCO#o)dqXf#Jza)D! z$}UhyMj~j{wrB2FL-0?0G>>cT%&?}G4>N{2Z?;2s`5cM=e6upTq6Kns)N?=AdP!bP zfp-0Km1U&$Xk(!J>5V|C_?>)v%+r16bKdHt%E+#xIDSQT=_r=d#7&agL!4MH*@KbY z9Pn=^Ywc4eISW5A#Ar{KMc(?of9~#lLc8o8rfEBOu?EOt8XIXp%&EVSuh>{l+72Q8 zST|%8!x_V@WHHHRK4!G@<)6?_|2Nc52%W#um4mjk586()owa05xAO*K`?T|EM7sxV z=NP`Coi~5lwVfxCymvdN{aCXw@8^LNA<4LjbOd=0+S1$kz_zppS<@|TW9jYF(%xUz z(k8y5r7v#l+S0$09E{A$_CG0uRVVffjj*K%PY+M@XhU-|u4wM#u%fkZkHw1Ch6=Hw zwV}aS(b`Y}R|yCk1+7JLYT z=EM9e_2CxCLH#M=QkDA-81KYxfgAJX44is+ z;?CT1_Kvzyf6Y75uyGJ@Wj*5OJQ_QT^o1&f4b)Cwe!)eC3^0@!1T#r&*9M90#VIm^ zp|`ceTf)N?Iq`u@d>5i6U;7aU9(OBh%|b5G#t55yY{kpS_q%AgyF2a9j`70MLx zkC8Jm>XvD1JB==Up~zBc&Vm^D--u0mUZfQ%vB@)s5K5d4?#4rK7tV>V#ob!sGS{7B zu1@0?Sn>-!)$@d13GFiRV@?VfFqS9!WYu-kyZdTY`j|l=&0iB_M7dJ9c8R(~(maxA z;kf=r)za`7lNV5$#oK1w?uWBw_-$vv8Tj(yYOU9B-3hVa@!O1|W^$fVth^X|GDQ-I zUc@u}N_@yMI@-e@eHF6D?&lo74#t>uLhY#y*cHRr4_G{+*OK*=YW-Yw>J$x=%qOgR^_s(Ee zIrVSwUa0zIo|!w&_1bY(A8L1;C)9?6?TjOSsBzWKxPYu_JYGx8E`;(S?U zZ3Ib8CV(L62@`lK0FqK}eh*m;juL z=_Y{u=mP@DN`9s<9I*pTSmG>N$tc{LVl`9C8hA@|(hL&`V%hN;e95ftAw`o7^Y z_r}O^h*lC3znk>xM>(fEu^UV%+lR=35cv4|TsU()%L8!sS||tPE)qD%)tJx9=D}Qe zIcftm69>na`Cq-|a3oiehT(JCrHX^0*;J|-eR_2=SoBi(-MX@Dgf5$CWeGM6oC2ol z*x}kR$gCGW>VOfS7Jgc^e)i*NoyOO1dC2g zzGK;nPiHe4)xg63&=~>}QH1KQ~f5&j~ z?wqZ{JF~gu+=k#%eGBguq#ffdvY*TAR%f?rIQ8&1c1RQoF|Fbvt%ZhgzB`d_*SK`M z)HQEw_)pvAr%2nbj`=1;yH2C(1GZ}uAMD+(D>K^l7uqZJ+2|qyWiu9;K{PCMqiovk zzisG+aj&5hZHR_eJamwT-o(qj8+y)9`M~8?$EKDOfla>x6biMs3oV`s^cG~Y_& z|7N}1YZ&FC`!>@Z66}l>Ctvea1fZFeY($!r$+4V(jbyB-nA$ICU^{;Dz2dAVc*m;M zzK*=5tZG}?3?tCfR^m>mm1$AN=~(ZdCcRO!iI2>x>p{Y?W&;l&(Pi@vAHp&|yFW~P zt9_Q3=u6xHB6)rcT@&?y3^6^|)0H)6>|2H7Fe;kpOUW+|r{$?ldWIs2v(eLS+iOYr zJXZtpjKb>GZBZN}cxsC_Js6W!cZd@Et1wH3TIcD>? zewt7WqQH(S1k%T)xXvWq`{s*WHjQ*1>+yW7QFVI;;g!H*@-fCv7DLyNL#OJf9EQAs!xuldG_ou zkvuwv#D2ta#vB{^BOwo*H2WzZZ0cc~XJ!XG%S4mrT}KMXkC}Pw=9elQ`9Tpwgv$$t zYr#v}s*2C)hW?!sT}9-}3BQ39azkH=_UC<2LDBxdV4cFzkB@1{)Dk$9fxI2>S7;^m zZRZ`&Q74miI~2rVK8EeIU5)j>MW*e})CL_^N~EpC#NdCLzrlQ+pSQ%8lJ|glR<3jg zeM%Po^ZmEkSN<2w)9^>x^8%w**fX)|ZCc)yd4II&{)>2`Dxvx- z8)%g#<~9oPSMb6a)JBy5X`_P5kN$ywwE1va@ksN`_YX18fWOi_&3)CQa!nW&4WJMp zjBwMmthSqHAn$#inYsNh*cblY=1KA1m&;8;e%@0&oBb>K z)t_qoyGdE%rl_=LztYTmV4nB8ot%pOcc+so$+5_dHv1Q3yvR!sY4%6FBmgj;umJP} z^X7Z0H?%Dz_?ZT3Xa}2&)BGo!XMWysJOTA8<&a{H-)}SI_0&_a%~F83tBD2j{_?Jg z4Us-#-XH@rjj?OUwpTqb;6vwt#; z%gQQgX!cJup)5ip-H=h{k+~rv>YSn zv=m?XP$)i~vWgTAHS>}j&E;j}1a>{oM{8fg@|*`5rEK1=mwA%iuFu&fKICbRZMaNx zqLYJyKPQO^CctrFtO;;97-a$+7lxPsjM0H6z;WSd6X1}MZvq@Ua!lYj_KQ6wDv|TU z=OzGA+wwD|^bG$n(l$JNZKTZ!&xo}34}Uk(mc20i?MU0<;VF@}0pSZ{4cOD4n-P^^% zlt8>cNNF$xsaBq8NIi6x3#mVu0Fe5v2>_|vOaMsDHvu3OF@a;vdCCNV)elSnSWPzp z4rG$T8Bkql0)VQ&0oCyEb%NJb0@ZYZ>M}qTo(7~AhA$SV&WB=|v_C+-_m}|ne#Zd- zb?L1JP`AFG0VvCdu=++Ba2iNh>O05q#7%`jX617%?i7{z<@4(?j_qcCJzxSr?GGjZ z)b2C^p!PEp0BZA0fcaHp0>Esh2>`QeOhEIi%7mC-+)Gc<0L{K&;^h(TQ$1 z0U(w%0U);71c2BpCQt}`)|wC?TW$hOvnNdei2cI^fY^zm>6l^HYeinIX?BIC+2xvM z|Dy$2saf{TSi=F<)`Oh&e|%r9GQld*4+MJ^>24ge$-`6 z-uDd`R=+U;V715ufK{Cd0IOR}09gIV1c23bCcx~v!UO=-w@m<0U1S1)s=@@u0?&=L zs$+P#8i0YH{ww@-?mq;t^V$vouZO7ucx~IbFT7l`)roaOn7EgUT@U9L8vip(h#3YF|S&afk z{gWKQlF$9ilRMQeHNI+`TR+(d_t^4+IIRh_+A7oXF2gcLXTw%%)jx(l`V}Qz^%O6C zS` zgRFE7*TVsD~pSt_}iD${KSq33_dBl}3!zy}k#9Klk=pnK+HO3ssa2CIGeJRx(; zbL#(05Q9q@XRP9D*C7U9Z6wyXD`$>z5l*~?xKsaoe&GY@C1_S`5ID1n!S$2LyK2TL zyNv7DU;rMbw(7&`YZzgf6je^($LOBm+j6yD3+I&8*=))rY0dj zO>^dE&4RR_&_Ap8qw(&(;P!2;!EB~)OQ_|``u1D$r2DpzSh{bwsFerk+l>FizWwUP zjJ|ne_BoA_Om35D)G80if}$pdHz5F+VE<*^{uO!B-G={^>UMR_fx0~X|FFvoW~RFA z@@=Z|a#u^cuwdwHh~OzKHWYqV^6xKsc+ko>WRWaND)tfq%f(oysqM}|v{!Nt3=2)I z8cAR6)Q)}s>ns*4@u->S%}zedT zN|io0@XKZn_+;Rp;*Qd)KfcS)yj8} zS+y;wm3eA%^k`f_5y4fNyrummN@tLBoB2Wv=%q9->qh)2Db#}+Ek(&jG%ou1w*V{3knR8Ls3_o z&KHcd4wOCl%#qTLzf4Hd?L*|p*_a@nM~aoVH;>C1O_8p|-O}?JjlYo_Ev#O5g}Wbd z{@lz5Hrhjaw2GR3M9B*#_B^=gbz7%ay_6J{R3dbF(C^-a$YCyB#8!?L?q*nX9!e<9U zMGu%A>gK8HP4$HtJ=jb!ZV%KDuf^(t7uVD4!BMF;N`aI%GM1Jfn{H>*8)g+R;SD;M zeU7j&4c1N0iL`TY&(iC5DAn(sN`Kl}FINzdMu^X9gw)R=2RaF(RWGv+rfpX88qy4X z;DJzYdg{&1;4^RPC7&T;w2m)5#*~?ZOLeu!6z|kOZc85Nmdqn7`3F-ndq38QGEXrF z%F74PyZxFBq4bb^uvxXRZU1lsxb$Iu=xpt?JDT7Nbx(}%=a0_(@Pn9y|Z|X@zN6CwLgB-0~BZYO#@)+L^|O&9YFx@P;sw!^&Em->5!fK z6dJK*W{KPM_6vNGRZ`OIf8B({ZCYtVC6?O+cWqkVC*LvU?c2aqSp%E>_od3Z$1RJV zi~SUH3*<&qC-#?t(h@kl?=1AKKXaz;5qr*mDmk`0mF?S|AqebK5^8;nqyK`I3M?Xp z9W1>Uir;Ir3=mv40AS>i8+o{LfeayJg-fB~lY?=hr;)9gkGu57?N0eC#;%9vVH)Mi z6FeusY`f@gsO|b-8^wF1wXC4QhFM@6u~Sy@YFwiK8D-e>dn!4r>c$wEq->@{pJB@C zUebfXHF0$EUg4sF3c8^!s=V=CzrxzhE9z2dhg6(u(@IH`&Z!|2W+TStCLlyACV*_^ zY7^)KWyS7qUX@I+qJhLWyUStAi`aj8)?X+N`Py9Ya~f=cVW28Sfu(L}S{14*Fzq)B z@^8H2-ive(?jj*L=iN?|{%@}LdT z^wppoK~wG62aNcW<+E=Fk&2C{Lu#)E1Wz=^U=Z)8#y5!$w+Kt{OL4C`Q~cld$A6mF zpN>?2K27!K1=uG0w!>9Ysnx9?WoKt}N0Vtk-8qX=rZ4PVi4e+()q`L;2m4FcR%8LG z27#ZR_UBWrk-I^^s{pTx~?yZzD>P-c^`{z*z5`o6)A?NU+1Aoska?m=1Tb|?nc98CF z#rif91H(*f(9ardQ{O_U@rH1PaK?6L3OHj5&q|rPgQBOc4ktrYWddi!EL=h>pWG4cM z%D41&-awnD@(t?!l;mmK)#Pn7xr5kLEL-`f^jU%JrOuQcG<%1dxFZC4P5Y3SQ$Hp;<#V-MB}&{fjlSfMdipuqOnEE#schoa3wrf3Kl%PYy6;}n zyBBEfdIDTvK=!rd{75;kG-m$-$<*C6sZ&kbqcIuvt9yLH@x}Fe(x{zk%XYOzO`ftx zKcDbZsqR&(u>9igs*!*t�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 literal 0 HcmV?d00001 From 863be4ae58f0a2283d9acf448868ea02dd597963 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 10 Sep 2010 22:48:19 +0200 Subject: [PATCH 149/237] no idea what I changed, check commit --- powder-64-sse3-opengl | Bin 287768 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 powder-64-sse3-opengl diff --git a/powder-64-sse3-opengl b/powder-64-sse3-opengl deleted file mode 100755 index 5253a6a333cb45c2c442d10f60c5e45254340e4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287768 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

~a`Cc9zFtPbNDS zr|73!pA8rMRNAS)DN30>= z8QaL7*wK)mgeN)Hz-Nq;|MJCK))(mG!w=J_s680l5myKyF_9M9oF$asv~k(*lO5)* zKeu>LL{IZm8yu6tb~cC>A$|eZU_*Y2-=}PHHsrff8uGh5y-wgX33o+pr`amnp+gYfM+lyGFP=8OW*hiC&FL}L4Z_~F;G}5-{ zM-jT|+lnF|rA#!2<`$PU#Wuz2$7ySpFyjW=bLYUXc${f}V-Sl5a_R&%O!9s2dqYKJCGjez8WMmYXt=qffU#ukn#Xe&=q# z^PR%HcY@yrhd{|Yfn=)o9b?oMIIaLF1dO3qTkA+kTMVK8hN}f=e$@?u*d{ClMw5%P zvr$hhD&H)m@ZZ1!r!8^N84ob>b{~wKU^e6S&Y+OIa5R%)}5ZsH}B1b4-}Q0 z){h2^QL!TZ^Pqu@o7j^2#m4_$ny5&1d~r$b1S6%ZuWYS_VD$JHFs!Wo z`2x8ga}J6Z*(et3kwR_a)^-HPR;4AE{>vBJRG8Pgpi->+@rE$UsT6m<)&<=n{w=ObO(k4j37|!`H*MjU)9<@wxJI z@wk0?UoIXd6Q(bZfT1mmF3mf%V4y#5$HM-(hy1w*Y3&!MWV?-wKEmkb1WI=3DNivA z3F^$6e!X_l5?OHkjGRf@i%b+OJvSEd2L$72MlU|*o_>kbZ0{nMQmw(hgYt>1-~85dVW>7 z*VQM#?B;I+)#S1!B;hlP8k;E-&W z#j_n-*gxFsn3c^-Z5=uowjC&v$@RM8qfIFc{A1%N_pqWSR?m*rNqDBIJd+V zgq}a+&wg)bT!`b`jB^P+f5w^5+8HO|I5*>HLeHP^xe&+#aloim;0-F(7VcSU$7%z#T^s+^1 zj^N<1GMX+W_QB$;dtvwR*p$5b#TOtb%+QtuSa})9lVY`@Hch6MMeBTX>+f4PlesTc zTf$jVY>rtlIHmB9@Hhowmt!leD4VQF4TULJG!(j6 z%@(GqlPA_(M^$06wua>$ZX(i_S~azcTr(QQCapuV_d&zP!=i;bI|p-2*wGObVqk64s< zI+$M=zJQCk!6UxdmZFk~Fv|fWr3=9GGuoFRZD_Lu^i2q;t=#db;n~sp3qOrENo>~U z_+AzMsxaK0xj1-9QAr)e$~@g9K*RnnDWTeA?#+EQrYhy)qELk5KQC>O{Q$g~RXNwh z;v`4dP4-KROLi2OY>7pRVq3@0-7!p-#^TOj>$SPlzk=)81t0)$$ zVtUK?l6rsc0e{Z>k<+PTSX_O^cxRww3nluDsY!Yy*UZm}21-ujOO{TMc7sxCTcvu6`#vX~7w zDxV9o(W6A#^hp!uBs=(FS#`5~`dhEcPRhKRUMJS^WJ^dRWGzZn2e<`6ADu6}GJ6Gi zxxteC4Bz7LbJ;JbFJ{2icXjq!^+gQK7eR~^72i(_AZKamzkOw+vS*dP{EL$uuEjJxkcmzFK7oxulXJ`jrgALFM@JHfu|Yh>`t9jzo_!(tbll zWWO@S7x_4eoeE-eu~2UDU6qF!sLIqRm;ACum$8|bG6Z3BP6%O%l%~o>ek|q4UvW77 zc@|B@R4VBxGlJ_+Ttg70kFBj^@wPLIFt0F+_Qv{i#txG$8y}f{1J3PwB=UZ0Xp2)% zdsPZ&j~c2Q=9LXw@cQr-Jg%@hQ1W`LL9bX+M!Bur1*H2VOYd-ua%zw7WdP8LRBzE; zH*ZFFq>&)VGz`nXqp0P`INE^JjMKEabnsC={ax-x<-Uvk!@PZq@@2bTvdfRM0~@F! zBcq30`V$tIJ%i1sYilmxPUr=JlA~2iMhlY;uCcnjO^ZMFJO2w?>*sWL*y4X+GQFr| zQ*jC8Ked-e7{w@u0=+87C9#yGB;ih9h@0I=5?eO*JHs^NF1ozn@dGL=2N2wlR+z}8 zoXCNcfU~7oq@Kmuf!1zzv5S0V*Qb;o^W}Y_Eqx8r1gHUfseq({*WMPZhg4}7$Q?p4 z0Ky6}ja`mh!|$GA$i}C2O{`(O^Jw(P^nZ}z&_(xVzA&DBRrmCfeDx7M*;A$d@l*}>jRvYH@&;^jyU}%$qghwzigI)G-8Je>we{4>wDP&>)XrzroU_X2iWnh zH}TUy)vTmdEXHW^dRh1}G1ONrkZ*}y+^ki+F@R={Hw#{|(RFLxUb z`2qpa>j44xx*JZoGQ0d1*IHr z<&B?va@a&;xW}h|TjnDu)P1Zw)*#;rY5H{mj3o?<)w6jEHKxcyU4#upSh@w;l1Csh z`~t#+Y0)7#;qB1o2q4NYE;%Yij18||T?Wbwyv_@okQOh}rw?nb_Iw(>3(c~23(nF- zDi?M1nXF$fb(ld3_=Y~WianS)Q4%?r4ed$O94!H5AE7#Sa--wK_Z;Sx2?6;}%ypQV z2?1pV_c_c9&xUat$|v-Rj>$f{gu^vjO7VQpJvW}Y-Wp`CFrKjYK7JW&BnXeVOF{;Wc!*ImBHc=RWiRWS z-jAKS2C^U1{?5Gv>l$7;`w%4_|CKT%W(}R3VqmmnhBc4cbWt zJcxse%H*A+87}F=cmv@iStk!rf-%(@L*VcR_|4Fk`Wf0@5hiHM-XKzq$>vafk{Xf1 z-^rM4E@tG+pzn7NU4I<`({}K4dkgivB|{}tiO!7ZTRI=S?m*z-9^=+>TD6=ejVUze z14;HD`N6iy^dmT?9~IwzpfN)-`Waf#FHJ@}xx3$=oyOcFE`C``#YGIveHt%zsI)Rq zPKV;}@}0?RC(tqwV(h0V6-;W=`Uz;r{G7hzS=G?#EBNZ(2jq9e{VGh&&jV&#@x6k4 znV;|FgNz=y>5|s3kGPGGN7kb=Ch02)CDD~5tnX!B>)XrzrsrAy0d~C0gP&nKY~kpz z6MlM_nl{GLN7cfuE&H2H)g}K8l_S*qr{bIY82 z@>@(7YRd8V%Z$|(h3ZpUpAkc<^F_&kv)3Xcv%f0uo-jMO8z^vGzP2V7iggS265tt& zT%nj2?8fSURVdb_G*@A9TO5nU*~k{@d9nIHY`fj@V#5k`e_pE8vjHLerqRUf! zt&Z1o>4OSg&R;%PBuYst#A-kSgQf2j7E^Qsgy-_--4C0v^g1#bg)Sf4nWdNFUN6sB zA>X>*p;d?$1xrzTfi9Jvsga{2a#3823eq+g$vYqQC2}i#c=g%7LS;SaZW)?y-k0&6e-!4#C7Vn+;hm41e|I4Ks=QSs$NX+{=%XOo zSSbPWN6wlZ>J0Lr%13fe$&4qZ3g!$+i=2gnk%Q(dC8VybMF^u+Y$WG+<7ENDU?sY7 zyfG`SDAa&{@-ZrEPDrM`u&-`BDQSvyRi0MyIQhblq=vqp#d}2JzJ-bRiiYtz6ZP$` z^ieE3#oExO<3-vPu=_>wNEPvQ#o9QLwY%QFfdsr_)g-T2Z3!5U+OJq)2&B=Mw}nUU zINJWq{JnuXnZB8-NtL)o4+UNkJj| zY4*WW=!dOaJLvD5g3Lf~(pwmq4VV!QeKI3p@PLSU{6jS8KV{f%+z(wv!~0P>4qfr5 zd~R?p|F?8StwMB~b=PC~8eL2Hl|K)4nx36+_e>EiygLsJ^}X>XLi7ATgxIIX2hDqa zM6}%|=`vHWzv0P ze5O>PFN5Zm_@EhO@9X}zakCV-XOA1H=eMP0Lz`!)abxcnbXO`>QpWMohX|+l$0vik zhlH}FRtg^-{THY8p1EjH(1L+N@(>rp_J0tI%r-ygM8BF zn}WZV!~b6f!j+PRgWZlcl&wjAQFtth2CytR+~SyogCkxzO&nR`m|><#7h>z3-_b7U z{=EAz9fVN!t**VcdlK$9ZTB?XJ8bt1+^^#{TYhLaCo{xX&{Nfj7X@0cr+%S@G7lD& zY!>YVx+?gdXCABp8((ZQR#9?%p)cnLyOb?Ny=RkXA(Rjm<=RDDKXi(EqD^EmZ>5UJv^_&3NyRPno_nOd?@uV!TUjok zk{<@(e_AhoN!jP?_oE4CQ!ey?X3#=WMU~j-a#3mdGjlr1o*5_2KzrO-^m+H6HhrFC z8UCN>a{_W(^kLk|H5E%R9$ghwBQe$TiV~RYXc;e4i}bI2Q>MOJc0rkAGDC^?lv>@h zs+Gn{YWWvJs^ERa;rp$S?@B(4cNEjvnZ7Z3sry;OnV&&*-GCLgyZP7kAKl;z(^1J3<^V0Z#gkl z-z97XsP?6xY$>R|vyExB3{B=z1 z;wa2lh^H~-za5y*stzkO$J~(da;J#D?c2zrM0@i_1srSZw>s*Zw{?-LP(Px#z!s{* zSYEq;pjw3vVYoT!P(_vQn58|K{>TmlgtfTJq@-Ee*AXpOImze_STuT{#i*#{o#K*D z&EzSnZv}YcK!BL9Jt$KXuk3uRq@sjMV@UnS-Mz{3p`Lbkg8rN6tF03&nJBI4 zU(?N{gR650Cam&LQjy5QqGqQuldu62V^Z=bm#`cO?pm49_~SwziJS2K7CF9?;r3gis)lf*pbEM*`-H24qqBWZwy=|N-iSr z*-x<|!)SEfMNawSY}EV>@NAi<>(O6$v0kk9dOjr?Wxh52Q&p`bw_U+ee8t(?pFQED zU9REMRE!&yf31f7*rcyi1%<7TKkv9^D8`^<(|Uwzj+#TlLmERj2g2i_qq2B6%naNw zyIe4XqONb>PTx1b z>?&B5d5=Fg7;{$&Ypt-&d@>!IU@zUK%+FPB!F-GumEy#vW;Y#?_AAsx^{*mZ?pv%C zdEa`L07q!QCM}Lj{&23fT#i7*Ov1a`_TqfocIMXM+1(NTlI_%6WQ;V~K5+|oD1V{% zlksh~JW@z4PPz%>EYlD z@FK}dFStqx5nVT0-)bQ?n>Z2h*=~1rMM9Y6c2`#=gjsHP_1lFVc`diQdVfNg<#t!6 zAmXKrW+_9&z2H%unh<8iyQ`<2>_|5~!97E{-PL|1!*MtwB^Ee=gfJ`KUA z?q_fZT%E7E7J@-+M!<~xLTp#zu>(DJwdDJysFIyu>p0)#*uSP6~v*ZjFiGCK(M zVM1jsHwXnfh+?_j)g!ZK3F3;#mfKyu^74)_%k8e7nNaCCp_aq@^Sn=-a<+JZ^htu}`4)^pQ+|Nu?o8m{i>+w_2i1{!d z8qrbxe1tT)%at>{T74pildwe8OgK_YT*ai)D*nmn2|!-yigGhtx+b%=mUG#zA);?q zkuBS8q;NuG4ryK`KYe()xJu=Yu)>~IVdZrasO9up z3RoEfM+J_N_UhXG0#EIikO;FWF`l;a{mjZ2QNYNcCU+{?rZQ%}n)v}4!B}B#{L9J| zwlZx}naUf*r_P61juR>vp!%|~ARc^m%DWw4ijCh|`5Wx~R@p)96k#R8O%9)yli5X# zRpw{~yD`cS72Um|vwBC1H0heffaP_!Y>wTvcaIw}0SC4*L@7oF3 z>(hF29nh!sneIyUX+1Jid|L16DH5ag?5Fj)T?HmfV6vS&GfCD%F0XJjCHayhTtvyU zg}g#`U}icc%1J@}wcdAF;4+SA?b6u6{qQl)U!nk9*wg9}+@skDKjK zLa6O=XBdg0wg8yJ3#&$t;;GA1=Mb`?}R4R#B8uM|H^Vm~QvR!*^Ks=GMvm zsT#R@VUGB_9cQ*)0}j~p7)BSxusANoT4)tNqwJW)XoQ|qfg1Ne3gl8JcFqqH8)|zP zgXhXIlN+AOF-xmx!(mK%5_IPU%e;5o1J@m#3tYuA@zm#4$Hk` zJYiQ?JfXHMt>PI~3a{;s{1W=Rk{dX)yF05B|L=5C+wPYojlkc{7%Sw_;+Y9Xcc`Su+!o@F|<=lB3bve zWlOQ`4P_<3u~vSxA}bZ3YVkI@`U6V-irM8oLq8}sxMwV1{cEwn)aSd>D-fhJr3t5q z?vE^n&{pmlBd|5pf@l1bi5 zb(@t6YM+~Gn#Ao|0IcsRm)fwMQ{wD)So5q@vOPQ})%86k#Y9E?vfVPDHrpyiHu$5x}Ng0IJt_ z^I;N}nYbPmWW``Ro5N|9qUxeIq3LO<9W33%BxgTf5}?c0Qo_?UgI_7YDk#T@3LJ;5 zb86Kx>)d@@yCX%dylYA5FlXOQCq1JlmU%Ch+Q7I8C!tlIa>sil>Oj*NJ3=aWg5{gh z!@QSVPB>2#Ng{1oDX`%)WFXFI5uO$q$|Jx|!FY)De_74cLo@ynhf- zrRgE>1WBw_T*-qAVb_G^gB^LU94{6XE1pUxUwqcC*bj30ZefQ+x>Lh{$J6Rwopi7n zcxl*8TspzzYVIbZAPEbdMrI|c>_+E(k|v3Z7(R&`V`Lb^YxSL4(Qa!FsioVoE_n`|jA*jWceW>3Bu*7%4vwoxWD@RYIILVYeCn6VkN0 zwL-vk{CDIwClvX#WzB*!=2T1*35@k?NMjeTH<-VH*QIXH5$Fg`j9Jg7Sys!0K69_HQgWqc+-vX1ZAFdI*GFI18}d>2FI@eQA`midMOtNk%Rr!LWGX`W_L~ zUm$9|xXk{XeT2Nf_|;(g=eHP0Wd!nY6q@ZbLTgt+B`i$b&A62lW%y=S-6E8**fOvy zlhGR;d4#j2>avZZZbo5FOk6|<@FV9ACvS(W>1_)*DV&e0nlzm=G$ngxEP6=1RwFYS z{>@5l`{2T+b;sv@cm)^*88Mkp%ZOQ;$=qbm68&WwIUh^IBrK%02e(Xqek@&DL!Cew z{sgKw3yGOVj09;*Glb{ZV7>0ARo=~UE99DerOXXHH#09M-b^iq4ko4+lx#8nFj zF@5md93p5oGjkJdT~S+V+6W?K3jiH?!iPoyIJ)QEW>w-Zj|&s-{oz7yTv6NHJ{5`R zj67j?Hr6iS&77KqfUGqH{4F71MgajU39w5Fwe}2s;huK|Kx=-9c$5SBOG4g9a5{p$ z!XwthgCQ@n4O5!G-Yy#OA8N}tp=Bkyv{vu9a#E7CwKi|;Nf38prpe{`@nFX~VFWxo zVzs9})88_0{7Eb((J8@xVONii=umAJ6+e)8gr&1@;5AF0&FP&0UN|zqYmYk#l*an5 z;HS*V-i|AJNOU4cd>dytz3I_*j!r)+Yu#>b>5Ib4TI^l)I2u5qwvtlcN!OR(9_^^r zDi1T>!>%&&or&<$AFEL&W8zwi_b;|ah&@o~UjX>AR@nvHEGJ!mSI{axKOrrY{<9y+ zVRo-)`5>7IBPq}`d3g&F0ZKH^RB>@UKHcdS7w6;CoqffXC9W)S<%kRIKknUlMa#K# zy>Ek3uJ!EWKEOtqLaU4Q{pxNFqGS;o=kk)qAtZgFj}Z1%_L6g(&nSG(>vGdOVEm)@ z`Ulu=MFfg<-W9$?4ka2=^nP-{7)i<9lxIG2$j2FJE{A)Ek$d^{W4_3Nq@cIhxmPqr ztP9Vc9mPha1+8A7q4xM-iaW*`p1&8HpE`HmXOFb{oz4E-orQV3f1j_2pwf@nlXCx85H2d;B$f1)e=bX`R*4XuqgG}XYhdiaIZd2J z#!qFJ@7o}Zu1yJF?q;mB`$8Wl`$8W=jNxoHM9*&;2Y*J&K1d6HIp+(3Z>a>ZOV8l; zS+VguNA4_k8p{M^vGKTL;~XgW&;6;(`20$C;3A#dzEt+DA`C#hCsVh*k1q@liPekZ za-p7E7|v0bnMBa2UtJhpl~jAzB8bySius>f?=91hetR9|W`Ui1NS;x(Q0f7Fhzu zdZ`h0u&VMag|+d7LdKF!&Z^dW+~(GLOw5A#T90wVloai@zFO~zIa=>=BSoSH-uVdK zrj)rw^j5}Caak6>{xVYEO6Cb!T92`~5x3n+&I#lkOU}E=*^saGob1+mTH>}olly8t zzmui)`A&}3vtXFkr(h&1X!%-?n}JdU6dzC!$=wW;BB1zyayw8WK(QobJ#TSqeQp8D zO+dK`C}V&!1}Js;sv~wq=$3-;u8%(@RRwgB00eh^{K){SbtCjh)gI$4hk?pkTwY%d zEenlRS3V>`Mhf@UBLS|CBV|d|L_Y$~pCfG}#p%!cG>kL~g6ft~N_=z?d_q@zLRWm! zzS^2GS*{?@OHAIf6HYyl*MTHSDj&QJNd_?!w{hcanMW z>CAa!Lf(57l)R9)N;$Y?{0t7*x63^wabgj*vAnUnFn9~HgFqIR+-Aq4_XBKB%RVs9 zYhK`+)6zmRwhh;Xyca59SMeTgzLLWAg4LIuNvSO})P%b-yH-j@0`UvXmGR}asaYjXVOM8op%9-1s z?vaYXYyAb}pt^3^^755UvT(riF@NwY1;s3kgQ&sgfo(>Hw@BA2E?wWVUPvW*Wv^j# z&*r^POWq@9w|HJ7klIlyE1;uBemX1qm}FO2uiH&B-`XsGd9zTNtg&_pXBBvK1;@CX zXy1@`#Zr+ER!%=AmVB%5fS)5e9|Ov-p^EpQ1C{W!`*tnYQ^MHh+%wvh|m?SD9%^$sLNgfFp!4uLVxj zqylqV-@1-PPj60C?+lZPzD%*lyy0{>rPa<#{nGCs`SKefft>u0@ub zzDXujDF7lPRI5maJ%uit@d#a_KO%qFJ2wm?YcZ{Qn=rDbw(Q%yz5t`(x(Bf(Mz?S0 zcu_e z0RNW+Lu+5B*GHQ$PEX|ms4ugq#<2JJLtcluw3*ITp`zC@sdD8&_KeF_K=k-Q ziv}X8H)nn(x+7Y}9cD+MTy7QR91Px#;7t!pyHu-e?nfyQLrM6B7?-O&GKwBR_7PnJ z+>m!Lw1IFf#5KAedBUDi>f%Y)b)~1Qchehc(xlI1v+{|ez#w*TVb{qkMmwS>fz#+3 z7ti{*K(YkSBA$*e!npU`mdm80{{*4uoR(L>MPyq)z(@JIDu0IZ6pBZtfn@5+8$Vbl z~tW#>khmSu^;A#j!JyM#v%f^dWDHk?_lJ42^?aCI0_Lg@5Bt)d!7qif0o<3YLX z#;BpZ-31^1qMK<{YPuh{v@6c|c#IAawHWMF5==c#@r!SR<%{y6v897ZD{~81xe0p4 z3OZ@≧kw-GQ`<9dO;usnsN~!7{qa2@HL)xb!wIb1mQ<`qBx!c)UQ)c^1nn&}Ebp zIWn+xB!>m!R@SzLP>gs~mbRqG=_GYq#g?U(ZAcOhi-}&$DeK2%ZLgKo+@6*X;C=cY z^Tr=K9q|2f)l$`vD4eQ#;NCn(*nY8HbrR_r z@)vzd=0{85>ELq>k0v)Ngvn9$E12(&LUKZ%nWlUI) zv(9|;>MiPu=Uu)3Ci%V06Y51T^XoZm42E*kW21`-n@7a!7O(V4bH8{`e1KQxVzUKr zb@VOqLu!W^QU3Mfmtk-IL-~J$ADPQ@ctoExT83XtYLAfFdxZk5EPo`sBKM7Ugda-b z$Ul&&b9OO3{k_yA8iV`dcW{kg9dAJ84HnCLzGDt;O+^1p1fw;>n3x0T8Y3QEtB||D zkao0IpSYMN_A&jW*DDn)xisA{k}3O!qUEwGyNoIbTRoh7w)*>fW@7E6xGUR<0uY>DXL9Oy#wh>mmW35J{=5LUVSM)l#Hw&L?Sr;eBx|nt&DD9ww=0z4~ z%x&oo>~vYkx{xp0MX`I|RYfkiWKPS&R^b^T?}w`JSb1Zrq}$6wym8dDC0z-c({hhW zt1bH+A|$Yd7YaVsp-%L28hB1bohx#H^c2r!ZOoUBdDPdz`_ha|>SU60n_6JXtkBFC z9t@GB?A>Z=sSPchOY5uZt-Fhwp&MS4Q$r1}xIwM_6{}b-g}Bd-v6BfuwjW3}&v4FQ zelQ#2h|(zK=_Iwr$UB!auUKcrl6NWhN;%s8zWF>@GiqvxKBI-x^Xaqc! zTY3ur;0NB^mP>_s$is=em_?iQbtoPob~hp7(=f^L`Oy3d5=0-~FWfMfbwn#VL4W-l zNYQ4I;u7i@JxV9)bfufW7|OLz$*Z6}bd_~nTQkCi98^~LW6g)OHK*0I`w}s^U$FQ{ z65?{(INP$;|3@#R5Q&$+%6-Z!spKzTTXRw!_2eGq^iUEl>}qFI$7L#5602Zwu+ zHZr;^IA5OpDL*ZnYQ5KY@hx`4_TGzQ7Lc_U-^^{c7DiVd2b_(rYx$MGM%N%*>aYZV>wde`}LS+rLo$V`PrIkU})$^wk@X?iw4Ru_I zfu85pu7G7{{r0CAfMQq&FxDwr2Ja73!>mshJ?f2OQP*HdEV)yhvQ(d6Sn^F0i+s!&$r{l&4x$rbiCe0Bmh57<7+iXtouk}soMs7Q zksLF@2BMF|o6)?8*^~E&7t-Z|U6~L5j>BHXqHi#!;A^J|`>HLwiFsU|jA#`PvSyH| zn(iUYD7|<7B6LY%*65=)ul)d#_=HR4c(09*?Mn(i4DT}yHh8w!bDSS%k`g#wbJ}cY z`#4&nMl9Qn1?+mufD^5KU*;L>m5Z#TQnewd!mHzFxT0Qf#Gt!H9>K=9R=6^rQ{&{f$)3=LSS1ir ziz?z)&V#u)flE$?#jw*|H_3JwU@F*6P@rV5Qq>O3*(5uRz?^+bV(hXGBK{?|djjQ~ z#I{V?$XMxxz`3Zw0h87}Ibfaa2ul;&Qu=#gfz7}J{pVK^6ZA?8Eew8J z0-lh7q2kiTHCS9>arK4Z^I^@V`9e+7jcpM@-NHO0l$n>M#jcep(rT#&T&e?J|+0K`R;NpfpVm z#1m_w4+U_tyN{MzAWnUiB2SSK zlGBZEJWLaF(}9xW>;;?)e;Szcx$2Vk1QVFkBAu%ky()Epw#+(Cd)zv8`lr=ze`Ot~ zJs}8*{->O=aTLYzNc%b36>^SNciwZfWI0>0&(V_QxaEI5N5fRdBb=ixSAE$&O3UcY zQQDJI|MA9pL2kV9taYOHPeG0o8o^4A($pE+dZ`pgX;y81Wu2%gWqt4$RBZhJ|8Sm` zBrNn_(v#9gCK(yG*{ z8s}-!LRIQiO`WGLun&v_<<@j1{g7e2fFrfbMJI(RMy3~8H|Yem#Io0vDZ$)@aE)n3 zrgYXI#fTyeN*u4&{82_?2DO?-=IuojqT)lD_!be2O&S82%G4~RR#@|0FT1OW1RJ3N zaN}rkXpjHx9pUQLWj=L_Pp-h(rlO>#X43GpY)5@|ZAXAm#@wF}AoIVuJt06=0<%T} z;tC=3Y4dLh0YWr$B>^aWd^&YBS|sQeAT!rhQ2Jhiln4rQb7$XKB*zzbcpZ)9@e7N# z)hh@ki;8t`@p%BqU!&`_;9%S3Yj^c&cX``gJ#ANmD-+2Nk5!JaJ`c#p{Op>9%7}K$ z{)7Of-LgF)Kxwzs5D@3Xyl>MgtQFwLA}~L?gw3wiI!B+TbxMgAy?_NBJf5{;M0cWT zQs%wMLv6H*u{%g+%N^9^LuDm_-5I;WmuNAOWh;pm{?viYj`WfhRKERa02x0ZKqOJ_ zb@tJKX`oG?a4-;@0A)7=2CfCM^^F;bt+(++C4DZKMp$$vY-PK^tw}YYEsA?ZJmhXt zEkM$dGui4o%p`gLu{p$x?iF`AgfoZc>$(wqK@62 z=A6`N&gKQ=YUaK}(GbaDkOze<}P&)k;7fBO0=oPW)S3+4j_M6yUGcKlr0## z(iccp%aq*_hfkT#m|zS=z5hdk<2_7-7h)dA>R*%S&58Z%g-k$Nr$qfE(pe(@t*7K1!czHx5y{RqUZ$PEho7R25;l-v%e?j9TSD_O{aVYY7n{ zOf%nN!@BK_Sf}P|Rde&vt6}ill7lzM9_|xC43f4V3Uz-SAPF=+qc`{NPH%pW6zrM= z`W1`QO4s3*5*>@ikyaEv`R8bT7EeAdSu0R;i+lO<-SX_T=sv`zUyC-YrH4T ztFDU0)Z7@IMHB#!3c#0~TA>AzK`(%#H?f22WFYPAv{OeOg;@W7qtl$PcAE2X$+@ue zoPX*x=Xl9k(0R_Ecbc=O@8BCyd`o&L=z1+0<#y`y}U` zo#%X})0{&j=b+AWju+AWc_*pQuxAuK$fVy%PZ-^4&VNhJzjdDT@=kLul$<~8JZH~N za~4R>yv}nz)ajJkO>)N0S~_+!F6^fXbI#70MVy+(w~K9^`m=J%zRAw%>J-~2C1<$v zoS${t`|gySHaa`Jurd;E094CSyN8`8* z`PlD>`ECnOObho3k4v$i7!E&}I+@KE7VaLLt4xC+#|k?ML>vog{C4eGuf4ssh|Yd(1J7v#s(P;&g}pj%Qb7i{{)jXxmt0b#BkG z!(NaYeCXNbH2F3~nl5lQ8OyJDQCsj|eVgZP~)x}pdJU-5ONUsM|&o*b>pk4g7 z>boMZWjJ?w>Ic1}@A1@oT71sK0C~d~d0q24-}M_Ca-2_&{mMV+Gaga$w0L&=oZCTp zw=c5&f1}?`(Lv4pj5Ahu`Ny5H z7Vrt3augAUl&HBYk?Jm{!=8z~i~)NBrpr)2Yb(e?{G zyRBl!7|VMM?p{6Dv)eM1{7Iy#pRuy%FCJd;l^;XTP6|He)9VM-6?(qHNvqKvjz+d- zIO__H)t4+Sc=V6HLA!_)Tl`|n^@K07O#_+h2Boep@?oIIxy$EiC>(T{U!$VScQ3o- zQD7`8zfUH zQGA7A6M@a->N99xh&`i04MP4gd8cDO&zoYKd$qB=d-=(SACI?#=hRqZ6mNta^?Rg? zW=aR8d&_Y6FtW85xZ%e%0grQez8Y(680|k)^IW9K z?QHgW>ZM!y^ahFqp>95BeWB;D^gp|yUeA<%_UG;Ieuq|~Gf)Ae!ZqVNubi~134JIU z;z0bIhc;}i@jH*vdjwHkh9h{oea^SQ6VMhDE>TjgB@!Z+XV)Z~dO0 zYx2lKmqPt;q33IcNM7ZzBX2~SGW|}I!7?Y%qX8+Tr%l}&F{8E5?=!^WPzt8zb zVYiR``Um5T<%2ife&>Cld1|NM`6;bP2|e?k`Nfx!ZM_xLk9^%eE%bZ@m87yvP~Dwo zw@sc_=U%qB`xr=hU0V%6=0Uz3`yl*~AomLY3$1 zR_pVa6t@54p-cN6#RWb^ke-M0@ z_xgSJ)Cok^cKb}Vnr9Ch^dMubyyT~gCZ9S*rtZ$qx;1%@I_q@iztz``IClN3QnO~~ z)^5$7CL<+Tf9=%HNK=1jGX&VlT?b=z`YSu$xRn;cxL$JST}~S6Lf>>Qclhq|-HlCP-#v-;$fjUV?W@Vk zQswc8nH<`Gqh8nG@7=d7U@Yj}Z~cw1ez}~Sbk!c)gR|Hu=^Hwf%2x1BUKI`(xRw36 z_fQ!rm=xiC%gHyRDq{AnDwrHD$PoRJ$+t+{6csmB#Yt$vZB>(RHDBV=P&k?RLR3w7 zG052-Uzl7qH7Q)c^@FJ?dZel_B@#`ox(UTPVDn&a)tKa}n}|;(K2_pV&mYh8Ayd;N zKJ9$*fksgiQi=tes-0tU@Z6ul;I*_7o zL2jv4h<%|(PA=K=9>F=Qy0M_I_yWdHGXFWebvy5q3ZIOLQr{FV#VT5h$;I$EH+N_E z=QZnGJ9%9648s$7`t1NM5HRlQ8#y$9hQLOMk{Y}#lDP>ds6pt<8-Fw(gWBWu!?UW3!d6$za~=u=Xf62%}%peUx3mi5am-Gzocubsq~W zcwEFP|3psDc(;y+S&`8M5wm?E?ZUK^iv3dK{%kiQK)2eu@XVFkyYP6b+PwI)GiCQe z^+}Qi7&+(5maq9BO$7Pm3Hifj65<_sKII|3jw@5znz9-17dUDUrGyUP`MG$i3Y?PQ z;i{hBkOVW_{_IDpCMSJE8keN`Vbx?*t2!;JtE355P44myX}U?8(yGbOpi?*(N}3;4 zO};>-p+0ua5~?*ht*RhhlFj=DI1mBBe%0iQz9CI_N%LscWcN3u=_zS`Ts66eUS|=v z1M_w=_mVU}shXVe4RHEMngvypdw)Zkev)Qk)#Sb^&H3xzzpCJ3Nw%n=Ad4~8fz4S> zKR^;Ku9}?LIjn+#Rg*74JxTiNop)_g8*1&gEoj2MvVBaosf8TqRTi zRAsF6lRFdY@4Hn=f3d~6@nMF%802IMk{6VJ++QfSDeQW5^k7Fr3f9Ui_wlll)6Y-R zef%WPs`6)}Z2lq=Pf>#9OxR(YSUy-RQTg{)he^GV=CpXr( z=)9cblKpX-D3Zz^u@%g3$A7xWiVWdU|WC)nE`cN4;dD#>kE%xpc zySzCEfV};bJ!(=gZ`AnG3o*9fd{CAun?KFPC6BeG`8!0Dj2`DI^hglKDKW~(*G?TdVv>g%>ycpYu2SS4t1-CR7_ zD){%{)w;}{Zv^mIt#U3?v;coltDJ#zy$r=bV*@M!4g8*YxR<)EQ(3J1dz6`>_|P`X zDLNnrGig?JZWj2zl$uw$?!8TJCDB4vuG?&9lI4uH!F*tXI9?4}!5ZP$08X*lH8M~s z-Pgd03{Hpn9{9+moo|DNJlwnJJ5;IIkS-J_hRhW3r`nU;6|0^)7(HHTqF57#G^|Vu zva`5&pD?;5wPgzTnLN_}E1tdu`~>wZ+XR5BFNtTJ;x({6p#xp@UiXl}>eUP5xqcnb zb#@uLtGl2xC7$q+ctWKvR--J(%CjI}Od-`tj>x2<+$B>ZUKsOsdUqEP&|9m#O2H61 ze-3P$&PQw~bQWi{8;NGM+Y@i?X7QDQSYz3Zj?y-5O&5$zjIVC!Do--zWB9DO>~yyu z`He{%%TD+E(Wr*5myx8_OtBb)vj2y=cL9&8IRE&wki{U0XCt7fC@N72f`A1jEx{~o zB*CC)y#&gyRnwx>OVw_Wwn~D#i)_OZ+G4BLR@+)@TU)g%BHog437|m4s#rzwo)s0u z3Lz2l|9of8+1+r{_V@oi&;Ot2$)1@xbLR5S%scPAw-FgQf%VoSGmbt|GwNk4O=00j z6O-@e+Z!L9cL=p?`QQNf#O|*`C;jB|S#I-NkLW|!?0UKwZ*XQ7;!FAmy-8*o9>Q}3 zhmv4id+M95mk^&+RRHe!p!GTB(WfiIy*=2QmEGLBnc1uC_aC8WYgwJ$igUEmV9|Hk z|Gx=A^7}cvs)Cb3)qy!3!Rqjp)#!13@7nN;aBqWDoZpXV*wN@?&aiJTZ1%s*y3(xM z@|Fl5TnGtevjwwC3;joUKI zZlA>MjEHJV&Pik&>xmNGAR0hPUiZmY_*&0)7C$gtT2sN=-MLQmT9sG3I}h6(yf>V{WT-Bi%OA~CX|f?Lt?i&*aCCc-_X z&f;fm!JWCGc{g$2Tl6|g=kC~YSzn@gK;A>j8$a+@6t>mXKF>srwCPIF;o)4==W2JO z$#_2Fq|S$X@Oyamp`_wqQN`$9+mX0;6=5y3EKDmDw$v2j-!Aij(1< zDY~Z<-N6h%wP?66tWpnkqVJKQQb&*@(lOq-^`9h&?qk~BRFG2|e+`iJI4^Pa(^=zd zpE?zn5R%+W*OIZWsCwgOZk}lGSAAkA@qM3swSPQm#>X1-Nxn_vYRCLd`hNYm0+IYU z7i#<<$JIa#^?YU0jCYlh%Fo5ch8ap+cMpl%kIs(g{ze~%Cj?;v;7UVEIyZj3a9t?A zK2!*`J$NMqbQ#0R4VOL23b&T|I=HxOysjqGkDL}&jt?jn*wTF=_(navwnc*$DHQ{(sCSZPAdF-T;!%xv;EG3G2}^Bg8MDr zV|mscdkB>VYv00~ZRYX_^~&vTnz9V+YwAfJpZdwE z*D9M-wZ|+pyS$jjrk|7IJ6Sl{=OxCB)yR!zLXMSI7`hqX2Np>-bn2>AKZ3Q-xNmOZ z4O5*}E>~3gjA2w_(N5()|ZnK(7uyPguB}~>KT--FI zCH`V$S=Owt#h=q-$eecJ+L{83XKO${8+8Bdj1300CUOtOZ>m;`{_6U^bJ|!g)!U@s z$=TmxGDppeIGEnt%)=c$A`Zdy(8?l}?afzLg6QKfh6e?oVk+UiezTTKiIz*5mJ8Nr zR~J+Y2$!-EUAb&wd>bEBzu>lQ^_)H018N!*b8h7GNE;qhZ-TuxXP3^{PV^5w6qeF7 z9{&7bpj{60kuM?)SoBSDavxA+*H9dPDsdMcK>tK$R`H5SRUcKvTeV;ejxAhK(S7LF zp=ca)v$uioA?A88tZ8=jt*dR-Suj3H)6Gb~c^bYR&uqbgXO4NsOZzje^Gk&(mYGlh zdmAcO&U47(&ZDxb7X^$ew1o}4MZK>oL&TVEy#6G$RwBFb6Wa^y9N9Ip`h@bTc2VbOd8l+ zVtUwIVme6a-!+M*d(9>Nvo_y3zS;k0e?3H_Qv)eg-y5DJA=pxgY9uz=Fc7ALcQP`B|a{<}IGc}9X(ftaTIB)k-9_JFINn~@o3fARa zVH2ZczHx^~pK5^YYF$_;^gMVaYwCV50vx~Up3bl}PV{xws({;vpR#_*%_!QcIrOzP zOl@~Get49xC9=5&WYk(q31IapdB=6r#SW%P=aFgYuz~ITP;@w_MYETZ%lKgL z4pnBm9m={QfjOfPZL z-A{_0%v1_$s`ZB@J`>b3&0mVS7(nb>#Iv;zs>GTkWbn`>*fCU>fejzrsm4IFtYni< zkuBNXB4Z31hj>enBUE?NAS#0s1VwNY3EKUx!i8XWe-`O=CE0QRAq0{y@s4Jy1&{B6 zKuxvv)sr&X+TzT;8bCo-`EMf^oobzd)w0{v9*A%IrU;&rct_)w0o6rw_86LM#GFn;_Y@jD4xm@sEvl`~0vdy=!@Q%~%v|v; zIE$O|@FPeM{6*8D3DZGJ%PSABff8f%{#Et2~X=a&umOozD5qQ3BJs_JD^ zRd~HbFd@+ACGl+)RV%qUYJ2eF&NV6dfKK53A?T&LbUeyz{(-wS0!@&?easG^YYBKa zNO{VtUNNKq`@e6Mvp5#g4&rVD`rdxU9VRdEa8& zU=a)J?9XCwytX^hm!Rj*N#r)fTSs6#wcc$J*ZYPn)?U@wP_%tzv`C)^Zoo_AXW=Qq z!q2!nyz!H4bb3C>4i}u0n186=kKoQd`<+vWjbLM-=;a$f^R)$wI>INNljs8zizBJ= zcX+6`t|)!u%BcA|Fnep!CTCHo;1nlzBHe-W(Fd2pM-mhZ=lH}VK#y-wm1A$b@NEZH zb|5@hT?U{HtSU_aSe<7A!0K!h09M5Wn5qrI_(!3{H9pQ({WvfkpK-oaef>>Mt{e4q z!!;*Io2$sSoUBDON|SoHCiSVTp76=iQR`gJ4S&I+H=X*C?5NigRXzusqaG&-J}9dIf|Hnx|tT&yVGI^2&Z-z z)8bT_D90?sf6{D=ZNeKUW=$KfzHeT08dyQ^3D`?b4r z!`~}|_8Ojos%h=a$?E4h>gU<&XHfkdQ-(ej8Qoq(~gDQa=GH{`L{Cb>0RgCn_}Ht5rs!DdReKz#rwUp!^0!}jp%(4T1Bklen?fwDnz6uO@g>qO_W6|WrWVnC~=aOL}8O~OQ zubU#w0M87NA(sp}WXK+qTYZu;jLpc~}7@ zYC($VX~1Rx@67!X`8BlH>&ej0&=Z_>nVyX66rTDhbF}t>^++J3DC=c2>{JQOhEhbZU{(yX{UijbC5#}q#Avg(43tE|0LridxjZLexDgM zx27e$Gc`SE0@QS$2~g8-OaSODA`ssyMAv!*l&e8;$rG8?LbRh9(ZkZK$C>*M4b=F& zrYGgSsHgDN8U>h=zoWS63zJV0(~^;;5H!s6`wtW=Cnei|Sf2EU-6 zRa<)7eZEmwjn3JnyGp|s6rEoENztzGhoQQu*`?^1yhZur0?sAyp{9+4b5$uOf1~K) zhSGRruyNOb(h;jl3s;pEHO+o3zN#~$u+n%_^+VGa8WI#bBzQ?|wQC9UO+-Wgb{4z> zN+_%I|Kg~zV9(;ac;LcbH2Q5*MInX?+SG4hhTF-RnB6_LqoV3%7UaK!=s$QKG-&EfC4)TZhkUwmx=svBWjS&c(lN+>(mFBzwNRuWNrgY`15CqLf0&^1m z=wM`J)~vDG;XX3KuW{$FIe-ktGsZ`z^~WOzs=xuwN3JmFyhM1EuH}8qJ6<5@8C)9w z30@M`H)k8h88FRCN?>mLgZ^c_(+*HD{=B(K8hwt)uA3p$15R`vm?W~R#);w?k-(3g z=vgN4lj>X}27eL~G>iKIcHM;Zh3WYO4Ct&U^%HM3zTu2w20q~8E6@Vx8N~S`x904D zGh>b_!JQi?2&*PW76ywxt@$D298k7Ib{6~f^o2z$Zn^-Wl%_(E(@3NvJN)f<6VP?( z?)WP>b(vMjh=vOy?cb>xP*&9rS>9P5Z#Pm--z($h%^#q__vqWA4`;8zi+QMM-Oax@ zP2eywDC00;N?&Np4XWHRD)-EN%B}Fd$vIB;_4*?y%Xb+(_|BrOPW>RhFZ$e>e*{l9 zg?PuLDl9>g1Jn#%tMO)N9xPzcNWV!lc8FcG#eu%+Y+yyKaOS^mfYC@_R|S2*V)ae$ zVYQ&|t6%5z5Xh>2X->Pracf;Ah??aURqf{`a>t%s*WX3auZ159Hf}*^-C=~*f0$JD z+@z~k!%qW{LaODUT3Y9_c05#DZcweTEbhjX`*k*RduFnQ`5B7$edKW0ZANlFJ3R9M z2c~gOjX+@S&W&6*&*`zJq^J!J)GuK6N+j_)Ce>yQJ(nDAGPYananMb9XayG&j=TJN_Y(@tw}uEj(ZoPJpqW zJt1*Z4epXYq^4k`4esLc3_2~zn`o9)z`~uog*oDB$W685dWgQ%G}U^CYq_dsHysrAoKy_tFzFl`nVkJfue@+8C!~7{EbzW zj&!TaWz^yKEe%X5&+2~2#4 zqunwHwI1mfII)vxA55Ir5)-nyWUhQ!dHgv_hH#)$ua@0T1v#o9M5{u{HcGYYKk*Y^ zMO8CA#~!HI*!~2ITB-{}iSgMnH2=z*gA@au4qR*r^sD;Nc*mTMODUxKS@ACB@1b>O zNtedoli3msxqhYbbzAZl8ZHP#>GR|mu>riGgW%TIwa}=j8NY>k!9?cu^o6kvSPuwK zvVS2s0aPo?s@A96U%?TxjbnD_GBZ)Vk>vGtkdRSCTNr6SF5Fv_M7|YXB-!JqP3R8i zuDqE}Fbx=hU?Rx<9OaD$?3R<%B1tvZ{*GW;FOKG$!IuKYLlmPTAA zNu9p1G>+Yo>E#~7HYhFn)LHPRz#w=$qdX%;SOfZ91=VPrC7&Y-J`Khp+G%14lQ%F$zoj>^{LHcn z6}AV9UT_k>CnJ2DqIXQHGymtrOMUCbxxkKX0!?9EQ3Ys*CNM5?iX57TD0}%mq1Bq z(FdnV30gK`=3EiHB*Z<|9GbjC4f=aVj9By;e(lBPaTc7&0)y&;9;3nvUFIuYp3O!% zrS?5vR(W9)YKO?Pq6PgJEi;RycVT3V$1a%UgU?n`=f6I8EH@YB4yrq zy5gUndZMHjmvJl$%m|>ze^}k9`$&uJK<9%Tk&eD~=VynH2Qo`|10NY}!AA=k2$!J@re_GR zaQ7>o$rm<9d!6PlgEbkRh5~B%lG^re;S0=>eR*H80#T_ud6EL?gj`FPYB9l!p-5$F zsi=A`U7+q%R8_T4oi08ei0VADxp)S+1fP(ahZ8L#RrA7<3_4bfX8VN;lr?LZM;IXc zu^KqX8p2?Qt6O(oV&uroV^^Jj`Jsq=f|#ieT}mj_{Q)yKDzL+b*Hw?v3HL{AD`eDO z3-@XEzfDMg&Hnod(GDreXNDuoFTqPkd*45 zA5_~k=N zLjj}vA~P_E!nZS1d6Vs3!j1TCO73m)rN?xXrhylkay~{uVn^iLyy%y79O}gUbO_Om zYV;3%+en&Rj$c{#s9T9Ej+T6Ns57XgBEFhN!$9%F$_lr+_0lI#O=X%i0UxproB~)Xi31u_;exjgPpxArFnyx} z)35D2Zuuv@>J}byPGTf$aJvQ0%Vpi|(h%s4$lMv`-wt2hxwW%gdh>ggLbh^rG6Mft zLSc~(=7SnB<$8uBUoY~nM+nl5dur0Kb>Rwyqp`W=0gb%oiI|6bR#IC@KfvW&B4bKF?Ab%g3mZlC|7^tZV zfyDyBewc;@8FS}C|CR}K@4~+C^7zd84ihQRx1V}U{<(KUi&1^KcxaVDjtTkm3);-& z&o^lxY`)O$ZGW&U`aF<83L84bH$^>MmNru#hX#0?ufI z6MGt9K^wypbx9`PbLUb@tj*QEjmA@G(MDlPIgi4WLHAfk&5cuhw{Fa>5Snt zK7rXl4biiBddNDOq=RatFW#2g;rG`t1OR>~_87TExL55k`(%o!+Xg~aOH!?LLfhR& zIwAL7ESm$wuY0kQS5cD1H<2IZfRMym736<^HfmL5FkojcYhfGFJE~$Bt1QPM@5ADk zN>9_7cOSuGozI;5UlX+FL#Mu;uy@&qIbrx(GQ{x7>v%nVA^O4LL%?NX4Wu@^6iWLy z+}213*TAnObEIQ1dV?k~5dQ5_6FSa`swI(*Q=RDjCQ#r+?>2#Bo#-!3;4~+iFafrt zs0lcH|6>z60|9{vobE)gGyxPMI_{z`W+P7igcgY2F_m9oGEn8WO@JHRFEW8b_U-6I z6Xc5b{L6%$`+w~hzZjn!MWUfkfU3m@Y2-22MQH5qF0QBmO*(FeJMCzjm@ zlQAmkFI{Zr)ZYn3CKS(9(AExy?_BBW)gf)cL4-w`srGa!#;Kpm_xm;?Lp6{5*#@!E zY8yzNEShl8E*A1Ot?Ki|nBJujC;FgMsYDj6w?Y@0rAy`wrOu#Nu^esVf14C*2EFb> z$NZ9aL(Z_xPNW+QJPLY+uPfgOIfLF-;2jDa@=rc|Cly;BUkN2tJw5&kL{Rm2%tWlI zbeR;B%c|OpW>%*?Fi}}NqjsYR zB2088Of4)2%Byzh`T#9&cfH%S@7tDI?eGxR?6urI+~lrz&Lzg(;QCU#D|;KIuceGJ zZ=i)9rc%wXb9^kX;&h%-bF;wsU)1bjy4ZzO?b2%D@g80V?HwF1o3YRsJVl!{CXezo z>&oqy1=E+>WbG4fC_|L zatn!(jw79D)p!LYN*bg9^xm!KEAVwEb|2e?MfqsF8-Zp9d6R9F)7Zf)|G<7WHzeYt zIeU;e$d6>#jk;X*uw^w-hN#3v4Uvx1okdMOVc3GXzE!AXuv<5XzUT%npWw+6De@ME zWs3>8%jTmp> zE%Z139E_1NA|lJnrd|l(7oH=`p4{=9ql(Wq2tR;v0Wz8)2 zE7iH5uX^gMhxuxut*NFg_HlS*1$3=?$G7D(S}X#~?zW%L57p-|1&u&Iij0-!_jEfw+4Lv9gwt6F5|^TA3GFT#6I zsiyQoTRQ$qh4(p|+jw1{fLnj{C{eLQHrs}AZdqh*FH=@G?U1rlZCc&Wb=H9WaD!WZ zipk48gvMz?`7~FY>;jQyo$@w z7B`lDn=$Qz=T^IsDod698>~+=Pp`Wq)fq^-0wvq79p*%jNXMWObJDSac*LR6Zcec7 zN9h=-_llR;(k%`Iqh3sVW+x(DEpIITeE zneP^qXb#rew5tn-OXzfI1s@+D!ft6$Yadv%@JG$PA<9K&K^LCgWO~W6?}HQ{3H%i4H}!^lGg70?u76PP<@ddF(R~rUut(2Y@skS?jQVC6OX%_ zNI(}kysMZow&gIObr^2~k|kt{kIRX)4Oz;3$#OzX!d<4Wcu7vMISW>nI%``ba2P1q z?x$g4>d)U#?~izGcV}?PEDE{9?KrL9r|;@^y0=(-G0)Wo|29**3lH1r_&9MqQXO_j zKHx;JIx95~Fo*pgVkkw-ZY#zn)B*wCzBf^ha-!jhsqEa`H$5HW&{9dvTeB63>_OPa zkES^wJQsdG9dj?p^%kv&<;h~^pz2Ie_Ha|ME1ZJ1$B+#bRXT&UXuVs-iVB?1^)W_R zSS`3HAUTx%);(`%W~C>Ponun6)Jz1#snH;CVZo)XkG#5@qu*dw>4&tS_;zMFs@Soe z#f)2E)b|t>z=@EXUpthvt{EboQ@^f4K@|nHZE+pu8-zz7h$kebEulvXYRxd@KV_Cd z>o~VUKCvn6D@WMsY*wj5@}cT8(^tnsGrXjk4p^p#9YeE>y0pb&bSfU#FIm5pv!;Oy zELadt>@(azi(sQD|A@T(@ui$$7C$+WVSG$J?lmxMuYiBndhsYy9Fg-4N5ouyU_p@| z>}LR7p*2hc_A?Nq(uLNs8+Uguy#m8~*yKwm10GqY7&v1O13Y@{(7dA*1AxYMSYleS zGXK@w#b!x&&QOwpi_BDX>VUtQV$CG4r>D>XvZwFvU;KG-){}=(Pji;}Einv5ijZ+! zpe&G_k2wQ;!+khRk)_6{8bwK6Cz;~S#=gguO3B-GF{It<_h!LyvhZ@S6UI%Q!d-_M*plO=p%2-c+#;4lx)FcT}qHCTtC!x;bm zk6=#hG60f1o*%JNzKgA{nHR~!2`S~Z?FL@Sc{~xKq?jzMSy2cc{m8lNKV`PuMh%v2 z^S?jIC9^4PQq}WiReQ>3G>SA#mFa7HR!AoEShzlQEPTowOH;=}8%>6}Y}hb3dLV0o zU5zpy#hX*dzfGV3{)TRDk94q8zGVVzk{eBcJ#f7Vun(*>0rtVCO#o)dqXf#Jza)D! z$}UhyMj~j{wrB2FL-0?0G>>cT%&?}G4>N{2Z?;2s`5cM=e6upTq6Kns)N?=AdP!bP zfp-0Km1U&$Xk(!J>5V|C_?>)v%+r16bKdHt%E+#xIDSQT=_r=d#7&agL!4MH*@KbY z9Pn=^Ywc4eISW5A#Ar{KMc(?of9~#lLc8o8rfEBOu?EOt8XIXp%&EVSuh>{l+72Q8 zST|%8!x_V@WHHHRK4!G@<)6?_|2Nc52%W#um4mjk586()owa05xAO*K`?T|EM7sxV z=NP`Coi~5lwVfxCymvdN{aCXw@8^LNA<4LjbOd=0+S1$kz_zppS<@|TW9jYF(%xUz z(k8y5r7v#l+S0$09E{A$_CG0uRVVffjj*K%PY+M@XhU-|u4wM#u%fkZkHw1Ch6=Hw zwV}aS(b`Y}R|yCk1+7JLYT z=EM9e_2CxCLH#M=QkDA-81KYxfgAJX44is+ z;?CT1_Kvzyf6Y75uyGJ@Wj*5OJQ_QT^o1&f4b)Cwe!)eC3^0@!1T#r&*9M90#VIm^ zp|`ceTf)N?Iq`u@d>5i6U;7aU9(OBh%|b5G#t55yY{kpS_q%AgyF2a9j`70MLx zkC8Jm>XvD1JB==Up~zBc&Vm^D--u0mUZfQ%vB@)s5K5d4?#4rK7tV>V#ob!sGS{7B zu1@0?Sn>-!)$@d13GFiRV@?VfFqS9!WYu-kyZdTY`j|l=&0iB_M7dJ9c8R(~(maxA z;kf=r)za`7lNV5$#oK1w?uWBw_-$vv8Tj(yYOU9B-3hVa@!O1|W^$fVth^X|GDQ-I zUc@u}N_@yMI@-e@eHF6D?&lo74#t>uLhY#y*cHRr4_G{+*OK*=YW-Yw>J$x=%qOgR^_s(Ee zIrVSwUa0zIo|!w&_1bY(A8L1;C)9?6?TjOSsBzWKxPYu_JYGx8E`;(S?U zZ3Ib8CV(L62@`lK0FqK}eh*m;juL z=_Y{u=mP@DN`9s<9I*pTSmG>N$tc{LVl`9C8hA@|(hL&`V%hN;e95ftAw`o7^Y z_r}O^h*lC3znk>xM>(fEu^UV%+lR=35cv4|TsU()%L8!sS||tPE)qD%)tJx9=D}Qe zIcftm69>na`Cq-|a3oiehT(JCrHX^0*;J|-eR_2=SoBi(-MX@Dgf5$CWeGM6oC2ol z*x}kR$gCGW>VOfS7Jgc^e)i*NoyOO1dC2g zzGK;nPiHe4)xg63&=~>}QH1KQ~f5&j~ z?wqZ{JF~gu+=k#%eGBguq#ffdvY*TAR%f?rIQ8&1c1RQoF|Fbvt%ZhgzB`d_*SK`M z)HQEw_)pvAr%2nbj`=1;yH2C(1GZ}uAMD+(D>K^l7uqZJ+2|qyWiu9;K{PCMqiovk zzisG+aj&5hZHR_eJamwT-o(qj8+y)9`M~8?$EKDOfla>x6biMs3oV`s^cG~Y_& z|7N}1YZ&FC`!>@Z66}l>Ctvea1fZFeY($!r$+4V(jbyB-nA$ICU^{;Dz2dAVc*m;M zzK*=5tZG}?3?tCfR^m>mm1$AN=~(ZdCcRO!iI2>x>p{Y?W&;l&(Pi@vAHp&|yFW~P zt9_Q3=u6xHB6)rcT@&?y3^6^|)0H)6>|2H7Fe;kpOUW+|r{$?ldWIs2v(eLS+iOYr zJXZtpjKb>GZBZN}cxsC_Js6W!cZd@Et1wH3TIcD>? zewt7WqQH(S1k%T)xXvWq`{s*WHjQ*1>+yW7QFVI;;g!H*@-fCv7DLyNL#OJf9EQAs!xuldG_ou zkvuwv#D2ta#vB{^BOwo*H2WzZZ0cc~XJ!XG%S4mrT}KMXkC}Pw=9elQ`9Tpwgv$$t zYr#v}s*2C)hW?!sT}9-}3BQ39azkH=_UC<2LDBxdV4cFzkB@1{)Dk$9fxI2>S7;^m zZRZ`&Q74miI~2rVK8EeIU5)j>MW*e})CL_^N~EpC#NdCLzrlQ+pSQ%8lJ|glR<3jg zeM%Po^ZmEkSN<2w)9^>x^8%w**fX)|ZCc)yd4II&{)>2`Dxvx- z8)%g#<~9oPSMb6a)JBy5X`_P5kN$ywwE1va@ksN`_YX18fWOi_&3)CQa!nW&4WJMp zjBwMmthSqHAn$#inYsNh*cblY=1KA1m&;8;e%@0&oBb>K z)t_qoyGdE%rl_=LztYTmV4nB8ot%pOcc+so$+5_dHv1Q3yvR!sY4%6FBmgj;umJP} z^X7Z0H?%Dz_?ZT3Xa}2&)BGo!XMWysJOTA8<&a{H-)}SI_0&_a%~F83tBD2j{_?Jg z4Us-#-XH@rjj?OUwpTqb;6vwt#; z%gQQgX!cJup)5ip-H=h{k+~rv>YSn zv=m?XP$)i~vWgTAHS>}j&E;j}1a>{oM{8fg@|*`5rEK1=mwA%iuFu&fKICbRZMaNx zqLYJyKPQO^CctrFtO;;97-a$+7lxPsjM0H6z;WSd6X1}MZvq@Ua!lYj_KQ6wDv|TU z=OzGA+wwD|^bG$n(l$JNZKTZ!&xo}34}Uk(mc20i?MU0<;VF@}0pSZ{4cOD4n-P^^% zlt8>cNNF$xsaBq8NIi6x3#mVu0Fe5v2>_|vOaMsDHvu3OF@a;vdCCNV)elSnSWPzp z4rG$T8Bkql0)VQ&0oCyEb%NJb0@ZYZ>M}qTo(7~AhA$SV&WB=|v_C+-_m}|ne#Zd- zb?L1JP`AFG0VvCdu=++Ba2iNh>O05q#7%`jX617%?i7{z<@4(?j_qcCJzxSr?GGjZ z)b2C^p!PEp0BZA0fcaHp0>Esh2>`QeOhEIi%7mC-+)Gc<0L{K&;^h(TQ$1 z0U(w%0U);71c2BpCQt}`)|wC?TW$hOvnNdei2cI^fY^zm>6l^HYeinIX?BIC+2xvM z|Dy$2saf{TSi=F<)`Oh&e|%r9GQld*4+MJ^>24ge$-`6 z-uDd`R=+U;V715ufK{Cd0IOR}09gIV1c23bCcx~v!UO=-w@m<0U1S1)s=@@u0?&=L zs$+P#8i0YH{ww@-?mq;t^V$vouZO7ucx~IbFT7l`)roaOn7EgUT@U9L8vip(h#3YF|S&afk z{gWKQlF$9ilRMQeHNI+`TR+(d_t^4+IIRh_+A7oXF2gcLXTw%%)jx(l`V}Qz^%O6C zS` zgRFE7*TVsD~pSt_}iD${KSq33_dBl}3!zy}k#9Klk=pnK+HO3ssa2CIGeJRx(; zbL#(05Q9q@XRP9D*C7U9Z6wyXD`$>z5l*~?xKsaoe&GY@C1_S`5ID1n!S$2LyK2TL zyNv7DU;rMbw(7&`YZzgf6je^($LOBm+j6yD3+I&8*=))rY0dj zO>^dE&4RR_&_Ap8qw(&(;P!2;!EB~)OQ_|``u1D$r2DpzSh{bwsFerk+l>FizWwUP zjJ|ne_BoA_Om35D)G80if}$pdHz5F+VE<*^{uO!B-G={^>UMR_fx0~X|FFvoW~RFA z@@=Z|a#u^cuwdwHh~OzKHWYqV^6xKsc+ko>WRWaND)tfq%f(oysqM}|v{!Nt3=2)I z8cAR6)Q)}s>ns*4@u->S%}zedT zN|io0@XKZn_+;Rp;*Qd)KfcS)yj8} zS+y;wm3eA%^k`f_5y4fNyrummN@tLBoB2Wv=%q9->qh)2Db#}+Ek(&jG%ou1w*V{3knR8Ls3_o z&KHcd4wOCl%#qTLzf4Hd?L*|p*_a@nM~aoVH;>C1O_8p|-O}?JjlYo_Ev#O5g}Wbd z{@lz5Hrhjaw2GR3M9B*#_B^=gbz7%ay_6J{R3dbF(C^-a$YCyB#8!?L?q*nX9!e<9U zMGu%A>gK8HP4$HtJ=jb!ZV%KDuf^(t7uVD4!BMF;N`aI%GM1Jfn{H>*8)g+R;SD;M zeU7j&4c1N0iL`TY&(iC5DAn(sN`Kl}FINzdMu^X9gw)R=2RaF(RWGv+rfpX88qy4X z;DJzYdg{&1;4^RPC7&T;w2m)5#*~?ZOLeu!6z|kOZc85Nmdqn7`3F-ndq38QGEXrF z%F74PyZxFBq4bb^uvxXRZU1lsxb$Iu=xpt?JDT7Nbx(}%=a0_(@Pn9y|Z|X@zN6CwLgB-0~BZYO#@)+L^|O&9YFx@P;sw!^&Em->5!fK z6dJK*W{KPM_6vNGRZ`OIf8B({ZCYtVC6?O+cWqkVC*LvU?c2aqSp%E>_od3Z$1RJV zi~SUH3*<&qC-#?t(h@kl?=1AKKXaz;5qr*mDmk`0mF?S|AqebK5^8;nqyK`I3M?Xp z9W1>Uir;Ir3=mv40AS>i8+o{LfeayJg-fB~lY?=hr;)9gkGu57?N0eC#;%9vVH)Mi z6FeusY`f@gsO|b-8^wF1wXC4QhFM@6u~Sy@YFwiK8D-e>dn!4r>c$wEq->@{pJB@C zUebfXHF0$EUg4sF3c8^!s=V=CzrxzhE9z2dhg6(u(@IH`&Z!|2W+TStCLlyACV*_^ zY7^)KWyS7qUX@I+qJhLWyUStAi`aj8)?X+N`Py9Ya~f=cVW28Sfu(L}S{14*Fzq)B z@^8H2-ive(?jj*L=iN?|{%@}LdT z^wppoK~wG62aNcW<+E=Fk&2C{Lu#)E1Wz=^U=Z)8#y5!$w+Kt{OL4C`Q~cld$A6mF zpN>?2K27!K1=uG0w!>9Ysnx9?WoKt}N0Vtk-8qX=rZ4PVi4e+()q`L;2m4FcR%8LG z27#ZR_UBWrk-I^^s{pTx~?yZzD>P-c^`{z*z5`o6)A?NU+1Aoska?m=1Tb|?nc98CF z#rif91H(*f(9ardQ{O_U@rH1PaK?6L3OHj5&q|rPgQBOc4ktrYWddi!EL=h>pWG4cM z%D41&-awnD@(t?!l;mmK)#Pn7xr5kLEL-`f^jU%JrOuQcG<%1dxFZC4P5Y3SQ$Hp;<#V-MB}&{fjlSfMdipuqOnEE#schoa3wrf3Kl%PYy6;}n zyBBEfdIDTvK=!rd{75;kG-m$-$<*C6sZ&kbqcIuvt9yLH@x}Fe(x{zk%XYOzO`ftx zKcDbZsqR&(u>9igs*!*t�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 From 812cf13ed22ff195be6c5bdaa90286b562c7e9cc Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 11 Sep 2010 22:11:05 +0100 Subject: [PATCH 150/237] Half-Implemented history --- defines.h | 2 +- graphics.c | 7 +++- interface.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++------ interface.h | 1 + main.c | 85 ++++++++++++++++++++++++++++++++++------ powder.c | 8 +++- powder.h | 22 +++++------ 7 files changed, 198 insertions(+), 38 deletions(-) diff --git a/defines.h b/defines.h index f59eb4ed6..73ab019f2 100644 --- a/defines.h +++ b/defines.h @@ -8,7 +8,7 @@ #endif #define SAVE_VERSION 42 -#define MINOR_VERSION 0 +#define MINOR_VERSION 1 #define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. #define BETA diff --git a/graphics.c b/graphics.c index eeb0d502e..cc0e49166 100644 --- a/graphics.c +++ b/graphics.c @@ -2114,13 +2114,16 @@ pixel *prerender_save(void *save, int size, int *width, int *height) { unsigned char *d,*c=save; int i,j,k,x,y,rx,ry,p=0; - int bw,bh,w,h; + int bw,bh,w,h,new_format = 0; pixel *fb; if(size<16) return NULL; - if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) + if(!(c[2]==0x43 && c[1]==0x75 && c[0]==0x66) && !(c[2]==0x76 && c[1]==0x53 && c[0]==0x50)) return NULL; + if(c[2]==0x43 && c[1]==0x75 && c[0]==0x66){ + new_format = 1; + } if(c[4]>SAVE_VERSION) return NULL; diff --git a/interface.c b/interface.c index a17cacaa3..31d28cacc 100644 --- a/interface.c +++ b/interface.c @@ -35,6 +35,7 @@ void *svf_last = NULL; int svf_lsize; char *search_ids[GRID_X*GRID_Y]; +char *search_dates[GRID_X*GRID_Y]; int search_votes[GRID_X*GRID_Y]; int search_publish[GRID_X*GRID_Y]; int search_scoredown[GRID_X*GRID_Y]; @@ -1563,11 +1564,11 @@ int sdl_poll(void) sdl_zoom_trig = 1; Z_keysym = event.key.keysym.sym; } - if( event.key.keysym.sym == SDLK_PLUS || event.key.keysym.sym == SDLK_RIGHTBRACKET) + if( event.key.keysym.sym == SDLK_PLUS) { sdl_wheel++; } - if( event.key.keysym.sym == SDLK_MINUS || event.key.keysym.sym == SDLK_LEFTBRACKET) + if( event.key.keysym.sym == SDLK_MINUS) { sdl_wheel--; } @@ -1788,6 +1789,7 @@ int search_ui(pixel *vid_buf) memset(img_id, 0, sizeof(img_id)); memset(search_ids, 0, sizeof(search_ids)); + memset(search_dates, 0, sizeof(search_dates)); memset(search_names, 0, sizeof(search_names)); memset(search_scoreup, 0, sizeof(search_scoreup)); memset(search_scoredown, 0, sizeof(search_scoredown)); @@ -1962,7 +1964,7 @@ int search_ui(pixel *vid_buf) } else pos = gi+GRID_X*gj; - if(!search_ids[pos]) + if(!search_dates[pos]) break; gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; gy = ((((YRES-(MENUSIZE-20))+15)/GRID_Y)*gj) + ((YRES-(MENUSIZE-20))/GRID_Y-(YRES-(MENUSIZE-20))/GRID_S+10)/2 + 18; @@ -2003,6 +2005,9 @@ int search_ui(pixel *vid_buf) } } drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, 1+(YRES/GRID_S+3)/2, 0, 107, 10, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 6, 1+(YRES/GRID_S+3)/2, 107, 10, 0, 255); + if(mp==pos && !st) drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); else @@ -2061,10 +2066,10 @@ int search_ui(pixel *vid_buf) nyd = search_scoredown[pos]/ry; } - fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 57, 187, 57, 255); - fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 57, 57, 255); - //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-1+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 57, 187, 57, 255); + fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 4, nyd, 187, 57, 57, 255); + //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); } } @@ -2157,9 +2162,17 @@ int search_ui(pixel *vid_buf) fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); info_box(vid_buf, "Loading..."); - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); + if(search_dates[mp]){ + uri = malloc(strlen(search_ids[mp])*3+strlen(search_dates[mp])*3+strlen(SERVER)+71); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + strcaturl(uri, "&Date="); + strcaturl(uri, search_dates[mp]); + } else { + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + } data = http_simple_get(uri, &status, &dlen); free(uri); @@ -2436,7 +2449,7 @@ finish: int search_results(char *str, int votes) { int i,j; - char *p,*q,*r,*s,*vu,*vd,*pu; + char *p,*q,*r,*s,*vu,*vd,*pu,*sd; for(i=0; i=GRID_X*GRID_Y) + break; + if(votes) + { + sd = strchr(str+8, ' '); + if(!sd) + return i; + *(sd++) = 0; + pu = strchr(sd, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + sd = strchr(str+8, ' '); + if(!sd) + return i; + *(sd++) = 0; + pu = strchr(sd, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+8); + + search_dates[i] = mystrdup(sd); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str+8, search_thumbs+i, search_thsizes+i); i++; } else if(!strncmp(str, "TAG ", 4)) diff --git a/interface.h b/interface.h index 7910c6630..7f130649a 100644 --- a/interface.h +++ b/interface.h @@ -101,6 +101,7 @@ extern void *svf_last; extern int svf_lsize; extern char *search_ids[GRID_X*GRID_Y]; +extern char *search_dates[GRID_X*GRID_Y]; extern int search_votes[GRID_X*GRID_Y]; extern int search_publish[GRID_X*GRID_Y]; extern int search_scoredown[GRID_X*GRID_Y]; diff --git a/main.c b/main.c index a5f88ed8f..f8e11f6dc 100644 --- a/main.c +++ b/main.c @@ -231,7 +231,7 @@ void *build_thumb(int *size, int bzip2) void *build_save(int *size, int x0, int y0, int w, int h) { - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*8+MAXSIGNS*262), *c; int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; @@ -310,10 +310,10 @@ void *build_save(int *size, int x0, int y0, int w, int h) i = m[j]; if(i) { - unsigned char tttemp = (unsigned char)((parts[i-1].temp+(-MIN_TEMP))/((MAX_TEMP+(-MIN_TEMP))/255)); - //if(tttemp<0) tttemp=0; - //if(tttemp>255) tttemp=255; - d[p++] = tttemp; + //New Temperature saving uses a 16bit unsigned int for temperatures, giving a precision of 1 degree versus 36 for the old format + int tttemp = (int)parts[i-1].temp; + d[p++] = ((tttemp&0xFF00)>>8); + d[p++] = (tttemp&0x00FF); } } for(j=0; jSAVE_VERSION) return 2; ver = c[4]; @@ -590,7 +600,13 @@ int parse_save(void *save, int size, int replace, int x0, int y0) if(i <= NPART) { if(ver>=42) { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + if(new_format){ + ttv = (d[p++])<<8; + ttv |= (d[p++]); + parts[i-1].temp = ttv; + } else { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } } else { parts[i-1].temp = ((d[p++]*((O_MAX_TEMP+(-O_MIN_TEMP))/255))+O_MIN_TEMP)+273; } @@ -598,6 +614,9 @@ int parse_save(void *save, int size, int replace, int x0, int y0) else { p++; + if(new_format){ + p++; + } } } else @@ -1234,6 +1253,50 @@ int main(int argc, char *argv[]) { set_cmode(6); } + if(sdl_key==SDLK_LEFTBRACKET){ + if(sdl_zoom_trig==1) + { + ZSIZE -= 1; + if(ZSIZE>32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + } + else + { + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + bs -= 1; + else + bs -= ceil((bs/5)+0.5f); + if(bs>1224) + bs = 1224; + if(bs<0) + bs = 0; + } + } + if(sdl_key==SDLK_RIGHTBRACKET){ + if(sdl_zoom_trig==1) + { + ZSIZE += 1; + if(ZSIZE>32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + } + else + { + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + bs += 1; + else + bs += ceil((bs/5)+0.5f); + if(bs>1224) + bs = 1224; + if(bs<0) + bs = 0; + } + } if(sdl_key==SDLK_SPACE) sys_pause = !sys_pause; if(sdl_key=='h') diff --git a/powder.c b/powder.c index 449693ffc..c9a55c3c4 100644 --- a/powder.c +++ b/powder.c @@ -245,6 +245,8 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = rand()%120+240; if(t==PT_NBLE) parts[i].life = 0; + if(t==PT_ICEI) + parts[i].ctype = PT_WATR; if(t==PT_NEUT) { float r = (rand()%128+128)/127.0f; @@ -701,6 +703,8 @@ void update_particles_i(pixel *vid, int start, int inc) int ctemp = pv[y/CELL][x/CELL]*2; c_heat = 0.0f; h_count = 0; + if(t==PT_ICEI && !parts[i].ctype) + parts[i].ctype = PT_WATR; if(ptypes[t].hconduct>(rand()%250)) { for(nx=-1; nx<2; nx++) @@ -822,11 +826,11 @@ void update_particles_i(pixel *vid, int start, int inc) pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); } } - if(t==PT_PTCT&&parts[i].temp>249.0f) + if(t==PT_PTCT&&parts[i].temp>295.0f) { pt = parts[i].temp -= 2.5f; } - if(t==PT_NTCT&&parts[i].temp>249.0f) + if(t==PT_NTCT&&parts[i].temp>295.0f) { pt = parts[i].temp -= 2.5f; } diff --git a/powder.h b/powder.h index 469b45d89..efbea86eb 100644 --- a/powder.h +++ b/powder.h @@ -221,7 +221,7 @@ static const part_type ptypes[PT_NUM] = {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f+273.15f, 44, "Liquid Wax."}, {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -195.0f +273.15f, 70, "Liquid Nitrogen. Very cold."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f+273.15f, 255, "Black hole, sucks in other particles and heats up."}, {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f+273.15f, 255, "White hole, pushes other particles away."}, @@ -232,10 +232,10 @@ static const part_type ptypes[PT_NUM] = {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f +273.15f, 46, "Nitrogen Ice."}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, @@ -244,7 +244,7 @@ static const part_type ptypes[PT_NUM] = {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f+273.15f, 88, "Smoke"}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f +273.15f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, @@ -274,14 +274,14 @@ static part_state pstates[PT_NUM] = /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 0.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -295,7 +295,7 @@ static part_state pstates[PT_NUM] = /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, 76.0f, PT_NONE, 0.0f, PT_NONE, 78.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -309,7 +309,7 @@ static part_state pstates[PT_NUM] = /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 77.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -318,10 +318,10 @@ static part_state pstates[PT_NUM] = /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 453.0f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 50.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, From a92da37559aa6e68d9165ff4f69f83517594bcc4 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 13 Sep 2010 22:36:43 +0100 Subject: [PATCH 151/237] History almost complete, couple of bug fixes --- interface.c | 48 ++++++++++++++++++++++++++++++++++++++---------- misc.c | 14 ++++++++++++++ misc.h | 2 ++ powder.h | 2 +- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/interface.c b/interface.c index 31d28cacc..1f972b301 100644 --- a/interface.c +++ b/interface.c @@ -1964,7 +1964,7 @@ int search_ui(pixel *vid_buf) } else pos = gi+GRID_X*gj; - if(!search_dates[pos]) + if(!search_ids[pos]) break; gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; gy = ((((YRES-(MENUSIZE-20))+15)/GRID_Y)*gj) + ((YRES-(MENUSIZE-20))/GRID_Y-(YRES-(MENUSIZE-20))/GRID_S+10)/2 + 18; @@ -2166,7 +2166,7 @@ int search_ui(pixel *vid_buf) uri = malloc(strlen(search_ids[mp])*3+strlen(search_dates[mp])*3+strlen(SERVER)+71); strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); strcaturl(uri, search_ids[mp]); - strcaturl(uri, "&Date="); + strappend(uri, "&Date="); strcaturl(uri, search_dates[mp]); } else { uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); @@ -2384,9 +2384,22 @@ int search_ui(pixel *vid_buf) thlen = 4; } thumb_cache_add(img_id[i], thumb, thlen); - for(pos=0; pos Date: Thu, 16 Sep 2010 13:37:53 +0100 Subject: [PATCH 152/237] Fix Part_avg function and COAL, temperature signs --- graphics.c | 2 +- powder.c | 2 +- powder.h | 152 ++++++++++++++++++++++++++--------------------------- 3 files changed, 78 insertions(+), 78 deletions(-) diff --git a/graphics.c b/graphics.c index cc0e49166..47c843fc6 100644 --- a/graphics.c +++ b/graphics.c @@ -1950,7 +1950,7 @@ void render_signs(pixel *vid_buf) if(strcmp(signs[i].text, "{t}")==0) { if((pmap[signs[i].y][signs[i].x]>>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature + sprintf(buff, "Temp: %4.2f", parts[pmap[signs[i].y][signs[i].x]>>8].temp-273.15); //...tempirature else sprintf(buff, "Temp: 0.00"); //...tempirature drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); diff --git a/powder.c b/powder.c index c9a55c3c4..b5db6ff06 100644 --- a/powder.c +++ b/powder.c @@ -421,7 +421,7 @@ inline int parts_avg(int ci, int ni) #endif { int pmr = pmap[(int)((parts[ci].y + parts[ni].y)/2)][(int)((parts[ci].x + parts[ni].x)/2)]; - if((pmr>>8) < NPART && (pmr>>8) >= 0) + if((pmr>>8) < NPART && (pmr>>8) >= 1) { return parts[pmr>>8].type; } diff --git a/powder.h b/powder.h index d42d8db39..24614551e 100644 --- a/powder.h +++ b/powder.h @@ -333,82 +333,82 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,1,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E*/ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S*/ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0}, + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M e o O 2 N E*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K s a X W S*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E l l R T*/ }; extern int isplayer; From 2ba8be7e492d0f3e964e51e7f0e5240ada0db6d8 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 16 Sep 2010 17:58:55 +0100 Subject: [PATCH 153/237] Improved Thermograph gradient --- hmap.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hmap.h b/hmap.h index 8af6e7168..92605f2c2 100755 --- a/hmap.h +++ b/hmap.h @@ -19,6 +19,13 @@ */ #ifndef HMAP_H #define HMAP_H -static char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; +//Original Heat Scale +//static char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; +//Modified Hue Scale +//static char color_data[] = {0x00,0x00,0x00,0x02,0x00,0x02,0x04,0x00,0x04,0x06,0x00,0x06,0x09,0x00,0x08,0x0B,0x00,0x0B,0x0E,0x00,0x0D,0x11,0x00,0x10,0x14,0x00,0x13,0x17,0x00,0x16,0x1B,0x00,0x19,0x1E,0x00,0x1C,0x22,0x00,0x1F,0x26,0x00,0x22,0x29,0x00,0x26,0x2D,0x00,0x29,0x32,0x00,0x2D,0x36,0x00,0x30,0x3A,0x00,0x34,0x3E,0x00,0x38,0x43,0x00,0x3C,0x47,0x00,0x40,0x4C,0x00,0x44,0x51,0x00,0x48,0x55,0x00,0x4C,0x5A,0x00,0x50,0x5F,0x00,0x54,0x64,0x00,0x59,0x69,0x00,0x5D,0x6E,0x00,0x61,0x73,0x00,0x66,0x77,0x00,0x6A,0x7C,0x00,0x6E,0x81,0x00,0x73,0x86,0x00,0x77,0x8B,0x00,0x7C,0x90,0x00,0x80,0x95,0x00,0x85,0x9A,0x00,0x89,0x9F,0x00,0x8D,0xA3,0x00,0x92,0xA8,0x00,0x96,0xAD,0x00,0x9B,0xB1,0x00,0x9F,0xB6,0x00,0xA3,0xBA,0x00,0xA8,0xBF,0x00,0xAC,0xC3,0x00,0xB0,0xC7,0x00,0xB4,0xCB,0x00,0xB8,0xCF,0x00,0xBD,0xD3,0x00,0xC1,0xD7,0x00,0xC4,0xDB,0x00,0xC8,0xDE,0x00,0xCC,0xE1,0x00,0xD0,0xE5,0x00,0xD4,0xE8,0x00,0xD7,0xEA,0x00,0xDB,0xED,0x00,0xDE,0xF0,0x00,0xE1,0xF2,0x00,0xE4,0xF4,0x00,0xE8,0xF6,0x00,0xEB,0xF8,0x00,0xED,0xFA,0x00,0xF0,0xFB,0x00,0xF3,0xFC,0x00,0xF5,0xFD,0x00,0xF8,0xFE,0x00,0xFA,0xFF,0x00,0xFC,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFE,0x00,0xFF,0xFE,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF8,0x00,0xFF,0xF6,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE6,0x00,0xFF,0xE3,0x00,0xFF,0xE0,0x00,0xFF,0xDD,0x00,0xFF,0xD9,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xCF,0x00,0xFF,0xCB,0x00,0xFF,0xC7,0x00,0xFF,0xC4,0x00,0xFF,0xC0,0x00,0xFF,0xBC,0x00,0xFF,0xB7,0x00,0xFF,0xB3,0x00,0xFF,0xAF,0x00,0xFF,0xAB,0x00,0xFF,0xA6,0x00,0xFF,0xA2,0x00,0xFF,0x9E,0x00,0xFF,0x99,0x00,0xFF,0x95,0x00,0xFF,0x90,0x00,0xFF,0x8B,0x00,0xFF,0x87,0x00,0xFF,0x82,0x00,0xFF,0x7E,0x00,0xFF,0x79,0x00,0xFF,0x74,0x00,0xFF,0x70,0x00,0xFF,0x6B,0x00,0xFF,0x67,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x59,0x00,0xFF,0x55,0x00,0xFF,0x50,0x00,0xFF,0x4C,0x00,0xFF,0x48,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x37,0x00,0xFF,0x33,0x00,0xFF,0x2F,0x00,0xFF,0x2B,0x00,0xFF,0x28,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1D,0x00,0xFF,0x1A,0x00,0xFF,0x17,0x00,0xFF,0x14,0x00,0xFF,0x11,0x00,0xFF,0x0E,0x00,0xFF,0x0C,0x00,0xFF,0x09,0x00,0xFF,0x07,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x01,0x00,0xFF,0x00,0x01,0xFF,0x00,0x03,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x09,0xFF,0x00,0x0C,0xFF,0x00,0x0F,0xFF,0x00,0x11,0xFF,0x00,0x14,0xFF,0x00,0x17,0xFF,0x00,0x1A,0xFF,0x00,0x1D,0xFF,0x00,0x20,0xFF,0x00,0x24,0xFF,0x00,0x27,0xFF,0x00,0x2B,0xFF,0x00,0x2E,0xFF,0x00,0x32,0xFF,0x00,0x36,0xFF,0x00,0x3A,0xFF,0x00,0x3E,0xFF,0x00,0x42,0xFF,0x00,0x46,0xFF,0x00,0x4A,0xFF,0x00,0x4E,0xFF,0x00,0x52,0xFF,0x00,0x56,0xFF,0x00,0x5B,0xFF,0x00,0x5F,0xFF,0x00,0x63,0xFF,0x00,0x68,0xFF,0x00,0x6C,0xFF,0x00,0x71,0xFF,0x00,0x75,0xFF,0x00,0x79,0xFF,0x00,0x7E,0xFF,0x00,0x82,0xFF,0x00,0x87,0xFF,0x00,0x8B,0xFF,0x00,0x90,0xFF,0x00,0x94,0xFF,0x00,0x98,0xFF,0x00,0x9D,0xFF,0x00,0xA1,0xFF,0x00,0xA6,0xFF,0x00,0xAA,0xFF,0x00,0xAE,0xFF,0x00,0xB2,0xFF,0x00,0xB6,0xFF,0x00,0xBA,0xFF,0x00,0xBF,0xFF,0x00,0xC2,0xFF,0x00,0xC6,0xFF,0x00,0xCA,0xFF,0x00,0xCE,0xFF,0x00,0xD2,0xFF,0x00,0xD5,0xFF,0x00,0xD9,0xFF,0x00,0xDC,0xFF,0x00,0xE0,0xFF,0x00,0xE3,0xFF,0x00,0xE6,0xFF,0x00,0xE9,0xFF,0x00,0xEC,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF4,0xFF,0x00,0xF6,0xFF,0x00,0xF9,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF2,0x00,0xFF,0xEF,0x00,0xFF,0xED,0x00,0xFF,0xEA,0x00,0xFF,0xE7,0x00,0xFF,0xE4,0x00,0xFF,0xE1,0x00,0xFF,0xDD,0x00,0xFF,0xDA,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xCF,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC4,0x00,0xFF,0xC0,0x00,0xFF,0xBC,0x00,0xFF,0xB8,0x00,0xFF,0xB4,0x00,0xFF,0xAF,0x00,0xFF,0xAB,0x00,0xFF,0xA7,0x00,0xFF,0xA3,0x00,0xFF,0x9E,0x00,0xFF,0x9A,0x00,0xFF,0x96,0x00,0xFF,0x91,0x00,0xFF,0x8D,0x00,0xFF,0x88,0x00,0xFF,0x84,0x00,0xFF,0x80,0x00,0xFF,0x7B,0x00,0xFF,0x77,0x00,0xFF,0x72,0x00,0xFF,0x6E,0x00,0xFF,0x69,0x00,0xFF,0x65,0x00,0xFF,0x61,0x00,0xFF,0x5C,0x00,0xFF,0x58,0x00,0xFF,0x54,0x00,0xFF,0x50,0x00,0xFF,0x4B,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x37,0x00,0xFF,0x34,0x00,0xFF,0x30,0x00,0xFF,0x2C,0x00,0xFF,0x29,0x00,0xFF,0x25,0x00,0xFF,0x22,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x18,0x00,0xFF,0x15,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x0D,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x04,0x00,0xFF,0x02,0x00,0xFF,0x00,0x02,0xFD,0x00,0x04,0xFB,0x00,0x06,0xF9,0x00,0x09,0xF6,0x00,0x0B,0xF3,0x00,0x0E,0xF1,0x00,0x10,0xEE,0x00,0x13,0xEB,0x00,0x16,0xE7,0x00,0x19,0xE4,0x00,0x1C,0xE0,0x00,0x1F,0xDD,0x00,0x23,0xD9,0x00,0x26,0xD5,0x00,0x29,0xD1,0x00,0x2D,0xCD,0x00,0x31,0xC9,0x00,0x35,0xC4,0x00,0x38,0xC0,0x00,0x3C,0xBC,0x00,0x40,0xB7,0x00,0x44,0xB2,0x00,0x48,0xAE,0x00,0x4C,0xA9,0x00,0x51,0xA4,0x00,0x55,0x9F,0x00,0x59,0x9B,0x00,0x5D,0x96,0x00,0x62,0x91,0x00,0x66,0x8C,0x00,0x6A,0x87,0x00,0x6F,0x82,0x00,0x73,0x7D,0x00,0x78,0x78,0x00,0x7C,0x73,0x00,0x81,0x6E,0x00,0x85,0x69,0x00,0x8A,0x65,0x00,0x8E,0x60,0x00,0x92,0x5B,0x00,0x97,0x56,0x00,0x9B,0x52,0x00,0xA0,0x4D,0x00,0xA4,0x49,0x00,0xA8,0x44,0x00,0xAC,0x40,0x00,0xB1,0x3B,0x00,0xB5,0x37,0x00,0xB9,0x33,0x00,0xBD,0x2F,0x00,0xC1,0x2B,0x00,0xC5,0x28,0x00,0xC9,0x24,0x00,0xCD,0x21,0x00,0xD0,0x1D,0x00,0xD4,0x1A,0x00,0xD8,0x17,0x00,0xDB,0x14,0x00,0xDE,0x11,0x00,0xE2,0x0F,0x00,0xE5,0x0D,0x00,0xE8,0x0A,0x00,0xEB,0x08,0x00,0xEE,0x07,0x00,0xF0,0x05,0x00,0xF3,0x04,0x00,0xF6,0x02,0x00,0xF8,0x01,0x00,0xFA,0x01,0x00,0xFC,0x00,0x00,0xFE,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x02,0x00,0xFF,0x03,0x00,0xFF,0x04,0x00,0xFF,0x06,0x00,0xFF,0x07,0x00,0xFF,0x09,0x00,0xFF,0x0B,0x00,0xFF,0x0D,0x00,0xFF,0x0F,0x00,0xFF,0x12,0x00,0xFF,0x14,0x00,0xFF,0x17,0x00,0xFF,0x1A,0x00,0xFF,0x1C,0x00,0xFF,0x1F,0x00,0xFF,0x23,0x00,0xFF,0x26,0x00,0xFF,0x29,0x00,0xFF,0x2D,0x00,0xFF,0x31,0x00,0xFF,0x34,0x00,0xFF,0x38,0x00,0xFF,0x3C,0x00,0xFF,0x40,0x00,0xFF,0x44,0x00,0xFF,0x48,0x00,0xFF,0x4C,0x00,0xFF,0x51,0x00,0xFF,0x55,0x00,0xFF,0x59,0x00,0xFF,0x5E,0x00,0xFF,0x62,0x00,0xFF,0x67,0x00,0xFF,0x6B,0x00,0xFF,0x70,0x00,0xFF,0x74,0x00,0xFF,0x79,0x00,0xFF,0x7D,0x00,0xFF,0x82,0x00,0xFF,0x87,0x00,0xFF,0x8B,0x00,0xFF,0x90,0x00,0xFF,0x94,0x00,0xFF,0x99,0x00,0xFF,0x9D,0x00,0xFF,0xA2,0x00,0xFF,0xA6,0x00,0xFF,0xAB,0x00,0xFF,0xAF,0x00,0xFF,0xB4,0x00,0xFF,0xB8,0x00,0xFF,0xBC,0x00,0xFF,0xC0,0x00,0xFF,0xC4,0x00,0xFF,0xC8,0x00,0xFF,0xCC,0x00,0xFF,0xD0,0x00,0xFF,0xD4,0x00,0xFF,0xD8,0x00,0xFF,0xDB,0x00,0xFF,0xDF,0x00,0xFF,0xE2,0x00,0xFF,0xE5,0x00,0xFF,0xE9,0x00,0xFF,0xEC,0x00,0xFF,0xEE,0x00,0xFF,0xF1,0x00,0xFF,0xF4,0x00,0xFF,0xF6,0x00,0xFF,0xF8,0x00,0xFF,0xFB,0x00,0xFF,0xFD,0x00,0xFF,0xFE,0x00,0xFF,0xFF,0x01,0xFF,0xFF,0x03,0xFF,0xFF,0x05,0xFF,0xFF,0x07,0xFF,0xFF,0x0A,0xFF,0xFF,0x0C,0xFF,0xFF,0x0F,0xFF,0xFF,0x12,0xFF,0xFF,0x14,0xFF,0xFF,0x17,0xFF,0xFF,0x1A,0xFF,0xFF,0x1E,0xFF,0xFF,0x21,0xFF,0xFF,0x24,0xFF,0xFF,0x28,0xFF,0xFF,0x2B,0xFF,0xFF,0x2F,0xFF,0xFF,0x33,0xFF,0xFF,0x36,0xFF,0xFF,0x3A,0xFF,0xFF,0x3E,0xFF,0xFF,0x42,0xFF,0xFF,0x46,0xFF,0xFF,0x4A,0xFF,0xFF,0x4F,0xFF,0xFF,0x53,0xFF,0xFF,0x57,0xFF,0xFF,0x5B,0xFF,0xFF,0x60,0xFF,0xFF,0x64,0xFF,0xFF,0x68,0xFF,0xFF,0x6D,0xFF,0xFF,0x71,0xFF,0xFF,0x76,0xFF,0xFF,0x7A,0xFF,0xFF,0x7E,0xFF,0xFF,0x83,0xFF,0xFF,0x87,0xFF,0xFF,0x8C,0xFF,0xFF,0x90,0xFF,0xFF,0x95,0xFF,0xFF,0x99,0xFF,0xFF,0x9D,0xFF,0xFF,0xA2,0xFF,0xFF,0xA6,0xFF,0xFF,0xAA,0xFF,0xFF,0xAF,0xFF,0xFF,0xB3,0xFF,0xFF,0xB7,0xFF,0xFF,0xBB,0xFF,0xFF,0xBF,0xFF,0xFF,0xC3,0xFF,0xFF,0xC7,0xFF,0xFF,0xCB,0xFF,0xFF,0xCE,0xFF,0xFF,0xD2,0xFF,0xFF,0xD6,0xFF,0xFF,0xD9,0xFF,0xFF,0xDD,0xFF,0xFF,0xE0,0xFF,0xFF,0xE3,0xFF,0xFF,0xE6,0xFF,0xFF,0xE9,0xFF,0xFF,0xEC,0xFF,0xFF,0xEF,0xFF,0xFF,0xF2,0xFF,0xFF,0xF4,0xFF,0xFF,0xF7,0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0xFF,0xFF,0xFD}; +//Hue Scale +//static char color_data[] = {0xFF,0x00,0xFF,0xFE,0x00,0xFF,0xFC,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF8,0x00,0xFF,0xF6,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xEA,0x00,0xFF,0xE8,0x00,0xFF,0xE5,0x00,0xFF,0xE3,0x00,0xFF,0xE1,0x00,0xFF,0xDE,0x00,0xFF,0xDC,0x00,0xFF,0xD9,0x00,0xFF,0xD6,0x00,0xFF,0xD4,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCC,0x00,0xFF,0xC9,0x00,0xFF,0xC6,0x00,0xFF,0xC3,0x00,0xFF,0xC1,0x00,0xFF,0xBE,0x00,0xFF,0xBB,0x00,0xFF,0xB8,0x00,0xFF,0xB5,0x00,0xFF,0xB2,0x00,0xFF,0xAF,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA7,0x00,0xFF,0xA4,0x00,0xFF,0xA1,0x00,0xFF,0x9E,0x00,0xFF,0x9B,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x93,0x00,0xFF,0x90,0x00,0xFF,0x8D,0x00,0xFF,0x8A,0x00,0xFF,0x88,0x00,0xFF,0x85,0x00,0xFF,0x83,0x00,0xFF,0x80,0x00,0xFF,0x7E,0x00,0xFF,0x7B,0x00,0xFF,0x78,0x00,0xFF,0x76,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6E,0x00,0xFF,0x6B,0x00,0xFF,0x68,0x00,0xFF,0x65,0x00,0xFF,0x63,0x00,0xFF,0x60,0x00,0xFF,0x5D,0x00,0xFF,0x5A,0x00,0xFF,0x57,0x00,0xFF,0x54,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x49,0x00,0xFF,0x46,0x00,0xFF,0x43,0x00,0xFF,0x40,0x00,0xFF,0x3D,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x35,0x00,0xFF,0x32,0x00,0xFF,0x2F,0x00,0xFF,0x2C,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x25,0x00,0xFF,0x22,0x00,0xFF,0x20,0x00,0xFF,0x1D,0x00,0xFF,0x1B,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x14,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x0E,0x00,0xFF,0x0C,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x08,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x14,0xFF,0x00,0x16,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1D,0xFF,0x00,0x20,0xFF,0x00,0x22,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x32,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3D,0xFF,0x00,0x40,0xFF,0x00,0x43,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x57,0xFF,0x00,0x5A,0xFF,0x00,0x5D,0xFF,0x00,0x60,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6B,0xFF,0x00,0x6E,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x76,0xFF,0x00,0x79,0xFF,0x00,0x7B,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x86,0xFF,0x00,0x88,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x93,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9E,0xFF,0x00,0xA1,0xFF,0x00,0xA4,0xFF,0x00,0xA7,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB5,0xFF,0x00,0xB8,0xFF,0x00,0xBB,0xFF,0x00,0xBE,0xFF,0x00,0xC1,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xC9,0xFF,0x00,0xCC,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD4,0xFF,0x00,0xD7,0xFF,0x00,0xD9,0xFF,0x00,0xDC,0xFF,0x00,0xDF,0xFF,0x00,0xE1,0xFF,0x00,0xE3,0xFF,0x00,0xE6,0xFF,0x00,0xE8,0xFF,0x00,0xEA,0xFF,0x00,0xEC,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF4,0xFF,0x00,0xF6,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE5,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDE,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC3,0x00,0xFF,0xC0,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA6,0x00,0xFF,0xA3,0x00,0xFF,0xA0,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x92,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x8A,0x00,0xFF,0x87,0x00,0xFF,0x85,0x00,0xFF,0x82,0x00,0xFF,0x80,0x00,0xFF,0x7D,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6D,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x65,0x00,0xFF,0x62,0x00,0xFF,0x5F,0x00,0xFF,0x5C,0x00,0xFF,0x59,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x48,0x00,0xFF,0x45,0x00,0xFF,0x42,0x00,0xFF,0x3F,0x00,0xFF,0x3C,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2C,0x00,0xFF,0x29,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1F,0x00,0xFF,0x1D,0x00,0xFF,0x1A,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x09,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x15,0xFF,0x00,0x17,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1E,0xFF,0x00,0x20,0xFF,0x00,0x23,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x33,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3E,0xFF,0x00,0x41,0xFF,0x00,0x44,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x58,0xFF,0x00,0x5B,0xFF,0x00,0x5E,0xFF,0x00,0x61,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6C,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x77,0xFF,0x00,0x79,0xFF,0x00,0x7C,0xFF,0x00,0x7F,0xFF,0x00,0x81,0xFF,0x00,0x84,0xFF,0x00,0x86,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x91,0xFF,0x00,0x94,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9C,0xFF,0x00,0x9F,0xFF,0x00,0xA2,0xFF,0x00,0xA5,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB3,0xFF,0x00,0xB6,0xFF,0x00,0xB9,0xFF,0x00,0xBC,0xFF,0x00,0xBF,0xFF,0x00,0xC2,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xCA,0xFF,0x00,0xCD,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD5,0xFF,0x00,0xD7,0xFF,0x00,0xDA,0xFF,0x00,0xDD,0xFF,0x00,0xDF,0xFF,0x00,0xE2,0xFF,0x00,0xE4,0xFF,0x00,0xE6,0xFF,0x00,0xE9,0xFF,0x00,0xEB,0xFF,0x00,0xED,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF5,0xFF,0x00,0xF7,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF3,0x00,0xFF,0xF1,0x00,0xFF,0xEF,0x00,0xFF,0xED,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE4,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDD,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD0,0x00,0xFF,0xCD,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC2,0x00,0xFF,0xBF,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAB,0x00,0xFF,0xA8,0x00,0xFF,0xA5,0x00,0xFF,0xA2,0x00,0xFF,0x9F,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x97,0x00,0xFF,0x94,0x00,0xFF,0x91,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x89,0x00,0xFF,0x87,0x00,0xFF,0x84,0x00,0xFF,0x81,0x00,0xFF,0x7F,0x00,0xFF,0x7C,0x00,0xFF,0x7A,0x00,0xFF,0x77,0x00,0xFF,0x75,0x00,0xFF,0x72,0x00,0xFF,0x6F,0x00,0xFF,0x6C,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x64,0x00,0xFF,0x61,0x00,0xFF,0x5E,0x00,0xFF,0x5B,0x00,0xFF,0x58,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x50,0x00,0xFF,0x4D,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x44,0x00,0xFF,0x41,0x00,0xFF,0x3E,0x00,0xFF,0x3C,0x00,0xFF,0x39,0x00,0xFF,0x36,0x00,0xFF,0x33,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2B,0x00,0xFF,0x29,0x00,0xFF,0x26,0x00,0xFF,0x23,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1C,0x00,0xFF,0x1A,0x00,0xFF,0x17,0x00,0xFF,0x15,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x09,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x01,0x00}; +//Scaled Hue Scale +static char color_data[] = {0xFF,0x00,0xFF,0xF1,0x00,0xFF,0xDE,0x00,0xFF,0xC7,0x00,0xFF,0xAF,0x00,0xFF,0x97,0x00,0xFF,0x82,0x00,0xFF,0x6C,0x00,0xFF,0x56,0x00,0xFF,0x41,0x00,0xFF,0x2E,0x00,0xFF,0x21,0x05,0xFF,0x16,0x0F,0xFF,0x0E,0x1B,0xFF,0x07,0x29,0xFF,0x02,0x39,0xFF,0x00,0x4B,0xFF,0x00,0x5E,0xFF,0x00,0x74,0xFF,0x00,0x8A,0xFF,0x00,0xA0,0xFF,0x00,0xAF,0xFF,0x00,0xB8,0xFE,0x00,0xC2,0xFD,0x00,0xCC,0xFD,0x00,0xD5,0xFC,0x00,0xDF,0xFA,0x00,0xE7,0xF9,0x00,0xEF,0xF6,0x00,0xF6,0xF3,0x00,0xFC,0xEE,0x00,0xFF,0xE8,0x00,0xFF,0xE1,0x00,0xFF,0xD8,0x00,0xFF,0xCE,0x00,0xFF,0xC4,0x00,0xFF,0xB9,0x00,0xFF,0xAD,0x00,0xFF,0xA1,0x00,0xFF,0x96,0x00,0xFF,0x8A,0x00,0xFF,0x80,0x00,0xFF,0x7C,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x71,0x00,0xFF,0x6D,0x00,0xFF,0x69,0x00,0xFF,0x66,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x5A,0x00,0xFF,0x56,0x00,0xFF,0x52,0x00,0xFF,0x4E,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x38,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2D,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x19,0x00,0xFF,0x17,0x01,0xFF,0x14,0x02,0xFF,0x13,0x04,0xFF,0x11,0x06,0xFF,0x0F,0x07,0xFF,0x0E,0x0A,0xFF,0x0C,0x0C,0xFF,0x0B,0x0E,0xFF,0x0A,0x10,0xFF,0x09,0x13,0xFF,0x08,0x16,0xFF,0x07,0x18,0xFF,0x06,0x1B,0xFF,0x06,0x1E,0xFF,0x05,0x21,0xFF,0x04,0x24,0xFF,0x04,0x27,0xFF,0x04,0x2A,0xFF,0x03,0x2D,0xFF,0x03,0x30,0xFF,0x03,0x34,0xFF,0x02,0x37,0xFF,0x02,0x3A,0xFF,0x02,0x3D,0xFF,0x02,0x41,0xFF,0x02,0x44,0xFF,0x01,0x47,0xFF,0x01,0x4A,0xFF,0x01,0x4E,0xFF,0x01,0x51,0xFF,0x00,0x54,0xFF,0x00,0x56,0xFF,0x00,0x58,0xFF,0x00,0x5A,0xFF,0x00,0x5C,0xFF,0x00,0x5E,0xFF,0x00,0x60,0xFF,0x00,0x62,0xFF,0x00,0x64,0xFF,0x00,0x66,0xFF,0x00,0x68,0xFF,0x00,0x6A,0xFF,0x00,0x6D,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x73,0xFF,0x00,0x75,0xFF,0x00,0x77,0xFF,0x00,0x7A,0xFF,0x00,0x7C,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x85,0xFF,0x00,0x87,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x92,0xFF,0x00,0x94,0xFF,0x00,0x97,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9D,0xFF,0x00,0x9F,0xFF,0x00,0xA1,0xFF,0x00,0xA3,0xFF,0x00,0xA6,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAC,0xFF,0x00,0xAE,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB5,0xFF,0x00,0xB7,0xFF,0x00,0xB9,0xFF,0x00,0xBB,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xC0,0xFF,0x00,0xC1,0xFF,0x00,0xC2,0xFE,0x00,0xC3,0xFE,0x00,0xC4,0xFE,0x00,0xC6,0xFD,0x00,0xC7,0xFD,0x00,0xC8,0xFD,0x00,0xC9,0xFC,0x00,0xCA,0xFC,0x00,0xCB,0xFC,0x00,0xCC,0xFB,0x00,0xCE,0xFB,0x00,0xCF,0xFB,0x00,0xD0,0xFA,0x00,0xD1,0xFA,0x00,0xD2,0xF9,0x00,0xD3,0xF9,0x00,0xD4,0xF9,0x00,0xD5,0xF8,0x00,0xD6,0xF8,0x00,0xD7,0xF7,0x00,0xD8,0xF7,0x00,0xD9,0xF7,0x00,0xDA,0xF6,0x00,0xDC,0xF6,0x00,0xDD,0xF5,0x00,0xDE,0xF5,0x00,0xDF,0xF4,0x00,0xE0,0xF4,0x00,0xE1,0xF3,0x00,0xE2,0xF3,0x00,0xE2,0xF2,0x00,0xE3,0xF2,0x00,0xE4,0xF1,0x00,0xE5,0xF1,0x00,0xE6,0xF0,0x00,0xE7,0xF0,0x00,0xE8,0xEF,0x00,0xE9,0xEE,0x00,0xEA,0xEE,0x00,0xEB,0xED,0x00,0xEC,0xED,0x00,0xEC,0xEC,0x00,0xED,0xEB,0x00,0xEE,0xEB,0x00,0xEF,0xEA,0x00,0xF0,0xE9,0x00,0xF1,0xE9,0x00,0xF1,0xE8,0x00,0xF2,0xE7,0x00,0xF3,0xE6,0x00,0xF4,0xE6,0x00,0xF4,0xE5,0x00,0xF5,0xE4,0x00,0xF6,0xE3,0x00,0xF6,0xE3,0x00,0xF7,0xE2,0x00,0xF8,0xE1,0x00,0xF8,0xE0,0x00,0xF9,0xDF,0x00,0xFA,0xDE,0x00,0xFA,0xDD,0x00,0xFB,0xDD,0x00,0xFB,0xDC,0x00,0xFC,0xDB,0x00,0xFC,0xDA,0x00,0xFD,0xD9,0x00,0xFD,0xD8,0x00,0xFE,0xD7,0x00,0xFE,0xD6,0x00,0xFF,0xD5,0x00,0xFF,0xD4,0x00,0xFF,0xD3,0x00,0xFF,0xD3,0x00,0xFF,0xD2,0x00,0xFF,0xD1,0x00,0xFF,0xD1,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCE,0x00,0xFF,0xCE,0x00,0xFF,0xCD,0x00,0xFF,0xCC,0x00,0xFF,0xCB,0x00,0xFF,0xCB,0x00,0xFF,0xCA,0x00,0xFF,0xC9,0x00,0xFF,0xC8,0x00,0xFF,0xC7,0x00,0xFF,0xC7,0x00,0xFF,0xC6,0x00,0xFF,0xC5,0x00,0xFF,0xC4,0x00,0xFF,0xC3,0x00,0xFF,0xC2,0x00,0xFF,0xC1,0x00,0xFF,0xC1,0x00,0xFF,0xC0,0x00,0xFF,0xBF,0x00,0xFF,0xBE,0x00,0xFF,0xBD,0x00,0xFF,0xBC,0x00,0xFF,0xBB,0x00,0xFF,0xBA,0x00,0xFF,0xB9,0x00,0xFF,0xB8,0x00,0xFF,0xB8,0x00,0xFF,0xB7,0x00,0xFF,0xB6,0x00,0xFF,0xB5,0x00,0xFF,0xB4,0x00,0xFF,0xB3,0x00,0xFF,0xB2,0x00,0xFF,0xB1,0x00,0xFF,0xB0,0x00,0xFF,0xAF,0x00,0xFF,0xAE,0x00,0xFF,0xAD,0x00,0xFF,0xAC,0x00,0xFF,0xAB,0x00,0xFF,0xAA,0x00,0xFF,0xA9,0x00,0xFF,0xA8,0x00,0xFF,0xA7,0x00,0xFF,0xA6,0x00,0xFF,0xA5,0x00,0xFF,0xA4,0x00,0xFF,0xA3,0x00,0xFF,0xA2,0x00,0xFF,0xA1,0x00,0xFF,0xA0,0x00,0xFF,0x9F,0x00,0xFF,0x9E,0x00,0xFF,0x9D,0x00,0xFF,0x9C,0x00,0xFF,0x9B,0x00,0xFF,0x9A,0x00,0xFF,0x99,0x00,0xFF,0x98,0x00,0xFF,0x97,0x00,0xFF,0x96,0x00,0xFF,0x95,0x00,0xFF,0x94,0x00,0xFF,0x92,0x00,0xFF,0x91,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8E,0x00,0xFF,0x8D,0x00,0xFF,0x8C,0x00,0xFF,0x8B,0x00,0xFF,0x8A,0x00,0xFF,0x89,0x00,0xFF,0x88,0x00,0xFF,0x87,0x00,0xFF,0x86,0x00,0xFF,0x85,0x00,0xFF,0x84,0x00,0xFF,0x83,0x00,0xFF,0x82,0x00,0xFF,0x81,0x00,0xFF,0x80,0x00,0xFF,0x7F,0x00,0xFF,0x7E,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7B,0x00,0xFF,0x7A,0x00,0xFF,0x79,0x00,0xFF,0x78,0x00,0xFF,0x77,0x00,0xFF,0x76,0x00,0xFF,0x75,0x00,0xFF,0x74,0x00,0xFF,0x73,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x70,0x00,0xFF,0x6F,0x00,0xFF,0x6E,0x00,0xFF,0x6D,0x00,0xFF,0x6C,0x00,0xFF,0x6B,0x00,0xFF,0x6A,0x00,0xFF,0x6A,0x00,0xFF,0x69,0x00,0xFF,0x68,0x00,0xFF,0x68,0x00,0xFF,0x67,0x00,0xFF,0x66,0x00,0xFF,0x66,0x00,0xFF,0x65,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x63,0x00,0xFF,0x63,0x00,0xFF,0x62,0x00,0xFF,0x61,0x00,0xFF,0x61,0x00,0xFF,0x60,0x00,0xFF,0x5F,0x00,0xFF,0x5F,0x00,0xFF,0x5E,0x00,0xFF,0x5D,0x00,0xFF,0x5D,0x00,0xFF,0x5C,0x00,0xFF,0x5B,0x00,0xFF,0x5B,0x00,0xFF,0x5A,0x00,0xFF,0x59,0x00,0xFF,0x59,0x00,0xFF,0x58,0x00,0xFF,0x57,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x55,0x00,0xFF,0x54,0x00,0xFF,0x54,0x00,0xFF,0x53,0x00,0xFF,0x52,0x00,0xFF,0x52,0x00,0xFF,0x51,0x00,0xFF,0x50,0x00,0xFF,0x50,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4E,0x00,0xFF,0x4D,0x00,0xFF,0x4C,0x00,0xFF,0x4B,0x00,0xFF,0x4B,0x00,0xFF,0x4A,0x00,0xFF,0x49,0x00,0xFF,0x49,0x00,0xFF,0x48,0x00,0xFF,0x47,0x00,0xFF,0x46,0x00,0xFF,0x46,0x00,0xFF,0x45,0x00,0xFF,0x44,0x00,0xFF,0x44,0x00,0xFF,0x43,0x00,0xFF,0x42,0x00,0xFF,0x41,0x00,0xFF,0x41,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00,0xFF,0x3E,0x00,0xFF,0x3D,0x00,0xFF,0x3C,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x3A,0x00,0xFF,0x3A,0x00,0xFF,0x39,0x00,0xFF,0x38,0x00,0xFF,0x38,0x00,0xFF,0x37,0x00,0xFF,0x36,0x00,0xFF,0x35,0x00,0xFF,0x35,0x00,0xFF,0x34,0x00,0xFF,0x33,0x00,0xFF,0x33,0x00,0xFF,0x32,0x00,0xFF,0x31,0x00,0xFF,0x31,0x00,0xFF,0x30,0x00,0xFF,0x2F,0x00,0xFF,0x2E,0x00,0xFF,0x2E,0x00,0xFF,0x2D,0x00,0xFF,0x2C,0x00,0xFF,0x2C,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x2A,0x00,0xFF,0x29,0x00,0xFF,0x28,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x26,0x00,0xFF,0x26,0x00,0xFF,0x25,0x00,0xFF,0x24,0x00,0xFF,0x24,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x21,0x00,0xFF,0x20,0x00,0xFF,0x1F,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1D,0x00,0xFF,0x1D,0x00,0xFF,0x1C,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x17,0x00,0xFF,0x17,0x00,0xFF,0x16,0x00,0xFF,0x16,0x00,0xFF,0x15,0x00,0xFF,0x14,0x00,0xFF,0x14,0x00,0xFF,0x13,0x00,0xFF,0x13,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x11,0x00,0xFF,0x11,0x00,0xFF,0x10,0x00,0xFF,0x10,0x00,0xFF,0x0F,0x00,0xFF,0x0F,0x00,0xFF,0x0E,0x00,0xFF,0x0E,0x00,0xFF,0x0D,0x00,0xFF,0x0D,0x00,0xFF,0x0C,0x00,0xFF,0x0C,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x0A,0x00,0xFF,0x09,0x00,0xFF,0x09,0x00,0xFF,0x08,0x00,0xFF,0x08,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00}; static char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; #endif \ No newline at end of file From fa099338bb87d25ea660e74b16811d18256e7d51 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 17 Sep 2010 11:34:24 +0100 Subject: [PATCH 154/237] Fix Coal and DESL --- powder.c | 34 ++++++++++++++++++++++++++++++++-- powder.h | 6 +++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/powder.c b/powder.c index b5db6ff06..ae7ba8f30 100644 --- a/powder.c +++ b/powder.c @@ -237,6 +237,8 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 150; } End Testing*/ + if(t==PT_COAL) + parts[i].life = 110; if(t==PT_FIRE) parts[i].life = rand()%50+120; if(t==PT_PLSM) @@ -474,7 +476,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(sys_pause&&!framerender) return; - if(parts[i].life && t!=PT_ACID && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM) + if(parts[i].life && t!=PT_ACID && t!=PT_COAL && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; @@ -656,7 +658,7 @@ void update_particles_i(pixel *vid, int start, int inc) } if(t==PT_GAS && pv[y/CELL][x/CELL]<-6.0f) t = parts[i].type = PT_OIL; - if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) // Only way I know to make it + if(t==PT_DESL && pv[y/CELL][x/CELL]>5.0f) // Only way I know to make it t = parts[i].type = PT_FIRE; // combust under pressure. if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) t = parts[i].type = PT_OIL; @@ -933,6 +935,34 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + else if(t==PT_COAL) + { + if(parts[i].life<=0){ + t = PT_NONE; + kill_part(i); + create_part(-1, x, y, PT_FIRE); + goto killed; + } else if(parts[i].life < 100){ + parts[i].life--; + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); + } + + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) + { + if(parts[i].life>100){ + parts[i].life = 99; + } + } + } + } else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) { for(nx=-2; nx<3; nx++) diff --git a/powder.h b/powder.h index 24614551e..cf9069ff5 100644 --- a/powder.h +++ b/powder.h @@ -243,13 +243,13 @@ static const part_type ptypes[PT_NUM] = {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f+273.15f, 88, "Smoke"}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Thermite."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite."}, {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow."}, {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description @@ -395,7 +395,7 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0}, /* LO2 */ /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0}, /* O2 */ From 99ae022d5544ecc252ff943f83dba3aa6614ec57 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 18 Sep 2010 09:52:14 +0200 Subject: [PATCH 155/237] astyle --- graphics.c | 6 +-- interface.c | 114 ++++++++++++++++++++++++++-------------------------- main.c | 70 ++++++++++++++++---------------- misc.c | 2 +- powder.c | 32 +++++++-------- 5 files changed, 112 insertions(+), 112 deletions(-) diff --git a/graphics.c b/graphics.c index 47c843fc6..7f9cf8c83 100644 --- a/graphics.c +++ b/graphics.c @@ -2121,9 +2121,9 @@ pixel *prerender_save(void *save, int size, int *width, int *height) return NULL; if(!(c[2]==0x43 && c[1]==0x75 && c[0]==0x66) && !(c[2]==0x76 && c[1]==0x53 && c[0]==0x50)) return NULL; - if(c[2]==0x43 && c[1]==0x75 && c[0]==0x66){ - new_format = 1; - } + if(c[2]==0x43 && c[1]==0x75 && c[0]==0x66) { + new_format = 1; + } if(c[4]>SAVE_VERSION) return NULL; diff --git a/interface.c b/interface.c index 1f972b301..7bbde7370 100644 --- a/interface.c +++ b/interface.c @@ -1789,7 +1789,7 @@ int search_ui(pixel *vid_buf) memset(img_id, 0, sizeof(img_id)); memset(search_ids, 0, sizeof(search_ids)); - memset(search_dates, 0, sizeof(search_dates)); + memset(search_dates, 0, sizeof(search_dates)); memset(search_names, 0, sizeof(search_names)); memset(search_scoreup, 0, sizeof(search_scoreup)); memset(search_scoredown, 0, sizeof(search_scoredown)); @@ -2004,8 +2004,8 @@ int search_ui(pixel *vid_buf) dp = pos; } } - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, 1+(YRES/GRID_S+3)/2, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, 1+(YRES/GRID_S+3)/2, 0, 107, 10, 255); fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 6, 1+(YRES/GRID_S+3)/2, 107, 10, 0, 255); if(mp==pos && !st) @@ -2069,7 +2069,7 @@ int search_ui(pixel *vid_buf) fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-1+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 57, 187, 57, 255); fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 4, nyd, 187, 57, 57, 255); - //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); } } @@ -2162,17 +2162,17 @@ int search_ui(pixel *vid_buf) fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); info_box(vid_buf, "Loading..."); - if(search_dates[mp]){ - uri = malloc(strlen(search_ids[mp])*3+strlen(search_dates[mp])*3+strlen(SERVER)+71); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - strappend(uri, "&Date="); - strcaturl(uri, search_dates[mp]); - } else { - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - } + if(search_dates[mp]) { + uri = malloc(strlen(search_ids[mp])*3+strlen(search_dates[mp])*3+strlen(SERVER)+71); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + strappend(uri, "&Date="); + strcaturl(uri, search_dates[mp]); + } else { + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + } data = http_simple_get(uri, &status, &dlen); free(uri); @@ -2384,22 +2384,22 @@ int search_ui(pixel *vid_buf) thlen = 4; } thumb_cache_add(img_id[i], thumb, thlen); - for(pos=0; pos=GRID_X*GRID_Y) break; if(votes) { sd = strchr(str+8, ' '); - if(!sd) + if(!sd) return i; *(sd++) = 0; - pu = strchr(sd, ' '); + pu = strchr(sd, ' '); if(!pu) return i; *(pu++) = 0; @@ -2624,10 +2624,10 @@ int search_results(char *str, int votes) else { sd = strchr(str+8, ' '); - if(!sd) + if(!sd) return i; *(sd++) = 0; - pu = strchr(sd, ' '); + pu = strchr(sd, ' '); if(!pu) return i; *(pu++) = 0; @@ -2650,7 +2650,7 @@ int search_results(char *str, int votes) *(r++) = 0; search_ids[i] = mystrdup(str+8); - search_dates[i] = mystrdup(sd); + search_dates[i] = mystrdup(sd); search_publish[i] = atoi(pu); search_scoreup[i] = atoi(vu); diff --git a/main.c b/main.c index f8e11f6dc..51fe3b0ca 100644 --- a/main.c +++ b/main.c @@ -310,10 +310,10 @@ void *build_save(int *size, int x0, int y0, int w, int h) i = m[j]; if(i) { - //New Temperature saving uses a 16bit unsigned int for temperatures, giving a precision of 1 degree versus 36 for the old format - int tttemp = (int)parts[i-1].temp; - d[p++] = ((tttemp&0xFF00)>>8); - d[p++] = (tttemp&0x00FF); + //New Temperature saving uses a 16bit unsigned int for temperatures, giving a precision of 1 degree versus 36 for the old format + int tttemp = (int)parts[i-1].temp; + d[p++] = ((tttemp&0xFF00)>>8); + d[p++] = (tttemp&0x00FF); } } for(j=0; jSAVE_VERSION) return 2; ver = c[4]; @@ -600,13 +600,13 @@ int parse_save(void *save, int size, int replace, int x0, int y0) if(i <= NPART) { if(ver>=42) { - if(new_format){ - ttv = (d[p++])<<8; - ttv |= (d[p++]); - parts[i-1].temp = ttv; - } else { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } + if(new_format) { + ttv = (d[p++])<<8; + ttv |= (d[p++]); + parts[i-1].temp = ttv; + } else { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } } else { parts[i-1].temp = ((d[p++]*((O_MAX_TEMP+(-O_MIN_TEMP))/255))+O_MIN_TEMP)+273; } @@ -614,9 +614,9 @@ int parse_save(void *save, int size, int replace, int x0, int y0) else { p++; - if(new_format){ - p++; - } + if(new_format) { + p++; + } } } else @@ -1253,8 +1253,8 @@ int main(int argc, char *argv[]) { set_cmode(6); } - if(sdl_key==SDLK_LEFTBRACKET){ - if(sdl_zoom_trig==1) + if(sdl_key==SDLK_LEFTBRACKET) { + if(sdl_zoom_trig==1) { ZSIZE -= 1; if(ZSIZE>32) @@ -1265,18 +1265,18 @@ int main(int argc, char *argv[]) } else { - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - bs -= 1; - else - bs -= ceil((bs/5)+0.5f); + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + bs -= 1; + else + bs -= ceil((bs/5)+0.5f); if(bs>1224) bs = 1224; if(bs<0) bs = 0; } - } - if(sdl_key==SDLK_RIGHTBRACKET){ - if(sdl_zoom_trig==1) + } + if(sdl_key==SDLK_RIGHTBRACKET) { + if(sdl_zoom_trig==1) { ZSIZE += 1; if(ZSIZE>32) @@ -1287,16 +1287,16 @@ int main(int argc, char *argv[]) } else { - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - bs += 1; - else - bs += ceil((bs/5)+0.5f); + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + bs += 1; + else + bs += ceil((bs/5)+0.5f); if(bs>1224) bs = 1224; if(bs<0) bs = 0; } - } + } if(sdl_key==SDLK_SPACE) sys_pause = !sys_pause; if(sdl_key=='h') diff --git a/misc.c b/misc.c index 2eac7b243..7c551e277 100644 --- a/misc.c +++ b/misc.c @@ -228,7 +228,7 @@ void strappend(char *dst, char *src) for(s=(unsigned char *)src; *s; s++) { - *(d++) = *s; + *(d++) = *s; } *d = 0; } diff --git a/powder.c b/powder.c index ae7ba8f30..b1473923a 100644 --- a/powder.c +++ b/powder.c @@ -237,7 +237,7 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 150; } End Testing*/ - if(t==PT_COAL) + if(t==PT_COAL) parts[i].life = 110; if(t==PT_FIRE) parts[i].life = rand()%50+120; @@ -518,7 +518,7 @@ void update_particles_i(pixel *vid, int start, int inc) (bmap[y/CELL][x/CELL]==2) || (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || + (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) { @@ -705,8 +705,8 @@ void update_particles_i(pixel *vid, int start, int inc) int ctemp = pv[y/CELL][x/CELL]*2; c_heat = 0.0f; h_count = 0; - if(t==PT_ICEI && !parts[i].ctype) - parts[i].ctype = PT_WATR; + if(t==PT_ICEI && !parts[i].ctype) + parts[i].ctype = PT_WATR; if(ptypes[t].hconduct>(rand()%250)) { for(nx=-1; nx<2; nx++) @@ -937,15 +937,15 @@ void update_particles_i(pixel *vid, int start, int inc) } else if(t==PT_COAL) { - if(parts[i].life<=0){ - t = PT_NONE; - kill_part(i); - create_part(-1, x, y, PT_FIRE); - goto killed; - } else if(parts[i].life < 100){ - parts[i].life--; - create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); - } + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + create_part(-1, x, y, PT_FIRE); + goto killed; + } else if(parts[i].life < 100) { + parts[i].life--; + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); + } for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) @@ -957,9 +957,9 @@ void update_particles_i(pixel *vid, int start, int inc) continue; if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) { - if(parts[i].life>100){ - parts[i].life = 99; - } + if(parts[i].life>100) { + parts[i].life = 99; + } } } } From c12cdce5b650220334bdc1de03303118954fb12d Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 19 Sep 2010 17:13:06 +0100 Subject: [PATCH 156/237] UI stuff for history --- interface.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/interface.c b/interface.c index 7bbde7370..c5e9f0d98 100644 --- a/interface.c +++ b/interface.c @@ -1759,7 +1759,7 @@ corrupt: int search_ui(pixel *vid_buf) { - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; int thumb_drawn[GRID_X*GRID_Y]; pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); @@ -1952,6 +1952,7 @@ int search_ui(pixel *vid_buf) } mp = dp = -1; + dap = -1; st = 0; for(gj=0; gj=gx-6 && mx<=gx+4 && my>=gy+YRES/GRID_S-4 && my<=gy+YRES/GRID_S+6) + { + mp = -1; + dap = pos; } } drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255); @@ -2025,6 +2031,16 @@ int search_ui(pixel *vid_buf) drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); } + if(!search_dates[pos] && own) + { + fillrect(vid_buf, gx-5, gy+YRES/GRID_S-3, 7, 8, 255, 255, 255, 255); + if(dap == pos){ + drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 200, 100, 80, 255); + } else { + drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 160, 70, 50, 255); + } + //drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } if(view_own || svf_admin || svf_mod) { sprintf(ts+1, "%d", search_votes[pos]); @@ -2139,6 +2155,11 @@ int search_ui(pixel *vid_buf) last = NULL; } } + if(b && !bq && dap!=-1) + { + sprintf(ed.str, "history:%s", search_ids[dap]); + lasttime = TIMEOUT; + } if(b && !bq && tp!=-1) { From d43b5a4fd848fe6f3fca12ee5a6be7d2e9dd9294 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 22 Sep 2010 16:01:49 +0100 Subject: [PATCH 157/237] Fix Thermite and Stickman reload glitch --- main.c | 4 +- powder.h | 144 +++++++++++++++++++++++++++---------------------------- 2 files changed, 74 insertions(+), 74 deletions(-) mode change 100644 => 100755 main.c mode change 100644 => 100755 powder.h diff --git a/main.c b/main.c old mode 100644 new mode 100755 index 51fe3b0ca..e0c5d629b --- a/main.c +++ b/main.c @@ -506,7 +506,7 @@ int parse_save(void *save, int size, int replace, int x0, int y0) j=d[p++]; if(j >= PT_NUM) goto corrupt; - if(j && !(isplayer == 1 && j==PT_STKM)) + if(j)// && !(isplayer == 1 && j==PT_STKM)) { if(pmap[y][x]) { @@ -1764,7 +1764,7 @@ int main(int argc, char *argv[]) memset(fire_g, 0, sizeof(fire_g)); memset(fire_b, 0, sizeof(fire_b)); } - if(x>=19 && x<=35 && svf_last && svf_open) + if(x>=19 && x<=35 && svf_last && svf_open && !bq) parse_save(svf_last, svf_lsize, 1, 0, 0); if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { diff --git a/powder.h b/powder.h old mode 100644 new mode 100755 index cf9069ff5..4f2736ba4 --- a/powder.h +++ b/powder.h @@ -337,78 +337,78 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E*/ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S*/ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,1,0,1,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0}, - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M e o O 2 N E*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K s a X W S*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E l l R T*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0}, + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* N D W O F S L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G*/ + /* o u a i i t a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M e o O 2 N E y h l*/ + /* n s t l r n v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K s a X W S s r o*/ + /* e t r l e e a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E l l R T t m w*/ }; extern int isplayer; From 6d3fe4344f6e844a0401f9381047906d2dc0813d Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 24 Sep 2010 16:07:58 +0100 Subject: [PATCH 158/237] Few bug-fixes added Fireworks and Cold-flame --- graphics.c | 80 +++++++++++++++++++++++++++- hmap.h | 2 + powder.c | 63 +++++++++++++++++++++- powder.h | 154 ++++++++++++++++++++++++++++------------------------- 4 files changed, 223 insertions(+), 76 deletions(-) diff --git a/graphics.c b/graphics.c index 7f9cf8c83..8707037e4 100644 --- a/graphics.c +++ b/graphics.c @@ -1755,6 +1755,84 @@ void draw_parts(pixel *vid) blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } + } else if(t==PT_HFLM) + { + float ttemp = (float)parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = hflm_data[caddress]; + uint8 G = hflm_data[caddress+1]; + uint8 B = hflm_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_FIRW&&parts[i].tmp==3) + { + float ttemp = (float)parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = firw_data[caddress]; + uint8 G = firw_data[caddress+1]; + uint8 B = firw_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/2; + cg = G/2; + cb = B/2; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } } else if(t==PT_FIRE && parts[i].life) { @@ -1900,7 +1978,7 @@ void draw_parts(pixel *vid) //blendpixel(vid, nx+1, ny, R, G, B, 255); } } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH) + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_HFLM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH&&t!=PT_SMKE&&t!=PT_WTRV&&!(t==PT_FIRW&&parts[i].tmp==3)) { uint8 R = PIXR(ptypes[t].pcolors); uint8 G = PIXG(ptypes[t].pcolors); diff --git a/hmap.h b/hmap.h index 92605f2c2..1af80132c 100755 --- a/hmap.h +++ b/hmap.h @@ -28,4 +28,6 @@ //Scaled Hue Scale static char color_data[] = {0xFF,0x00,0xFF,0xF1,0x00,0xFF,0xDE,0x00,0xFF,0xC7,0x00,0xFF,0xAF,0x00,0xFF,0x97,0x00,0xFF,0x82,0x00,0xFF,0x6C,0x00,0xFF,0x56,0x00,0xFF,0x41,0x00,0xFF,0x2E,0x00,0xFF,0x21,0x05,0xFF,0x16,0x0F,0xFF,0x0E,0x1B,0xFF,0x07,0x29,0xFF,0x02,0x39,0xFF,0x00,0x4B,0xFF,0x00,0x5E,0xFF,0x00,0x74,0xFF,0x00,0x8A,0xFF,0x00,0xA0,0xFF,0x00,0xAF,0xFF,0x00,0xB8,0xFE,0x00,0xC2,0xFD,0x00,0xCC,0xFD,0x00,0xD5,0xFC,0x00,0xDF,0xFA,0x00,0xE7,0xF9,0x00,0xEF,0xF6,0x00,0xF6,0xF3,0x00,0xFC,0xEE,0x00,0xFF,0xE8,0x00,0xFF,0xE1,0x00,0xFF,0xD8,0x00,0xFF,0xCE,0x00,0xFF,0xC4,0x00,0xFF,0xB9,0x00,0xFF,0xAD,0x00,0xFF,0xA1,0x00,0xFF,0x96,0x00,0xFF,0x8A,0x00,0xFF,0x80,0x00,0xFF,0x7C,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x71,0x00,0xFF,0x6D,0x00,0xFF,0x69,0x00,0xFF,0x66,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x5A,0x00,0xFF,0x56,0x00,0xFF,0x52,0x00,0xFF,0x4E,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x38,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2D,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x19,0x00,0xFF,0x17,0x01,0xFF,0x14,0x02,0xFF,0x13,0x04,0xFF,0x11,0x06,0xFF,0x0F,0x07,0xFF,0x0E,0x0A,0xFF,0x0C,0x0C,0xFF,0x0B,0x0E,0xFF,0x0A,0x10,0xFF,0x09,0x13,0xFF,0x08,0x16,0xFF,0x07,0x18,0xFF,0x06,0x1B,0xFF,0x06,0x1E,0xFF,0x05,0x21,0xFF,0x04,0x24,0xFF,0x04,0x27,0xFF,0x04,0x2A,0xFF,0x03,0x2D,0xFF,0x03,0x30,0xFF,0x03,0x34,0xFF,0x02,0x37,0xFF,0x02,0x3A,0xFF,0x02,0x3D,0xFF,0x02,0x41,0xFF,0x02,0x44,0xFF,0x01,0x47,0xFF,0x01,0x4A,0xFF,0x01,0x4E,0xFF,0x01,0x51,0xFF,0x00,0x54,0xFF,0x00,0x56,0xFF,0x00,0x58,0xFF,0x00,0x5A,0xFF,0x00,0x5C,0xFF,0x00,0x5E,0xFF,0x00,0x60,0xFF,0x00,0x62,0xFF,0x00,0x64,0xFF,0x00,0x66,0xFF,0x00,0x68,0xFF,0x00,0x6A,0xFF,0x00,0x6D,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x73,0xFF,0x00,0x75,0xFF,0x00,0x77,0xFF,0x00,0x7A,0xFF,0x00,0x7C,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x85,0xFF,0x00,0x87,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x92,0xFF,0x00,0x94,0xFF,0x00,0x97,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9D,0xFF,0x00,0x9F,0xFF,0x00,0xA1,0xFF,0x00,0xA3,0xFF,0x00,0xA6,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAC,0xFF,0x00,0xAE,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB5,0xFF,0x00,0xB7,0xFF,0x00,0xB9,0xFF,0x00,0xBB,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xC0,0xFF,0x00,0xC1,0xFF,0x00,0xC2,0xFE,0x00,0xC3,0xFE,0x00,0xC4,0xFE,0x00,0xC6,0xFD,0x00,0xC7,0xFD,0x00,0xC8,0xFD,0x00,0xC9,0xFC,0x00,0xCA,0xFC,0x00,0xCB,0xFC,0x00,0xCC,0xFB,0x00,0xCE,0xFB,0x00,0xCF,0xFB,0x00,0xD0,0xFA,0x00,0xD1,0xFA,0x00,0xD2,0xF9,0x00,0xD3,0xF9,0x00,0xD4,0xF9,0x00,0xD5,0xF8,0x00,0xD6,0xF8,0x00,0xD7,0xF7,0x00,0xD8,0xF7,0x00,0xD9,0xF7,0x00,0xDA,0xF6,0x00,0xDC,0xF6,0x00,0xDD,0xF5,0x00,0xDE,0xF5,0x00,0xDF,0xF4,0x00,0xE0,0xF4,0x00,0xE1,0xF3,0x00,0xE2,0xF3,0x00,0xE2,0xF2,0x00,0xE3,0xF2,0x00,0xE4,0xF1,0x00,0xE5,0xF1,0x00,0xE6,0xF0,0x00,0xE7,0xF0,0x00,0xE8,0xEF,0x00,0xE9,0xEE,0x00,0xEA,0xEE,0x00,0xEB,0xED,0x00,0xEC,0xED,0x00,0xEC,0xEC,0x00,0xED,0xEB,0x00,0xEE,0xEB,0x00,0xEF,0xEA,0x00,0xF0,0xE9,0x00,0xF1,0xE9,0x00,0xF1,0xE8,0x00,0xF2,0xE7,0x00,0xF3,0xE6,0x00,0xF4,0xE6,0x00,0xF4,0xE5,0x00,0xF5,0xE4,0x00,0xF6,0xE3,0x00,0xF6,0xE3,0x00,0xF7,0xE2,0x00,0xF8,0xE1,0x00,0xF8,0xE0,0x00,0xF9,0xDF,0x00,0xFA,0xDE,0x00,0xFA,0xDD,0x00,0xFB,0xDD,0x00,0xFB,0xDC,0x00,0xFC,0xDB,0x00,0xFC,0xDA,0x00,0xFD,0xD9,0x00,0xFD,0xD8,0x00,0xFE,0xD7,0x00,0xFE,0xD6,0x00,0xFF,0xD5,0x00,0xFF,0xD4,0x00,0xFF,0xD3,0x00,0xFF,0xD3,0x00,0xFF,0xD2,0x00,0xFF,0xD1,0x00,0xFF,0xD1,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCE,0x00,0xFF,0xCE,0x00,0xFF,0xCD,0x00,0xFF,0xCC,0x00,0xFF,0xCB,0x00,0xFF,0xCB,0x00,0xFF,0xCA,0x00,0xFF,0xC9,0x00,0xFF,0xC8,0x00,0xFF,0xC7,0x00,0xFF,0xC7,0x00,0xFF,0xC6,0x00,0xFF,0xC5,0x00,0xFF,0xC4,0x00,0xFF,0xC3,0x00,0xFF,0xC2,0x00,0xFF,0xC1,0x00,0xFF,0xC1,0x00,0xFF,0xC0,0x00,0xFF,0xBF,0x00,0xFF,0xBE,0x00,0xFF,0xBD,0x00,0xFF,0xBC,0x00,0xFF,0xBB,0x00,0xFF,0xBA,0x00,0xFF,0xB9,0x00,0xFF,0xB8,0x00,0xFF,0xB8,0x00,0xFF,0xB7,0x00,0xFF,0xB6,0x00,0xFF,0xB5,0x00,0xFF,0xB4,0x00,0xFF,0xB3,0x00,0xFF,0xB2,0x00,0xFF,0xB1,0x00,0xFF,0xB0,0x00,0xFF,0xAF,0x00,0xFF,0xAE,0x00,0xFF,0xAD,0x00,0xFF,0xAC,0x00,0xFF,0xAB,0x00,0xFF,0xAA,0x00,0xFF,0xA9,0x00,0xFF,0xA8,0x00,0xFF,0xA7,0x00,0xFF,0xA6,0x00,0xFF,0xA5,0x00,0xFF,0xA4,0x00,0xFF,0xA3,0x00,0xFF,0xA2,0x00,0xFF,0xA1,0x00,0xFF,0xA0,0x00,0xFF,0x9F,0x00,0xFF,0x9E,0x00,0xFF,0x9D,0x00,0xFF,0x9C,0x00,0xFF,0x9B,0x00,0xFF,0x9A,0x00,0xFF,0x99,0x00,0xFF,0x98,0x00,0xFF,0x97,0x00,0xFF,0x96,0x00,0xFF,0x95,0x00,0xFF,0x94,0x00,0xFF,0x92,0x00,0xFF,0x91,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8E,0x00,0xFF,0x8D,0x00,0xFF,0x8C,0x00,0xFF,0x8B,0x00,0xFF,0x8A,0x00,0xFF,0x89,0x00,0xFF,0x88,0x00,0xFF,0x87,0x00,0xFF,0x86,0x00,0xFF,0x85,0x00,0xFF,0x84,0x00,0xFF,0x83,0x00,0xFF,0x82,0x00,0xFF,0x81,0x00,0xFF,0x80,0x00,0xFF,0x7F,0x00,0xFF,0x7E,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7B,0x00,0xFF,0x7A,0x00,0xFF,0x79,0x00,0xFF,0x78,0x00,0xFF,0x77,0x00,0xFF,0x76,0x00,0xFF,0x75,0x00,0xFF,0x74,0x00,0xFF,0x73,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x70,0x00,0xFF,0x6F,0x00,0xFF,0x6E,0x00,0xFF,0x6D,0x00,0xFF,0x6C,0x00,0xFF,0x6B,0x00,0xFF,0x6A,0x00,0xFF,0x6A,0x00,0xFF,0x69,0x00,0xFF,0x68,0x00,0xFF,0x68,0x00,0xFF,0x67,0x00,0xFF,0x66,0x00,0xFF,0x66,0x00,0xFF,0x65,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x63,0x00,0xFF,0x63,0x00,0xFF,0x62,0x00,0xFF,0x61,0x00,0xFF,0x61,0x00,0xFF,0x60,0x00,0xFF,0x5F,0x00,0xFF,0x5F,0x00,0xFF,0x5E,0x00,0xFF,0x5D,0x00,0xFF,0x5D,0x00,0xFF,0x5C,0x00,0xFF,0x5B,0x00,0xFF,0x5B,0x00,0xFF,0x5A,0x00,0xFF,0x59,0x00,0xFF,0x59,0x00,0xFF,0x58,0x00,0xFF,0x57,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x55,0x00,0xFF,0x54,0x00,0xFF,0x54,0x00,0xFF,0x53,0x00,0xFF,0x52,0x00,0xFF,0x52,0x00,0xFF,0x51,0x00,0xFF,0x50,0x00,0xFF,0x50,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4E,0x00,0xFF,0x4D,0x00,0xFF,0x4C,0x00,0xFF,0x4B,0x00,0xFF,0x4B,0x00,0xFF,0x4A,0x00,0xFF,0x49,0x00,0xFF,0x49,0x00,0xFF,0x48,0x00,0xFF,0x47,0x00,0xFF,0x46,0x00,0xFF,0x46,0x00,0xFF,0x45,0x00,0xFF,0x44,0x00,0xFF,0x44,0x00,0xFF,0x43,0x00,0xFF,0x42,0x00,0xFF,0x41,0x00,0xFF,0x41,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00,0xFF,0x3E,0x00,0xFF,0x3D,0x00,0xFF,0x3C,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x3A,0x00,0xFF,0x3A,0x00,0xFF,0x39,0x00,0xFF,0x38,0x00,0xFF,0x38,0x00,0xFF,0x37,0x00,0xFF,0x36,0x00,0xFF,0x35,0x00,0xFF,0x35,0x00,0xFF,0x34,0x00,0xFF,0x33,0x00,0xFF,0x33,0x00,0xFF,0x32,0x00,0xFF,0x31,0x00,0xFF,0x31,0x00,0xFF,0x30,0x00,0xFF,0x2F,0x00,0xFF,0x2E,0x00,0xFF,0x2E,0x00,0xFF,0x2D,0x00,0xFF,0x2C,0x00,0xFF,0x2C,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x2A,0x00,0xFF,0x29,0x00,0xFF,0x28,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x26,0x00,0xFF,0x26,0x00,0xFF,0x25,0x00,0xFF,0x24,0x00,0xFF,0x24,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x21,0x00,0xFF,0x20,0x00,0xFF,0x1F,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1D,0x00,0xFF,0x1D,0x00,0xFF,0x1C,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x17,0x00,0xFF,0x17,0x00,0xFF,0x16,0x00,0xFF,0x16,0x00,0xFF,0x15,0x00,0xFF,0x14,0x00,0xFF,0x14,0x00,0xFF,0x13,0x00,0xFF,0x13,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x11,0x00,0xFF,0x11,0x00,0xFF,0x10,0x00,0xFF,0x10,0x00,0xFF,0x0F,0x00,0xFF,0x0F,0x00,0xFF,0x0E,0x00,0xFF,0x0E,0x00,0xFF,0x0D,0x00,0xFF,0x0D,0x00,0xFF,0x0C,0x00,0xFF,0x0C,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x0A,0x00,0xFF,0x09,0x00,0xFF,0x09,0x00,0xFF,0x08,0x00,0xFF,0x08,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00}; static char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; +static char hflm_data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04, 0x02, 0x03, 0x05, 0x03, 0x03, 0x07, 0x04, 0x04, 0x08, 0x04, 0x03, 0x09, 0x04, 0x04, 0x0B, 0x05, 0x04, 0x0C, 0x05, 0x05, 0x0D, 0x06, 0x05, 0x0E, 0x07, 0x06, 0x10, 0x07, 0x07, 0x11, 0x08, 0x07, 0x12, 0x09, 0x08, 0x14, 0x09, 0x08, 0x15, 0x0A, 0x09, 0x17, 0x0A, 0x09, 0x19, 0x0B, 0x0A, 0x1A, 0x0C, 0x0A, 0x1C, 0x0D, 0x0B, 0x1D, 0x0D, 0x0B, 0x1F, 0x0D, 0x0C, 0x22, 0x0F, 0x0D, 0x23, 0x0F, 0x0E, 0x25, 0x10, 0x0E, 0x26, 0x11, 0x0F, 0x28, 0x12, 0x10, 0x2A, 0x13, 0x10, 0x2C, 0x13, 0x11, 0x2E, 0x14, 0x12, 0x2F, 0x15, 0x12, 0x31, 0x15, 0x13, 0x33, 0x16, 0x14, 0x35, 0x17, 0x15, 0x36, 0x18, 0x15, 0x39, 0x19, 0x16, 0x3B, 0x19, 0x17, 0x3D, 0x1B, 0x17, 0x3E, 0x1B, 0x18, 0x40, 0x1C, 0x19, 0x42, 0x1D, 0x1A, 0x43, 0x1D, 0x1B, 0x45, 0x1E, 0x1C, 0x47, 0x1F, 0x1C, 0x49, 0x20, 0x1D, 0x4B, 0x21, 0x1F, 0x4C, 0x21, 0x1F, 0x4E, 0x22, 0x20, 0x50, 0x23, 0x21, 0x52, 0x23, 0x22, 0x53, 0x24, 0x23, 0x55, 0x25, 0x23, 0x56, 0x26, 0x24, 0x59, 0x26, 0x25, 0x5A, 0x27, 0x26, 0x5B, 0x28, 0x27, 0x5D, 0x28, 0x28, 0x5E, 0x29, 0x29, 0x60, 0x29, 0x2A, 0x62, 0x2A, 0x2B, 0x63, 0x2B, 0x2C, 0x64, 0x2C, 0x2E, 0x65, 0x2C, 0x2E, 0x66, 0x2C, 0x2F, 0x68, 0x2D, 0x31, 0x69, 0x2E, 0x32, 0x6A, 0x2F, 0x32, 0x6B, 0x2F, 0x34, 0x6C, 0x30, 0x34, 0x6D, 0x30, 0x35, 0x6F, 0x31, 0x37, 0x70, 0x31, 0x38, 0x71, 0x32, 0x39, 0x72, 0x33, 0x3B, 0x73, 0x33, 0x3C, 0x74, 0x34, 0x3D, 0x75, 0x35, 0x3E, 0x76, 0x35, 0x3F, 0x78, 0x36, 0x41, 0x78, 0x36, 0x42, 0x79, 0x36, 0x43, 0x7A, 0x37, 0x44, 0x7B, 0x37, 0x46, 0x7C, 0x38, 0x48, 0x7D, 0x39, 0x48, 0x7E, 0x3A, 0x49, 0x7F, 0x39, 0x4B, 0x80, 0x3A, 0x4C, 0x81, 0x3B, 0x4E, 0x82, 0x3C, 0x4F, 0x83, 0x3C, 0x51, 0x84, 0x3C, 0x52, 0x84, 0x3D, 0x54, 0x86, 0x3E, 0x55, 0x87, 0x3E, 0x56, 0x88, 0x3F, 0x57, 0x89, 0x40, 0x59, 0x8A, 0x40, 0x5A, 0x8A, 0x41, 0x5C, 0x8B, 0x41, 0x5D, 0x8C, 0x42, 0x5F, 0x8D, 0x41, 0x60, 0x8E, 0x42, 0x62, 0x8E, 0x42, 0x62, 0x8F, 0x44, 0x65, 0x90, 0x43, 0x65, 0x91, 0x45, 0x67, 0x91, 0x44, 0x69, 0x92, 0x45, 0x6A, 0x93, 0x46, 0x6B, 0x94, 0x46, 0x6C, 0x94, 0x46, 0x6E, 0x96, 0x47, 0x70, 0x96, 0x48, 0x70, 0x97, 0x48, 0x72, 0x98, 0x48, 0x73, 0x99, 0x49, 0x74, 0x99, 0x49, 0x76, 0x9A, 0x4A, 0x77, 0x9A, 0x4B, 0x78, 0x9B, 0x4B, 0x7A, 0x9C, 0x4B, 0x7B, 0x9D, 0x4B, 0x7C, 0x9E, 0x4C, 0x7D, 0x9F, 0x4C, 0x7E, 0x9F, 0x4D, 0x7F, 0xA0, 0x4E, 0x80, 0xA0, 0x4E, 0x82, 0xA1, 0x4E, 0x83, 0xA2, 0x4F, 0x84, 0xA3, 0x4F, 0x85, 0xA3, 0x4F, 0x86, 0xA4, 0x4F, 0x88, 0xA5, 0x50, 0x89, 0xA5, 0x50, 0x89, 0xA6, 0x51, 0x8B, 0xA6, 0x51, 0x8B, 0xA7, 0x51, 0x8D, 0xA8, 0x51, 0x8E, 0xA9, 0x52, 0x8F, 0xAA, 0x52, 0x90, 0xAA, 0x53, 0x92, 0xAB, 0x53, 0x92, 0xAB, 0x53, 0x93, 0xAC, 0x54, 0x95, 0xAD, 0x53, 0x95, 0xAE, 0x54, 0x96, 0xAE, 0x55, 0x98, 0xAE, 0x54, 0x98, 0xAF, 0x55, 0x9A, 0xB0, 0x56, 0x9B, 0xB0, 0x56, 0x9C, 0xB1, 0x56, 0x9D, 0xB1, 0x56, 0x9E, 0xB2, 0x56, 0xA0, 0xB3, 0x57, 0xA0, 0xB3, 0x57, 0xA1, 0xB3, 0x57, 0xA2, 0xB4, 0x58, 0xA3, 0xB4, 0x58, 0xA4, 0xB5, 0x57, 0xA5, 0xB6, 0x58, 0xA6, 0xB6, 0x58, 0xA7, 0xB7, 0x58, 0xA8, 0xB7, 0x59, 0xA9, 0xB8, 0x58, 0xAA, 0xB9, 0x5A, 0xAB, 0xB9, 0x59, 0xAC, 0xBA, 0x5A, 0xAD, 0xBA, 0x5A, 0xAE, 0xBB, 0x5A, 0xAF, 0xBB, 0x5A, 0xB0, 0xBC, 0x5B, 0xB0, 0xBC, 0x5A, 0xB1, 0xBD, 0x5B, 0xB2, 0xBD, 0x5B, 0xB3, 0xBD, 0x5B, 0xB4, 0xBE, 0x5C, 0xB5, 0xBE, 0x5B, 0xB5, 0xBE, 0x5B, 0xB7, 0xBF, 0x5C, 0xB7, 0xBF, 0x5C, 0xB8, 0xBF, 0x5C, 0xB9, 0xC0, 0x5C, 0xB9, 0xC0, 0x5C, 0xBA, 0xC0, 0x5C, 0xBA, 0xC1, 0x5D, 0xBB, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBD, 0xC2, 0x5E, 0xBE, 0xC3, 0x5E, 0xBE, 0xC3, 0x5E, 0xBF, 0xC3, 0x5E, 0xC0, 0xC3, 0x5E, 0xC0, 0xC4, 0x5E, 0xC1, 0xC4}; +static char firw_data[] = {0x86,0xC6,0xF8,0x8B,0xCC,0xFC,0x80,0xD9,0xF7,0x7B,0xE9,0xF5,0x7A,0xE3,0xF8,0x84,0xEE,0xF8,0x85,0xEB,0xEB,0x89,0xEB,0xF1,0x7B,0xEA,0xED,0x7F,0xEB,0xF2,0x84,0xF1,0xFF,0x87,0xFC,0xFF,0x8F,0xEE,0xFF,0x8C,0xED,0xFB,0x9E,0xF8,0xF5,0xA2,0xF2,0xF1,0xA1,0xF8,0xED,0x99,0xED,0xE8,0x99,0xED,0xEC,0x8E,0xE6,0xEB,0x93,0xE4,0xE5,0x90,0xE0,0xDE,0x90,0xE0,0xDB,0xA0,0xD2,0xDF,0x9A,0xCB,0xDB,0x9F,0xBD,0xE0,0x99,0xB8,0xE0,0xA5,0xBE,0xD9,0xAB,0xAF,0xD8,0xB0,0xB7,0xD9,0xB8,0xAA,0xD2,0xC6,0xA3,0xC3,0xC6,0xA7,0xC0,0xC2,0xB0,0xC0,0xC9,0xB3,0xBA,0xC9,0xB8,0xBC,0xE0,0xB1,0xBB,0xD8,0xAE,0xB9,0xD8,0xB5,0xAE,0xD9,0xAF,0xA9,0xDE,0xB7,0xB0,0xE7,0xB2,0xB0,0xE2,0xB8,0xA8,0xDB,0xB5,0xA8,0xDC,0xB9,0xA6,0xEA,0xC3,0xA2,0xEA,0xC1,0xA5,0xF9,0xB9,0x9B,0xFA,0xB1,0x95,0xFF,0xAA,0x81,0xFF,0xA0,0x81,0xFF,0x9F,0x86,0xFF,0x94,0x82,0xFF,0x91,0x86,0xFF,0x8E,0x8F,0xFF,0x82,0x8F,0xFF,0x86,0x93,0xFB,0x8F,0x92,0xF9,0x90,0x94,0xE8,0x83,0xA2,0xE4,0x7E,0x95,0xE6,0x71,0x8E,0xE2,0x6A,0x82,0xE9,0x62,0x72,0xEC,0x57,0x6F,0xF2,0x54,0x71,0xF4,0x48,0x78,0xF5,0x45,0x7C,0xEB,0x46,0x7A,0xF2,0x54,0x88,0xF9,0x59,0x8C,0xFF,0x58,0x84,0xFF,0x52,0x8A,0xFF,0x56,0x85,0xFF,0x54,0x84,0xFF,0x57,0x8E,0xFF,0x61,0x97,0xFF,0x51,0x9F,0xFF,0x54,0xA0,0xFF,0x50,0x9A,0xFF,0x53,0xA7,0xFF,0x59,0xA1,0xFF,0x5E,0xA3,0xFF,0x5C,0xAB,0xFF,0x63,0xA7,0xFF,0x5B,0xA5,0xFB,0x57,0xA6,0xFB,0x5C,0xAF,0xF7,0x57,0xB3,0xEB,0x58,0xB5,0xE4,0x47,0xBB,0xE7,0x4C,0xC9,0xD8,0x50,0xC5,0xD4,0x51,0xD0,0xC8,0x4E,0xD8,0xC6,0x4A,0xDC,0xC9,0x44,0xDB,0xB7,0x47,0xCF,0xB0,0x44,0xC7,0x9E,0x44,0xC3,0x9C,0x4A,0xC5,0x97,0x44,0xC8,0x8E,0x44,0xCD,0x81,0x44,0xC6,0x8A,0x44,0xC1,0x87,0x44,0xC8,0x8A,0x44,0xCE,0x90,0x44,0xC7,0x86,0x44,0xC5,0x8A,0x44,0xC9,0x7F,0x44,0xC7,0x82,0x44,0xBF,0x87,0x44,0xBA,0x8C,0x44,0xB7,0x86,0x44,0xAE,0x7C,0x46,0xA5,0x73,0x4A,0xA9,0x75,0x49,0xA5,0x7B,0x47,0xA1,0x73,0x44,0x9D,0x7C,0x44,0x92,0x7D,0x44,0x90,0x87,0x44,0x88,0x7F,0x44,0x93,0x76,0x44,0x9D,0x7A,0x44,0x9D,0x7C,0x44,0x9F,0x80,0x44,0xA7,0x7E,0x44,0x98,0x82,0x44,0x94,0x80,0x44,0x94,0x8E,0x46,0x92,0x85,0x44,0x95,0x7F,0x44,0x89,0x7B,0x49,0x95,0x77,0x57,0x9E,0x7A,0x58,0xA7,0x77,0x5D,0xB3,0x76,0x64,0xAE,0x71,0x6B,0xA5,0x78,0x7A,0xA5,0x76,0x7D,0x9C,0x85,0x7F,0xA0,0x89,0x7C,0x9B,0x92,0x77,0x8C,0x96,0x6A,0x97,0x96,0x77,0x93,0xA9,0x7F,0x92,0xAC,0x80,0x9A,0xAD,0x89,0xA1,0xAA,0x86,0xA8,0xAF,0x98,0xAC,0xAE,0x9F,0xAF,0xB6,0xA6,0xB9,0xB1,0xA8,0xAF,0xBA,0xB0,0xAB,0xBF,0xAA,0xAD,0xBB,0xAD,0xA6,0xC3,0xAC,0xA4,0xC0,0xB7,0xA5,0xCD,0xB9,0xA9,0xDD,0xB1,0xA9,0xE8,0xBF,0x9D,0xEC,0xB9,0x9A,0xF4,0xC9,0x9E,0xEE,0xD3,0x95,0xF4,0xD5,0x9C,0xF1,0xD1,0x9F,0xF1,0xD3,0x9A,0xF2,0xCD,0x8F,0xE4,0xD7,0x92,0xE8,0xD6,0x98,0xE8,0xCA,0x9D,0xE6,0xCE,0xA2,0xE0,0xC3,0xA2,0xDE,0xBE,0xA0,0xDB,0xB2,0x9C,0xED,0xB1,0xA1,0xEF,0xAA,0x9F,0xED,0x9B,0x9D,0xEE,0x8F,0x96,0xEB,0x95,0x9C,0xF3,0x95,0xA3,0xED,0x9A,0xAB,0xF0,0x92,0xB3,0xF1,0x85,0xBD,0xF5,0x89,0xC9,0xF3,0x81,0xC7,0xF6,0x81,0xC2,0xEF,0x87,0xC7,0xF3,0x8A,0xC2,0xF5,0x85,0xC3,0xE4,0x86,0xC5,0xE1,0x87,0xBE,0xD6,0x92,0xBC,0xD5,0x9D,0xB7,0xCE,0x9F,0xB7,0xCC,0xA0,0xAD,0xCD,0x9C,0x9B,0xCF,0x9D,0x93}; #endif \ No newline at end of file diff --git a/powder.c b/powder.c index b1473923a..d4ed908e9 100644 --- a/powder.c +++ b/powder.c @@ -227,6 +227,7 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 0; parts[i].ctype = 0; parts[i].temp = ptypes[t].heat; + parts[i].tmp = 0; } if(t==PT_ACID) { @@ -243,6 +244,8 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = rand()%50+120; if(t==PT_PLSM) parts[i].life = rand()%150+50; + if(t==PT_HFLM) + parts[i].life = rand()%150+50; if(t==PT_LAVA) parts[i].life = rand()%120+240; if(t==PT_NBLE) @@ -480,7 +483,7 @@ void update_particles_i(pixel *vid, int start, int inc) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; - if(parts[i].life<=0 && t!=PT_METL && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) + if(parts[i].life<=0 && t!=PT_METL && t!=PT_FIRW && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) { kill_part(i); continue; @@ -808,6 +811,8 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = pstates[t].gas; pv[y/CELL][x/CELL] += 0.50f; if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_HFLM) parts[i].life = rand()%50+120; } } @@ -1285,6 +1290,60 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + else if(t==PT_FIRW){ + if(parts[i].tmp==0){ + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_FIRE) + { + parts[i].tmp = 1; + parts[i].life = rand()%50+120; + } + } + } + else if(parts[i].tmp==1){ + if(parts[i].life==0){ + parts[i].tmp=2; + } else { + float newVel = parts[i].life/50; + parts[i].flags = parts[i].flags&0xFFFFFFFE; + parts[i].vy = -newVel; + ly-=newVel; + iy-=newVel; + } + } + else if(parts[i].tmp==2){ + for(nx=-2; nx<3; nx++){ + for(ny=-2; ny<3; ny++){ + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + parts[r>>8].vx = (rand()%3-1)*tmul; + parts[r>>8].vy = (rand()%3-1)*tmul; + parts[r>>8].tmp = 3; + parts[r>>8].life = rand()%100+100; + } + } + } + pv[y/CELL][x/CELL] += 20; + kill_part(i); + } else if(parts[i].tmp==3){ + if(parts[i].life<=0){ + kill_part(i); + } + } + } else if(t==PT_BTRY) { rt = 3 + (int)pv[y/CELL][x/CELL]; @@ -1944,7 +2003,7 @@ killed: parts[i].type = PT_NBLE; parts[i].life = 0; } - if (t==PT_FIRE && parts[i].life <=1 && parts[i].temp<673) + if (t==PT_FIRE && parts[i].life <=1 && parts[i].temp<625) { t = parts[i].type = PT_SMKE; parts[i].life = rand()%20+250; diff --git a/powder.h b/powder.h index 4f2736ba4..8d03b3d8b 100755 --- a/powder.h +++ b/powder.h @@ -106,7 +106,9 @@ #define PT_THRM 65 #define PT_GLOW 66 #define PT_BRCK 67 -#define PT_NUM 68 +#define PT_HFLM 68 +#define PT_FIRW 69 +#define PT_NUM 70 #define R_TEMP 22 #define MAX_TEMP 9999 @@ -187,7 +189,7 @@ static const part_type ptypes[PT_NUM] = {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable. Solidifies under pressure"}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f+273.15f, 88, "Ignites flammable materials. Heats air."}, {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f+273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, @@ -241,7 +243,7 @@ static const part_type ptypes[PT_NUM] = {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f+273.15f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f+273.15f, 88, "Smoke"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f+273.15f, 88, "Smoke"}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, @@ -249,9 +251,11 @@ static const part_type ptypes[PT_NUM] = {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow, Glows under pressure"}, {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -326,6 +330,8 @@ static part_state pstates[PT_NUM] = /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = { @@ -337,74 +343,76 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E*/ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S*/ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0}, - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* N D W O F S L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G*/ /* o u a i i t a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M e o O 2 N E y h l*/ /* n s t l r n v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K s a X W S s r o*/ From 3d6e7f8f62fc2e34c1d525842dc711c3be903a20 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 24 Sep 2010 16:23:29 +0100 Subject: [PATCH 159/237] Fireworks bugfixes --- powder.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/powder.c b/powder.c index d4ed908e9..42099febc 100644 --- a/powder.c +++ b/powder.c @@ -1301,7 +1301,7 @@ void update_particles_i(pixel *vid, int start, int inc) if((r>>8)>=NPART || !r) continue; rt = parts[r>>8].type; - if(rt==PT_FIRE) + if(rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR) { parts[i].tmp = 1; parts[i].life = rand()%50+120; @@ -1314,9 +1314,11 @@ void update_particles_i(pixel *vid, int start, int inc) } else { float newVel = parts[i].life/50; parts[i].flags = parts[i].flags&0xFFFFFFFE; - parts[i].vy = -newVel; - ly-=newVel; - iy-=newVel; + if((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE){ + parts[i].vy = -newVel; + ly-=newVel; + iy-=newVel; + } } } else if(parts[i].tmp==2){ @@ -1329,10 +1331,13 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - parts[r>>8].vx = (rand()%3-1)*tmul; - parts[r>>8].vy = (rand()%3-1)*tmul; - parts[r>>8].tmp = 3; - parts[r>>8].life = rand()%100+100; + if(parts[r>>8].type==PT_FIRW){ + parts[r>>8].vx = (rand()%3-1)*tmul; + parts[r>>8].vy = (rand()%3-1)*tmul; + parts[r>>8].tmp = 3; + parts[r>>8].life = rand()%100+100; + parts[r>>8].temp = 6000.0f; + } } } } From fffb5300d0663924df19184b286cfda438ea50b2 Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Sat, 25 Sep 2010 04:07:55 -0700 Subject: [PATCH 160/237] --- defines.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/defines.h b/defines.h index 73ab019f2..a324e9f54 100644 --- a/defines.h +++ b/defines.h @@ -7,8 +7,8 @@ #define PATH_SEP "/" #endif -#define SAVE_VERSION 42 -#define MINOR_VERSION 1 +#define SAVE_VERSION 43 +#define MINOR_VERSION 0 #define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. #define BETA From c7dab50b51f51d8c386123b33d2a726740d03483 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 25 Sep 2010 19:11:25 +0100 Subject: [PATCH 161/237] Add Anti-Matter --- defines.h | 4 +- powder.c | 31 ++++++++++- powder.h | 150 ++++++++++++++++++++++++++++-------------------------- 3 files changed, 109 insertions(+), 76 deletions(-) diff --git a/defines.h b/defines.h index 73ab019f2..a324e9f54 100644 --- a/defines.h +++ b/defines.h @@ -7,8 +7,8 @@ #define PATH_SEP "/" #endif -#define SAVE_VERSION 42 -#define MINOR_VERSION 1 +#define SAVE_VERSION 43 +#define MINOR_VERSION 0 #define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. #define BETA diff --git a/powder.c b/powder.c index 42099febc..6c6908419 100644 --- a/powder.c +++ b/powder.c @@ -1260,7 +1260,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1289,6 +1289,35 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + } + else if(t==PT_AMTR) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if((r&0xFF)!=PT_AMTR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_NONE && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_BHOL) + { + t = parts[i].life++; + if(parts[i].life==3) + { + parts[i].type = PT_NONE; + kill_part(i); + } + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + kill_part(r>>8); + if(2>(rand()/(RAND_MAX/100))) + create_part(r>>8, x+nx, y+ny, PT_PHOT); + pv[y/CELL][x/CELL] -= 5.0f; + continue; + } + } } else if(t==PT_FIRW){ if(parts[i].tmp==0){ diff --git a/powder.h b/powder.h index 8d03b3d8b..935af398a 100755 --- a/powder.h +++ b/powder.h @@ -108,7 +108,8 @@ #define PT_BRCK 67 #define PT_HFLM 68 #define PT_FIRW 69 -#define PT_NUM 70 +#define PT_AMTR 70 +#define PT_NUM 71 #define R_TEMP 22 #define MAX_TEMP 9999 @@ -245,7 +246,7 @@ static const part_type ptypes[PT_NUM] = {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f+273.15f, 88, "Smoke"}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, @@ -255,7 +256,8 @@ static const part_type ptypes[PT_NUM] = {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow, Glows under pressure"}, {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -332,6 +334,7 @@ static part_state pstates[PT_NUM] = /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = { @@ -343,76 +346,77 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E*/ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S*/ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0}, - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* N D W O F S L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G*/ /* o u a i i t a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M e o O 2 N E y h l*/ /* n s t l r n v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K s a X W S s r o*/ From ddde608d3e95cbeade256eacf3ea33e974c004c7 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 26 Sep 2010 03:37:13 -0400 Subject: [PATCH 162/237] half done commiting --- powder.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 6c6908419..c82c5d8b9 100644 --- a/powder.c +++ b/powder.c @@ -238,6 +238,10 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 150; } End Testing*/ + if(t==PT_FUSE) + parts[i].life = ((uint32_t)(50 << 24) | (uint32_t)50); + if(t==PT_FSEP) + parts[i].life = 50; if(t==PT_COAL) parts[i].life = 110; if(t==PT_FIRE) @@ -479,7 +483,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(sys_pause&&!framerender) return; - if(parts[i].life && t!=PT_ACID && t!=PT_COAL && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM) + if(parts[i].life && t!=PT_ACID && t!=PT_COAL && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM && t!=PT_FUSE && t!=PT_FSEP) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; @@ -968,6 +972,80 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + else if(t==PT_FUSE) + { + // I do a parts[i].life hack here, the first half bits is for the burn life, the last half bits is for the pressure life + tempu1 = (uint16_t)(((unsigned int)parts[i].life) >> 24); + tempu2 = (uint16_t)(((unsigned int)parts[i].life) & 0x0000FFFF); + if(tempu1<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (tempu1 < 40) { + tempu1--; + if((rand()%100)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + if(pv[y/CELL][x/CELL] > 0.8f) + tempu2--; + else if(tempu2<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_FSEP); + goto killed; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) + { + if(tempu1>40) { + tempu1 = 39; + } + } + } + parts[i].life = ((uint32_t)(((uint32_t)tempu1 << 24) | (uint32_t)tempu2)); + } + else if(t==PT_FSEP) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%10)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) + { + if(parts[i].life>40) { + parts[i].life = 39; + } + } + } + } else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) { for(nx=-2; nx<3; nx++) From 7341fd94685f83956374d34323c11de5c27a9e06 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 26 Sep 2010 04:01:14 -0400 Subject: [PATCH 163/237] merged! --- powder.c | 4 ++ powder.h | 183 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 100 insertions(+), 87 deletions(-) diff --git a/powder.c b/powder.c index c82c5d8b9..ffe604b2f 100644 --- a/powder.c +++ b/powder.c @@ -1,3 +1,4 @@ +#include #include #include "defines.h" #include "powder.h" @@ -466,6 +467,9 @@ int nearest_part(int ci, int t) void update_particles_i(pixel *vid, int start, int inc) { int i, j, x, y, t, nx, ny, r, a, s, rt, fe, nt, lpv, nearp, pavg; + uint16_t tempu1, tempu2; + int16_t temps1, temps2; + float tempf1, tempf2; float mv, dx, dy, ix, iy, lx, ly, d, pp; float pt = R_TEMP; float c_heat = 0.0f; diff --git a/powder.h b/powder.h index 935af398a..ffe2dab96 100755 --- a/powder.h +++ b/powder.h @@ -108,8 +108,10 @@ #define PT_BRCK 67 #define PT_HFLM 68 #define PT_FIRW 69 -#define PT_AMTR 70 -#define PT_NUM 71 +#define PT_FUSE 70 +#define PT_FSEP 71 +#define PT_AMTR 72 +#define PT_NUM 73 #define R_TEMP 22 #define MAX_TEMP 9999 @@ -247,7 +249,7 @@ static const part_type ptypes[PT_NUM] = {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f+273.15f, 88, "Smoke"}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, @@ -255,9 +257,11 @@ static const part_type ptypes[PT_NUM] = {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow, Glows under pressure"}, {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -333,94 +337,99 @@ static part_state pstates[PT_NUM] = /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; + static unsigned char can_move[PT_NUM][PT_NUM] = { /* A B */ /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E*/ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S*/ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0}, - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* N D W O F S L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G*/ - /* o u a i i t a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M e o O 2 N E y h l*/ - /* n s t l r n v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K s a X W S s r o*/ - /* e t r l e e a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E l l R T t m w*/ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* GLOW */ + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ + /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ + /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ + /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ + /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0}, /* FSEP */ + /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R */ }; extern int isplayer; From 26c67a303ee159006fa63f04aef7132d95069b64 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 26 Sep 2010 12:57:02 +0100 Subject: [PATCH 164/237] Gah\! --- powder.c | 88 ++++++++++++++++++++++++++------------------------------ 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/powder.c b/powder.c index ffe604b2f..c47400986 100644 --- a/powder.c +++ b/powder.c @@ -239,10 +239,12 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 150; } End Testing*/ - if(t==PT_FUSE) - parts[i].life = ((uint32_t)(50 << 24) | (uint32_t)50); + if(t==PT_FUSE){ + parts[i].life = 50; + parts[i].tmp = 50; + } if(t==PT_FSEP) - parts[i].life = 50; + parts[i].life = 50; if(t==PT_COAL) parts[i].life = 110; if(t==PT_FIRE) @@ -467,9 +469,6 @@ int nearest_part(int ci, int t) void update_particles_i(pixel *vid, int start, int inc) { int i, j, x, y, t, nx, ny, r, a, s, rt, fe, nt, lpv, nearp, pavg; - uint16_t tempu1, tempu2; - int16_t temps1, temps2; - float tempf1, tempf2; float mv, dx, dy, ix, iy, lx, ly, d, pp; float pt = R_TEMP; float c_heat = 0.0f; @@ -978,46 +977,41 @@ void update_particles_i(pixel *vid, int start, int inc) } else if(t==PT_FUSE) { - // I do a parts[i].life hack here, the first half bits is for the burn life, the last half bits is for the pressure life - tempu1 = (uint16_t)(((unsigned int)parts[i].life) >> 24); - tempu2 = (uint16_t)(((unsigned int)parts[i].life) & 0x0000FFFF); - if(tempu1<=0) { + if(parts[i].life<=0) { t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_PLSM); parts[r].life = 50; goto killed; - } else if (tempu1 < 40) { - tempu1--; - if((rand()%100)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%100)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } } - if(pv[y/CELL][x/CELL] > 0.8f) - tempu2--; - else if(tempu2<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_FSEP); - goto killed; - } + if(pv[y/CELL][x/CELL] > 0.8f) + parts[i].tmp--; + else if(parts[i].tmp<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_FSEP); + goto killed; + } for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx=0 && y+ny>0 && x+nx>8)>=NPART || !r) continue; if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) { - if(tempu1>40) { - tempu1 = 39; + if(parts[i].life>40) { + parts[i].life = 39; } } } - parts[i].life = ((uint32_t)(((uint32_t)tempu1 << 24) | (uint32_t)tempu2)); } else if(t==PT_FSEP) { @@ -1025,30 +1019,28 @@ void update_particles_i(pixel *vid, int start, int inc) t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; + parts[r].life = 50; goto killed; } else if (parts[i].life < 40) { - parts[i].life--; - if((rand()%10)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } + parts[i].life--; + if((rand()%10)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } } for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) + { + if(parts[i].life>40) { + parts[i].life = 39; } + } + } } else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) { From 0424907d28aa847bd754b561cacbc235accf04d0 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sun, 26 Sep 2010 14:00:15 +0200 Subject: [PATCH 165/237] atzensty... astyle --- interface.c | 18 ++-- powder.c | 288 ++++++++++++++++++++++++++-------------------------- powder.h | 4 +- 3 files changed, 155 insertions(+), 155 deletions(-) mode change 100755 => 100644 powder.h diff --git a/interface.c b/interface.c index c5e9f0d98..27232c969 100644 --- a/interface.c +++ b/interface.c @@ -1952,7 +1952,7 @@ int search_ui(pixel *vid_buf) } mp = dp = -1; - dap = -1; + dap = -1; st = 0; for(gj=0; gj=gx-6 && mx<=gx+4 && my>=gy+YRES/GRID_S-4 && my<=gy+YRES/GRID_S+6) + if(!search_dates[pos] && mx>=gx-6 && mx<=gx+4 && my>=gy+YRES/GRID_S-4 && my<=gy+YRES/GRID_S+6) { mp = -1; dap = pos; @@ -2034,11 +2034,11 @@ int search_ui(pixel *vid_buf) if(!search_dates[pos] && own) { fillrect(vid_buf, gx-5, gy+YRES/GRID_S-3, 7, 8, 255, 255, 255, 255); - if(dap == pos){ - drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 200, 100, 80, 255); - } else { - drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 160, 70, 50, 255); - } + if(dap == pos) { + drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 200, 100, 80, 255); + } else { + drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 160, 70, 50, 255); + } //drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); } if(view_own || svf_admin || svf_mod) @@ -2156,10 +2156,10 @@ int search_ui(pixel *vid_buf) } } if(b && !bq && dap!=-1) - { + { sprintf(ed.str, "history:%s", search_ids[dap]); lasttime = TIMEOUT; - } + } if(b && !bq && tp!=-1) { diff --git a/powder.c b/powder.c index c47400986..5a0b95b4f 100644 --- a/powder.c +++ b/powder.c @@ -228,7 +228,7 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 0; parts[i].ctype = 0; parts[i].temp = ptypes[t].heat; - parts[i].tmp = 0; + parts[i].tmp = 0; } if(t==PT_ACID) { @@ -239,10 +239,10 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 150; } End Testing*/ - if(t==PT_FUSE){ + if(t==PT_FUSE) { parts[i].life = 50; - parts[i].tmp = 50; - } + parts[i].tmp = 50; + } if(t==PT_FSEP) parts[i].life = 50; if(t==PT_COAL) @@ -819,7 +819,7 @@ void update_particles_i(pixel *vid, int start, int inc) pv[y/CELL][x/CELL] += 0.50f; if(t==PT_FIRE) parts[i].life = rand()%50+120; - if(t==PT_HFLM) + if(t==PT_HFLM) parts[i].life = rand()%50+120; } } @@ -975,73 +975,73 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - else if(t==PT_FUSE) + else if(t==PT_FUSE) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%100)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + if(pv[y/CELL][x/CELL] > 0.8f) + parts[i].tmp--; + else if(parts[i].tmp<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_FSEP); + goto killed; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) + { + if(parts[i].life>40) { + parts[i].life = 39; } - if(pv[y/CELL][x/CELL] > 0.8f) - parts[i].tmp--; - else if(parts[i].tmp<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_FSEP); - goto killed; - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } - } + } } - else if(t==PT_FSEP) - { - if(parts[i].life<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; - } else if (parts[i].life < 40) { - parts[i].life--; - if((rand()%10)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } + } + else if(t==PT_FSEP) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%10)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) + { + if(parts[i].life>40) { + parts[i].life = 39; } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } - } + } } + } else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) { for(nx=-2; nx<3; nx++) @@ -1334,7 +1334,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1369,89 +1369,89 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) continue; rt = parts[r>>8].type; - if((r&0xFF)!=PT_AMTR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_NONE && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_BHOL) - { - t = parts[i].life++; - if(parts[i].life==3) - { - parts[i].type = PT_NONE; - kill_part(i); - } - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - kill_part(r>>8); - if(2>(rand()/(RAND_MAX/100))) - create_part(r>>8, x+nx, y+ny, PT_PHOT); - pv[y/CELL][x/CELL] -= 5.0f; - continue; - } + if((r&0xFF)!=PT_AMTR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_NONE && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_BHOL) + { + t = parts[i].life++; + if(parts[i].life==3) + { + parts[i].type = PT_NONE; + kill_part(i); + } + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + kill_part(r>>8); + if(2>(rand()/(RAND_MAX/100))) + create_part(r>>8, x+nx, y+ny, PT_PHOT); + pv[y/CELL][x/CELL] -= 5.0f; + continue; + } } } - else if(t==PT_FIRW){ - if(parts[i].tmp==0){ - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR) - { - parts[i].tmp = 1; - parts[i].life = rand()%50+120; - } - } - } - else if(parts[i].tmp==1){ - if(parts[i].life==0){ - parts[i].tmp=2; - } else { - float newVel = parts[i].life/50; - parts[i].flags = parts[i].flags&0xFFFFFFFE; - if((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE){ - parts[i].vy = -newVel; - ly-=newVel; - iy-=newVel; - } - } - } - else if(parts[i].tmp==2){ - for(nx=-2; nx<3; nx++){ - for(ny=-2; ny<3; ny++){ - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type==PT_FIRW){ - parts[r>>8].vx = (rand()%3-1)*tmul; - parts[r>>8].vy = (rand()%3-1)*tmul; - parts[r>>8].tmp = 3; - parts[r>>8].life = rand()%100+100; - parts[r>>8].temp = 6000.0f; - } - } - } - } - pv[y/CELL][x/CELL] += 20; - kill_part(i); - } else if(parts[i].tmp==3){ - if(parts[i].life<=0){ - kill_part(i); - } - } - } + else if(t==PT_FIRW) { + if(parts[i].tmp==0) { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR) + { + parts[i].tmp = 1; + parts[i].life = rand()%50+120; + } + } + } + else if(parts[i].tmp==1) { + if(parts[i].life==0) { + parts[i].tmp=2; + } else { + float newVel = parts[i].life/50; + parts[i].flags = parts[i].flags&0xFFFFFFFE; + if((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE) { + parts[i].vy = -newVel; + ly-=newVel; + iy-=newVel; + } + } + } + else if(parts[i].tmp==2) { + for(nx=-2; nx<3; nx++) { + for(ny=-2; ny<3; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type==PT_FIRW) { + parts[r>>8].vx = (rand()%3-1)*tmul; + parts[r>>8].vy = (rand()%3-1)*tmul; + parts[r>>8].tmp = 3; + parts[r>>8].life = rand()%100+100; + parts[r>>8].temp = 6000.0f; + } + } + } + } + pv[y/CELL][x/CELL] += 20; + kill_part(i); + } else if(parts[i].tmp==3) { + if(parts[i].life<=0) { + kill_part(i); + } + } + } else if(t==PT_BTRY) { rt = 3 + (int)pv[y/CELL][x/CELL]; diff --git a/powder.h b/powder.h old mode 100755 new mode 100644 index ffe2dab96..1d19a2bde --- a/powder.h +++ b/powder.h @@ -353,7 +353,7 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M */ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T */ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0}, /* Dust */ /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Watr */ /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ @@ -378,7 +378,7 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Wtrv */ /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Dstw */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Dstw */ /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0}, /* Salt */ /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Sltw */ /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ From 9707323109bb04e78b1e8ed4c317c8c75f5494eb Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 26 Sep 2010 15:18:03 +0100 Subject: [PATCH 166/237] Added Powered Clone and Heat Switch --- graphics.c | 37 ++++++++++- powder.c | 103 ++++++++++++++++++++++++++++--- powder.h | 176 ++++++++++++++++++++++++++++------------------------- 3 files changed, 223 insertions(+), 93 deletions(-) diff --git a/graphics.c b/graphics.c index 8707037e4..3ea0635e9 100644 --- a/graphics.c +++ b/graphics.c @@ -1710,13 +1710,46 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny, GR, GR, GR, 223); blendpixel(vid, nx, ny+1, GR, GR, GR, 223); blendpixel(vid, nx, ny-1, GR, GR, GR, 223); - + blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112); blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112); blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112); blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112); } - } else if(t==PT_PLSM) + } + else if(t==PT_PCLN) + { + uint8 GR = 0x3B+(parts[i].life*19); + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, 10); + if(cmode == 4) { + blendpixel(vid, nx+1, ny, GR, GR, 10, 223); + blendpixel(vid, nx-1, ny, GR, GR, 10, 223); + blendpixel(vid, nx, ny+1, GR, GR, 10, 223); + blendpixel(vid, nx, ny-1, GR, GR, 10, 223); + + blendpixel(vid, nx+1, ny-1, GR, GR, 10, 112); + blendpixel(vid, nx-1, ny-1, GR, GR, 10, 112); + blendpixel(vid, nx+1, ny+1, GR, GR, 10, 112); + blendpixel(vid, nx-1, ny+1, GR, GR, 10, 112); + } + } + else if(t==PT_HSWC) + { + uint8 GR = 0x3B+(parts[i].life*19); + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, 10, 10); + if(cmode == 4) { + blendpixel(vid, nx+1, ny, GR, 10, 10, 223); + blendpixel(vid, nx-1, ny, GR, 10, 10, 223); + blendpixel(vid, nx, ny+1, GR, 10, 10, 223); + blendpixel(vid, nx, ny-1, GR, 10, 10, 223); + + blendpixel(vid, nx+1, ny-1, GR, 10, 10, 112); + blendpixel(vid, nx-1, ny-1, GR, 10, 10, 112); + blendpixel(vid, nx+1, ny+1, GR, 10, 10, 112); + blendpixel(vid, nx-1, ny+1, GR, 10, 10, 112); + } + } + else if(t==PT_PLSM) { float ttemp = (float)parts[i].life; int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); diff --git a/powder.c b/powder.c index 5a0b95b4f..5438c6bd6 100644 --- a/powder.c +++ b/powder.c @@ -35,7 +35,7 @@ int try_move(int i, int x, int y, int nx, int ny) if(r && (r>>8)>8].type; - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||(r&0xFF)==PT_PCLN||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) { return 1; } @@ -488,9 +488,9 @@ void update_particles_i(pixel *vid, int start, int inc) if(parts[i].life && t!=PT_ACID && t!=PT_COAL && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM && t!=PT_FUSE && t!=PT_FSEP) { - if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) + if(!(parts[i].life==10&&(parts[i].type==PT_LCRY||parts[i].type==PT_PCLN||parts[i].type==PT_HSWC))) parts[i].life--; - if(parts[i].life<=0 && t!=PT_METL && t!=PT_FIRW && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) + if(parts[i].life<=0 && t!=PT_METL && t!=PT_FIRW && t!=PT_PCLN && t!=PT_HSWC && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) { kill_part(i); continue; @@ -717,7 +717,7 @@ void update_particles_i(pixel *vid, int start, int inc) h_count = 0; if(t==PT_ICEI && !parts[i].ctype) parts[i].ctype = PT_WATR; - if(ptypes[t].hconduct>(rand()%250)) + if(ptypes[t].hconduct>(rand()%250)&&!(parts[i].type==PT_HSWC&&parts[i].life!=10)) { for(nx=-1; nx<2; nx++) { @@ -728,7 +728,7 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)) { h_count++; c_heat += parts[r>>8].temp; @@ -746,7 +746,7 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)) { parts[r>>8].temp = parts[i].temp; } @@ -1364,6 +1364,76 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + else if(t==PT_PCLN) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_PCLN) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_HSWC) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_HSWC) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } else if(t==PT_AMTR) { for(nx=-1; nx<2; nx++) @@ -1375,7 +1445,7 @@ void update_particles_i(pixel *vid, int start, int inc) if((r>>8)>=NPART || !r) continue; rt = parts[r>>8].type; - if((r&0xFF)!=PT_AMTR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_NONE && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_BHOL) + if((r&0xFF)!=PT_AMTR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_NONE && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_BHOL) { t = parts[i].life++; if(parts[i].life==3) @@ -2100,6 +2170,25 @@ killed: else create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); } + if(parts[i].type==PT_PCLN) + { + if(!parts[i].ctype) + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx303&&parts[i].temp<317) { diff --git a/powder.h b/powder.h index 1d19a2bde..5bca4c71f 100644 --- a/powder.h +++ b/powder.h @@ -111,7 +111,9 @@ #define PT_FUSE 70 #define PT_FSEP 71 #define PT_AMTR 72 -#define PT_NUM 73 +#define PT_PCLN 73 +#define PT_HSWC 74 +#define PT_NUM 75 #define R_TEMP 22 #define MAX_TEMP 9999 @@ -261,7 +263,9 @@ static const part_type ptypes[PT_NUM] = {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -340,7 +344,9 @@ static part_state pstates[PT_NUM] = /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = @@ -349,87 +355,89 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* GLOW */ - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ - /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ - /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ - /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ - /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0}, /* FSEP */ - /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A P H */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C S */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T L W */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R N C */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* GLOW */ + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ + /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ + /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ + /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ + /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* FSEP */ + /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ + /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ + /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A P H */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C S */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T L W */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R N C */ }; extern int isplayer; From 2d5558491fa864f340668df05a7869ca820ddef1 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sun, 26 Sep 2010 19:50:50 +0200 Subject: [PATCH 167/237] astyle again. --- graphics.c | 12 ++-- powder.c | 178 ++++++++++++++++++++++++++--------------------------- powder.h | 4 +- 3 files changed, 97 insertions(+), 97 deletions(-) diff --git a/graphics.c b/graphics.c index 3ea0635e9..aafe8973d 100644 --- a/graphics.c +++ b/graphics.c @@ -1710,14 +1710,14 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny, GR, GR, GR, 223); blendpixel(vid, nx, ny+1, GR, GR, GR, 223); blendpixel(vid, nx, ny-1, GR, GR, GR, 223); - + blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112); blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112); blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112); blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112); } } - else if(t==PT_PCLN) + else if(t==PT_PCLN) { uint8 GR = 0x3B+(parts[i].life*19); vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, 10); @@ -1726,14 +1726,14 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny, GR, GR, 10, 223); blendpixel(vid, nx, ny+1, GR, GR, 10, 223); blendpixel(vid, nx, ny-1, GR, GR, 10, 223); - + blendpixel(vid, nx+1, ny-1, GR, GR, 10, 112); blendpixel(vid, nx-1, ny-1, GR, GR, 10, 112); blendpixel(vid, nx+1, ny+1, GR, GR, 10, 112); blendpixel(vid, nx-1, ny+1, GR, GR, 10, 112); } } - else if(t==PT_HSWC) + else if(t==PT_HSWC) { uint8 GR = 0x3B+(parts[i].life*19); vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, 10, 10); @@ -1742,14 +1742,14 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny, GR, 10, 10, 223); blendpixel(vid, nx, ny+1, GR, 10, 10, 223); blendpixel(vid, nx, ny-1, GR, 10, 10, 223); - + blendpixel(vid, nx+1, ny-1, GR, 10, 10, 112); blendpixel(vid, nx-1, ny-1, GR, 10, 10, 112); blendpixel(vid, nx+1, ny+1, GR, 10, 10, 112); blendpixel(vid, nx-1, ny+1, GR, 10, 10, 112); } } - else if(t==PT_PLSM) + else if(t==PT_PLSM) { float ttemp = (float)parts[i].life; int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); diff --git a/powder.c b/powder.c index 5438c6bd6..b62a68ace 100644 --- a/powder.c +++ b/powder.c @@ -1364,76 +1364,76 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - else if(t==PT_PCLN) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_PCLN) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_HSWC) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_HSWC) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } + else if(t==PT_PCLN) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_PCLN) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_HSWC) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_HSWC) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } else if(t==PT_AMTR) { for(nx=-1; nx<2; nx++) @@ -2170,25 +2170,25 @@ killed: else create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); } - if(parts[i].type==PT_PCLN) - { - if(!parts[i].ctype) - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx=0 && y+ny>0 && + x+nx303&&parts[i].temp<317) { diff --git a/powder.h b/powder.h index 5bca4c71f..eda30d2ca 100644 --- a/powder.h +++ b/powder.h @@ -264,8 +264,8 @@ static const part_type ptypes[PT_NUM] = {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; From bf534e1514d37a6b1fef6163fbed32766cbc8711 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 26 Sep 2010 17:14:51 -0400 Subject: [PATCH 168/237] Added BCOL, changed FUSE->FSEP --- powder.c | 389 ++++++++++++++++++++++++++++++------------------------- powder.h | 176 +++++++++++++------------ 2 files changed, 306 insertions(+), 259 deletions(-) diff --git a/powder.c b/powder.c index ffe604b2f..cb93d7d65 100644 --- a/powder.c +++ b/powder.c @@ -124,7 +124,7 @@ void kill_part(int i) #ifdef WIN32 _inline int create_part(int p, int x, int y, int t) #else -inline int create_part(int p, int x, int y, int t) + inline int create_part(int p, int x, int y, int t) #endif { int i; @@ -181,19 +181,19 @@ inline int create_part(int p, int x, int y, int t) if(t==PT_SPRK) { if((pmap[y][x]&0xFF)!=PT_METL && - (pmap[y][x]&0xFF)!=PT_PSCN && - (pmap[y][x]&0xFF)!=PT_NSCN && - (pmap[y][x]&0xFF)!=PT_NTCT && - (pmap[y][x]&0xFF)!=PT_PTCT && - (pmap[y][x]&0xFF)!=PT_WATR && - (pmap[y][x]&0xFF)!=PT_SLTW && - (pmap[y][x]&0xFF)!=PT_BMTL && - (pmap[y][x]&0xFF)!=PT_RBDM && - (pmap[y][x]&0xFF)!=PT_LRBD && - (pmap[y][x]&0xFF)!=PT_ETRD && - (pmap[y][x]&0xFF)!=PT_BRMT && - (pmap[y][x]&0xFF)!=PT_NBLE && - (pmap[y][x]&0xFF)!=PT_INWR) + (pmap[y][x]&0xFF)!=PT_PSCN && + (pmap[y][x]&0xFF)!=PT_NSCN && + (pmap[y][x]&0xFF)!=PT_NTCT && + (pmap[y][x]&0xFF)!=PT_PTCT && + (pmap[y][x]&0xFF)!=PT_WATR && + (pmap[y][x]&0xFF)!=PT_SLTW && + (pmap[y][x]&0xFF)!=PT_BMTL && + (pmap[y][x]&0xFF)!=PT_RBDM && + (pmap[y][x]&0xFF)!=PT_LRBD && + (pmap[y][x]&0xFF)!=PT_ETRD && + (pmap[y][x]&0xFF)!=PT_BRMT && + (pmap[y][x]&0xFF)!=PT_NBLE && + (pmap[y][x]&0xFF)!=PT_INWR) return -1; parts[pmap[y][x]>>8].type = PT_SPRK; parts[pmap[y][x]>>8].life = 4; @@ -235,16 +235,18 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 75; } /*Testing - if(t==PT_WOOD){ - parts[i].life = 150; - } - End Testing*/ + if(t==PT_WOOD){ + parts[i].life = 150; + } + End Testing*/ if(t==PT_FUSE) - parts[i].life = ((uint32_t)(50 << 24) | (uint32_t)50); + parts[i].life = ((uint32_t)(50 << 24) | (uint32_t)50); if(t==PT_FSEP) - parts[i].life = 50; + parts[i].life = 50; if(t==PT_COAL) - parts[i].life = 110; + parts[i].life = ((uint32_t)(110 << 24) | (uint32_t)50); + if(t==PT_BCOL) + parts[i].life = 110; if(t==PT_FIRE) parts[i].life = rand()%50+120; if(t==PT_PLSM) @@ -334,7 +336,7 @@ inline int create_part(int p, int x, int y, int t) #ifdef WIN32 _inline void delete_part(int x, int y) #else -inline void delete_part(int x, int y) + inline void delete_part(int x, int y) #endif { unsigned i; @@ -352,7 +354,7 @@ inline void delete_part(int x, int y) #ifdef WIN32 _inline int is_wire(int x, int y) #else -inline int is_wire(int x, int y) + inline int is_wire(int x, int y) #endif { return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; @@ -361,7 +363,7 @@ inline int is_wire(int x, int y) #ifdef WIN32 _inline int is_wire_off(int x, int y) #else -inline int is_wire_off(int x, int y) + inline int is_wire_off(int x, int y) #endif { return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; @@ -396,30 +398,30 @@ void set_emap(int x, int y) // fill children if(y>1 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) set_emap(x1, y-2); else if(y>0) for(x=x1; x<=x2; x++) if(is_wire_off(x, y-1)) { if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) set_emap(x, y-1); } if(y=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) { kill_part(i); continue; @@ -648,8 +650,8 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -926,7 +928,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -949,6 +951,45 @@ void update_particles_i(pixel *vid, int start, int inc) } } else if(t==PT_COAL) + { + tempu1 = (uint16_t)(((unsigned int)parts[i].life) >> 24); + tempu2 = (uint16_t)(((unsigned int)parts[i].life) & 0x0000FFFF); + if(tempu1<=0) { + t = PT_NONE; + kill_part(i); + create_part(-1, x, y, PT_FIRE); + goto killed; + } else if(tempu1 < 100) { + tempu1--; + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); + } + if((pv[y/CELL][x/CELL] > 4.3f)&&tempu2>40) + tempu2=39; + else if(tempu2<40&&tempu2>0) + tempu2--; + else if(tempu2<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_BCOL); + goto killed; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) + { + if(tempu1>100) { + tempu1 = 99; + } + } + } + parts[i].life = ((uint32_t)(((uint32_t)tempu1 << 24) | (uint32_t)tempu2)); + } else if(t==PT_BCOL) { if(parts[i].life<=0) { t = PT_NONE; @@ -956,14 +997,14 @@ void update_particles_i(pixel *vid, int start, int inc) create_part(-1, x, y, PT_FIRE); goto killed; } else if(parts[i].life < 100) { - parts[i].life--; + parts[i].life; create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); } for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -971,92 +1012,94 @@ void update_particles_i(pixel *vid, int start, int inc) if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) { if(parts[i].life>100) { - parts[i].life = 99; + parts[i].life = 99; } } } } - else if(t==PT_FUSE) - { - // I do a parts[i].life hack here, the first half bits is for the burn life, the last half bits is for the pressure life - tempu1 = (uint16_t)(((unsigned int)parts[i].life) >> 24); - tempu2 = (uint16_t)(((unsigned int)parts[i].life) & 0x0000FFFF); - if(tempu1<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; - } else if (tempu1 < 40) { - tempu1--; - if((rand()%100)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } - } - if(pv[y/CELL][x/CELL] > 0.8f) - tempu2--; - else if(tempu2<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_FSEP); - goto killed; - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) - { - if(tempu1>40) { - tempu1 = 39; - } - } - } - parts[i].life = ((uint32_t)(((uint32_t)tempu1 << 24) | (uint32_t)tempu2)); - } - else if(t==PT_FSEP) - { - if(parts[i].life<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; - } else if (parts[i].life < 40) { - parts[i].life--; - if((rand()%10)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } - } - } - else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx> 24); + tempu2 = (uint16_t)(((uint32_t)parts[i].life) & 0xFFFF); + if(tempu1<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (tempu1 < 40) { + tempu1--; + if((rand()%100)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + if((pv[y/CELL][x/CELL] > 2.7f)&&tempu2>40) + tempu2=39; + else if(tempu2<40&&tempu2>0) + tempu2--; + else if(tempu2<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_FSEP); + goto killed; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) + { + if(tempu1>40) { + tempu1 = 39; + } + } + } + parts[i].life = ((uint32_t)(((uint32_t)tempu1 << 24) | (uint32_t)tempu2)); + } + else if(t==PT_FSEP) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%10)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) + { + if(parts[i].life>40) { + parts[i].life = 39; + } + } + } + } + else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) continue; @@ -1064,14 +1107,14 @@ void update_particles_i(pixel *vid, int start, int inc) { parts[i].temp = 473.0f; } - } - } - else if(t==PT_PLNT) - { + } + } + else if(t==PT_PLNT) + { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1123,7 +1166,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1158,7 +1201,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1185,7 +1228,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1215,7 +1258,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1263,7 +1306,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1312,11 +1355,11 @@ void update_particles_i(pixel *vid, int start, int inc) if((r&0xFF)==PT_COAL && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && - (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| - ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| - ptypes[parts[r>>8].type-1].menusection==SC_GAS|| - ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) - parts[r>>8].type--;*/ + (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| + ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| + ptypes[parts[r>>8].type-1].menusection==SC_GAS|| + ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) + parts[r>>8].type--;*/ } } else if(t==PT_PHOT) @@ -1325,7 +1368,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=0; nx<1; nx++) for(ny=0; ny<1; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1466,7 +1509,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1488,7 +1531,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1517,7 +1560,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1526,8 +1569,8 @@ void update_particles_i(pixel *vid, int start, int inc) continue; rt = parts[r>>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); @@ -1541,7 +1584,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(legacy_enable) { if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && - ptypes[rt].meltable*lpv>(rand()%1000)) + ptypes[rt].meltable*lpv>(rand()%1000)) { if(t!=PT_LAVA || parts[i].life>0) { @@ -1613,7 +1656,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(pavg != PT_INSL) { if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)=373.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=373.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) { @@ -1625,7 +1668,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)>8].temp>373.0f))&&pavg != PT_INSL) { @@ -1635,7 +1678,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)>8].temp<373.0f))&&pavg != PT_INSL) { @@ -1645,7 +1688,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)>8].life==0 && - (parts[i].life<2 || ((r>>8)>8)>8].type = PT_SPRK; parts[r>>8].life = 6; parts[r>>8].ctype = rt; } if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8)>8].type = PT_SPRK; parts[r>>8].life = 5; @@ -1696,7 +1739,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } } -killed: + killed: if(parts[i].type == PT_NONE) continue; } @@ -1772,7 +1815,7 @@ killed: if (((int)(player[0])&0x01) == 0x01 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) { if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { @@ -1810,7 +1853,7 @@ killed: if (((int)(player[0])&0x02) == 0x02 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) { if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { @@ -2098,11 +2141,11 @@ killed: for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx=XRES-CELL || - ny=YRES-CELL) + ny=YRES-CELL) { parts[i].x = lx; parts[i].y = ly; @@ -2935,8 +2978,8 @@ int create_parts(int x, int y, int r, int c) for(v=-1; v<2; v++) for(u=-1; u<2; u++) if(i+u>=0 && i+u=0 && j+v=0 && j+v Date: Sun, 26 Sep 2010 17:28:27 -0400 Subject: [PATCH 169/237] use parts[i].tmp instead of bit hacks --- powder.c | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/powder.c b/powder.c index cb93d7d65..a60d4443f 100644 --- a/powder.c +++ b/powder.c @@ -239,12 +239,16 @@ _inline int create_part(int p, int x, int y, int t) parts[i].life = 150; } End Testing*/ - if(t==PT_FUSE) - parts[i].life = ((uint32_t)(50 << 24) | (uint32_t)50); + if(t==PT_FUSE) { + parts[i].life = 50; + parts[i].tmp = 50; + } if(t==PT_FSEP) parts[i].life = 50; - if(t==PT_COAL) - parts[i].life = ((uint32_t)(110 << 24) | (uint32_t)50); + if(t==PT_COAL) { + parts[i].life = 110; + parts[i].tmp = 50; + } if(t==PT_BCOL) parts[i].life = 110; if(t==PT_FIRE) @@ -952,22 +956,20 @@ void update_particles_i(pixel *vid, int start, int inc) } else if(t==PT_COAL) { - tempu1 = (uint16_t)(((unsigned int)parts[i].life) >> 24); - tempu2 = (uint16_t)(((unsigned int)parts[i].life) & 0x0000FFFF); - if(tempu1<=0) { + if(parts[i].life<=0) { t = PT_NONE; kill_part(i); create_part(-1, x, y, PT_FIRE); goto killed; - } else if(tempu1 < 100) { - tempu1--; + } else if(parts[i].life < 100) { + parts[i].life; create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); } - if((pv[y/CELL][x/CELL] > 4.3f)&&tempu2>40) - tempu2=39; - else if(tempu2<40&&tempu2>0) - tempu2--; - else if(tempu2<=0) { + if((pv[y/CELL][x/CELL] > 4.3f)&&parts[i].tmp>40) + parts[i].tmp=39; + else if(parts[i].tmp<40&&parts[i].tmp>0) + parts[i].tmp--; + else if(parts[i].tmp<=0) { t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_BCOL); @@ -983,12 +985,11 @@ void update_particles_i(pixel *vid, int start, int inc) continue; if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) { - if(tempu1>100) { - tempu1 = 99; + if(parts[i].life>100) { + parts[i].life = 99; } } } - parts[i].life = ((uint32_t)(((uint32_t)tempu1 << 24) | (uint32_t)tempu2)); } else if(t==PT_BCOL) { if(parts[i].life<=0) { @@ -1022,24 +1023,24 @@ void update_particles_i(pixel *vid, int start, int inc) // I do a parts[i].life hack here, the first half bits is for the burn life, the last half bits is for the pressure life tempu1 = (uint16_t)(((uint32_t)parts[i].life) >> 24); tempu2 = (uint16_t)(((uint32_t)parts[i].life) & 0xFFFF); - if(tempu1<=0) { + if(parts[i].life<=0) { t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_PLSM); parts[r].life = 50; goto killed; - } else if (tempu1 < 40) { - tempu1--; + } else if (parts[i].life < 40) { + parts[i].life--; if((rand()%100)==0) { r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); parts[r].life = 50; } } - if((pv[y/CELL][x/CELL] > 2.7f)&&tempu2>40) - tempu2=39; - else if(tempu2<40&&tempu2>0) - tempu2--; - else if(tempu2<=0) { + if((pv[y/CELL][x/CELL] > 2.7f)&&parts[i].tmp>40) + parts[i].tmp=39; + else if(parts[i].tmp<40&&parts[i].tmp>0) + parts[i].tmp--; + else if(parts[i].tmp<=0) { t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_FSEP); @@ -1055,8 +1056,8 @@ void update_particles_i(pixel *vid, int start, int inc) continue; if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) { - if(tempu1>40) { - tempu1 = 39; + if(parts[i].life>40) { + parts[i].life = 39; } } } From 5b9e55436092711d862ecfc4b7fcdd69d93b75f4 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 26 Sep 2010 19:22:27 -0400 Subject: [PATCH 170/237] fixed BCOL and COAL bug --- powder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.c b/powder.c index 389c80740..cedf3bae1 100644 --- a/powder.c +++ b/powder.c @@ -962,7 +962,7 @@ void update_particles_i(pixel *vid, int start, int inc) create_part(-1, x, y, PT_FIRE); goto killed; } else if(parts[i].life < 100) { - parts[i].life; + parts[i].life--; create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); } if((pv[y/CELL][x/CELL] > 4.3f)&&parts[i].tmp>40) @@ -999,7 +999,7 @@ void update_particles_i(pixel *vid, int start, int inc) create_part(-1, x, y, PT_FIRE); goto killed; } else if(parts[i].life < 100) { - parts[i].life; + parts[i].life--; create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); } From 1401817f212e1c4759f38bcb47e9ec8aecfe8444 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 26 Sep 2010 19:28:18 -0400 Subject: [PATCH 171/237] fixed fuse bug --- powder.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/powder.c b/powder.c index cedf3bae1..16941fd9a 100644 --- a/powder.c +++ b/powder.c @@ -1021,9 +1021,6 @@ void update_particles_i(pixel *vid, int start, int inc) } else if(t==PT_FUSE) { - // I do a parts[i].life hack here, the first half bits is for the burn life, the last half bits is for the pressure life - tempu1 = (uint16_t)(((uint32_t)parts[i].life) >> 24); - tempu2 = (uint16_t)(((uint32_t)parts[i].life) & 0xFFFF); if(parts[i].life<=0) { t = PT_NONE; kill_part(i); @@ -1055,14 +1052,13 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) + if((r&0xFF)==PT_SPRK || ((parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20))) { if(parts[i].life>40) { parts[i].life = 39; } } } - parts[i].life = ((uint32_t)(((uint32_t)tempu1 << 24) | (uint32_t)tempu2)); } else if(t==PT_FSEP) { From 58d710b22484b8c7cc9dadefd305f3506d3ff139 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 27 Sep 2010 12:53:05 +0200 Subject: [PATCH 172/237] layout change --- .gitignore | 1 + Makefile | 6 +- includes/air.h | 21 + includes/defines.h | 118 ++ includes/font.h | 32 + includes/graphics.h | 144 ++ includes/hmap.h | 33 + includes/http.h | 43 + includes/icon.h | 22 + includes/interface.h | 183 ++ includes/md5.h | 18 + includes/misc.h | 72 + includes/powder.h | 512 ++++++ includes/update.h | 27 + includes/version.h | 25 + src/Resources/Font-Data | Bin 0 -> 4442 bytes src/Resources/Font-Pointers | Bin 0 -> 512 bytes src/Resources/Icon-16.png | Bin 0 -> 3161 bytes src/Resources/Icon-32.png | Bin 0 -> 3896 bytes src/Resources/powder-res.rc | 2 + src/Resources/powder.icns | Bin 0 -> 98761 bytes src/Resources/powder.ico | Bin 0 -> 90174 bytes src/air.c | 141 ++ src/graphics.c | 2567 ++++++++++++++++++++++++++++ src/http.c | 1051 ++++++++++++ src/interface.c | 2961 ++++++++++++++++++++++++++++++++ src/main.c | 2096 +++++++++++++++++++++++ src/md5.c | 231 +++ src/misc.c | 283 ++++ src/powder.c | 3199 +++++++++++++++++++++++++++++++++++ src/update.c | 201 +++ 31 files changed, 13987 insertions(+), 2 deletions(-) create mode 100644 includes/air.h create mode 100644 includes/defines.h create mode 100644 includes/font.h create mode 100644 includes/graphics.h create mode 100755 includes/hmap.h create mode 100755 includes/http.h create mode 100755 includes/icon.h create mode 100644 includes/interface.h create mode 100644 includes/md5.h create mode 100644 includes/misc.h create mode 100644 includes/powder.h create mode 100755 includes/update.h create mode 100755 includes/version.h create mode 100644 src/Resources/Font-Data create mode 100644 src/Resources/Font-Pointers create mode 100755 src/Resources/Icon-16.png create mode 100755 src/Resources/Icon-32.png create mode 100644 src/Resources/powder-res.rc create mode 100755 src/Resources/powder.icns create mode 100755 src/Resources/powder.ico create mode 100644 src/air.c create mode 100644 src/graphics.c create mode 100644 src/http.c create mode 100644 src/interface.c create mode 100755 src/main.c create mode 100644 src/md5.c create mode 100644 src/misc.c create mode 100644 src/powder.c create mode 100644 src/update.c diff --git a/.gitignore b/.gitignore index ccc72b83b..a6b750800 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ powder.def powder-debug gmon.out *.*.orig +build/ diff --git a/Makefile b/Makefile index 233d4933a..8a25f401d 100755 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -SOURCES := *.c +SOURCES := src/*.c -CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L +CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -Iincludes/ OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations LFLAGS := -lSDL -lm -lbz2 MFLAGS_SSE3 := -march=native -DX86 -DX86_SSE3 -msse3 @@ -19,6 +19,7 @@ powder-debug: $(SOURCES) powder-sse3: $(SOURCES) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 strip $@ + mv $@ build powder-sse2: $(SOURCES) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN32 strip $@ @@ -31,6 +32,7 @@ powder-64-sse3-opengl: $(SOURCES) powder-64-sse3: $(SOURCES) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 strip $@ + mv $@ build powder-64-sse2: $(SOURCES) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 strip $@ diff --git a/includes/air.h b/includes/air.h new file mode 100644 index 000000000..d9e04f631 --- /dev/null +++ b/includes/air.h @@ -0,0 +1,21 @@ +#ifndef AIR_H +#define AIR_H +#include "defines.h" + +extern float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +extern float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +extern float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +extern float cb_vx[YRES/CELL][XRES/CELL], cb_ovx[YRES/CELL][XRES/CELL]; +extern float cb_vy[YRES/CELL][XRES/CELL], cb_ovy[YRES/CELL][XRES/CELL]; +extern float cb_pv[YRES/CELL][XRES/CELL], cb_opv[YRES/CELL][XRES/CELL]; + +extern float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; + +extern float kernel[9]; + +void make_kernel(void); + +void update_air(void); + +#endif \ No newline at end of file diff --git a/includes/defines.h b/includes/defines.h new file mode 100644 index 000000000..a324e9f54 --- /dev/null +++ b/includes/defines.h @@ -0,0 +1,118 @@ +#ifndef DEFINE_H +#define DEFINE_H + +#ifdef WIN32 +#define PATH_SEP "\\" +#else +#define PATH_SEP "/" +#endif + +#define SAVE_VERSION 43 +#define MINOR_VERSION 0 +#define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. +#define BETA + +#define SERVER "powdertoy.co.uk" + +#undef PLOSS + +#define THUMB_CACHE_SIZE 256 + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + +#define MENUSIZE 40 +#define BARSIZE 14 +#define XRES 612 +#define YRES 384 +#define NPART XRES*YRES + +#define MAXSIGNS 16 +#define TAG_MAX 256 + +#define ZSIZE_D 16 +#define ZFACTOR_D 8 +extern unsigned char ZFACTOR; +extern unsigned char ZSIZE; + +#define CELL 4 +#define ISTP (CELL/2) +#define CFDS (4.0f/CELL) + +#define TSTEPP 0.3f +#define TSTEPV 0.4f +#define VADV 0.3f +#define VLOSS 0.999f +#define PLOSS 0.9999f + +#define GRID_X 5 +#define GRID_Y 4 +#define GRID_P 3 +#define GRID_S 6 +#define GRID_Z 3 + +#define STAMP_X 4 +#define STAMP_Y 4 +#define STAMP_MAX 120 + +#ifdef PIX16 +typedef unsigned short pixel; +#else +typedef unsigned int pixel; +#endif + +typedef unsigned char uint8; + +extern int amd; + +extern int FPSB; + +extern int legacy_enable; + +extern int sys_pause; +extern int framerender; + +extern int mousex, mousey; +extern int death; + +struct sign +{ + int x,y,ju; + char text[256]; +}; +typedef struct sign sign; + +struct stamp +{ + char name[11]; + pixel *thumb; + int thumb_w, thumb_h, dodelete; +}; +typedef struct stamp stamp; + +extern sign signs[MAXSIGNS]; +extern stamp stamps[STAMP_MAX]; +extern int stamp_count; +extern int itc; +extern char itc_msg[64]; + +extern int do_open; +extern int sys_pause; +extern int legacy_enable; //Used to disable new features such as heat, will be set by commandline or save. +extern int death, framerender; + +extern unsigned char last_major, last_minor, update_flag; + +extern char http_proxy_string[256]; + +//Functions in main.c +void thumb_cache_inval(char *id); +void thumb_cache_add(char *id, void *thumb, int size); +int thumb_cache_find(char *id, void **thumb, int *size); +void *build_thumb(int *size, int bzip2); +void *build_save(int *size, int x0, int y0, int w, int h); +int parse_save(void *save, int size, int replace, int x0, int y0); +void del_stamp(int d); +void sdl_seticon(void); +#endif \ No newline at end of file diff --git a/includes/font.h b/includes/font.h new file mode 100644 index 000000000..f8f9a58c5 --- /dev/null +++ b/includes/font.h @@ -0,0 +1,32 @@ +/** + * Powder Toy - Font Data + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw. + * + * 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 02111-1301 USA + */ +#ifndef FONT_H_CHECK +#define FONT_H_CHECK +#define FONT_H 10 +static char font_data[] = +{ + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xcc, 0x00, 0x00, 0x0a, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xff, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x80, 0xff, 0x2f, 0xfc, 0xff, 0xc3, 0x07, 0x3d, 0x3c, 0xc0, 0xc3, 0x03, 0x3c, 0x7c, 0xd0, 0xc3, 0xff, 0x3f, 0xf8, 0xff, 0x02, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, +}; +static short font_ptrs[] = +{ + 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, +}; +#endif \ No newline at end of file diff --git a/includes/graphics.h b/includes/graphics.h new file mode 100644 index 000000000..6a1507e94 --- /dev/null +++ b/includes/graphics.h @@ -0,0 +1,144 @@ +#ifndef GRAPHICS_H +#define GRAPHICS_H +#include +#include "defines.h" +#include "hmap.h" + +#ifdef PIX16 +#define PIXELSIZE 2 +#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) +#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) +#define PIXR(x) (((x)>>8)&0xF8) +#define PIXG(x) (((x)>>3)&0xFC) +#define PIXB(x) (((x)<<3)&0xF8) +#else +#define PIXELSIZE 4 +#ifdef PIX32BGR +#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) +#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) +#define PIXR(x) ((x)&0xFF) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)>>16) +#else +#ifdef PIX32BGRA +#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) +#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) +#define PIXR(x) (((x)>>8)&0xFF) +#define PIXG(x) (((x)>>16)&0xFF) +#define PIXB(x) (((x)>>24)) +#else +#define PIXPACK(x) (x) +#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) +#define PIXR(x) ((x)>>16) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)&0xFF) +#endif +#endif +#endif + +extern unsigned cmode; +extern SDL_Surface *sdl_scrn; +extern int sdl_scale; + +extern unsigned char fire_r[YRES/CELL][XRES/CELL]; +extern unsigned char fire_g[YRES/CELL][XRES/CELL]; +extern unsigned char fire_b[YRES/CELL][XRES/CELL]; + +extern unsigned int fire_alpha[CELL*3][CELL*3]; +extern pixel *fire_bg; + +pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch); + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch); + +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch); + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb); + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall); + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc); + +void draw_menu(pixel *vid_buf, int i, int hover); + +#ifdef WIN32 +_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#else +extern inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#endif + +#ifdef WIN32 +_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); +#else +extern inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); +#endif + +int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a); + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); + +void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); + +void clearrect(pixel *vid, int x, int y, int w, int h); + +void drawdots(pixel *vid, int x, int y, int h, int r, int g, int b, int a); + +int textwidth(char *s); + +int drawtextmax(pixel *vid, int x, int y, int w, char *s, int r, int g, int b, int a); + +int textnwidth(char *s, int n); + +int textwidthx(char *s, int w); + +#ifdef WIN32 +_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#else +inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#endif + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag); + +void draw_air(pixel *vid); + +void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a); + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a); + +void xor_pixel(int x, int y, pixel *vid); + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid); + +void xor_rect(pixel *vid, int x, int y, int w, int h); + +void draw_parts(pixel *vid); + +void render_signs(pixel *vid_buf); + +void render_fire(pixel *dst); + +void prepare_alpha(void); + +void draw_image(pixel *vid, pixel *img, int x, int y, int w, int h, int a); + +void dim_copy(pixel *dst, pixel *src); + +void render_zoom(pixel *img); + +pixel *prerender_save(void *save, int size, int *width, int *height); + +int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl); + +void render_cursor(pixel *vid, int x, int y, int t, int r); + +void sdl_open(void); + +#ifdef OpenGL +void Enable2D (); +void RenderScene (); +void ClearScreen(); +#endif + +#endif diff --git a/includes/hmap.h b/includes/hmap.h new file mode 100755 index 000000000..1af80132c --- /dev/null +++ b/includes/hmap.h @@ -0,0 +1,33 @@ +/** + * Powder Toy - Heatmap Data + * + * Copyright (c) 2010 Simon Robertshaw + * + * 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 02111-1301 USA + */ +#ifndef HMAP_H +#define HMAP_H +//Original Heat Scale +//static char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; +//Modified Hue Scale +//static char color_data[] = {0x00,0x00,0x00,0x02,0x00,0x02,0x04,0x00,0x04,0x06,0x00,0x06,0x09,0x00,0x08,0x0B,0x00,0x0B,0x0E,0x00,0x0D,0x11,0x00,0x10,0x14,0x00,0x13,0x17,0x00,0x16,0x1B,0x00,0x19,0x1E,0x00,0x1C,0x22,0x00,0x1F,0x26,0x00,0x22,0x29,0x00,0x26,0x2D,0x00,0x29,0x32,0x00,0x2D,0x36,0x00,0x30,0x3A,0x00,0x34,0x3E,0x00,0x38,0x43,0x00,0x3C,0x47,0x00,0x40,0x4C,0x00,0x44,0x51,0x00,0x48,0x55,0x00,0x4C,0x5A,0x00,0x50,0x5F,0x00,0x54,0x64,0x00,0x59,0x69,0x00,0x5D,0x6E,0x00,0x61,0x73,0x00,0x66,0x77,0x00,0x6A,0x7C,0x00,0x6E,0x81,0x00,0x73,0x86,0x00,0x77,0x8B,0x00,0x7C,0x90,0x00,0x80,0x95,0x00,0x85,0x9A,0x00,0x89,0x9F,0x00,0x8D,0xA3,0x00,0x92,0xA8,0x00,0x96,0xAD,0x00,0x9B,0xB1,0x00,0x9F,0xB6,0x00,0xA3,0xBA,0x00,0xA8,0xBF,0x00,0xAC,0xC3,0x00,0xB0,0xC7,0x00,0xB4,0xCB,0x00,0xB8,0xCF,0x00,0xBD,0xD3,0x00,0xC1,0xD7,0x00,0xC4,0xDB,0x00,0xC8,0xDE,0x00,0xCC,0xE1,0x00,0xD0,0xE5,0x00,0xD4,0xE8,0x00,0xD7,0xEA,0x00,0xDB,0xED,0x00,0xDE,0xF0,0x00,0xE1,0xF2,0x00,0xE4,0xF4,0x00,0xE8,0xF6,0x00,0xEB,0xF8,0x00,0xED,0xFA,0x00,0xF0,0xFB,0x00,0xF3,0xFC,0x00,0xF5,0xFD,0x00,0xF8,0xFE,0x00,0xFA,0xFF,0x00,0xFC,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFE,0x00,0xFF,0xFE,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF8,0x00,0xFF,0xF6,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE6,0x00,0xFF,0xE3,0x00,0xFF,0xE0,0x00,0xFF,0xDD,0x00,0xFF,0xD9,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xCF,0x00,0xFF,0xCB,0x00,0xFF,0xC7,0x00,0xFF,0xC4,0x00,0xFF,0xC0,0x00,0xFF,0xBC,0x00,0xFF,0xB7,0x00,0xFF,0xB3,0x00,0xFF,0xAF,0x00,0xFF,0xAB,0x00,0xFF,0xA6,0x00,0xFF,0xA2,0x00,0xFF,0x9E,0x00,0xFF,0x99,0x00,0xFF,0x95,0x00,0xFF,0x90,0x00,0xFF,0x8B,0x00,0xFF,0x87,0x00,0xFF,0x82,0x00,0xFF,0x7E,0x00,0xFF,0x79,0x00,0xFF,0x74,0x00,0xFF,0x70,0x00,0xFF,0x6B,0x00,0xFF,0x67,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x59,0x00,0xFF,0x55,0x00,0xFF,0x50,0x00,0xFF,0x4C,0x00,0xFF,0x48,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x37,0x00,0xFF,0x33,0x00,0xFF,0x2F,0x00,0xFF,0x2B,0x00,0xFF,0x28,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1D,0x00,0xFF,0x1A,0x00,0xFF,0x17,0x00,0xFF,0x14,0x00,0xFF,0x11,0x00,0xFF,0x0E,0x00,0xFF,0x0C,0x00,0xFF,0x09,0x00,0xFF,0x07,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x01,0x00,0xFF,0x00,0x01,0xFF,0x00,0x03,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x09,0xFF,0x00,0x0C,0xFF,0x00,0x0F,0xFF,0x00,0x11,0xFF,0x00,0x14,0xFF,0x00,0x17,0xFF,0x00,0x1A,0xFF,0x00,0x1D,0xFF,0x00,0x20,0xFF,0x00,0x24,0xFF,0x00,0x27,0xFF,0x00,0x2B,0xFF,0x00,0x2E,0xFF,0x00,0x32,0xFF,0x00,0x36,0xFF,0x00,0x3A,0xFF,0x00,0x3E,0xFF,0x00,0x42,0xFF,0x00,0x46,0xFF,0x00,0x4A,0xFF,0x00,0x4E,0xFF,0x00,0x52,0xFF,0x00,0x56,0xFF,0x00,0x5B,0xFF,0x00,0x5F,0xFF,0x00,0x63,0xFF,0x00,0x68,0xFF,0x00,0x6C,0xFF,0x00,0x71,0xFF,0x00,0x75,0xFF,0x00,0x79,0xFF,0x00,0x7E,0xFF,0x00,0x82,0xFF,0x00,0x87,0xFF,0x00,0x8B,0xFF,0x00,0x90,0xFF,0x00,0x94,0xFF,0x00,0x98,0xFF,0x00,0x9D,0xFF,0x00,0xA1,0xFF,0x00,0xA6,0xFF,0x00,0xAA,0xFF,0x00,0xAE,0xFF,0x00,0xB2,0xFF,0x00,0xB6,0xFF,0x00,0xBA,0xFF,0x00,0xBF,0xFF,0x00,0xC2,0xFF,0x00,0xC6,0xFF,0x00,0xCA,0xFF,0x00,0xCE,0xFF,0x00,0xD2,0xFF,0x00,0xD5,0xFF,0x00,0xD9,0xFF,0x00,0xDC,0xFF,0x00,0xE0,0xFF,0x00,0xE3,0xFF,0x00,0xE6,0xFF,0x00,0xE9,0xFF,0x00,0xEC,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF4,0xFF,0x00,0xF6,0xFF,0x00,0xF9,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF2,0x00,0xFF,0xEF,0x00,0xFF,0xED,0x00,0xFF,0xEA,0x00,0xFF,0xE7,0x00,0xFF,0xE4,0x00,0xFF,0xE1,0x00,0xFF,0xDD,0x00,0xFF,0xDA,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xCF,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC4,0x00,0xFF,0xC0,0x00,0xFF,0xBC,0x00,0xFF,0xB8,0x00,0xFF,0xB4,0x00,0xFF,0xAF,0x00,0xFF,0xAB,0x00,0xFF,0xA7,0x00,0xFF,0xA3,0x00,0xFF,0x9E,0x00,0xFF,0x9A,0x00,0xFF,0x96,0x00,0xFF,0x91,0x00,0xFF,0x8D,0x00,0xFF,0x88,0x00,0xFF,0x84,0x00,0xFF,0x80,0x00,0xFF,0x7B,0x00,0xFF,0x77,0x00,0xFF,0x72,0x00,0xFF,0x6E,0x00,0xFF,0x69,0x00,0xFF,0x65,0x00,0xFF,0x61,0x00,0xFF,0x5C,0x00,0xFF,0x58,0x00,0xFF,0x54,0x00,0xFF,0x50,0x00,0xFF,0x4B,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x37,0x00,0xFF,0x34,0x00,0xFF,0x30,0x00,0xFF,0x2C,0x00,0xFF,0x29,0x00,0xFF,0x25,0x00,0xFF,0x22,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x18,0x00,0xFF,0x15,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x0D,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x04,0x00,0xFF,0x02,0x00,0xFF,0x00,0x02,0xFD,0x00,0x04,0xFB,0x00,0x06,0xF9,0x00,0x09,0xF6,0x00,0x0B,0xF3,0x00,0x0E,0xF1,0x00,0x10,0xEE,0x00,0x13,0xEB,0x00,0x16,0xE7,0x00,0x19,0xE4,0x00,0x1C,0xE0,0x00,0x1F,0xDD,0x00,0x23,0xD9,0x00,0x26,0xD5,0x00,0x29,0xD1,0x00,0x2D,0xCD,0x00,0x31,0xC9,0x00,0x35,0xC4,0x00,0x38,0xC0,0x00,0x3C,0xBC,0x00,0x40,0xB7,0x00,0x44,0xB2,0x00,0x48,0xAE,0x00,0x4C,0xA9,0x00,0x51,0xA4,0x00,0x55,0x9F,0x00,0x59,0x9B,0x00,0x5D,0x96,0x00,0x62,0x91,0x00,0x66,0x8C,0x00,0x6A,0x87,0x00,0x6F,0x82,0x00,0x73,0x7D,0x00,0x78,0x78,0x00,0x7C,0x73,0x00,0x81,0x6E,0x00,0x85,0x69,0x00,0x8A,0x65,0x00,0x8E,0x60,0x00,0x92,0x5B,0x00,0x97,0x56,0x00,0x9B,0x52,0x00,0xA0,0x4D,0x00,0xA4,0x49,0x00,0xA8,0x44,0x00,0xAC,0x40,0x00,0xB1,0x3B,0x00,0xB5,0x37,0x00,0xB9,0x33,0x00,0xBD,0x2F,0x00,0xC1,0x2B,0x00,0xC5,0x28,0x00,0xC9,0x24,0x00,0xCD,0x21,0x00,0xD0,0x1D,0x00,0xD4,0x1A,0x00,0xD8,0x17,0x00,0xDB,0x14,0x00,0xDE,0x11,0x00,0xE2,0x0F,0x00,0xE5,0x0D,0x00,0xE8,0x0A,0x00,0xEB,0x08,0x00,0xEE,0x07,0x00,0xF0,0x05,0x00,0xF3,0x04,0x00,0xF6,0x02,0x00,0xF8,0x01,0x00,0xFA,0x01,0x00,0xFC,0x00,0x00,0xFE,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x02,0x00,0xFF,0x03,0x00,0xFF,0x04,0x00,0xFF,0x06,0x00,0xFF,0x07,0x00,0xFF,0x09,0x00,0xFF,0x0B,0x00,0xFF,0x0D,0x00,0xFF,0x0F,0x00,0xFF,0x12,0x00,0xFF,0x14,0x00,0xFF,0x17,0x00,0xFF,0x1A,0x00,0xFF,0x1C,0x00,0xFF,0x1F,0x00,0xFF,0x23,0x00,0xFF,0x26,0x00,0xFF,0x29,0x00,0xFF,0x2D,0x00,0xFF,0x31,0x00,0xFF,0x34,0x00,0xFF,0x38,0x00,0xFF,0x3C,0x00,0xFF,0x40,0x00,0xFF,0x44,0x00,0xFF,0x48,0x00,0xFF,0x4C,0x00,0xFF,0x51,0x00,0xFF,0x55,0x00,0xFF,0x59,0x00,0xFF,0x5E,0x00,0xFF,0x62,0x00,0xFF,0x67,0x00,0xFF,0x6B,0x00,0xFF,0x70,0x00,0xFF,0x74,0x00,0xFF,0x79,0x00,0xFF,0x7D,0x00,0xFF,0x82,0x00,0xFF,0x87,0x00,0xFF,0x8B,0x00,0xFF,0x90,0x00,0xFF,0x94,0x00,0xFF,0x99,0x00,0xFF,0x9D,0x00,0xFF,0xA2,0x00,0xFF,0xA6,0x00,0xFF,0xAB,0x00,0xFF,0xAF,0x00,0xFF,0xB4,0x00,0xFF,0xB8,0x00,0xFF,0xBC,0x00,0xFF,0xC0,0x00,0xFF,0xC4,0x00,0xFF,0xC8,0x00,0xFF,0xCC,0x00,0xFF,0xD0,0x00,0xFF,0xD4,0x00,0xFF,0xD8,0x00,0xFF,0xDB,0x00,0xFF,0xDF,0x00,0xFF,0xE2,0x00,0xFF,0xE5,0x00,0xFF,0xE9,0x00,0xFF,0xEC,0x00,0xFF,0xEE,0x00,0xFF,0xF1,0x00,0xFF,0xF4,0x00,0xFF,0xF6,0x00,0xFF,0xF8,0x00,0xFF,0xFB,0x00,0xFF,0xFD,0x00,0xFF,0xFE,0x00,0xFF,0xFF,0x01,0xFF,0xFF,0x03,0xFF,0xFF,0x05,0xFF,0xFF,0x07,0xFF,0xFF,0x0A,0xFF,0xFF,0x0C,0xFF,0xFF,0x0F,0xFF,0xFF,0x12,0xFF,0xFF,0x14,0xFF,0xFF,0x17,0xFF,0xFF,0x1A,0xFF,0xFF,0x1E,0xFF,0xFF,0x21,0xFF,0xFF,0x24,0xFF,0xFF,0x28,0xFF,0xFF,0x2B,0xFF,0xFF,0x2F,0xFF,0xFF,0x33,0xFF,0xFF,0x36,0xFF,0xFF,0x3A,0xFF,0xFF,0x3E,0xFF,0xFF,0x42,0xFF,0xFF,0x46,0xFF,0xFF,0x4A,0xFF,0xFF,0x4F,0xFF,0xFF,0x53,0xFF,0xFF,0x57,0xFF,0xFF,0x5B,0xFF,0xFF,0x60,0xFF,0xFF,0x64,0xFF,0xFF,0x68,0xFF,0xFF,0x6D,0xFF,0xFF,0x71,0xFF,0xFF,0x76,0xFF,0xFF,0x7A,0xFF,0xFF,0x7E,0xFF,0xFF,0x83,0xFF,0xFF,0x87,0xFF,0xFF,0x8C,0xFF,0xFF,0x90,0xFF,0xFF,0x95,0xFF,0xFF,0x99,0xFF,0xFF,0x9D,0xFF,0xFF,0xA2,0xFF,0xFF,0xA6,0xFF,0xFF,0xAA,0xFF,0xFF,0xAF,0xFF,0xFF,0xB3,0xFF,0xFF,0xB7,0xFF,0xFF,0xBB,0xFF,0xFF,0xBF,0xFF,0xFF,0xC3,0xFF,0xFF,0xC7,0xFF,0xFF,0xCB,0xFF,0xFF,0xCE,0xFF,0xFF,0xD2,0xFF,0xFF,0xD6,0xFF,0xFF,0xD9,0xFF,0xFF,0xDD,0xFF,0xFF,0xE0,0xFF,0xFF,0xE3,0xFF,0xFF,0xE6,0xFF,0xFF,0xE9,0xFF,0xFF,0xEC,0xFF,0xFF,0xEF,0xFF,0xFF,0xF2,0xFF,0xFF,0xF4,0xFF,0xFF,0xF7,0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0xFF,0xFF,0xFD}; +//Hue Scale +//static char color_data[] = {0xFF,0x00,0xFF,0xFE,0x00,0xFF,0xFC,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF8,0x00,0xFF,0xF6,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xEA,0x00,0xFF,0xE8,0x00,0xFF,0xE5,0x00,0xFF,0xE3,0x00,0xFF,0xE1,0x00,0xFF,0xDE,0x00,0xFF,0xDC,0x00,0xFF,0xD9,0x00,0xFF,0xD6,0x00,0xFF,0xD4,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCC,0x00,0xFF,0xC9,0x00,0xFF,0xC6,0x00,0xFF,0xC3,0x00,0xFF,0xC1,0x00,0xFF,0xBE,0x00,0xFF,0xBB,0x00,0xFF,0xB8,0x00,0xFF,0xB5,0x00,0xFF,0xB2,0x00,0xFF,0xAF,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA7,0x00,0xFF,0xA4,0x00,0xFF,0xA1,0x00,0xFF,0x9E,0x00,0xFF,0x9B,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x93,0x00,0xFF,0x90,0x00,0xFF,0x8D,0x00,0xFF,0x8A,0x00,0xFF,0x88,0x00,0xFF,0x85,0x00,0xFF,0x83,0x00,0xFF,0x80,0x00,0xFF,0x7E,0x00,0xFF,0x7B,0x00,0xFF,0x78,0x00,0xFF,0x76,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6E,0x00,0xFF,0x6B,0x00,0xFF,0x68,0x00,0xFF,0x65,0x00,0xFF,0x63,0x00,0xFF,0x60,0x00,0xFF,0x5D,0x00,0xFF,0x5A,0x00,0xFF,0x57,0x00,0xFF,0x54,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x49,0x00,0xFF,0x46,0x00,0xFF,0x43,0x00,0xFF,0x40,0x00,0xFF,0x3D,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x35,0x00,0xFF,0x32,0x00,0xFF,0x2F,0x00,0xFF,0x2C,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x25,0x00,0xFF,0x22,0x00,0xFF,0x20,0x00,0xFF,0x1D,0x00,0xFF,0x1B,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x14,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x0E,0x00,0xFF,0x0C,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x08,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x14,0xFF,0x00,0x16,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1D,0xFF,0x00,0x20,0xFF,0x00,0x22,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x32,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3D,0xFF,0x00,0x40,0xFF,0x00,0x43,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x57,0xFF,0x00,0x5A,0xFF,0x00,0x5D,0xFF,0x00,0x60,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6B,0xFF,0x00,0x6E,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x76,0xFF,0x00,0x79,0xFF,0x00,0x7B,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x86,0xFF,0x00,0x88,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x93,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9E,0xFF,0x00,0xA1,0xFF,0x00,0xA4,0xFF,0x00,0xA7,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB5,0xFF,0x00,0xB8,0xFF,0x00,0xBB,0xFF,0x00,0xBE,0xFF,0x00,0xC1,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xC9,0xFF,0x00,0xCC,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD4,0xFF,0x00,0xD7,0xFF,0x00,0xD9,0xFF,0x00,0xDC,0xFF,0x00,0xDF,0xFF,0x00,0xE1,0xFF,0x00,0xE3,0xFF,0x00,0xE6,0xFF,0x00,0xE8,0xFF,0x00,0xEA,0xFF,0x00,0xEC,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF4,0xFF,0x00,0xF6,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE5,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDE,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC3,0x00,0xFF,0xC0,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA6,0x00,0xFF,0xA3,0x00,0xFF,0xA0,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x92,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x8A,0x00,0xFF,0x87,0x00,0xFF,0x85,0x00,0xFF,0x82,0x00,0xFF,0x80,0x00,0xFF,0x7D,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6D,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x65,0x00,0xFF,0x62,0x00,0xFF,0x5F,0x00,0xFF,0x5C,0x00,0xFF,0x59,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x48,0x00,0xFF,0x45,0x00,0xFF,0x42,0x00,0xFF,0x3F,0x00,0xFF,0x3C,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2C,0x00,0xFF,0x29,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1F,0x00,0xFF,0x1D,0x00,0xFF,0x1A,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x09,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x15,0xFF,0x00,0x17,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1E,0xFF,0x00,0x20,0xFF,0x00,0x23,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x33,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3E,0xFF,0x00,0x41,0xFF,0x00,0x44,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x58,0xFF,0x00,0x5B,0xFF,0x00,0x5E,0xFF,0x00,0x61,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6C,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x77,0xFF,0x00,0x79,0xFF,0x00,0x7C,0xFF,0x00,0x7F,0xFF,0x00,0x81,0xFF,0x00,0x84,0xFF,0x00,0x86,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x91,0xFF,0x00,0x94,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9C,0xFF,0x00,0x9F,0xFF,0x00,0xA2,0xFF,0x00,0xA5,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB3,0xFF,0x00,0xB6,0xFF,0x00,0xB9,0xFF,0x00,0xBC,0xFF,0x00,0xBF,0xFF,0x00,0xC2,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xCA,0xFF,0x00,0xCD,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD5,0xFF,0x00,0xD7,0xFF,0x00,0xDA,0xFF,0x00,0xDD,0xFF,0x00,0xDF,0xFF,0x00,0xE2,0xFF,0x00,0xE4,0xFF,0x00,0xE6,0xFF,0x00,0xE9,0xFF,0x00,0xEB,0xFF,0x00,0xED,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF5,0xFF,0x00,0xF7,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF3,0x00,0xFF,0xF1,0x00,0xFF,0xEF,0x00,0xFF,0xED,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE4,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDD,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD0,0x00,0xFF,0xCD,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC2,0x00,0xFF,0xBF,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAB,0x00,0xFF,0xA8,0x00,0xFF,0xA5,0x00,0xFF,0xA2,0x00,0xFF,0x9F,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x97,0x00,0xFF,0x94,0x00,0xFF,0x91,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x89,0x00,0xFF,0x87,0x00,0xFF,0x84,0x00,0xFF,0x81,0x00,0xFF,0x7F,0x00,0xFF,0x7C,0x00,0xFF,0x7A,0x00,0xFF,0x77,0x00,0xFF,0x75,0x00,0xFF,0x72,0x00,0xFF,0x6F,0x00,0xFF,0x6C,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x64,0x00,0xFF,0x61,0x00,0xFF,0x5E,0x00,0xFF,0x5B,0x00,0xFF,0x58,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x50,0x00,0xFF,0x4D,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x44,0x00,0xFF,0x41,0x00,0xFF,0x3E,0x00,0xFF,0x3C,0x00,0xFF,0x39,0x00,0xFF,0x36,0x00,0xFF,0x33,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2B,0x00,0xFF,0x29,0x00,0xFF,0x26,0x00,0xFF,0x23,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1C,0x00,0xFF,0x1A,0x00,0xFF,0x17,0x00,0xFF,0x15,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x09,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x01,0x00}; +//Scaled Hue Scale +static char color_data[] = {0xFF,0x00,0xFF,0xF1,0x00,0xFF,0xDE,0x00,0xFF,0xC7,0x00,0xFF,0xAF,0x00,0xFF,0x97,0x00,0xFF,0x82,0x00,0xFF,0x6C,0x00,0xFF,0x56,0x00,0xFF,0x41,0x00,0xFF,0x2E,0x00,0xFF,0x21,0x05,0xFF,0x16,0x0F,0xFF,0x0E,0x1B,0xFF,0x07,0x29,0xFF,0x02,0x39,0xFF,0x00,0x4B,0xFF,0x00,0x5E,0xFF,0x00,0x74,0xFF,0x00,0x8A,0xFF,0x00,0xA0,0xFF,0x00,0xAF,0xFF,0x00,0xB8,0xFE,0x00,0xC2,0xFD,0x00,0xCC,0xFD,0x00,0xD5,0xFC,0x00,0xDF,0xFA,0x00,0xE7,0xF9,0x00,0xEF,0xF6,0x00,0xF6,0xF3,0x00,0xFC,0xEE,0x00,0xFF,0xE8,0x00,0xFF,0xE1,0x00,0xFF,0xD8,0x00,0xFF,0xCE,0x00,0xFF,0xC4,0x00,0xFF,0xB9,0x00,0xFF,0xAD,0x00,0xFF,0xA1,0x00,0xFF,0x96,0x00,0xFF,0x8A,0x00,0xFF,0x80,0x00,0xFF,0x7C,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x71,0x00,0xFF,0x6D,0x00,0xFF,0x69,0x00,0xFF,0x66,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x5A,0x00,0xFF,0x56,0x00,0xFF,0x52,0x00,0xFF,0x4E,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x38,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2D,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x19,0x00,0xFF,0x17,0x01,0xFF,0x14,0x02,0xFF,0x13,0x04,0xFF,0x11,0x06,0xFF,0x0F,0x07,0xFF,0x0E,0x0A,0xFF,0x0C,0x0C,0xFF,0x0B,0x0E,0xFF,0x0A,0x10,0xFF,0x09,0x13,0xFF,0x08,0x16,0xFF,0x07,0x18,0xFF,0x06,0x1B,0xFF,0x06,0x1E,0xFF,0x05,0x21,0xFF,0x04,0x24,0xFF,0x04,0x27,0xFF,0x04,0x2A,0xFF,0x03,0x2D,0xFF,0x03,0x30,0xFF,0x03,0x34,0xFF,0x02,0x37,0xFF,0x02,0x3A,0xFF,0x02,0x3D,0xFF,0x02,0x41,0xFF,0x02,0x44,0xFF,0x01,0x47,0xFF,0x01,0x4A,0xFF,0x01,0x4E,0xFF,0x01,0x51,0xFF,0x00,0x54,0xFF,0x00,0x56,0xFF,0x00,0x58,0xFF,0x00,0x5A,0xFF,0x00,0x5C,0xFF,0x00,0x5E,0xFF,0x00,0x60,0xFF,0x00,0x62,0xFF,0x00,0x64,0xFF,0x00,0x66,0xFF,0x00,0x68,0xFF,0x00,0x6A,0xFF,0x00,0x6D,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x73,0xFF,0x00,0x75,0xFF,0x00,0x77,0xFF,0x00,0x7A,0xFF,0x00,0x7C,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x85,0xFF,0x00,0x87,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x92,0xFF,0x00,0x94,0xFF,0x00,0x97,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9D,0xFF,0x00,0x9F,0xFF,0x00,0xA1,0xFF,0x00,0xA3,0xFF,0x00,0xA6,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAC,0xFF,0x00,0xAE,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB5,0xFF,0x00,0xB7,0xFF,0x00,0xB9,0xFF,0x00,0xBB,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xC0,0xFF,0x00,0xC1,0xFF,0x00,0xC2,0xFE,0x00,0xC3,0xFE,0x00,0xC4,0xFE,0x00,0xC6,0xFD,0x00,0xC7,0xFD,0x00,0xC8,0xFD,0x00,0xC9,0xFC,0x00,0xCA,0xFC,0x00,0xCB,0xFC,0x00,0xCC,0xFB,0x00,0xCE,0xFB,0x00,0xCF,0xFB,0x00,0xD0,0xFA,0x00,0xD1,0xFA,0x00,0xD2,0xF9,0x00,0xD3,0xF9,0x00,0xD4,0xF9,0x00,0xD5,0xF8,0x00,0xD6,0xF8,0x00,0xD7,0xF7,0x00,0xD8,0xF7,0x00,0xD9,0xF7,0x00,0xDA,0xF6,0x00,0xDC,0xF6,0x00,0xDD,0xF5,0x00,0xDE,0xF5,0x00,0xDF,0xF4,0x00,0xE0,0xF4,0x00,0xE1,0xF3,0x00,0xE2,0xF3,0x00,0xE2,0xF2,0x00,0xE3,0xF2,0x00,0xE4,0xF1,0x00,0xE5,0xF1,0x00,0xE6,0xF0,0x00,0xE7,0xF0,0x00,0xE8,0xEF,0x00,0xE9,0xEE,0x00,0xEA,0xEE,0x00,0xEB,0xED,0x00,0xEC,0xED,0x00,0xEC,0xEC,0x00,0xED,0xEB,0x00,0xEE,0xEB,0x00,0xEF,0xEA,0x00,0xF0,0xE9,0x00,0xF1,0xE9,0x00,0xF1,0xE8,0x00,0xF2,0xE7,0x00,0xF3,0xE6,0x00,0xF4,0xE6,0x00,0xF4,0xE5,0x00,0xF5,0xE4,0x00,0xF6,0xE3,0x00,0xF6,0xE3,0x00,0xF7,0xE2,0x00,0xF8,0xE1,0x00,0xF8,0xE0,0x00,0xF9,0xDF,0x00,0xFA,0xDE,0x00,0xFA,0xDD,0x00,0xFB,0xDD,0x00,0xFB,0xDC,0x00,0xFC,0xDB,0x00,0xFC,0xDA,0x00,0xFD,0xD9,0x00,0xFD,0xD8,0x00,0xFE,0xD7,0x00,0xFE,0xD6,0x00,0xFF,0xD5,0x00,0xFF,0xD4,0x00,0xFF,0xD3,0x00,0xFF,0xD3,0x00,0xFF,0xD2,0x00,0xFF,0xD1,0x00,0xFF,0xD1,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCE,0x00,0xFF,0xCE,0x00,0xFF,0xCD,0x00,0xFF,0xCC,0x00,0xFF,0xCB,0x00,0xFF,0xCB,0x00,0xFF,0xCA,0x00,0xFF,0xC9,0x00,0xFF,0xC8,0x00,0xFF,0xC7,0x00,0xFF,0xC7,0x00,0xFF,0xC6,0x00,0xFF,0xC5,0x00,0xFF,0xC4,0x00,0xFF,0xC3,0x00,0xFF,0xC2,0x00,0xFF,0xC1,0x00,0xFF,0xC1,0x00,0xFF,0xC0,0x00,0xFF,0xBF,0x00,0xFF,0xBE,0x00,0xFF,0xBD,0x00,0xFF,0xBC,0x00,0xFF,0xBB,0x00,0xFF,0xBA,0x00,0xFF,0xB9,0x00,0xFF,0xB8,0x00,0xFF,0xB8,0x00,0xFF,0xB7,0x00,0xFF,0xB6,0x00,0xFF,0xB5,0x00,0xFF,0xB4,0x00,0xFF,0xB3,0x00,0xFF,0xB2,0x00,0xFF,0xB1,0x00,0xFF,0xB0,0x00,0xFF,0xAF,0x00,0xFF,0xAE,0x00,0xFF,0xAD,0x00,0xFF,0xAC,0x00,0xFF,0xAB,0x00,0xFF,0xAA,0x00,0xFF,0xA9,0x00,0xFF,0xA8,0x00,0xFF,0xA7,0x00,0xFF,0xA6,0x00,0xFF,0xA5,0x00,0xFF,0xA4,0x00,0xFF,0xA3,0x00,0xFF,0xA2,0x00,0xFF,0xA1,0x00,0xFF,0xA0,0x00,0xFF,0x9F,0x00,0xFF,0x9E,0x00,0xFF,0x9D,0x00,0xFF,0x9C,0x00,0xFF,0x9B,0x00,0xFF,0x9A,0x00,0xFF,0x99,0x00,0xFF,0x98,0x00,0xFF,0x97,0x00,0xFF,0x96,0x00,0xFF,0x95,0x00,0xFF,0x94,0x00,0xFF,0x92,0x00,0xFF,0x91,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8E,0x00,0xFF,0x8D,0x00,0xFF,0x8C,0x00,0xFF,0x8B,0x00,0xFF,0x8A,0x00,0xFF,0x89,0x00,0xFF,0x88,0x00,0xFF,0x87,0x00,0xFF,0x86,0x00,0xFF,0x85,0x00,0xFF,0x84,0x00,0xFF,0x83,0x00,0xFF,0x82,0x00,0xFF,0x81,0x00,0xFF,0x80,0x00,0xFF,0x7F,0x00,0xFF,0x7E,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7B,0x00,0xFF,0x7A,0x00,0xFF,0x79,0x00,0xFF,0x78,0x00,0xFF,0x77,0x00,0xFF,0x76,0x00,0xFF,0x75,0x00,0xFF,0x74,0x00,0xFF,0x73,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x70,0x00,0xFF,0x6F,0x00,0xFF,0x6E,0x00,0xFF,0x6D,0x00,0xFF,0x6C,0x00,0xFF,0x6B,0x00,0xFF,0x6A,0x00,0xFF,0x6A,0x00,0xFF,0x69,0x00,0xFF,0x68,0x00,0xFF,0x68,0x00,0xFF,0x67,0x00,0xFF,0x66,0x00,0xFF,0x66,0x00,0xFF,0x65,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x63,0x00,0xFF,0x63,0x00,0xFF,0x62,0x00,0xFF,0x61,0x00,0xFF,0x61,0x00,0xFF,0x60,0x00,0xFF,0x5F,0x00,0xFF,0x5F,0x00,0xFF,0x5E,0x00,0xFF,0x5D,0x00,0xFF,0x5D,0x00,0xFF,0x5C,0x00,0xFF,0x5B,0x00,0xFF,0x5B,0x00,0xFF,0x5A,0x00,0xFF,0x59,0x00,0xFF,0x59,0x00,0xFF,0x58,0x00,0xFF,0x57,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x55,0x00,0xFF,0x54,0x00,0xFF,0x54,0x00,0xFF,0x53,0x00,0xFF,0x52,0x00,0xFF,0x52,0x00,0xFF,0x51,0x00,0xFF,0x50,0x00,0xFF,0x50,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4E,0x00,0xFF,0x4D,0x00,0xFF,0x4C,0x00,0xFF,0x4B,0x00,0xFF,0x4B,0x00,0xFF,0x4A,0x00,0xFF,0x49,0x00,0xFF,0x49,0x00,0xFF,0x48,0x00,0xFF,0x47,0x00,0xFF,0x46,0x00,0xFF,0x46,0x00,0xFF,0x45,0x00,0xFF,0x44,0x00,0xFF,0x44,0x00,0xFF,0x43,0x00,0xFF,0x42,0x00,0xFF,0x41,0x00,0xFF,0x41,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00,0xFF,0x3E,0x00,0xFF,0x3D,0x00,0xFF,0x3C,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x3A,0x00,0xFF,0x3A,0x00,0xFF,0x39,0x00,0xFF,0x38,0x00,0xFF,0x38,0x00,0xFF,0x37,0x00,0xFF,0x36,0x00,0xFF,0x35,0x00,0xFF,0x35,0x00,0xFF,0x34,0x00,0xFF,0x33,0x00,0xFF,0x33,0x00,0xFF,0x32,0x00,0xFF,0x31,0x00,0xFF,0x31,0x00,0xFF,0x30,0x00,0xFF,0x2F,0x00,0xFF,0x2E,0x00,0xFF,0x2E,0x00,0xFF,0x2D,0x00,0xFF,0x2C,0x00,0xFF,0x2C,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x2A,0x00,0xFF,0x29,0x00,0xFF,0x28,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x26,0x00,0xFF,0x26,0x00,0xFF,0x25,0x00,0xFF,0x24,0x00,0xFF,0x24,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x21,0x00,0xFF,0x20,0x00,0xFF,0x1F,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1D,0x00,0xFF,0x1D,0x00,0xFF,0x1C,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x17,0x00,0xFF,0x17,0x00,0xFF,0x16,0x00,0xFF,0x16,0x00,0xFF,0x15,0x00,0xFF,0x14,0x00,0xFF,0x14,0x00,0xFF,0x13,0x00,0xFF,0x13,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x11,0x00,0xFF,0x11,0x00,0xFF,0x10,0x00,0xFF,0x10,0x00,0xFF,0x0F,0x00,0xFF,0x0F,0x00,0xFF,0x0E,0x00,0xFF,0x0E,0x00,0xFF,0x0D,0x00,0xFF,0x0D,0x00,0xFF,0x0C,0x00,0xFF,0x0C,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x0A,0x00,0xFF,0x09,0x00,0xFF,0x09,0x00,0xFF,0x08,0x00,0xFF,0x08,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00}; +static char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; +static char hflm_data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04, 0x02, 0x03, 0x05, 0x03, 0x03, 0x07, 0x04, 0x04, 0x08, 0x04, 0x03, 0x09, 0x04, 0x04, 0x0B, 0x05, 0x04, 0x0C, 0x05, 0x05, 0x0D, 0x06, 0x05, 0x0E, 0x07, 0x06, 0x10, 0x07, 0x07, 0x11, 0x08, 0x07, 0x12, 0x09, 0x08, 0x14, 0x09, 0x08, 0x15, 0x0A, 0x09, 0x17, 0x0A, 0x09, 0x19, 0x0B, 0x0A, 0x1A, 0x0C, 0x0A, 0x1C, 0x0D, 0x0B, 0x1D, 0x0D, 0x0B, 0x1F, 0x0D, 0x0C, 0x22, 0x0F, 0x0D, 0x23, 0x0F, 0x0E, 0x25, 0x10, 0x0E, 0x26, 0x11, 0x0F, 0x28, 0x12, 0x10, 0x2A, 0x13, 0x10, 0x2C, 0x13, 0x11, 0x2E, 0x14, 0x12, 0x2F, 0x15, 0x12, 0x31, 0x15, 0x13, 0x33, 0x16, 0x14, 0x35, 0x17, 0x15, 0x36, 0x18, 0x15, 0x39, 0x19, 0x16, 0x3B, 0x19, 0x17, 0x3D, 0x1B, 0x17, 0x3E, 0x1B, 0x18, 0x40, 0x1C, 0x19, 0x42, 0x1D, 0x1A, 0x43, 0x1D, 0x1B, 0x45, 0x1E, 0x1C, 0x47, 0x1F, 0x1C, 0x49, 0x20, 0x1D, 0x4B, 0x21, 0x1F, 0x4C, 0x21, 0x1F, 0x4E, 0x22, 0x20, 0x50, 0x23, 0x21, 0x52, 0x23, 0x22, 0x53, 0x24, 0x23, 0x55, 0x25, 0x23, 0x56, 0x26, 0x24, 0x59, 0x26, 0x25, 0x5A, 0x27, 0x26, 0x5B, 0x28, 0x27, 0x5D, 0x28, 0x28, 0x5E, 0x29, 0x29, 0x60, 0x29, 0x2A, 0x62, 0x2A, 0x2B, 0x63, 0x2B, 0x2C, 0x64, 0x2C, 0x2E, 0x65, 0x2C, 0x2E, 0x66, 0x2C, 0x2F, 0x68, 0x2D, 0x31, 0x69, 0x2E, 0x32, 0x6A, 0x2F, 0x32, 0x6B, 0x2F, 0x34, 0x6C, 0x30, 0x34, 0x6D, 0x30, 0x35, 0x6F, 0x31, 0x37, 0x70, 0x31, 0x38, 0x71, 0x32, 0x39, 0x72, 0x33, 0x3B, 0x73, 0x33, 0x3C, 0x74, 0x34, 0x3D, 0x75, 0x35, 0x3E, 0x76, 0x35, 0x3F, 0x78, 0x36, 0x41, 0x78, 0x36, 0x42, 0x79, 0x36, 0x43, 0x7A, 0x37, 0x44, 0x7B, 0x37, 0x46, 0x7C, 0x38, 0x48, 0x7D, 0x39, 0x48, 0x7E, 0x3A, 0x49, 0x7F, 0x39, 0x4B, 0x80, 0x3A, 0x4C, 0x81, 0x3B, 0x4E, 0x82, 0x3C, 0x4F, 0x83, 0x3C, 0x51, 0x84, 0x3C, 0x52, 0x84, 0x3D, 0x54, 0x86, 0x3E, 0x55, 0x87, 0x3E, 0x56, 0x88, 0x3F, 0x57, 0x89, 0x40, 0x59, 0x8A, 0x40, 0x5A, 0x8A, 0x41, 0x5C, 0x8B, 0x41, 0x5D, 0x8C, 0x42, 0x5F, 0x8D, 0x41, 0x60, 0x8E, 0x42, 0x62, 0x8E, 0x42, 0x62, 0x8F, 0x44, 0x65, 0x90, 0x43, 0x65, 0x91, 0x45, 0x67, 0x91, 0x44, 0x69, 0x92, 0x45, 0x6A, 0x93, 0x46, 0x6B, 0x94, 0x46, 0x6C, 0x94, 0x46, 0x6E, 0x96, 0x47, 0x70, 0x96, 0x48, 0x70, 0x97, 0x48, 0x72, 0x98, 0x48, 0x73, 0x99, 0x49, 0x74, 0x99, 0x49, 0x76, 0x9A, 0x4A, 0x77, 0x9A, 0x4B, 0x78, 0x9B, 0x4B, 0x7A, 0x9C, 0x4B, 0x7B, 0x9D, 0x4B, 0x7C, 0x9E, 0x4C, 0x7D, 0x9F, 0x4C, 0x7E, 0x9F, 0x4D, 0x7F, 0xA0, 0x4E, 0x80, 0xA0, 0x4E, 0x82, 0xA1, 0x4E, 0x83, 0xA2, 0x4F, 0x84, 0xA3, 0x4F, 0x85, 0xA3, 0x4F, 0x86, 0xA4, 0x4F, 0x88, 0xA5, 0x50, 0x89, 0xA5, 0x50, 0x89, 0xA6, 0x51, 0x8B, 0xA6, 0x51, 0x8B, 0xA7, 0x51, 0x8D, 0xA8, 0x51, 0x8E, 0xA9, 0x52, 0x8F, 0xAA, 0x52, 0x90, 0xAA, 0x53, 0x92, 0xAB, 0x53, 0x92, 0xAB, 0x53, 0x93, 0xAC, 0x54, 0x95, 0xAD, 0x53, 0x95, 0xAE, 0x54, 0x96, 0xAE, 0x55, 0x98, 0xAE, 0x54, 0x98, 0xAF, 0x55, 0x9A, 0xB0, 0x56, 0x9B, 0xB0, 0x56, 0x9C, 0xB1, 0x56, 0x9D, 0xB1, 0x56, 0x9E, 0xB2, 0x56, 0xA0, 0xB3, 0x57, 0xA0, 0xB3, 0x57, 0xA1, 0xB3, 0x57, 0xA2, 0xB4, 0x58, 0xA3, 0xB4, 0x58, 0xA4, 0xB5, 0x57, 0xA5, 0xB6, 0x58, 0xA6, 0xB6, 0x58, 0xA7, 0xB7, 0x58, 0xA8, 0xB7, 0x59, 0xA9, 0xB8, 0x58, 0xAA, 0xB9, 0x5A, 0xAB, 0xB9, 0x59, 0xAC, 0xBA, 0x5A, 0xAD, 0xBA, 0x5A, 0xAE, 0xBB, 0x5A, 0xAF, 0xBB, 0x5A, 0xB0, 0xBC, 0x5B, 0xB0, 0xBC, 0x5A, 0xB1, 0xBD, 0x5B, 0xB2, 0xBD, 0x5B, 0xB3, 0xBD, 0x5B, 0xB4, 0xBE, 0x5C, 0xB5, 0xBE, 0x5B, 0xB5, 0xBE, 0x5B, 0xB7, 0xBF, 0x5C, 0xB7, 0xBF, 0x5C, 0xB8, 0xBF, 0x5C, 0xB9, 0xC0, 0x5C, 0xB9, 0xC0, 0x5C, 0xBA, 0xC0, 0x5C, 0xBA, 0xC1, 0x5D, 0xBB, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBD, 0xC2, 0x5E, 0xBE, 0xC3, 0x5E, 0xBE, 0xC3, 0x5E, 0xBF, 0xC3, 0x5E, 0xC0, 0xC3, 0x5E, 0xC0, 0xC4, 0x5E, 0xC1, 0xC4}; +static char firw_data[] = {0x86,0xC6,0xF8,0x8B,0xCC,0xFC,0x80,0xD9,0xF7,0x7B,0xE9,0xF5,0x7A,0xE3,0xF8,0x84,0xEE,0xF8,0x85,0xEB,0xEB,0x89,0xEB,0xF1,0x7B,0xEA,0xED,0x7F,0xEB,0xF2,0x84,0xF1,0xFF,0x87,0xFC,0xFF,0x8F,0xEE,0xFF,0x8C,0xED,0xFB,0x9E,0xF8,0xF5,0xA2,0xF2,0xF1,0xA1,0xF8,0xED,0x99,0xED,0xE8,0x99,0xED,0xEC,0x8E,0xE6,0xEB,0x93,0xE4,0xE5,0x90,0xE0,0xDE,0x90,0xE0,0xDB,0xA0,0xD2,0xDF,0x9A,0xCB,0xDB,0x9F,0xBD,0xE0,0x99,0xB8,0xE0,0xA5,0xBE,0xD9,0xAB,0xAF,0xD8,0xB0,0xB7,0xD9,0xB8,0xAA,0xD2,0xC6,0xA3,0xC3,0xC6,0xA7,0xC0,0xC2,0xB0,0xC0,0xC9,0xB3,0xBA,0xC9,0xB8,0xBC,0xE0,0xB1,0xBB,0xD8,0xAE,0xB9,0xD8,0xB5,0xAE,0xD9,0xAF,0xA9,0xDE,0xB7,0xB0,0xE7,0xB2,0xB0,0xE2,0xB8,0xA8,0xDB,0xB5,0xA8,0xDC,0xB9,0xA6,0xEA,0xC3,0xA2,0xEA,0xC1,0xA5,0xF9,0xB9,0x9B,0xFA,0xB1,0x95,0xFF,0xAA,0x81,0xFF,0xA0,0x81,0xFF,0x9F,0x86,0xFF,0x94,0x82,0xFF,0x91,0x86,0xFF,0x8E,0x8F,0xFF,0x82,0x8F,0xFF,0x86,0x93,0xFB,0x8F,0x92,0xF9,0x90,0x94,0xE8,0x83,0xA2,0xE4,0x7E,0x95,0xE6,0x71,0x8E,0xE2,0x6A,0x82,0xE9,0x62,0x72,0xEC,0x57,0x6F,0xF2,0x54,0x71,0xF4,0x48,0x78,0xF5,0x45,0x7C,0xEB,0x46,0x7A,0xF2,0x54,0x88,0xF9,0x59,0x8C,0xFF,0x58,0x84,0xFF,0x52,0x8A,0xFF,0x56,0x85,0xFF,0x54,0x84,0xFF,0x57,0x8E,0xFF,0x61,0x97,0xFF,0x51,0x9F,0xFF,0x54,0xA0,0xFF,0x50,0x9A,0xFF,0x53,0xA7,0xFF,0x59,0xA1,0xFF,0x5E,0xA3,0xFF,0x5C,0xAB,0xFF,0x63,0xA7,0xFF,0x5B,0xA5,0xFB,0x57,0xA6,0xFB,0x5C,0xAF,0xF7,0x57,0xB3,0xEB,0x58,0xB5,0xE4,0x47,0xBB,0xE7,0x4C,0xC9,0xD8,0x50,0xC5,0xD4,0x51,0xD0,0xC8,0x4E,0xD8,0xC6,0x4A,0xDC,0xC9,0x44,0xDB,0xB7,0x47,0xCF,0xB0,0x44,0xC7,0x9E,0x44,0xC3,0x9C,0x4A,0xC5,0x97,0x44,0xC8,0x8E,0x44,0xCD,0x81,0x44,0xC6,0x8A,0x44,0xC1,0x87,0x44,0xC8,0x8A,0x44,0xCE,0x90,0x44,0xC7,0x86,0x44,0xC5,0x8A,0x44,0xC9,0x7F,0x44,0xC7,0x82,0x44,0xBF,0x87,0x44,0xBA,0x8C,0x44,0xB7,0x86,0x44,0xAE,0x7C,0x46,0xA5,0x73,0x4A,0xA9,0x75,0x49,0xA5,0x7B,0x47,0xA1,0x73,0x44,0x9D,0x7C,0x44,0x92,0x7D,0x44,0x90,0x87,0x44,0x88,0x7F,0x44,0x93,0x76,0x44,0x9D,0x7A,0x44,0x9D,0x7C,0x44,0x9F,0x80,0x44,0xA7,0x7E,0x44,0x98,0x82,0x44,0x94,0x80,0x44,0x94,0x8E,0x46,0x92,0x85,0x44,0x95,0x7F,0x44,0x89,0x7B,0x49,0x95,0x77,0x57,0x9E,0x7A,0x58,0xA7,0x77,0x5D,0xB3,0x76,0x64,0xAE,0x71,0x6B,0xA5,0x78,0x7A,0xA5,0x76,0x7D,0x9C,0x85,0x7F,0xA0,0x89,0x7C,0x9B,0x92,0x77,0x8C,0x96,0x6A,0x97,0x96,0x77,0x93,0xA9,0x7F,0x92,0xAC,0x80,0x9A,0xAD,0x89,0xA1,0xAA,0x86,0xA8,0xAF,0x98,0xAC,0xAE,0x9F,0xAF,0xB6,0xA6,0xB9,0xB1,0xA8,0xAF,0xBA,0xB0,0xAB,0xBF,0xAA,0xAD,0xBB,0xAD,0xA6,0xC3,0xAC,0xA4,0xC0,0xB7,0xA5,0xCD,0xB9,0xA9,0xDD,0xB1,0xA9,0xE8,0xBF,0x9D,0xEC,0xB9,0x9A,0xF4,0xC9,0x9E,0xEE,0xD3,0x95,0xF4,0xD5,0x9C,0xF1,0xD1,0x9F,0xF1,0xD3,0x9A,0xF2,0xCD,0x8F,0xE4,0xD7,0x92,0xE8,0xD6,0x98,0xE8,0xCA,0x9D,0xE6,0xCE,0xA2,0xE0,0xC3,0xA2,0xDE,0xBE,0xA0,0xDB,0xB2,0x9C,0xED,0xB1,0xA1,0xEF,0xAA,0x9F,0xED,0x9B,0x9D,0xEE,0x8F,0x96,0xEB,0x95,0x9C,0xF3,0x95,0xA3,0xED,0x9A,0xAB,0xF0,0x92,0xB3,0xF1,0x85,0xBD,0xF5,0x89,0xC9,0xF3,0x81,0xC7,0xF6,0x81,0xC2,0xEF,0x87,0xC7,0xF3,0x8A,0xC2,0xF5,0x85,0xC3,0xE4,0x86,0xC5,0xE1,0x87,0xBE,0xD6,0x92,0xBC,0xD5,0x9D,0xB7,0xCE,0x9F,0xB7,0xCC,0xA0,0xAD,0xCD,0x9C,0x9B,0xCF,0x9D,0x93}; +#endif \ No newline at end of file diff --git a/includes/http.h b/includes/http.h new file mode 100755 index 000000000..2ad7ccc28 --- /dev/null +++ b/includes/http.h @@ -0,0 +1,43 @@ +/** + * Powder Toy - HTTP Library (Header) + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * 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 02111-1301 USA + */ +#ifndef HTTP_H +#define HTTP_H + +void http_init(char *proxy); +void http_done(void); + +char *http_simple_get(char *uri, int *ret, int *len); +char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len); +char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len); + +void http_auth_headers(void *ctx, char *user, char *pass); + +void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep); +void http_async_add_header(void *ctx, char *name, char *data); +int http_async_req_status(void *ctx); +void http_async_get_length(void *ctx, int *total, int *done); +char *http_async_req_stop(void *ctx, int *ret, int *len); +void http_async_req_close(void *ctx); + +char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len); + +char *http_ret_text(int ret); + +#endif diff --git a/includes/icon.h b/includes/icon.h new file mode 100755 index 000000000..89b2c7f83 --- /dev/null +++ b/includes/icon.h @@ -0,0 +1,22 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * 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 02111-1301 USA + */ +static unsigned char app_icon[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x05,0x06,0x06,0xFF,0x09,0x09,0x0A,0xFF,0x2F,0x08,0x08,0xFF,0x56,0x06,0x07,0xFF,0x23,0x06,0x06,0xFF,0x85,0x02,0x06,0xFF,0xE5,0x02,0x07,0xFF,0xF2,0x1E,0x08,0xFF,0xED,0x0A,0x08,0xFF,0x60,0x07,0x08,0xFF,0x5F,0x08,0x08,0xFF,0x68,0x08,0x08,0xFF,0x18,0x07,0x08,0xFF,0x05,0x04,0x04,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB6,0x00,0x00,0xFF,0xD3,0x00,0x00,0xFF,0xEE,0x00,0x00,0xFF,0xF9,0x00,0x00,0xFF,0x91,0x00,0x00,0xFF,0xDD,0x15,0x00,0xFF,0xFF,0x74,0x00,0xFF,0xFF,0xBF,0x00,0xFF,0xFC,0x37,0x00,0xFF,0xAE,0x00,0x00,0xFF,0xD7,0x00,0x00,0xFF,0xFA,0x00,0x00,0xFF,0xE5,0x01,0x00,0xFF,0xB3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xF9,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE9,0x00,0x00,0xFF,0xFA,0x90,0x02,0xFF,0xFF,0xFF,0x1A,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0xA4,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xF6,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE8,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xB7,0x2E,0xFF,0xFF,0xFF,0xA1,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFA,0x3E,0xFF,0xFF,0x63,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE4,0x00,0x00,0xFF,0xFF,0x21,0x00,0xFF,0xFF,0x61,0x00,0xFF,0xFF,0x94,0x00,0xFF,0xFF,0x8C,0x00,0xFF,0xFF,0xE1,0x5C,0xFF,0xFF,0xFF,0xCD,0xFF,0xFF,0xFF,0xAE,0xFF,0xFF,0xFF,0x6F,0xFF,0xFF,0xF9,0x1D,0xFF,0xFF,0xC3,0x00,0xFF,0xFF,0x99,0x00,0xFF,0xFF,0x48,0x00,0xFF,0xDF,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xC5,0x00,0x00,0xFF,0xFF,0x64,0x00,0xFF,0xFF,0xEF,0x09,0xFF,0xFF,0xFF,0x46,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBC,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF,0x69,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0x81,0x00,0xFF,0xD0,0x01,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB1,0x00,0x00,0xFF,0xEC,0x14,0x00,0xFF,0xFF,0x90,0x13,0xFF,0xFF,0xF9,0x8E,0xFF,0xFF,0xFF,0xE6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xF2,0xC9,0xFF,0xFF,0xFA,0xBD,0xFF,0xFF,0xFF,0xA8,0xFF,0xFF,0xFC,0x9A,0xFF,0xFF,0xA4,0x2A,0xFF,0xFD,0x15,0x00,0xFF,0xEB,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD5,0xFF,0x1F,0x30,0xD5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF }; +static unsigned char app_icon_w32[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x44,0x47,0x49,0x00,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x86,0x88,0x8A,0xFF,0xD8,0xDE,0xE6,0xFF,0xD1,0xD7,0xDF,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x81,0x84,0x88,0xFF,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x83,0x85,0x89,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x14,0x00,0x00,0xFF,0xE1,0x01,0x00,0xFF,0xF4,0x03,0x00,0xFF,0x24,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x86,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0xE7,0x0A,0x01,0xFF,0xFF,0x07,0x01,0xFF,0x41,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0x16,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x0B,0x00,0x00,0xFF,0x55,0x02,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x39,0x00,0x00,0xFF,0xF8,0x1B,0x02,0xFF,0xFF,0x2F,0x03,0xFF,0x52,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1C,0x00,0x00,0xFF,0x5C,0x01,0x00,0xFF,0x09,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0xAE,0x04,0x01,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x50,0x00,0x00,0xFF,0xFE,0x44,0x02,0xFF,0xFF,0x5C,0x03,0xFF,0x60,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x12,0x00,0x00,0xFF,0x9F,0x02,0x00,0xFF,0x49,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x73,0x04,0x00,0xFF,0xEC,0x09,0x01,0xFF,0x2B,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x13,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x4E,0x06,0x00,0xFF,0xFF,0xC1,0x08,0xFF,0xFD,0x9A,0x07,0xFF,0x49,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x01,0x00,0xFF,0xD5,0x03,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0xB7,0x0D,0x01,0xFF,0xFF,0x0F,0x02,0xFF,0xDE,0x00,0x00,0xFF,0xAB,0x00,0x00,0xFF,0xA5,0x01,0x00,0xFF,0x3D,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x35,0x03,0xFF,0xFF,0xF0,0x0E,0xFF,0xDF,0x4B,0x01,0xFF,0x14,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x55,0x00,0x00,0xFF,0xFF,0x05,0x01,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xE5,0x0F,0x01,0xFF,0xFF,0x0D,0x02,0xFF,0xFF,0x04,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xFF,0x01,0x00,0xFF,0x8F,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xD9,0x47,0x03,0xFF,0xFF,0x92,0x06,0xFF,0xAF,0x12,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x20,0x00,0x00,0xFF,0xE5,0x08,0x01,0xFF,0xD1,0x04,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x30,0x01,0x00,0xFF,0xF6,0x47,0x04,0xFF,0xFF,0x1F,0x02,0xFF,0xFF,0x03,0x01,0xFF,0xFF,0x06,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xC7,0x01,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x06,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x38,0x02,0x00,0xFF,0xFB,0x72,0x07,0xFF,0xFF,0x5A,0x03,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA1,0x02,0x00,0xFF,0xFF,0x0C,0x03,0xFF,0x7B,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x06,0x00,0xFF,0xFF,0xBB,0x0C,0xFF,0xFF,0x56,0x04,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x10,0x03,0xFF,0xFF,0x02,0x01,0xFF,0xDE,0x01,0x00,0xFF,0x34,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x05,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x03,0x00,0xFF,0xFC,0x83,0x06,0xFF,0xFF,0x71,0x03,0xFF,0x83,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFB,0x18,0x03,0xFF,0xFF,0x0E,0x02,0xFF,0xB9,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x21,0x01,0x00,0xFF,0xE8,0xB9,0x0F,0xFF,0xFF,0x8F,0x0C,0xFF,0xFF,0x02,0x00,0xFF,0xFF,0x3C,0x04,0xFF,0xFF,0x16,0x02,0xFF,0xFD,0x00,0x00,0xFF,0x63,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x40,0x0B,0x00,0xFF,0xFE,0xAD,0x06,0xFF,0xFF,0xC9,0x06,0xFF,0xCC,0x45,0x02,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x49,0x03,0xFF,0xFF,0x7E,0x03,0xFF,0xFF,0x45,0x01,0xFF,0x67,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0xFF,0xCC,0xA0,0x08,0xFF,0xFB,0xAA,0x0A,0xFF,0xC9,0x00,0x00,0xFF,0xFE,0x6B,0x03,0xFF,0xFF,0x79,0x02,0xFF,0xF9,0x0A,0x00,0xFF,0x4C,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3F,0x14,0x00,0xFF,0xFC,0xDF,0x10,0xFF,0xFF,0xFF,0x10,0xFF,0xFA,0xCD,0x14,0xFF,0x46,0x0C,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x7F,0x03,0xFF,0xFF,0xFF,0x06,0xFF,0xFF,0xE7,0x03,0xFF,0xD5,0x39,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x06,0x00,0xFF,0xEA,0xCF,0x17,0xFF,0xE2,0xA6,0x10,0xFF,0x32,0x00,0x00,0xFF,0xCB,0x80,0x06,0xFF,0xFF,0xF4,0x09,0xFF,0xD8,0x44,0x00,0xFF,0x10,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x44,0x21,0x00,0xFF,0xFD,0xE9,0x1C,0xFF,0xFF,0xD6,0x09,0xFF,0xFF,0xFF,0x28,0xFF,0xB4,0x75,0x04,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x8D,0x03,0xFF,0xFF,0xFF,0x41,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0x7E,0x01,0xFF,0x4C,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x49,0x30,0x04,0xFF,0xFF,0xFC,0x5A,0xFF,0xB0,0x7E,0x14,0xFF,0x00,0x00,0x00,0xFF,0x89,0x66,0x0F,0xFF,0xFF,0xFF,0x6B,0xFF,0xE6,0xA7,0x1E,0xFF,0x1E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x6F,0x5A,0x18,0xFF,0xFF,0xFE,0x70,0xFF,0xCD,0x6C,0x04,0xFF,0xE8,0xB5,0x27,0xFF,0xFE,0xF3,0x60,0xFF,0x6E,0x3D,0x08,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xDB,0x8A,0x26,0xFF,0xFF,0xFF,0xD5,0xFF,0xFF,0xFF,0xD8,0xFF,0xFF,0xCF,0x3A,0xFF,0x94,0x12,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x15,0x0A,0x01,0xFF,0xBF,0xAC,0x7E,0xFF,0xFF,0xFF,0xDE,0xFF,0x82,0x5F,0x20,0xFF,0x00,0x00,0x00,0xFF,0x67,0x5B,0x28,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xF1,0xAA,0xFF,0x5D,0x2E,0x07,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x18,0x0D,0x02,0xFF,0xD0,0xC0,0x90,0xFF,0xFF,0xFF,0xF4,0xFF,0x92,0x61,0x27,0xFF,0x72,0x3F,0x0F,0xFF,0xFF,0xFF,0xE2,0xFF,0xFA,0xE5,0xAE,0xFF,0x80,0x4B,0x19,0xFF,0x02,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xC9,0xA1,0x64,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xB2,0xFF,0xA1,0x33,0x03,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x96,0x7E,0x5E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7E,0x6A,0x41,0xFF,0x00,0x00,0x00,0xFF,0x7F,0x75,0x56,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9,0x8D,0x54,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8C,0x69,0x4F,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x93,0x82,0x58,0xFF,0x16,0x05,0x00,0xFF,0xEB,0xDB,0xB8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0xBD,0xFF,0x62,0x42,0x14,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA3,0x7F,0x47,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xDD,0xA4,0xFF,0x51,0x19,0x02,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0xD0,0xB6,0x88,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x6A,0x5A,0x39,0xFF,0x00,0x00,0x00,0xFF,0x85,0x7D,0x4E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB4,0xA5,0x73,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xB5,0x9B,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8B,0x78,0x4E,0xFF,0x00,0x00,0x00,0xFF,0xCC,0xAE,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x74,0x38,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x24,0x14,0x03,0xFF,0x8C,0x7E,0x44,0xFF,0xA2,0x8E,0x5D,0xFF,0x5B,0x37,0x17,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x71,0x46,0x1E,0xFF,0xCB,0xA4,0x71,0xFF,0xAC,0x93,0x66,0xFF,0x17,0x0E,0x04,0xFF,0x00,0x00,0x00,0xFF,0x30,0x23,0x0A,0xFF,0xBF,0xA4,0x60,0xFF,0xC4,0xAC,0x78,0xFF,0x43,0x34,0x1A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x5C,0x3D,0x18,0xFF,0xC9,0xA9,0x6F,0xFF,0xB8,0x94,0x63,0xFF,0x2A,0x19,0x07,0xFF,0x00,0x00,0x00,0xFF,0x53,0x3B,0x16,0xFF,0xC7,0xB6,0x70,0xFF,0xBD,0xA2,0x66,0xFF,0x2C,0x1C,0x09,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD6,0xFF,0x1F,0x30,0xD6,0xFF,0x00,0x00,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0x00,0x00,0x00,0xFF,0xC8,0x47,0x0E,0xFF,0xC8,0x47,0x0E,0xFF,0x00,0x00,0x00,0xFF,0x20,0xE6,0x0F,0xFF,0x20,0xE6,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xEB,0xF5,0x22,0xFF,0xEB,0xF5,0x22,0xFF,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x44,0x46,0x48,0x00,0x7A,0x7D,0x81,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x83,0x86,0x8A,0xFF,0x86,0x89,0x8C,0xFF,0x89,0x8C,0x8F,0xFF,0x87,0x8A,0x8F,0xFF,0x85,0x87,0x8B,0xFF,0x82,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00 }; \ No newline at end of file diff --git a/includes/interface.h b/includes/interface.h new file mode 100644 index 000000000..7f130649a --- /dev/null +++ b/includes/interface.h @@ -0,0 +1,183 @@ +#ifndef INTERFACE_H +#define INTERFACE_H +#include +#include "graphics.h" + +struct menu_section +{ + char *icon; + const char *name; + int itemcount; +}; +typedef struct menu_section menu_section; + +struct menu_wall +{ + pixel colour; + const char *descs; +}; +typedef struct menu_wall menu_wall; + +static menu_wall mwalls[] = +{ + {PIXPACK(0xC0C0C0), "Wall. Indestructible. Blocks everything. Conductive."}, + {PIXPACK(0x808080), "E-Wall. Becomes transparent when electricity is connected."}, + {PIXPACK(0xFF8080), "Detector. Generates electricity when a particle is inside."}, + {PIXPACK(0x808080), "Streamline. Set start point of a streamline."}, + {PIXPACK(0x808080), "Sign. Click on a sign to edit it or anywhere else to place a new one."}, + {PIXPACK(0x8080FF), "Fan. Accelerates air. Use line tool to set direction and strength."}, + {PIXPACK(0xC0C0C0), "Wall. Blocks most particles but lets liquids through. Conductive."}, + {PIXPACK(0x808080), "Wall. Absorbs particles but lets air currents through."}, + {PIXPACK(0x808080), "Erases walls."}, + {PIXPACK(0x808080), "Wall. Indestructible. Blocks everything."}, + {PIXPACK(0x3C3C3C), "Wall. Indestructible. Blocks particles, allows air"}, + {PIXPACK(0x575757), "Wall. Indestructible. Blocks liquids and gasses, allows solids"}, + {PIXPACK(0xFFFF22), "Conductor, allows particles, conducts electricity"}, + {PIXPACK(0x242424), "E-Hole, absorbs particles, release them when powered"}, + {PIXPACK(0xFFFFFF), "Air, creates airflow and pressure"}, + {PIXPACK(0xFFBB00), "Heats the targetted element."}, + {PIXPACK(0x00BBFF), "Cools the targetted element."}, + {PIXPACK(0x303030), "Vacuum, reduces air pressure."}, + {PIXPACK(0x579777), "Wall. Indestructible. Blocks liquids and solids, allows gasses"}, +}; + +#define SC_WALL 0 +#define SC_SPECIAL 8 +#define SC_POWDERS 5 +#define SC_SOLIDS 6 +#define SC_ELEC 1 +#define SC_EXPLOSIVE 2 +#define SC_GAS 3 +#define SC_LIQUID 4 +#define SC_NUCLEAR 7 +#define SC_TOTAL 9 + +static menu_section msections[] = +{ + {"\xC1", "Walls", 0}, + {"\xC2", "Electronics", 0}, + {"\xC3", "Explosives", 0}, + {"\xC5", "Gasses", 0}, + {"\xC4", "Liquids", 0}, + {"\xD0", "Powders", 0}, + {"\xD1", "Solids", 0}, + {"\xC6", "Radioactive", 0}, + {"\xCC", "Special", 0}, +}; + +struct ui_edit +{ + int x, y, w, nx; + char str[256],*def; + int focus, cursor, hide; +}; +typedef struct ui_edit ui_edit; + +struct ui_checkbox +{ + int x, y; + int focus, checked; +}; +typedef struct ui_checkbox ui_checkbox; + +extern SDLMod sdl_mod; +extern int sdl_key, sdl_wheel, sdl_caps, sdl_ascii, sdl_zoom_trig; +extern char *shift_0; +extern char *shift_1; +extern int svf_login; +extern int svf_admin; +extern int svf_mod; +extern char svf_user[64]; +extern char svf_pass[64]; + +extern int svf_open; +extern int svf_own; +extern int svf_myvote; +extern int svf_publish; +extern char svf_id[16]; +extern char svf_name[64]; +extern char svf_tags[256]; +extern void *svf_last; +extern int svf_lsize; + +extern char *search_ids[GRID_X*GRID_Y]; +extern char *search_dates[GRID_X*GRID_Y]; +extern int search_votes[GRID_X*GRID_Y]; +extern int search_publish[GRID_X*GRID_Y]; +extern int search_scoredown[GRID_X*GRID_Y]; +extern int search_scoreup[GRID_X*GRID_Y]; +extern char *search_names[GRID_X*GRID_Y]; +extern char *search_owners[GRID_X*GRID_Y]; +extern void *search_thumbs[GRID_X*GRID_Y]; +extern int search_thsizes[GRID_X*GRID_Y]; + +extern int search_own; +extern int search_date; +extern int search_page; +extern char search_expr[256]; + +extern char *tag_names[TAG_MAX]; +extern int tag_votes[TAG_MAX]; + +extern int Z_keysym; + +extern int zoom_en; +extern int zoom_x, zoom_y; +extern int zoom_wx, zoom_wy; + +void menu_count(void); + +void get_sign_pos(int i, int *x0, int *y0, int *w, int *h); + +void add_sign_ui(pixel *vid_buf, int mx, int my); + +void ui_edit_draw(pixel *vid_buf, ui_edit *ed); + +void ui_edit_process(int mx, int my, int mb, ui_edit *ed); + +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed); + +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed); + +void draw_svf_ui(pixel *vid_buf); + +void error_ui(pixel *vid_buf, int err, char *txt); + +void info_ui(pixel *vid_buf, char *top, char *txt); + +void info_box(pixel *vid_buf, char *msg); + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn); + +void login_ui(pixel *vid_buf); + +int stamp_ui(pixel *vid_buf); + +void tag_list_ui(pixel *vid_buf); + +int save_name_ui(pixel *vid_buf); + +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr); + +void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int my); + +int sdl_poll(void); + +void set_cmode(int cm); + +char *download_ui(pixel *vid_buf, char *uri, int *len); + +int search_ui(pixel *vid_buf); + +int search_results(char *str, int votes); + +int execute_tagop(pixel *vid_buf, char *op, char *tag); + +void execute_save(pixel *vid_buf); + +void execute_delete(pixel *vid_buf, char *id); + +int execute_vote(pixel *vid_buf, char *id, char *action); + +#endif + diff --git a/includes/md5.h b/includes/md5.h new file mode 100644 index 000000000..2ae3ae843 --- /dev/null +++ b/includes/md5.h @@ -0,0 +1,18 @@ +#ifndef MD5_H +#define MD5_H + +struct md5_context +{ + unsigned buf[4]; + unsigned bits[2]; + unsigned char in[64]; +}; + +void md5_init(struct md5_context *context); +void md5_update(struct md5_context *context, unsigned char const *buf, unsigned len); +void md5_final(unsigned char digest[16], struct md5_context *context); +void md5_transform(unsigned buf[4], const unsigned char in[64]); + +void md5_ascii(char *result, unsigned char const *buf, unsigned len); + +#endif diff --git a/includes/misc.h b/includes/misc.h new file mode 100644 index 000000000..139468776 --- /dev/null +++ b/includes/misc.h @@ -0,0 +1,72 @@ +#ifndef UTILS_H +#define UTILS_H +#include +#include + +#ifdef WIN32 +#define x86_cpuid(func,af,bf,cf,df) \ + do {\ + __asm mov eax, func\ + __asm cpuid\ + __asm mov af, eax\ + __asm mov bf, ebx\ + __asm mov cf, ecx\ + __asm mov df, edx\ + } while(0) +#else +#define x86_cpuid(func,af,bf,cf,df) \ +__asm__ __volatile ("cpuid":\ + "=a" (af), "=b" (bf), "=c" (cf), "=d" (df) : "a" (func)); +#endif + +static char hex[] = "0123456789ABCDEF"; +//Signum function +#ifdef WIN32 +extern _inline int isign(float i); +#else +extern inline int isign(float i); +#endif + +#ifdef WIN32 +extern _inline unsigned clamp_flt(float f, float min, float max); +#else +extern inline unsigned clamp_flt(float f, float min, float max); +#endif + +#ifdef WIN32 +extern _inline float restrict_flt(float f, float min, float max); +#else +extern inline float restrict_flt(float f, float min, float max); +#endif + +char *mystrdup(char *s); + +struct strlist +{ + char *str; + struct strlist *next; +}; + +void strlist_add(struct strlist **list, char *str); + +int strlist_find(struct strlist **list, char *str); + +void strlist_free(struct strlist **list); + +void save_presets(int do_update); + +void load_presets(void); + +void save_string(FILE *f, char *str); + +int load_string(FILE *f, char *str, int max); + +void strcaturl(char *dst, char *src); + +void strappend(char *dst, char *src); + +void *file_load(char *fn, int *size); + +int cpu_check(void); + +#endif \ No newline at end of file diff --git a/includes/powder.h b/includes/powder.h new file mode 100644 index 000000000..eda30d2ca --- /dev/null +++ b/includes/powder.h @@ -0,0 +1,512 @@ +#ifndef POWDER_H +#define POWDER_H + +#include "graphics.h" +#include "defines.h" +#include "interface.h" + +#define CM_COUNT 7 +#define CM_FANCY 6 +#define CM_HEAT 5 +#define CM_BLOB 4 +#define CM_FIRE 3 +#define CM_PERS 2 +#define CM_PRESS 1 +#define CM_VEL 0 + +#define UI_WALLSTART 37 +#define UI_WALLCOUNT 19 + +#define SPC_AIR 136 +#define SPC_HEAT 137 +#define SPC_COOL 138 +#define SPC_VACUUM 139 + +#define WL_WALLELEC 22 +#define WL_EWALL 23 +#define WL_DETECT 24 +#define WL_STREAM 25 +#define WL_SIGN 26 +#define WL_FAN 27 +#define WL_ALLOWLIQUID 28 +#define WL_DESTROYALL 29 +#define WL_ERASE 30 +#define WL_WALL 31 +#define WL_ALLOWAIR 32 +#define WL_ALLOWSOLID 33 +#define WL_ALLOWALLELEC 34 +#define WL_EHOLE 35 +#define WL_ALLOWGAS 40 + +#define PT_NONE 0 +#define PT_DUST 1 +#define PT_WATR 2 +#define PT_OIL 3 +#define PT_FIRE 4 +#define PT_STNE 5 +#define PT_LAVA 6 +#define PT_GUNP 7 +#define PT_NITR 8 +#define PT_CLNE 9 +#define PT_GAS 10 +#define PT_PLEX 11 +#define PT_GOO 12 +#define PT_ICEI 13 +#define PT_METL 14 +#define PT_SPRK 15 +#define PT_SNOW 16 +#define PT_WOOD 17 +#define PT_NEUT 18 +#define PT_PLUT 19 +#define PT_PLNT 20 +#define PT_ACID 21 +#define PT_VOID 22 +#define PT_WTRV 23 +#define PT_CNCT 24 +#define PT_DSTW 25 +#define PT_SALT 26 +#define PT_SLTW 27 +#define PT_DMND 28 +#define PT_BMTL 29 +#define PT_BRMT 30 +#define PT_PHOT 31 +#define PT_URAN 32 +#define PT_WAX 33 +#define PT_MWAX 34 +#define PT_PSCN 35 +#define PT_NSCN 36 +#define PT_LNTG 37 +#define PT_INSL 38 +#define PT_BHOL 39 +#define PT_WHOL 40 +#define PT_RBDM 41 +#define PT_LRBD 42 +#define PT_NTCT 43 +#define PT_SAND 44 +#define PT_GLAS 45 +#define PT_PTCT 46 +#define PT_BGLA 47 +#define PT_THDR 48 +#define PT_PLSM 49 +#define PT_ETRD 50 +#define PT_NICE 51 +#define PT_NBLE 52 +#define PT_BTRY 53 +#define PT_LCRY 54 +#define PT_STKM 55 +#define PT_SWCH 56 +#define PT_SMKE 57 +#define PT_DESL 58 +#define PT_COAL 59 +#define PT_LO2 60 +#define PT_O2 61 +#define PT_INWR 62 +#define PT_YEST 63 +#define PT_DYST 64 +#define PT_THRM 65 +#define PT_GLOW 66 +#define PT_BRCK 67 +#define PT_HFLM 68 +#define PT_FIRW 69 +#define PT_FUSE 70 +#define PT_FSEP 71 +#define PT_AMTR 72 +#define PT_PCLN 73 +#define PT_HSWC 74 +#define PT_NUM 75 + +#define R_TEMP 22 +#define MAX_TEMP 9999 +#define MIN_TEMP 0 +#define O_MAX_TEMP 3500 +#define O_MIN_TEMP -273 + +#define ST_NONE 0 +#define ST_SOLID 1 +#define ST_LIQUID 2 +#define ST_GAS 3 +/* + We should start to implement these. +*/ +static const unsigned short TYPE_PART = 0x01; //1 +static const unsigned short TYPE_LIQUID = 0x02; //2 +static const unsigned short TYPE_SOLID = 0x04; //4 +static const unsigned short TYPE_GAS = 0x08; //8 +static const unsigned short PROP_CONDUCTS = 0x10; //16 +static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. +#define FLAG_STAGNANT 1 + +struct particle +{ + int type; + int life, ctype; + float x, y, vx, vy; + float temp; + float pavg[2]; + int flags; + int tmp; +}; +typedef struct particle particle; + +struct part_type +{ + const char *name; + pixel pcolors; + float advection; + float airdrag; + float airloss; + float loss; + float collision; + float gravity; + float diffusion; + float hotair; + int falldown; + int flammable; + int explosive; + int meltable; + int hardness; + int menu; + int menusection; + float heat; + unsigned char hconduct; + const char *descs; + const unsigned short properties; +}; +typedef struct part_type part_type; + +struct part_state +{ + char state; + int solid; + float stemp; + int liquid; + float ltemp; + int gas; + float gtemp; + int burn; + float btemp; +}; +typedef struct part_state part_state; +//Should probably be const. +static const part_type ptypes[PT_NUM] = +{ + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f+273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f+273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f+273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f+273.15f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f+273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f+273.15f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f+273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f+273.15f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f+273.15f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f+273.15f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f+273.15f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f+273.15f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f+273.15f, 88, "Smoke"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow, Glows under pressure"}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description +}; + +static part_state pstates[PT_NUM] = +{ + // Name Solid Frzp Liquid Mpnt Gas Bpoint + /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, + /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, + /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, + /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, + /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, + /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, + /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, + /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, + /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, + /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, +}; + +static unsigned char can_move[PT_NUM][PT_NUM] = +{ + /* A B */ + /* A 0 1 | B ligher than A */ + /* B 1 0 | A heavier than B */ + + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A P H */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C S */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T L W */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R N C */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* GLOW */ + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ + /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ + /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ + /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ + /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* FSEP */ + /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ + /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ + /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A P H */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C S */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T L W */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R N C */ +}; + +extern int isplayer; +extern float player[27]; + +extern particle *parts; +extern particle *cb_parts; + +extern unsigned char bmap[YRES/CELL][XRES/CELL]; +extern unsigned char emap[YRES/CELL][XRES/CELL]; + +extern unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +extern unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +extern int pfree; + +extern unsigned pmap[YRES][XRES]; +unsigned cb_pmap[YRES][XRES]; + +int try_move(int i, int x, int y, int nx, int ny); + +void kill_part(int i); + +#ifdef WIN32 +extern _inline int create_part(int p, int x, int y, int t); +#else +extern inline int create_part(int p, int x, int y, int t); +#endif + +#ifdef WIN32 +extern _inline void delete_part(int x, int y); +#else +extern inline void delete_part(int x, int y); +#endif + +#ifdef WIN32 +extern _inline int is_wire(int x, int y); +#else +extern inline int is_wire(int x, int y); +#endif + +#ifdef WIN32 +extern _inline int is_wire_off(int x, int y); +#else +extern inline int is_wire_off(int x, int y); +#endif + +void set_emap(int x, int y); + +#ifdef WIN32 +_inline int parts_avg(int ci, int ni); +#else +inline int parts_avg(int ci, int ni); +#endif + +int nearest_part(int ci, int t); + +void update_particles_i(pixel *vid, int start, int inc); + +void update_particles(pixel *vid); + +void clear_area(int area_x, int area_y, int area_w, int area_h); + +void create_box(int x1, int y1, int x2, int y2, int c); + +int flood_parts(int x, int y, int c, int cm, int bm); + +int create_parts(int x, int y, int r, int c); + +void create_line(int x1, int y1, int x2, int y2, int r, int c); + +#endif diff --git a/includes/update.h b/includes/update.h new file mode 100755 index 000000000..6398d4d79 --- /dev/null +++ b/includes/update.h @@ -0,0 +1,27 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * 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 02111-1301 USA + */ +#ifndef UPDATE_H +#define UPDATE_H + +int update_start(char *data, int len); +int update_finish(void); +void update_cleanup(void); + +#endif diff --git a/includes/version.h b/includes/version.h new file mode 100755 index 000000000..41e9672df --- /dev/null +++ b/includes/version.h @@ -0,0 +1,25 @@ +/** + * Powder Toy - Version (Header) + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * 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 02111-1301 USA + */ +#ifndef VERSION_H +#define VERSION_H + + + +#endif diff --git a/src/Resources/Font-Data b/src/Resources/Font-Data new file mode 100644 index 0000000000000000000000000000000000000000..a38415251c4672b7a0a27e45d10cef660ced29bc GIT binary patch literal 4442 zcmeHJ;cpyA6@R;PcWd8`v!zGpO_umuq0jr})k_cEN!J!dZ-4|gR_Fxux2FWTu7hFl?2v!Nj7 zWDH_t9OPp7#gN5m;)tI<8WfNE=_5)l0id(G#UKKKkR;I_qN<7)Lmuto#4X{FsOa<( zkgst_Dp_K?e$cRo$>L~B@o^T+5X!i#;3Qgqa>hwAR{|j|K%#Zb(Z~SU&W@&dPDawR z&N5+cC>J(-uWmsfi{#C9FoG;u|cZh}h1WGXl z8v{$nR9u*40Pdywd5VWVrKO-KKZ>N>teEqsO*7=%$Ji;d2Qw*?3DC7|X4r#~+4QDm zK)YY9L1NC&OxjG?jD$v)+2}+gJ7GH_1m3*ukUWr52WXjPCQ$jITnqyVQiSzJi4u0N z;#KA`adJN!+YJ<*kw%f&Y*P7)WvHYKqDlA~fHNy&*qSzRdG$yB+kuS?7Bv~CHg$G4Wp9)#*J^mzX(RG!WxIu&JH$B==5lfl( z6*6^4omJe2)4#R7bfk&0DqE(0O4^AXHV6WeyKoa<9rl`Jik+0$(BMIj&Zd=GEDb&3 zamRpxBY_S`o&3!`*;+o-QE^QkMtuqT;;|9i9-ashV8K`O9<|jilIW0|TJK<$vZ+Q@ zmY$T|l`@lYv=6LYl_wyvReKAuMp%557AZ~3(?daNgQ0$y1proK>l-Vo$|QLu#JO3OZpqbHb#B6-xEHzL`CKmdzPf|4QA!D=qi8@Mw(UNMr6^^T%9Kf~ znV*l`!7oLz=vj9KBL_yplumPn}uD1;|2`v%`E{ZMT$$5^vK-i=T0r$RDNZtHK zS|B85g_tojs%e(b0diSxLJ7BxcVl1ftGxr+Bo zMR33w>llx27Dmw$W(%>Y7^9HF+%MHFv1u)-HR)VfZSkS#&|Oj97BWaz!#C!J(d$9J z2e3I~vB+kHfbringW%HxO5AuwoE`9=Mo4v$0uz?V)pvwGt#t{543Jr}MR?~=paQ^s ztKN@IP>^fEb?sG$A4su{`vx{?b-4g8>z5Yb@{0L&LH<^(w9G+OUKFrhaAV;=S%Fm| zsf=@6k?Z&xxU=E7KV`|0{}MJ((H#E1po4V9RWQvmTZ zaQ}5>8dnD4D0J70rI{b``;`@9m;*l%Ulm1s@lgNB5qM(!rPxzX{pve|Lo2l|7WTSs zOjHJr!)r!h@sHt}-Za|sQIWq8B)NdO-3ynYqS%M)SUV6%gkht4WF1fjEfxHu>vBW% z5TboNaR@e62?+7LfiJph5XvtXrmWP^V>pJ@YQSIhe=pVxfAol1kj0DDn&LP3`Tn&7 z4`7n~p>m)tu3!9UX=&-t7qCuDbuvUEZDCDI=b{)$+qY2IB~8DWU1eUe3MXZjkdo?} zQ1Dtd-RJQ1AysND`D$eA-9qnrQK$lUAHW4Zl3@hIEUYRkkn=2so;+EZEN zkpp5LpqD~$@_`<^IBpbo9}=2r@#Bl`TGg_#d-JH#C(6a2hT-c zd1Ya2u#SVif=3)$>(V*Ho`jF`PRcLC%NqK)g#Q&dwXgTrF!*El$#4H~{=5GBLt1-$ z+(1bj<=D}-byVL;;YNJg%h1%69|zvn{DfP^PSZ4e`3U%E5fSdBUb0>YrnThTSIX@V zs;Mz-g)eK#idFf6g(U>Cjx@*Nn$hF`qGL_wwW+Drh_i^KAM8t8@Olb+%0jZT7mn&m z+{um$z56Q tqe3FA9r3YxP_T2O1LJUkd!+E9kJkx1H}?2X*TQ4|(Yx_DAD`)b{2zD8w6*{M literal 0 HcmV?d00001 diff --git a/src/Resources/Font-Pointers b/src/Resources/Font-Pointers new file mode 100644 index 0000000000000000000000000000000000000000..621258b8240d3a4489dc661c661b8b77476a772a GIT binary patch literal 512 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 literal 0 HcmV?d00001 diff --git a/src/Resources/Icon-32.png b/src/Resources/Icon-32.png new file mode 100755 index 0000000000000000000000000000000000000000..1f056bd778a1a0f9f6dc4c94ad864e7dcaf1db4c GIT binary patch literal 3896 zcmV-856AF{P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000DINkl^ia$QVm01Jjrd3KQeKUG5Lnk^0$Jop z3&^ z_$-naeAH#OW4f4C6oqcLyBL5NnT%{LxT|F3o7i6e@!25K%6YrwSmd)nSs(xUlHr1# zJ#H=dbe4At{+;lz=)^xdOUn@asN{PcHsv(Gjh|o~H((3?S_A14yBrOaxT4_XJk2>8 zEv^ZCCoq&VxsF{O?(XnmgByr3N|NMU0A&aR_7?PCkMH6(RUqLyT#4)PBHpGo&&Tsj z%rV(!sAMyt`ordCnr&>uCAC^^sZVKinQw<{t}nrXwbiX{xTjXdwtC~Cny|}l6&6zb z@*EJpVqv@-ch@0F*8u$T)ynaqwbZinsN(Ba0nj>7>wI|&At=kz`E^kLTj0Rb01p0+ z?jP!$zu01o(lnK2*`i#&y8QZnrJ(sX)66^30og=*8 zTR9ILId-Z3-&fs1*%xF@@@AAIQDdkryZW$n>tX32$wAtGW9DRTK2%kAHZY#Du|ead zS&iG@kxr0&p77p?;=L5p%X47M@lRF`<$*PF?vHEeiWg)Sqclm*85c=rmHDOCzr2<% zmx@m>e0f~T*-G>}PI`&Yl`99mQ))%mIFWeeO10MTrbsKI2cjEg&)j0qa9Z*AQkhnCUH7zw@WzeD zjvPI{Yu%BnN9MB^!bEy2SBiM8NW^I+xR8j2iB_xx%W&1(DuHkD86K{0bnClTyLo)~ zKbvr(s^Q^H)@!w;ug7h^GRh2Bgoh_`TD|NK#hg~O093=n)mq6>_ChqCqEUo!BK`32 zNx7WXvNTt#&2ne2TDta~I=@}B;hTp3$u7fS!ozEI7 z)f?9^F*7kW=S1~3Y!KB8X)V$hi%di`m<=1cywQH_CbArRXSkFT>228Xh|`+g*%YbO zK5fQcS1YyR#|_z~#&fR5r#yZ9>Y1xPd#SRqdENR_qZ-YOYhXYdHef)YUr{^s+=>lz zJ4~M{5{adv|K^AG|FDnA)5t*${bOO_O}v3ZBvQW#e{M19IeqdXk;cP!-pj1KLRFEd zP+4GXZQT-2DttD7Sfe$v)>_dYPu6KAEn7CDhwHVH%Eku5BlwH%DHsNi`1M-hsek)` zJokU`CY4sNwB&mzb8>pCQmYS_E)FdttI>)|%KuOyc)o{~y|iB2Ku7<5>W7pMU%qDL z<`))aCBC_H@!6+uIeGc{nYyuU5=n`+=sP}T-$nS=!z2E?ls!W)Z4xm7mxS?#a#e_0 zDO2#GxmQJhYoWqrn-m5rktifCJjyaKiaw#xQ15{Q2m1x=x%wpLeLSCF`C!{}*`hgP zhmL_V@v^F?k5`}FpH*7R@A3P$?AorFIDR@bORso(cI)w0rL9r;h#NM3(UMUvZq86N zz2err%ghX=wno-dMVF2P7p^(y%tsUG3i^WoYY27YP5PEFMQTi_%r`& zY5AWpw(eqPS-Rk-2Q(T*o>FHusqVe^isV1+W=L;2nxTT_LbRd+PGm$+tc%Gnl9ByF zwIbN1COv00F=YLLt9PUFwc55x2pd(woR=q!4IXHHnpbj73qE4-v zmNn~ntU0)8wuep>*pg}^Wyc;t{%O*_a5ux>f+q4jiZCTqXXAkY-h{a zbb^uT^)Bu`yLiv`YTwbxsXgA%+RoP2&d#R!pLJnrdcAY6&aOdwrnhVB)Ulm?Yg-%Z zmW>CoMSgO|CV1uH%O}CGEiO2X9h}QPcp%SG+J@eE>0w+H=6Yb zfADFARxfi~H_Qw4jM&`DbMnfFb1`|jk*D_W*?(a7UuR!N@9T~!r7^uOG0-!RR;pI7 zU4I|jniiETEGk!S=;q$i*g(gJtEE??hUN0=dX}~7=;VSE(Uo|^zjGpb2~LDxVahO# zLFh8f!%B@Pkep~5n{EuG|IOLvzy0>b|7m*SC3;Ah|KX#CB=0}Gs?|0&{m-vAGym1E z|Ht8Lo0hl9w(iOKR<|in46#b=9_jYa(tkcSn+uV zxjA6QWj1EqzI^`l=_A;sf*tt1kBej6Kr<=|!f>y+m$Db)=g*ZdM9<|fL@)VQO(A0B z%c$tsl-GCfp1OG^`cBln-M9C?c@h;9^Y+61Ywu&@9)HmWGmc=G&*d31j#*rW9^~V` z{PF1{<46)FCcKA)UZi@3CJxp}z-+;@4YqC{3~ zP*PG{T*McL6mf;3B6*>vAT(c*C(g~~@5B~*Ocm&l!BIiaY=EBvRGVHtSZtgEGkkJ>J=0g$_hmJe1R-qoR_c66X)FE zYz%Cj8NF(O+O1da?>&0@?Ah~|E?l^X&&x$Bq8L(&RfMWUuei8GQOp&Iiq#mHegUYd z3*`Cwd06A~d1kpe*_oGYtZi&MGIEsywc8&>oxO17`n`Mi@87$}-4#D5Qhe7d#o80Z z3}|#Za>^nl8=Ja7k*^18GV76qLV&lWEU_owISa{r5pssu#_cSv8Y5| zEGm)}%ZtQ?Me0HYMC33q6&q8=6>DoNYk`hwpmtY!c0pk=bOmK`AfhZaEGaEv3M2W{ z@S!3QGJwJgF)TS#mlC>ye7QN-ty)=GIlm$G>j!H8`c6w}jD|1O`(6sM_!3buS0XNE zMW+v!2!>O8&NylZ?*9RUd>D}{1o5Q|i-E?ov$G%$KdfnI(=0ZCwx3!XnN zfdKokvJCrffcKYv4=dHs$YsU)PyjfR`>6_5>}t8rU2^kexuR=)3w@_3?P8?0h1$d4 z;diKSVBku|co{4rgGH3^I#`2^Sy`YGyhMf60B6s=#x*x+A<&R6)E>gc_)_bP%9V)V zA0aRV4MXr;q9D%8<5?)=@id6$Gzi$?2LTlb$iAye^~s!?5)GrklPO^ZHMZDtp7wI=+@v2YnRed*N&H#Tn+kA zRm1B!K}i}Ggk*aITv&)y1GiVhgURh>OxfyOeFP&LdyIAo*e})|{SF6|l$K(er6C{^ z;Y5mJ2{c`VPv(qrkfC5u2=1)THJ~id$i&i=X%MVEMr0_tD9hZ4GD0yzS%Xweic{tC zIfB~a=o-CX?Q!LIL(*C)#xLkhQKAxzq$&!7zSZn9neMXpbeaAV?eS6tC07p7uEAJ^ z%%c*tC1dIi(Z#w(@DGeOM;L7xi4!oGiV_&?q|1a#He3b5S6syMmm$0ZGP8`YKn_6o zk>`UJeG2pv*pQZLPr%#sNr9SjLAYWurD;J2ln+7#cU8fLxw&OBC1^Rw1Og>8l1Wo4 zp)s*RDOd)>EJU$fSR_cM(q%(3se<{U8vX=w($ma)1$vzJWC^dc248|$P$0j`%2E`~ z8u}EB$^v~7ky%xq$K{IPU?8T*k)HAo5BG1zh)F;UX&(a05s3(FA*N{Z5Tujoa=wa9 zYN9+&kW&FygP=-`YzD$xAZAD-`wlOGtcp@2rhoiUAnTE$R7Hm5@|5~1Vu%*`4JnN1 zut6mX8Y?9UX@13sWSC(~5N$MVknPlzW5{<{U>jfdazv+y(zQ49u?`GK*;PVLK>1T8OoxVy080kYi-NhgqD(#^ ze=5)P!o6F&|E9ioVl;{$Znk~oV z@V6qY6;&{=5{||TPOE0V20em;?4J~hm280+qFc{}z#1Vmcp00`Xl25tGa7>e6lBoC zKgIwGYM2!oROzyf8qUh)i`b%z%f(F1B2bA-Nt6G)zC>P1le}O~4XJ|CE3J~4ODM}0 zysBIkDFENnQ${AnM$MT=FjWc^c0 zKnghvHCl2pUC5a|m58<+C8%Vd^bcP>u>uttrf0P2jn3X$^^6&X&YVmLzH7 zq#P2GEj{@!3ehlYP@dJN6%U8;u=L0l83L6MCM#T-Kq!J)_&XZ>(eV{%eTW+i3Y z2VwFnTWSbvSeikJoRGOmzaYuwh~O;}(lEZ26)kQAszsDcRKk`-rQ45?+Yv35ZU&I$ z8bUaHDRO9NAr)!B=DUhDSOGEf&eH}jt4k{~!BA?D6lHO6Tc)RfGd{|7JPRONT`1xBv;|??86oMb zDEPAYY}LQ$2iDfGMHrO=C`Hk(kjukrUf98Cn4R^&S|!-JS$VoGmxnFmXd9s@q-l$1 zRMadPD9cwkWv0%`)>I@UL=7TXSR@In95u5NPhLl}AMHwXQ-=o5QcgjLU#tao7P38% z3fm`5*=!+fX4JWA#6osL}N{H>li6y!s719Pd z7*WZrKm}`uokb-O2v?|& z1s>)e1TXElY4KaOaVt}_iWy4I6cm=l{|g;#l2Of};su4TuoTy@DMnegC_<2^p;|6W zmif;-P^e_XphY56Ev@TdBMq!9tjaK#Q;-Rs4%1)+|BN(7LrpT2g+H4el)6bqgY+R> zP6ndOr>|aBVPQ}xgI>!j7dpdIoYE{#sYA&W5Xxx$5aZ`$RLB>HA!$&Uv5kOG8dC^M z3XaVS3bx2ZW*28c8{$liMe#4n#12PSLE_7-5{iL@U{*mIR3SzwT7*jvVTu!?9>KaR zoeDt&PN32gB~zA+X_1WCjj~M+1fgt$RbE!MLKuK5Qxpg)wOH=J9JT8!xRawomtpWz zjV{%NfVBa+5-x-XWc_p zL1s?Y$IsvLcp6bY3|pS|X!BMF=|49&W0_2J9aicNRo5>vk_vX^Hm zGmSpSKEH;_^!Rc)=LMu}a_>9P+r4-1uHAZg^&2|W$ESav{=-HMA39>R|HKIsCQg|) zb=tJa(`U_|JqKU2rcD?-Vt{vFuMSoYF755@nl)(`-^w`}lYpt`JqK9y)5oh*6>4N3<0gdinS$ z`iWY~MCL;^O`A5>j2u3EV!blL<>L)x<6YH3WK}*?O$R-URMuY9h;JDBzZ$AQ(L5k^ z1+QMJnxA)g=~2KYsb*#g*sFU+j3P z|LSh^LX_`j#Xiq{A]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 S;?fN;ne)(?8bTL3 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≀0iwiUE9s3m_S| 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 byTM}{bv<>=)c?OJA@jd>%%ZgaZ@2#kNH-22 literal 0 HcmV?d00001 diff --git a/src/air.c b/src/air.c new file mode 100644 index 000000000..dd98a124c --- /dev/null +++ b/src/air.c @@ -0,0 +1,141 @@ +#include +#include +#include +#include +float kernel[9]; + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float cb_vx[YRES/CELL][XRES/CELL], cb_ovx[YRES/CELL][XRES/CELL]; +float cb_vy[YRES/CELL][XRES/CELL], cb_ovy[YRES/CELL][XRES/CELL]; +float cb_pv[YRES/CELL][XRES/CELL], cb_opv[YRES/CELL][XRES/CELL]; + +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; + +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} diff --git a/src/graphics.c b/src/graphics.c new file mode 100644 index 000000000..7ac641e7f --- /dev/null +++ b/src/graphics.c @@ -0,0 +1,2567 @@ +#include +#include +#include + +#ifdef OpenGL +#ifdef MACOSX +#include +#include +#else +#include +#include +#endif +#endif + +#include +#include +#include +#include +#include +#include + + +unsigned cmode = 3; +SDL_Surface *sdl_scrn; +int sdl_scale = 1; + +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + +unsigned int fire_alpha[CELL*3][CELL*3]; +pixel *fire_bg; + +pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) +{ + int i,j,x,y,w,h,r,g,b,c; + pixel p, *q; + w = (sw+f-1)/f; + h = (sh+f-1)/f; + q = malloc(w*h*PIXELSIZE); + for(y=0; y1) + { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } + *qw = w; + *qh = h; + return q; +} + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + int i,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + } + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) +{ +#ifdef OpenGL + RenderScene(); +#else + if(sdl_scale == 2) + sdl_blit_2(x, y, w, h, src, pitch); + else + sdl_blit_1(x, y, w, h, src, pitch); +#endif +} + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) +{ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +} + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) +{ + int x, y, i, j, c; + int bo = b; + if(iswall==1) + { + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) + { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) + { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } +} + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) +{ + int i, j, c; + if(b>=121) + { + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); +#ifdef OpenGL + fillrect(vid_buf, x, y, 28, 16, PIXR(pc), PIXG(pc), PIXB(pc), 255); +#else + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } +#endif + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; +} + +void draw_menu(pixel *vid_buf, int i, int hover) +{ + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i) + { + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } +} + +#ifdef WIN32 +_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#else +inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#endif +{ + pixel t; + if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +#ifdef WIN32 +_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#else +inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#endif +{ + int i, j, w, bn = 0, ba = 0; + char *rp = font_data + font_ptrs[c]; + w = *(rp++); + for(j=0; j>= 2; + bn -= 2; + } + return x + w; +} + +int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a) +{ +#ifdef OpenGL +#else + int sx = x; + for(; *s; s++) + { + if(*s == '\n') + { + x = sx; + y += FONT_H+2; + } + else if(*s == '\b') + { + switch(s[1]) + { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } + else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } +#endif + return x; +} + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +{ +#ifdef OpenGL + glBegin(GL_LINE_LOOP); + glColor4ub(r, g, b, a); + glVertex2i(x, y); + glVertex2i(x+w, y); + glVertex2i(x+w, y+h); + glVertex2i(x, y+h); + glEnd(); +#else + int i; + for(i=0; i<=w; i++) + { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); + } + for(i=1; i=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + if(*s) + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); + return x; +} + +int textnwidth(char *s, int n) +{ + int x = 0; + for(; *s; s++) + { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} + +int textwidthx(char *s, int w) +{ + int x=0,n=0,cw; + for(; *s; s++) + { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; + } + return n; +} + +#ifdef WIN32 +_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#else +inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#endif +{ +#ifdef OpenGL + if(x<0 || y<0 || x>=XRES || r>=YRES) + return; + if(a!=255) + { + glBegin (GL_QUADS); + glColor4ub(r,g,b,a); + glVertex2i(x, y); + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +#else + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +#endif //OpenGL +} + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) +{ + char t[2]; + t[0] = ch; + t[1] = 0; + if(flag) + { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } + else + { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + } +} + +void draw_air(pixel *vid) +{ + int x, y, i, j; + pixel c; + + if(cmode == 2) + return; + + for(y=0; y 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } + else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; jdx) + { + dx = dx+dy; + dy = dx-dy; + dx = dx-dy; + check = 1; + } + + e = (dy<<2)-dx; + for (i=0; i<=dx; i++) + { + vid[x+y*a] =PIXRGB(r, g, b); + if (e>=0) + { + if (check==1) + x = x+sx; + else + y = y+sy; + e = e-(dx<<2); + } + if (check==1) + y = y+sy; + else + x = x+sx; + e = e+(dy<<2); + } +} + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + 255*PIXR(t)) >> 8; + g = (a*g + 255*PIXG(t)) >> 8; + b = (a*b + 255*PIXB(t)) >> 8; + if(r>255) + r = 255; + if(g>255) + g = 255; + if(b>255) + b = 255; + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +void xor_pixel(int x, int y, pixel *vid) +{ + int c; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + c = vid[y*(XRES+BARSIZE)+x]; + c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); + if(c<512) + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + else + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); +} + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + e -= 1.0f; + } + } +} + +void xor_rect(pixel *vid, int x, int y, int w, int h) +{ + int i; + for(i=0; i(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; + vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; + vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; + vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; + } + draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); + draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); + draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); + draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + + isplayer = 1; //It's a secret. Tssss... + } + if(t==PT_MWAX&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,224,224,170,255); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,224,224,170,20); + else + blendpixel(vid,x+nx,y+ny,224,224,170,40); + } + } + + } + else if(t==PT_ACID) + { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28)); + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + if(cmode==6) { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); + } + } + } else { + blendpixel(vid, nx, ny, cr, cg, cb, 255); + } + + if(cmode==4) + { + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + } + else if(t==PT_OIL&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,64,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,64,16,40); + } + } + } + else if(t==PT_NEUT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLUT&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_SLTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,80,240,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,80,240,50); + } + } + } + else if(t==PT_PHOT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_SWCH && parts[i].life == 10) + { + x = nx; + y = ny; + blendpixel(vid,x,y,17,217,24,255); + } + else if(t==PT_LNTG&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,128,160,223,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,128,160,223,50); + } + } + } + else if(t==PT_SMKE) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = 10; + cb = 10; + cr = 10; + cg += fire_g[y][x]; + if(cg > 50) cg = 50; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 50) cb = 50; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 50) cr = 50; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,100,100,100,30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,100,100,100,10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,100,100,100,20); + } + } + } + } + else if(t==PT_WATR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + + } else if(t==PT_DSTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + } + else if(t==PT_NITR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,224,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,224,16,50); + } + } + + } + else if(t==PT_LRBD&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,170,170,170,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,170,170,170,50); + } + } + + } + + else if(t==PT_NBLE&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,235,73,23,100); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,235,73,23,30); + else + blendpixel(vid,x+nx,y+ny,235,73,23,50); + } + } + + } + else if(t==PT_GAS&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,255,255,0,180); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,255,255,0,50); + else + blendpixel(vid,x+nx,y+ny,255,255,0,80); + } + } + + } + else if(t==PT_WTRV) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = PIXG(ptypes[t].pcolors)/3; + cb = PIXB(ptypes[t].pcolors)/3; + cr = PIXR(ptypes[t].pcolors)/3; + cg += fire_g[y][x]; + if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); + } + } + } + } + else if(t==PT_THDR) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_GLOW) + { + fg = 0; + fb = 0; + fr = 0; + if(pv[ny/CELL][nx/CELL]>0) { + fg = 6 * pv[ny/CELL][nx/CELL]; + fb = 4 * pv[ny/CELL][nx/CELL]; + fr = 2 * pv[ny/CELL][nx/CELL]; + } + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB((int)restrict_flt(0x44 + fr*8, 0, 255), (int)restrict_flt(0x88 + fg*8, 0, 255), (int)restrict_flt(0x44 + fb*8, 0, 255)); + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + fg += fire_g[y][x]; + if(fg > 255) fg = 255; + fire_g[y][x] = fg; + fb += fire_b[y][x]; + if(fb > 255) fb = 255; + fire_b[y][x] = fb; + fr += fire_r[y][x]; + if(fr > 255) fr = 255; + fire_r[y][x] = fr; + } + if(cmode == 4) { + uint8 R = (int)restrict_flt(0x44 + fr*8, 0, 255); + uint8 G = (int)restrict_flt(0x88 + fg*8, 0, 255); + uint8 B = (int)restrict_flt(0x44 + fb*8, 0, 255); + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + } + else if(t==PT_LCRY) + { + uint8 GR = 0x50+(parts[i].life*10); + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, GR); + if(cmode == 4) { + blendpixel(vid, nx+1, ny, GR, GR, GR, 223); + blendpixel(vid, nx-1, ny, GR, GR, GR, 223); + blendpixel(vid, nx, ny+1, GR, GR, GR, 223); + blendpixel(vid, nx, ny-1, GR, GR, GR, 223); + + blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112); + blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112); + blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112); + blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112); + } + } + else if(t==PT_PCLN) + { + uint8 GR = 0x3B+(parts[i].life*19); + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, 10); + if(cmode == 4) { + blendpixel(vid, nx+1, ny, GR, GR, 10, 223); + blendpixel(vid, nx-1, ny, GR, GR, 10, 223); + blendpixel(vid, nx, ny+1, GR, GR, 10, 223); + blendpixel(vid, nx, ny-1, GR, GR, 10, 223); + + blendpixel(vid, nx+1, ny-1, GR, GR, 10, 112); + blendpixel(vid, nx-1, ny-1, GR, GR, 10, 112); + blendpixel(vid, nx+1, ny+1, GR, GR, 10, 112); + blendpixel(vid, nx-1, ny+1, GR, GR, 10, 112); + } + } + else if(t==PT_HSWC) + { + uint8 GR = 0x3B+(parts[i].life*19); + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, 10, 10); + if(cmode == 4) { + blendpixel(vid, nx+1, ny, GR, 10, 10, 223); + blendpixel(vid, nx-1, ny, GR, 10, 10, 223); + blendpixel(vid, nx, ny+1, GR, 10, 10, 223); + blendpixel(vid, nx, ny-1, GR, 10, 10, 223); + + blendpixel(vid, nx+1, ny-1, GR, 10, 10, 112); + blendpixel(vid, nx-1, ny-1, GR, 10, 10, 112); + blendpixel(vid, nx+1, ny+1, GR, 10, 10, 112); + blendpixel(vid, nx-1, ny+1, GR, 10, 10, 112); + } + } + else if(t==PT_PLSM) + { + float ttemp = (float)parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_HFLM) + { + float ttemp = (float)parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = hflm_data[caddress]; + uint8 G = hflm_data[caddress+1]; + uint8 B = hflm_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_FIRW&&parts[i].tmp==3) + { + float ttemp = (float)parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = firw_data[caddress]; + uint8 G = firw_data[caddress+1]; + uint8 B = firw_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/2; + cg = G/2; + cb = B/2; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_FIRE && parts[i].life) + { + if(cmode == 3||cmode==4 || cmode==6) + { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LAVA && parts[i].life) + { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4 || cmode==6) + { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else if(t==PT_LAVA || t==PT_SPRK) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4 || cmode==6) + { + if(t == PT_LAVA) + { + cr = 3; + cg = i%2; + cb = 0; + } + else + { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + } + else + { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + + if(t==PT_STKM) //Stick man should be visible in heat mode + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); + vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); + vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); + vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); + } + draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); + draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); + draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); + draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + + isplayer = 1; //It's a secret. Tssss... + } + else + { + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } + } + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_HFLM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH&&t!=PT_SMKE&&t!=PT_WTRV&&!(t==PT_FIRW&&parts[i].tmp==3)) + { + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + } +#endif + } +#ifdef OpenGL + glFlush (); +#endif + +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + char buff[30]; //Buffer + for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp-273.15); //...tempirature + else + sprintf(buff, "Temp: 0.00"); //...tempirature + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + //Usual text + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); + x = signs[i].x; + y = signs[i].y; + dx = 1 - signs[i].ju; + dy = (signs[i].y > 18) ? -1 : 1; + for(j=0; j<4; j++) + { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void render_fire(pixel *dst) +{ + int i,j,x,y,r,g,b; + for(j=0; j=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; jSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) + { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0; y= size) + goto corrupt; + j=d[p++]; + if(j0) + { + if(j==PT_STKM) //Stickman should be drawed another way + { + //Stickman drawing + for(k=-2; k<=1; k++) + { + fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); + fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); + fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); + fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); + } + draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); + draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); + draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); + draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); + } + else + fb[y*w+x] = ptypes[j].pcolors; + } + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) +{ + unsigned char *d,*c=thumb; + int i,j,x,y,a,t,r,g,b,sx,sy; + + if(bzip2) + { + if(size<16) + return 1; + if(c[3]!=0x74 || c[2]!=0x49 || c[1]!=0x68 || c[0]!=0x53) + return 1; + if(c[4]>PT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } + else + d = c; + + if(size < XRES*YRES) + { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0; y+scl<=YRES; y+=scl) + { + sx = 0; + for(x=0; x+scl<=XRES; x+=scl) + { + a = 0; + r = g = b = 0; + for(j=0; j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) + { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +void render_cursor(pixel *vid, int x, int y, int t, int r) +{ + int i,j,c; + if(tr*r || i*i+(j+1)*(j+1)>r*r)) + { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } + else + { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i +#include +#include +#ifndef MACOSX +#include +#endif +#include +#ifdef WIN32 +#define _WIN32_WINNT 0x0501 +//#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#endif + +#include +#include +#include + +#ifdef WIN32 +#define PERROR SOCKET_ERROR +#define PERRNO WSAGetLastError() +#define PEAGAIN WSAEWOULDBLOCK +#define PEINTR WSAEINTR +#define PEINPROGRESS WSAEINPROGRESS +#define PEALREADY WSAEALREADY +#define PCLOSE closesocket +#else +#define PERROR -1 +#define PERRNO errno +#define PEAGAIN EAGAIN +#define PEINTR EINTR +#define PEINPROGRESS EINPROGRESS +#define PEALREADY EALREADY +#define PCLOSE close +#endif + +static int http_up = 0; +static long http_timeout = 15; +static int http_use_proxy = 0; +static struct sockaddr_in http_proxy; + +static char *mystrdup(char *s) +{ + char *x; + if(s) + { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +static int splituri(char *uri, char **host, char **path) +{ + char *p=uri,*q,*x,*y; + if(!strncmp(p, "http://", 7)) + p += 7; + q = strchr(p, '/'); + if(!q) + q = p + strlen(p); + x = malloc(q-p+1); + if(*q) + y = mystrdup(q); + else + y = mystrdup("/"); + strncpy(x, p, q-p); + x[q-p] = 0; + if(q==p || x[q-p-1]==':') + { + free(x); + free(y); + return 1; + } + *host = x; + *path = y; + return 0; +} + +static char *getserv(char *host) +{ + char *q, *x = mystrdup(host); + q = strchr(x, ':'); + if(q) + *q = 0; + return x; +} + +static char *getport(char *host) +{ + char *p, *q; + q = strchr(host, ':'); + if(q) + p = mystrdup(q+1); + else + p = mystrdup("80"); + return p; +} + +static int resolve(char *dns, char *srv, struct sockaddr_in *addr) +{ + struct addrinfo hnt, *res = 0; + if(http_use_proxy) + { + memcpy(addr, &http_proxy, sizeof(struct sockaddr_in)); + return 0; + } + memset(&hnt, 0, sizeof(hnt)); + hnt.ai_family = AF_INET; + hnt.ai_socktype = SOCK_STREAM; + if(getaddrinfo(dns, srv, &hnt, &res)) + return 1; + if(res) + { + if(res->ai_family != AF_INET) + { + freeaddrinfo(res); + return 1; + } + memcpy(addr, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + return 0; + } + return 1; +} + +void http_init(char *proxy) +{ + char *host, *port; +#ifdef WIN32 + WSADATA wsadata; + if(!WSAStartup(MAKEWORD(2,2), &wsadata)) + http_up = 1; +#else + signal(SIGPIPE, SIG_IGN); + http_up = 1; +#endif + if(proxy) + { + host = getserv(proxy); + port = getport(proxy); + if(resolve(host, port, &http_proxy)) + http_up = 0; + else + http_use_proxy = 1; + free(host); + free(port); + } +} + +void http_done(void) +{ +#ifdef WIN32 + WSACleanup(); +#endif + http_up = 0; +} + +#define CHUNK 4096 + +#define HTS_STRT 0 +#define HTS_RSLV 1 +#define HTS_CONN 2 +#define HTS_IDLE 3 +#define HTS_XMIT 4 +#define HTS_RECV 5 +#define HTS_DONE 6 +struct http_ctx +{ + int state; + time_t last; + int keep; + int ret; + char *host, *path; + char *thdr; + int thlen; + char *txd; + int txdl; + struct sockaddr_in addr; + char *tbuf; + int tlen, tptr; + char *hbuf; + int hlen, hptr; + char *rbuf; + int rlen, rptr; + int chunked, chunkhdr, rxtogo, contlen, cclose; + int fd; + char *fdhost; +}; +void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep) +{ + struct http_ctx *cx = ctx; + if(!ctx) + { + ctx = calloc(1, sizeof(struct http_ctx)); + cx = ctx; + cx->fd = PERROR; + } + + if(!cx->hbuf) + { + cx->hbuf = malloc(256); + cx->hlen = 256; + } + + if(!http_up) + { + cx->ret = 604; + cx->state = HTS_DONE; + return ctx; + } + + if(cx->state!=HTS_STRT && cx->state!=HTS_IDLE) + { + fprintf(stderr, "HTTP: unclean request restart state.\n"); + exit(1); + } + + cx->keep = keep; + cx->ret = 600; + if(splituri(uri, &cx->host, &cx->path)) + { + cx->ret = 601; + cx->state = HTS_DONE; + return ctx; + } + if(http_use_proxy) + { + free(cx->path); + cx->path = mystrdup(uri); + } + if(cx->fdhost && strcmp(cx->host, cx->fdhost)) + { + free(cx->fdhost); + cx->fdhost = NULL; + PCLOSE(cx->fd); + cx->fd = PERROR; + cx->state = HTS_STRT; + } + if(data) + { + if(!dlen) + dlen = strlen(data); + cx->txd = malloc(dlen); + memcpy(cx->txd, data, dlen); + cx->txdl = dlen; + } + else + cx->txdl = 0; + + cx->contlen = 0; + cx->chunked = 0; + cx->chunkhdr = 0; + cx->rxtogo = 0; + cx->cclose = 0; + + cx->tptr = 0; + cx->tlen = 0; + + cx->last = time(NULL); + + return ctx; +} + +void http_async_add_header(void *ctx, char *name, char *data) +{ + struct http_ctx *cx = ctx; + cx->thdr = realloc(cx->thdr, cx->thlen + strlen(name) + strlen(data) + 4); + cx->thlen += sprintf(cx->thdr+cx->thlen, "%s: %s\n", name, data); +} + +static void process_header(struct http_ctx *cx, char *str) +{ + char *p; + if(cx->chunkhdr) + { + p = strchr(str, ';'); + if(p) + *p = 0; + cx->rxtogo = strtoul(str, NULL, 16); + cx->chunkhdr = 0; + if(!cx->rxtogo) + cx->chunked = 0; + } + if(!str[0]) + { + cx->rxtogo = cx->contlen; + cx->chunkhdr = cx->chunked; + if(!cx->contlen && !cx->chunked && cx->ret!=100) + cx->state = HTS_DONE; + return; + } + if(!strncmp(str, "HTTP/", 5)) + { + p = strchr(str, ' '); + if(!p) + { + cx->ret = 603; + cx->state = HTS_DONE; + return; + } + p++; + cx->ret = atoi(p); + return; + } + if(!strncmp(str, "Content-Length: ", 16)) + { + cx->contlen = atoi(str+16); + return; + } + if(!strcmp(str, "Transfer-Encoding: chunked")) + { + cx->chunked = 1; + return; + } + if(!strcmp(str, "Connection: close")) + { + cx->cclose = 1; + return; + } +} + +static void process_byte(struct http_ctx *cx, char ch) +{ + if(cx->rxtogo) + { + cx->rxtogo--; + + if(!cx->rbuf) + { + cx->rbuf = malloc(256); + cx->rlen = 256; + } + if(cx->rptr >= cx->rlen-1) + { + cx->rlen *= 2; + cx->rbuf = realloc(cx->rbuf, cx->rlen); + } + cx->rbuf[cx->rptr++] = ch; + + if(!cx->rxtogo && !cx->chunked) + cx->state = HTS_DONE; + } + else + { + if(ch == '\n') + { + cx->hbuf[cx->hptr] = 0; + process_header(cx, cx->hbuf); + cx->hptr = 0; + } + else if(ch != '\r') + { + if(cx->hptr >= cx->hlen-1) + { + cx->hlen *= 2; + cx->hbuf = realloc(cx->hbuf, cx->hlen); + } + cx->hbuf[cx->hptr++] = ch; + } + } +} + +int http_async_req_status(void *ctx) +{ + struct http_ctx *cx = ctx; + char *dns,*srv,buf[CHUNK]; + int tmp, i; + time_t now = time(NULL); +#ifdef WIN32 + unsigned long tmp2; +#endif + + switch(cx->state) + { + case HTS_STRT: + dns = getserv(cx->host); + srv = getport(cx->host); + if(resolve(dns, srv, &cx->addr)) + { + free(dns); + free(srv); + cx->state = HTS_DONE; + cx->ret = 602; + return 1; + } + free(dns); + free(srv); + cx->state = HTS_RSLV; + return 0; + case HTS_RSLV: + cx->state = HTS_CONN; + cx->last = now; + return 0; + case HTS_CONN: + if(cx->fd == PERROR) + { + cx->fd = socket(AF_INET, SOCK_STREAM, 0); + if(cx->fd == PERROR) + goto fail; + cx->fdhost = mystrdup(cx->host); +#ifdef WIN32 + tmp2 = 1; + if(ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR) + goto fail; +#else + tmp = fcntl(cx->fd, F_GETFL); + if(tmp < 0) + goto fail; + if(fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0) + goto fail; +#endif + } + if(!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr))) + cx->state = HTS_IDLE; +#ifdef WIN32 + else if(PERRNO==WSAEISCONN) + cx->state = HTS_IDLE; +#endif +#ifdef MACOSX + else if(PERRNO==EISCONN) + cx->state = HTS_IDLE; +#endif + else if(PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY +#ifdef WIN32 + && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL +#endif + ) + goto fail; + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_IDLE: + if(cx->txdl) + { + // generate POST + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); + if(cx->thdr) + { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl); +#ifdef BETA + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#else + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#endif + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl); + cx->tlen += cx->txdl; + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; + } + else + { + // generate GET + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(cx->thdr) + { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); +#ifdef BETA + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#else + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#endif + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + } + cx->state = HTS_XMIT; + cx->last = now; + return 0; + case HTS_XMIT: + tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) + { + cx->tptr += tmp; + if(cx->tptr == cx->tlen) + { + cx->tptr = 0; + cx->tlen = 0; + if(cx->tbuf) + free(cx->tbuf); + cx->state = HTS_RECV; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_RECV: + tmp = recv(cx->fd, buf, CHUNK, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) + { + for(i=0; istate == HTS_DONE) + return 1; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_DONE: + return 1; + } + return 0; + +fail: + cx->ret = 600; + cx->state = HTS_DONE; + return 1; + +timeout: + cx->ret = 605; + cx->state = HTS_DONE; + return 1; +} + +char *http_async_req_stop(void *ctx, int *ret, int *len) +{ + struct http_ctx *cx = ctx; + char *rxd; + + if(cx->state != HTS_DONE) + while(!http_async_req_status(ctx)) ; + + if(cx->host) + { + free(cx->host); + cx->host = NULL; + } + if(cx->path) + { + free(cx->path); + cx->path = NULL; + } + if(cx->txd) + { + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; + } + if(cx->hbuf) + { + free(cx->hbuf); + cx->hbuf = NULL; + } + if(cx->thdr) + { + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + + if(ret) + *ret = cx->ret; + if(len) + *len = cx->rptr; + if(cx->rbuf) + cx->rbuf[cx->rptr] = 0; + rxd = cx->rbuf; + cx->rbuf = NULL; + cx->rlen = 0; + cx->rptr = 0; + cx->contlen = 0; + + if(!cx->keep) + http_async_req_close(ctx); + else if(cx->cclose) + { + PCLOSE(cx->fd); + cx->fd = PERROR; + if(cx->fdhost) + { + free(cx->fdhost); + cx->fdhost = NULL; + } + cx->state = HTS_STRT; + } + else + cx->state = HTS_IDLE; + + return rxd; +} + +void http_async_get_length(void *ctx, int *total, int *done) +{ + struct http_ctx *cx = ctx; + if(done) + *done = cx->rptr; + if(total) + *total = cx->contlen; +} + +void http_async_req_close(void *ctx) +{ + struct http_ctx *cx = ctx; + void *tmp; + if(cx->host) + { + cx->keep = 1; + tmp = http_async_req_stop(ctx, NULL, NULL); + if(tmp) + free(tmp); + } + if(cx->fdhost) + free(cx->fdhost); + PCLOSE(cx->fd); + free(ctx); +} + +char *http_simple_get(char *uri, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); + if(!ctx) + { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} +static char hex[] = "0123456789abcdef"; +void http_auth_headers(void *ctx, char *user, char *pass) +{ + char *tmp; + int i; + unsigned char hash[16]; + unsigned int m; + struct md5_context md5; + + if(user) + { + http_async_add_header(ctx, "X-Auth-User", user); + if(pass) + { + md5_init(&md5); + md5_update(&md5, (unsigned char *)user, strlen(user)); + md5_update(&md5, (unsigned char *)"-", 1); + m = 0; + + md5_update(&md5, (unsigned char *)pass, strlen(pass)); + md5_final(hash, &md5); + tmp = malloc(33); + for(i=0; i<16; i++) + { + tmp[i*2] = hex[hash[i]>>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } + } +} +char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); + + if(!ctx) + { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} + +char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, data, dlen, 0); + if(!ctx) + { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} + +char *http_ret_text(int ret) +{ + switch(ret) + { + case 100: + return "Continue"; + case 101: + return "Switching Protocols"; + case 102: + return "Processing"; + + case 200: + return "OK"; + case 201: + return "Created"; + case 202: + return "Accepted"; + case 203: + return "Non-Authoritative Information"; + case 204: + return "No Content"; + case 205: + return "Reset Content"; + case 206: + return "Partial Content"; + case 207: + return "Multi-Status"; + + case 300: + return "Multiple Choices"; + case 301: + return "Moved Permanently"; + case 302: + return "Found"; + case 303: + return "See Other"; + case 304: + return "Not Modified"; + case 305: + return "Use Proxy"; + case 306: + return "Switch Proxy"; + case 307: + return "Temporary Redirect"; + + case 400: + return "Bad Request"; + case 401: + return "Unauthorized"; + case 402: + return "Payment Required"; + case 403: + return "Forbidden"; + case 404: + return "Not Found"; + case 405: + return "Method Not Allowed"; + case 406: + return "Not Acceptable"; + case 407: + return "Proxy Authentication Required"; + case 408: + return "Request Timeout"; + case 409: + return "Conflict"; + case 410: + return "Gone"; + case 411: + return "Length Required"; + case 412: + return "Precondition Failed"; + case 413: + return "Request Entity Too Large"; + case 414: + return "Request URI Too Long"; + case 415: + return "Unsupported Media Type"; + case 416: + return "Requested Range Not Satisfiable"; + case 417: + return "Expectation Failed"; + case 422: + return "Unprocessable Entity"; + case 423: + return "Locked"; + case 424: + return "Failed Dependency"; + case 425: + return "Unordered Collection"; + case 426: + return "Upgrade Required"; + + case 500: + return "Internal Server Error"; + case 501: + return "Not Implemented"; + case 502: + return "Bad Gateway"; + case 503: + return "Service Unavailable"; + case 504: + return "Gateway Timeout"; + case 505: + return "HTTP Version Not Supported"; + case 506: + return "Variant Also Negotiates"; + case 507: + return "Insufficient Storage"; + case 509: + return "Bandwidth Limit Exceeded"; + case 510: + return "Not Extended"; + + case 600: + return "Internal Client Error"; + case 601: + return "Unsupported Protocol"; + case 602: + return "Server Not Found"; + case 603: + return "Malformed Response"; + case 604: + return "Network Not Available"; + case 605: + return "Request Timed Out"; + default: + return "Unknown Status Code"; + } +} +char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len) +{ + void *ctx; + char *data = NULL, *tmp, *p; + int dlen = 0, i, j; + unsigned char hash[16]; + unsigned char boundary[32], ch; + int blen = 0; + unsigned int map[62], m; + struct md5_context md5; + //struct md5_context md52; + int own_plen = 0; + + if(names) + { + if(!plens) + { + own_plen = 1; + for(i=0; names[i]; i++) ; + plens = calloc(i, sizeof(int)); + for(i=0; names[i]; i++) + plens[i] = strlen(parts[i]); + } + +retry: + if(blen >= 31) + goto fail; + memset(map, 0, 62*sizeof(int)); + for(i=0; names[i]; i++) + { + for(j=0; j='0' && ch<='9') + map[ch-'0']++; + else if(ch>='A' && ch<='Z') + map[ch-'A'+10]++; + else if(ch>='a' && ch<='z') + map[ch-'a'+36]++; + } + } + m = ~0; + j = 61; + for(i=0; i<62; i++) + if(map[i]>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } + } + + if(data) + { + tmp = malloc(32+strlen((char *)boundary)); + sprintf(tmp, "multipart/form-data, boundary=%s", boundary); + http_async_add_header(ctx, "Content-type", tmp); + free(tmp); + free(data); + } + + if(own_plen) + free(plens); + return http_async_req_stop(ctx, ret, len); + +fail: + if(data) + free(data); + if(own_plen) + free(plens); + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; +} diff --git a/src/interface.c b/src/interface.c new file mode 100644 index 000000000..bdec1114f --- /dev/null +++ b/src/interface.c @@ -0,0 +1,2961 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; + +int svf_login = 0; +int svf_admin = 0; +int svf_mod = 0; +char svf_user[64] = ""; +char svf_pass[64] = ""; + +int svf_open = 0; +int svf_own = 0; +int svf_myvote = 0; +int svf_publish = 0; +char svf_id[16] = ""; +char svf_name[64] = ""; +char svf_tags[256] = ""; +void *svf_last = NULL; +int svf_lsize; + +char *search_ids[GRID_X*GRID_Y]; +char *search_dates[GRID_X*GRID_Y]; +int search_votes[GRID_X*GRID_Y]; +int search_publish[GRID_X*GRID_Y]; +int search_scoredown[GRID_X*GRID_Y]; +int search_scoreup[GRID_X*GRID_Y]; +char *search_names[GRID_X*GRID_Y]; +char *search_owners[GRID_X*GRID_Y]; +void *search_thumbs[GRID_X*GRID_Y]; +int search_thsizes[GRID_X*GRID_Y]; + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +char *tag_names[TAG_MAX]; +int tag_votes[TAG_MAX]; + +int Z_keysym = 'z'; + +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; +unsigned char ZFACTOR = 256/ZSIZE_D; +unsigned char ZSIZE = ZSIZE_D; + +void menu_count(void) +{ + int i=0; + msections[SC_WALL].itemcount = UI_WALLCOUNT-4; + msections[SC_SPECIAL].itemcount = 4; + for(i=0; i 18) ? signs[i].y - 18 : signs[i].y + 4; +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) + { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) + { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) + { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) + { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +void ui_edit_draw(pixel *vid_buf, ui_edit *ed) +{ + int cx, i; + char echo[256], *str; + + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(ed->str[0]) + { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } + else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) + { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} + +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; + } + if(ed->focus && sdl_key) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) + { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } + else if(ed->cursor > 0) + { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) + { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) + { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) + { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} + +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) +{ + int w = 12; + if(ed->checked) + { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus) + { + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } + else + { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } +} + +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) +{ + int w = 12; + + if(mb && !mbq) + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->checked = (ed->checked)?0:1; + } + } + else + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->focus = 1; + } + else + { + ed->focus = 0; + } + } +} + +void draw_svf_ui(pixel *vid_buf) +{ + int c; + + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); + drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + c = svf_open ? 255 : 128; + drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); + drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); + + c = svf_login ? 255 : 128; + drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); + if(svf_open) + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + else + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); + if(svf_open && svf_own) + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } + else if(svf_myvote==-1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); + if(svf_tags[0]) + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + else + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); + + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); + drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); + if(svf_login) + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + else + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); + + if(sys_pause) + { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + if(!legacy_enable) + { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + switch(cmode) + { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; + case 6: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xC4", 100, 150, 255, 255); + break; + } + drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(svf_admin) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } + else if(svf_mod) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? +} + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) + { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +void login_ui(pixel *vid_buf) +{ + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq,mx,my,err; + ui_edit ed1,ed2; + char *res; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed1.x = x0+25; + ed1.y = y0+25; + ed1.w = 158; + ed1.nx = 1; + ed1.def = "[user name]"; + ed1.focus = 1; + ed1.hide = 0; + ed1.cursor = strlen(svf_user); + strcpy(ed1.str, svf_user); + ed2.x = x0+25; + ed2.y = y0+45; + ed2.w = 158; + ed2.nx = 1; + ed2.def = "[password]"; + ed2.focus = 0; + ed2.hide = 1; + ed2.cursor = 0; + strcpy(ed2.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, "Server login:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\x8B", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\x8A", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + drawtext(vid_buf, x0+11, y0+44, "\x8C", 160, 144, 32, 255); + drawtext(vid_buf, x0+11, y0+44, "\x84", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+40, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed1); + ui_edit_draw(vid_buf, &ed2); + drawtext(vid_buf, x0+5, y0+69, "Sign in", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed1); + ui_edit_process(mx, my, b, &ed2); + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) + { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) + { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) + { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) + { + if(!strcmp(res, "OK ADMIN")) + { + svf_admin = 1; + svf_mod = 0; + } + else if(!strcmp(res, "OK MOD")) + { + svf_admin = 0; + svf_mod = 1; + } + else + { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +int stamp_ui(pixel *vid_buf) +{ + int b=1,bq,mx,my,d=-1,i,j,k,x,gx,gy,y,w,h,r=-1,stamp_page=0,per_page=STAMP_X*STAMP_Y,page_count; + char page_info[64]; + page_count = ceil((float)stamp_count/(float)per_page); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); + k = stamp_page*per_page;//0; + r = -1; + d = -1; + for(j=0; j=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) + { + if(stamp_page) + { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=20) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1) + { + *sl = h; + } + if(b==4&&h!=-1) + { + *sr = h; + } +} + +int sdl_poll(void) +{ + SDL_Event event; + sdl_key=sdl_wheel=sdl_ascii=0; + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_KEYDOWN: + sdl_key=event.key.keysym.sym; + sdl_ascii=event.key.keysym.unicode; + if(event.key.keysym.sym == SDLK_CAPSLOCK) + sdl_caps = 1; + if(event.key.keysym.unicode=='z' || event.key.keysym.unicode=='Z') + { + sdl_zoom_trig = 1; + Z_keysym = event.key.keysym.sym; + } + if( event.key.keysym.sym == SDLK_PLUS) + { + sdl_wheel++; + } + if( event.key.keysym.sym == SDLK_MINUS) + { + sdl_wheel--; + } + // 4 + //1 8 2 + if(event.key.keysym.sym == SDLK_RIGHT) + { + player[0] = (int)(player[0])|0x02; //Go right command + } + if(event.key.keysym.sym == SDLK_LEFT) + { + player[0] = (int)(player[0])|0x01; //Go left command + } + if(event.key.keysym.sym == SDLK_DOWN && ((int)(player[0])&0x08)!=0x08) + { + player[0] = (int)(player[0])|0x08; //Go left command + } + if(event.key.keysym.sym == SDLK_UP && ((int)(player[0])&0x04)!=0x04) + { + player[0] = (int)(player[0])|0x04; //Jump command + } + break; + + case SDL_KEYUP: + if(event.key.keysym.sym == SDLK_CAPSLOCK) + sdl_caps = 0; + if(event.key.keysym.sym == Z_keysym) + sdl_zoom_trig = 0; + if(event.key.keysym.sym == SDLK_RIGHT || event.key.keysym.sym == SDLK_LEFT) + { + player[1] = player[0]; //Saving last movement + player[0] = (int)(player[0])&12; //Stop command + } + if(event.key.keysym.sym == SDLK_UP) + { + player[0] = (int)(player[0])&11; + } + if(event.key.keysym.sym == SDLK_DOWN) + { + player[0] = (int)(player[0])&7; + } + break; + case SDL_MOUSEBUTTONDOWN: + if(event.button.button == SDL_BUTTON_WHEELUP) + sdl_wheel++; + if(event.button.button == SDL_BUTTON_WHEELDOWN) + sdl_wheel--; + break; + case SDL_QUIT: + return 1; + } + } + sdl_mod = SDL_GetModState(); + return 0; +} + +void set_cmode(int cm) +{ + cmode = cm; + itc = 51; + if(cmode==4) + { + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + strcpy(itc_msg, "Blob Display"); + } + else if(cmode==5) + { + strcpy(itc_msg, "Heat Display"); + } + else if(cmode==6) + { + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + strcpy(itc_msg, "Fancy Display"); + } + else if(cmode==3) + { + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + strcpy(itc_msg, "Fire Display"); + } + else if(cmode==2) + { + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + strcpy(itc_msg, "Persistent Display"); + } + else if(cmode==1) + strcpy(itc_msg, "Pressure Display"); + else + strcpy(itc_msg, "Velocity Display"); +} + +char *download_ui(pixel *vid_buf, char *uri, int *len) +{ + int dstate = 0; + void *http = http_async_req_start(NULL, uri, NULL, 0, 0); + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2; + int done, total, i, ret, zlen, ulen; + char str[16], *tmp, *res; + + while(!http_async_req_status(http)) + { + sdl_poll(); + + http_async_get_length(http, &total, &done); + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, "Please wait", 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, "Downloading update...", 255, 255, 255, 255); + + if(total) + { + i = (236*done)/total; + fillrect(vid_buf, x0+1, y0+45, i+1, 14, 255, 216, 32, 255); + i = (100*done)/total; + sprintf(str, "%d%%", i); + if(i<50) + drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 192, 192, 192, 255); + else + drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 0, 0, 0, 255); + } + else + drawtext(vid_buf, x0+120-textwidth("Waiting...")/2, y0+48, "Waiting...", 255, 216, 32, 255); + + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + } + + tmp = http_async_req_stop(http, &ret, &zlen); + if(ret!=200) + { + error_ui(vid_buf, ret, http_ret_text(ret)); + if(tmp) + free(tmp); + return NULL; + } + if(!tmp) + { + error_ui(vid_buf, 0, "Server did not return data"); + return NULL; + } + + if(zlen<16) + { + printf("ZLen is not 16!\n"); + goto corrupt; + } + if(tmp[0]!=0x42 || tmp[1]!=0x75 || tmp[2]!=0x54 || tmp[3]!=0x54) + { + printf("Tmperr %d, %d, %d, %d\n", tmp[0], tmp[1], tmp[2], tmp[3]); + goto corrupt; + } + + ulen = (unsigned char)tmp[4]; + ulen |= ((unsigned char)tmp[5])<<8; + ulen |= ((unsigned char)tmp[6])<<16; + ulen |= ((unsigned char)tmp[7])<<24; + + res = (char *)malloc(ulen); + if(!res) + { + printf("No res!\n"); + goto corrupt; + } + dstate = BZ2_bzBuffToBuffDecompress((char *)res, (unsigned *)&ulen, (char *)(tmp+8), zlen-8, 0, 0); + if(dstate) + { + printf("Decompression failure: %d!\n", dstate); + free(res); + goto corrupt; + } + + free(tmp); + if(len) + *len = ulen; + return res; + +corrupt: + error_ui(vid_buf, 0, "Downloaded update is corrupted"); + free(tmp); + return NULL; +} + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + int thumb_drawn[GRID_X*GRID_Y]; + pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_dates, 0, sizeof(search_dates)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + + do_open = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) + { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) + { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) + { + if(search_page) + { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) + { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) + { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) + for(gi=0; giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) + { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) + { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]&&thumb_drawn[pos]==0) + { + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); + thumb_drawn[pos] = 1; + } + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) + { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) + { + mp = -1; + dp = pos; + } + if(!search_dates[pos] && mx>=gx-6 && mx<=gx+4 && my>=gy+YRES/GRID_S-4 && my<=gy+YRES/GRID_S+6) + { + mp = -1; + dap = pos; + } + } + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, 1+(YRES/GRID_S+3)/2, 0, 107, 10, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 6, 1+(YRES/GRID_S+3)/2, 107, 10, 0, 255); + + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) + { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]) + { + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(!search_dates[pos] && own) + { + fillrect(vid_buf, gx-5, gy+YRES/GRID_S-3, 7, 8, 255, 255, 255, 255); + if(dap == pos) { + drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 200, 100, 80, 255); + } else { + drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 160, 70, 50, 255); + } + //drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) + { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0) + { + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv) + { + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8) + { + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } + else + { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + + fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-1+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 57, 187, 57, 255); + fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 4, nyd, 187, 57, 57, 255); + //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) + { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) + { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) + { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) + { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) + { + free(last); + last = NULL; + } + } + if(b && !bq && dap!=-1) + { + sprintf(ed.str, "history:%s", search_ids[dap]); + lasttime = TIMEOUT; + } + + if(b && !bq && tp!=-1) + { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) + { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1) + { + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) + { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + if(search_dates[mp]) { + uri = malloc(strlen(search_ids[mp])*3+strlen(search_dates[mp])*3+strlen(SERVER)+71); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + strappend(uri, "&Date="); + strcaturl(uri, search_dates[mp]); + } else { + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + } + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) + { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) + { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) + { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) + { + if(data) + { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } + else + svf_tags[0] = 0; + } + else + { + svf_tags[0] = 0; + } + + if(svf_login) + { + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200) + { + if(data) + { + if(!strcmp(data, "Up")) + { + svf_myvote = 1; + } + else if(!strcmp(data, "Down")) + { + svf_myvote = -1; + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + } + else + { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } + else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + { + search = 1; + } + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } + else + search = 0; + + if(search && lasttime>=TIMEOUT) + { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) + { + if(search_page) + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } + else + { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } + else + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) + { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login) + { + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) + { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + { + page_count = search_results(results, last_own||svf_admin||svf_mod); + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + } + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) + { + http_async_req_close(http); + http = NULL; + } + + for(i=0; i=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str+5, search_thumbs+i, search_thsizes+i); + i++; + } + else if(!strncmp(str, "HISTORY ", 8)) + { + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + sd = strchr(str+8, ' '); + if(!sd) + return i; + *(sd++) = 0; + pu = strchr(sd, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + sd = strchr(str+8, ' '); + if(!sd) + return i; + *(sd++) = 0; + pu = strchr(sd, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+8); + + search_dates[i] = mystrdup(sd); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str+8, search_thumbs+i, search_thsizes+i); + i++; + } + else if(!strncmp(str, "TAG ", 4)) + { + if(j >= TAG_MAX) + { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) + { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } + else + { + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) + { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +void execute_save(pixel *vid_buf) +{ + int status; + char *result; + + char *names[] = {"Name", "Data:save.bin", "Thumb:thumb.bin", "Publish", "ID", NULL}; + char *parts[5]; + int plens[5]; + + parts[0] = svf_name; + plens[0] = strlen(svf_name); + parts[1] = build_save(plens+1, 0, 0, XRES, YRES); + parts[2] = build_thumb(plens+2, 1); + parts[3] = (svf_publish==1)?"Public":"Private"; + plens[3] = strlen((svf_publish==1)?"Public":"Private"); + + if(svf_id[0]) + { + parts[4] = svf_id; + plens[4] = strlen(svf_id); + } + else + names[4] = NULL; + + result = http_multipart_post( + "http://" SERVER "/Save.api", + names, parts, plens, + svf_user, svf_pass, + &status, NULL); + + if(svf_last) + free(svf_last); + svf_last = parts[1]; + svf_lsize = plens[1]; + + free(parts[2]); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result[2]) + { + strncpy(svf_id, result+3, 15); + svf_id[15] = 0; + } + + if(!svf_id[0]) + { + error_ui(vid_buf, 0, "No ID supplied by server"); + free(result); + return; + } + + thumb_cache_inval(svf_id); + + svf_own = 1; + if(result) + free(result); +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} diff --git a/src/main.c b/src/main.c new file mode 100755 index 000000000..8c7035b8a --- /dev/null +++ b/src/main.c @@ -0,0 +1,2096 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * Copyright (c) 2010 Skresanov Savely + * Copyright (c) 2010 Bryan Hoyle + * Copyright (c) 2010 Nathan Cousins + * + * 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 02111-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char *it_msg = + "\brThe Powder Toy\n" + "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" + "\n" + "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" + "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" + "\bgPick your material from the menu using mouse left/right buttons.\n" + "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" + "Shift+drag will create straight lines of particles.\n" + "Ctrl+drag will result in filled rectangles.\n" + "Ctrl+Shift+click will flood-fill a closed area.\n" + "Ctrl+Z will act as Undo.\n" + "Middle click or Alt+Click to \"sample\" the particles.\n" + "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" + "Use 'S' to save parts of the window as 'stamps'.\n" + "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" + "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 7 will do the same\n" + "Use the mouse scroll wheel to change the tool size for particles.\n" + "'Q' will quit the application.\n" + "The spacebar can be used to pause physics.\n" + "'P' will take a screenshot and save it into the current directory.\n" + "\n" + "\brhttp://powdertoy.co.uk/\n" + "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" + "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" + "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" + "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" + "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" + "\n" + "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" + "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" + ; + +typedef struct +{ + int start, inc; + pixel *vid; +} upstruc; + +#ifdef BETA +static const char *old_ver_msg_beta = "A new beta is available - click here!"; +#endif +static const char *old_ver_msg = "A new version is available - click here!"; +float mheat = 0.0f; + +int do_open = 0; +int sys_pause = 0; +int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. +int death = 0, framerender = 0; +int amd = 1; +int FPSB = 0; + +sign signs[MAXSIGNS]; + +int numCores = 4; + +int core_count() +{ + int numCPU = 1; +#ifdef MT +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; +#else +#ifdef MACOSX + numCPU = 4; +#else + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); +#endif +#endif + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); +#endif + return numCPU; +} + +int mousex = 0, mousey = 0; //They contain mouse position + +void sdl_seticon(void) +{ +#ifdef WIN32 + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else +#ifdef MACOSX + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#endif +#endif +} + +int frame_idx=0; +void dump_frame(pixel *src, int w, int h, int pitch) +{ + char frame_name[32]; + int j,i; + unsigned char c[3]; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"wb"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0; j=0 && x=0 && y255) i=255; + d[p++] = i; + } + for(y=by0; y255) i=255; + d[p++] = i; + } + + // save the particle map + for(i=0; i=x0 && x=y0 && y255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } + } + for(j=0; j>8); + d[p++] = (tttemp&0x00FF); + } + } + for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + + i = (p*101+99)/100 + 612; + c = malloc(i); + + //New file header uses PSv, replacing fuC. This is to detect if the client uses a new save format for temperatures + //This creates a problem for old clients, that display and "corrupt" error instead of a "newer version" error + + c[0] = 0x50; //0x66; + c[1] = 0x53; //0x75; + c[2] = 0x76; //0x43; + c[3] = legacy_enable; + c[4] = SAVE_VERSION; + c[5] = CELL; + c[6] = bw; + c[7] = bh; + c[8] = p; + c[9] = p >> 8; + c[10] = p >> 16; + c[11] = p >> 24; + + i -= 12; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) + { + free(d); + free(c); + return NULL; + } + free(d); + + *size = i+12; + return c; +} + +int parse_save(void *save, int size, int replace, int x0, int y0) +{ + unsigned char *d,*c=save; + int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; + int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; + int fp[NPART], nf=0, new_format = 0, ttv = 0; + + //New file header uses PSv, replacing fuC. This is to detect if the client uses a new save format for temperatures + //This creates a problem for old clients, that display and "corrupt" error instead of a "newer version" error + + if(size<16) + return 1; + if(!(c[2]==0x43 && c[1]==0x75 && c[0]==0x66) && !(c[2]==0x76 && c[1]==0x53 && c[0]==0x50)) + return 1; + if(c[2]==0x76 && c[1]==0x53 && c[0]==0x50) { + new_format = 1; + } + if(c[4]>SAVE_VERSION) + return 2; + ver = c[4]; + + if(ver<34) + { + legacy_enable = 1; + } + else + { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } + + bw = c[6]; + bh = c[7]; + if(bx0+bw > XRES/CELL) + bx0 = XRES/CELL - bw; + if(by0+bh > YRES/CELL) + by0 = YRES/CELL - bh; + if(bx0 < 0) + bx0 = 0; + if(by0 < 0) + by0 = 0; + + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) + return 3; + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + return 1; + size = i; + + if(size < bw*bh) + return 1; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + if(replace) + { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); + } + + // make a catalog of free parts + memset(pmap, 0, sizeof(pmap)); + for(i=0; i= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } + for(y=by0; y= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + + // load the particle map + i = 0; + pty = p; + for(y=y0; y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j)// && !(isplayer == 1 && j==PT_STKM)) + { + if(pmap[y][x]) + { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } + else if(i < nf) + { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } + else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + + // load particle properties + for(j=0; j= size) + goto corrupt; + if(i < NPART) + { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + if(parts[i].type == PT_STKM) + { + //player[2] = PT_DUST; + + player[3] = parts[i].x-1; //Setting legs positions + player[4] = parts[i].y+6; + player[5] = parts[i].x-1; + player[6] = parts[i].y+6; + + player[7] = parts[i].x-3; + player[8] = parts[i].y+12; + player[9] = parts[i].x-3; + player[10] = parts[i].y+12; + + player[11] = parts[i].x+1; + player[12] = parts[i].y+6; + player[13] = parts[i].x+1; + player[14] = parts[i].y+6; + + player[15] = parts[i].x+3; + player[16] = parts[i].y+12; + player[17] = parts[i].x+3; + player[18] = parts[i].y+12; + + } + } + else + p += 2; + } + } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } + } + for(j=0; j=34&&legacy_beta==0) + { + if(p >= size) + { + goto corrupt; + } + if(i <= NPART) + { + if(ver>=42) { + if(new_format) { + ttv = (d[p++])<<8; + ttv |= (d[p++]); + parts[i-1].temp = ttv; + } else { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } + } else { + parts[i-1].temp = ((d[p++]*((O_MAX_TEMP+(-O_MIN_TEMP))/255))+O_MIN_TEMP)+273; + } + } + else + { + p++; + if(new_format) { + p++; + } + } + } + else + { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } + } + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) + { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + + if(p >= size) + goto version1; + j = d[p++]; + for(i=0; i size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kXRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) + { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } + } + + free(data); +} + +int clipboard_ready = 0; +void *clipboard_data = 0; +int clipboard_length = 0; + +void stamp_save(int x, int y, int w, int h) +{ + FILE *f; + int n; + char fn[64], sn[16]; + void *s=build_save(&n, x, y, w, h); + +#ifdef WIN32 + _mkdir("stamps"); +#else + mkdir("stamps", 0755); +#endif + + stamp_gen_name(sn); + sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); + + f = fopen(fn, "wb"); + if(!f) + return; + fwrite(s, n, 1, f); + fclose(f); + + free(s); + + if(stamps[STAMP_MAX-1].thumb) + free(stamps[STAMP_MAX-1].thumb); + memmove(stamps+1, stamps, sizeof(struct stamp)*(STAMP_MAX-1)); + memset(stamps, 0, sizeof(struct stamp)); + if(stamp_count0) + { + memcpy(&tmp, stamps+i, sizeof(struct stamp)); + memmove(stamps+1, stamps, sizeof(struct stamp)*i); + memcpy(stamps, &tmp, sizeof(struct stamp)); + + stamp_update(); + } + + return data; +} + +void stamp_init(void) +{ + int i; + FILE *f; + + memset(stamps, 0, sizeof(stamps)); + + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); + if(!f) + return; + for(i=0; i= THUMB_CACHE_SIZE) + return; + free(thumb_cache_id[i]); + free(thumb_cache_data[i]); + thumb_cache_id[i] = NULL; + for(j=0; j thumb_cache_lru[i]) + thumb_cache_lru[j]--; +} +void thumb_cache_add(char *id, void *thumb, int size) +{ + int i,m=-1,j=-1; + thumb_cache_inval(id); + for(i=0; i m) + { + m = thumb_cache_lru[i]; + j = i; + } + } + if(i >= THUMB_CACHE_SIZE) + { + thumb_cache_inval(thumb_cache_id[j]); + i = j; + } + for(j=0; j= THUMB_CACHE_SIZE) + return 0; + for(j=0; jSAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; +#else + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; +#endif + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + { + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) + { + break; + } + } + if(sdl_key=='d' && isplayer) + { + death = 1; + //death = !(death); + } + if(sdl_key=='f') + { + framerender = 1; + } + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) + { + if(load_mode) + { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) + { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } + else + load_data = stamp_load(0, &load_size); + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') + { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1') + { + set_cmode(0); + } + if(sdl_key=='2') + { + set_cmode(1); + } + if(sdl_key=='3') + { + set_cmode(2); + } + if(sdl_key=='4') + { + set_cmode(3); + } + if(sdl_key=='5') + { + set_cmode(4); + } + if(sdl_key=='6') + { + set_cmode(5); + } + if(sdl_key=='7') + { + set_cmode(6); + } + if(sdl_key==SDLK_LEFTBRACKET) { + if(sdl_zoom_trig==1) + { + ZSIZE -= 1; + if(ZSIZE>32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + } + else + { + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + bs -= 1; + else + bs -= ceil((bs/5)+0.5f); + if(bs>1224) + bs = 1224; + if(bs<0) + bs = 0; + } + } + if(sdl_key==SDLK_RIGHTBRACKET) { + if(sdl_zoom_trig==1) + { + ZSIZE += 1; + if(ZSIZE>32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + } + else + { + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + bs += 1; + else + bs += ceil((bs/5)+0.5f); + if(bs>1224) + bs = 1224; + if(bs<0) + bs = 0; + } + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='h') + hud_enable = !hud_enable; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + if(clipboard_ready==1) + { + load_data = malloc(clipboard_length); + memcpy(load_data, clipboard_data, clipboard_length); + load_size = clipboard_length; + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + } + if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 2; + } + if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 1; + } + else if(sdl_key=='c') + { + set_cmode((cmode+1) % 7); + if(it > 50) + it = 50; + } + if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo + { + int cbx, cby, cbi; + + for(cbi=0; cbi32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } + else + { + bs += sdl_wheel; + if(bs>1224) + bs = 1224; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)) + { +#ifdef BETA + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life); +#else + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f); +#endif + } + else + { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } + mx = x; + my = y; + if(update_flag) + { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) + { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } + + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) + { + tmp = malloc(64); +#ifdef BETA + if(is_beta) + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } + else + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } +#else + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); +#endif + if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) + { + free(tmp); + tmp = download_ui(vid_buf, my_uri, &i); + if(tmp) + { + save_presets(1); + if(update_start(tmp, i)) + { + update_cleanup(); + save_presets(0); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + return 0; + } + } + else + free(tmp); + } + if(y>=sdl_scale*(YRES+(MENUSIZE-20))) + { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) + { + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) + { + db = svf_own ? 257 : 256; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) + { + db = 270; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) + { + db = 266; + if(da < 51) + da ++; + } + else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) + { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) + { + db = svf_login ? 261 : 260; + if(svf_admin) + { + db = 268; + } + else if(svf_mod) + { + db = 271; + } + if(da < 51) + da ++; + } + else if(x>=sdl_scale && x<=17*sdl_scale) + { + db = 262; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) + { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) + { + db = 267; + if(da < 51) + da ++; + } + else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) + { + db = 265; + if(da < 51) + da ++; + } + else if(da > 0) + da --; + } + else if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) + { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) + { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } + else if(bq==4 && !b) + { + free(load_data); + free(load_img); + load_mode = 0; + } + } + else if(save_mode==1) + { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1) + { + save_mode = 2; + } + else if(b==4) + { + save_mode = 0; + copy_mode = 0; + } + } + else if(save_mode==2) + { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) + { + if(copy_mode==1) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + } + else if(copy_mode==2) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + } + else + { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } + } + else if(sdl_zoom_trig && zoom_en<2) + { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) + { + if(!lb) + { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Up")) + { + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Down")) + { + svf_myvote = -1; + } + } + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) + tag_list_ui(vid_buf); + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) + { + legacy_enable = !legacy_enable; + } + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) + { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) + { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) + { + if(!svf_open || !svf_own || x>51) + { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } + else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) + { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open && !bq) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) + { + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 7); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+6) % 7); + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } + else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) + { + c = sl = cr&0xFF; + } + else + { + //Something + } + } + lx = x; + ly = y; + lb = 0; + lm = 0; + } + else + { + //Copy state before drawing any particles (for undo)7 + int cbx, cby, cbi; + + for(cbi=0; cbi=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } + else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) + { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) + { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + { + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + mousex = mx/sdl_scale; + mousey = my/sdl_scale; + } + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) + { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) + { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) + { + it--; + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) + { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta) + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } + else + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + + if(hud_enable) + { + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) + { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) + { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); + //printf("%s\n", uitext); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } + if(sdl_zoom_trig||zoom_en) + { + if(zoom_x0 || sr == PT_NEUT || sr == PT_PHOT) + player[2] = sr; + else + player[2] = PT_DUST; + } + + } + + http_done(); + return 0; +} + diff --git a/src/md5.c b/src/md5.c new file mode 100644 index 000000000..a51f4fea4 --- /dev/null +++ b/src/md5.c @@ -0,0 +1,231 @@ +// based on public-domain code from Colin Plumb (1993) +#include +#include + +static unsigned getu32(const unsigned char *addr) +{ + return (((((unsigned long)addr[3] << 8) | addr[2]) << 8) | addr[1]) << 8 | addr[0]; +} + +static void putu32(unsigned data, unsigned char *addr) +{ + addr[0] = (unsigned char)data; + addr[1] = (unsigned char)(data >> 8); + addr[2] = (unsigned char)(data >> 16); + addr[3] = (unsigned char)(data >> 24); +} + +void md5_init(struct md5_context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +void md5_update(struct md5_context *ctx, unsigned char const *buf, unsigned len) +{ + unsigned t; + + // update bit count + t = ctx->bits[0]; + if((ctx->bits[0] = (t + ((unsigned)len << 3)) & 0xffffffff) < t) + ctx->bits[1]++; // carry + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; + + // use leading data to top up the buffer + + if(t) + { + unsigned char *p = ctx->in + t; + + t = 64-t; + if (len < t) + { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + md5_transform(ctx->buf, ctx->in); + buf += t; + len -= t; + } + + // following 64-byte chunks + + while(len >= 64) + { + memcpy(ctx->in, buf, 64); + md5_transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + // save rest of bytes for later + + memcpy(ctx->in, buf, len); +} + +void md5_final(unsigned char digest[16], struct md5_context *ctx) +{ + unsigned count; + unsigned char *p; + + // #bytes mod64 + count = (ctx->bits[0] >> 3) & 0x3F; + + // first char of padding = 0x80 + p = ctx->in + count; + *p++ = 0x80; + + // calculate # of bytes to pad + count = 64 - 1 - count; + + // Pad out to 56 mod 64 + if(count < 8) + { + // we need to finish a whole block before padding + memset(p, 0, count); + md5_transform(ctx->buf, ctx->in); + memset(ctx->in, 0, 56); + } + else + { + // just pad to 56 bytes + memset(p, 0, count-8); + } + + // append length & final transform + putu32(ctx->bits[0], ctx->in + 56); + putu32(ctx->bits[1], ctx->in + 60); + + md5_transform(ctx->buf, ctx->in); + putu32(ctx->buf[0], digest); + putu32(ctx->buf[1], digest + 4); + putu32(ctx->buf[2], digest + 8); + putu32(ctx->buf[3], digest + 12); + memset(ctx, 0, sizeof(ctx)); +} + +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<>(32-s), w += x ) + +void md5_transform(unsigned buf[4], const unsigned char inraw[64]) +{ + unsigned a, b, c, d; + unsigned in[16]; + int i; + + for (i = 0; i < 16; ++i) + in[i] = getu32 (inraw + 4 * i); + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +static char hex[] = "0123456789abcdef"; +void md5_ascii(char *result, unsigned char const *buf, unsigned len) +{ + struct md5_context md5; + unsigned char hash[16]; + int i; + + if(len==0) + len = strlen((char *)buf); + + md5_init(&md5); + md5_update(&md5, buf, len); + md5_final(hash, &md5); + + for(i=0; i<16; i++) + { + result[i*2] = hex[(hash[i]>>4)&0xF]; + result[i*2+1] = hex[hash[i]&0x0F]; + } + result[32] = 0; +} diff --git a/src/misc.c b/src/misc.c new file mode 100644 index 000000000..7c551e277 --- /dev/null +++ b/src/misc.c @@ -0,0 +1,283 @@ +#include +#include +#include +#include "misc.h" +#include "defines.h" +#include "interface.h" +#include "graphics.h" + +//Signum function +#ifdef WIN32 +_inline int isign(float i) +#else +inline int isign(float i) +#endif +{ + if (i<0) + return -1; + if (i>0) + return 1; + return 0; +} + +#ifdef WIN32 +_inline unsigned clamp_flt(float f, float min, float max) +#else +inline unsigned clamp_flt(float f, float min, float max) +#endif +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +#ifdef WIN32 +_inline float restrict_flt(float f, float min, float max) +#else +inline float restrict_flt(float f, float min, float max) +#endif +{ + if(fmax) + return max; + return f; +} + +char *mystrdup(char *s) +{ + char *x; + if(s) + { + x = (char*)malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} + +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list; item; item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} + +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) + { + item = *list; + *list = (*list)->next; + free(item); + } +} + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy_string); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) + { + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) + { + if(fseek(f, -3, SEEK_END)) + { + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3) + { + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + cmode = tmp%7; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy_string, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) + { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; +} + +void strcaturl(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) + { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else + { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +void strappend(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) + { + *(d++) = *s; + } + *d = 0; +} + +void *file_load(char *fn, int *size) +{ + FILE *f = fopen(fn, "rb"); + void *s; + + if(!f) + return NULL; + fseek(f, 0, SEEK_END); + *size = ftell(f); + fseek(f, 0, SEEK_SET); + s = malloc(*size); + if(!s) + { + fclose(f); + return NULL; + } + fread(s, *size, 1, f); + fclose(f); + return s; +} + +int cpu_check(void) +{ +#ifdef MACOSX + return 0; +#else +#ifdef X86 + unsigned af,bf,cf,df; + x86_cpuid(0, af, bf, cf, df); + if(bf==0x68747541 && cf==0x444D4163 && df==0x69746E65) + amd = 1; + x86_cpuid(1, af, bf, cf, df); +#ifdef X86_SSE + if(!(df&(1<<25))) + return 1; +#endif +#ifdef X86_SSE2 + if(!(df&(1<<26))) + return 1; +#endif +#ifdef X86_SSE3 + if(!(cf&1)) + return 1; +#endif +#endif +#endif + return 0; +} \ No newline at end of file diff --git a/src/powder.c b/src/powder.c new file mode 100644 index 000000000..588055489 --- /dev/null +++ b/src/powder.c @@ -0,0 +1,3199 @@ +#include +#include +#include +#include +#include +#include + +int isplayer = 0; +float player[27]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index, [19]-[26] are accelerations + +particle *parts; +particle *cb_parts; + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; + +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +int pfree; + +unsigned pmap[YRES][XRES]; +unsigned cb_pmap[YRES][XRES]; + +int try_move(int i, int x, int y, int nx, int ny) +{ + unsigned r; + + + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||(r&0xFF)==PT_PCLN||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + { + return 1; + } + + if((r&0xFF)==PT_VOID) + { + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL) + { + parts[i].type=PT_NONE; + if(!legacy_enable) + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } + return 0; + } + + if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide + { + return 1; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) + { + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) + { + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + { + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + + if(t==SPC_HEAT||t==SPC_COOL) + { + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) + { + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } + else + { + return -1; + } + } + if(t==SPC_AIR) + { + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) + { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } + else + i = p; + + if(t==PT_GLAS) + { + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + } + if(t!=PT_STKM) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + parts[i].tmp = 0; + } + if(t==PT_ACID) + { + parts[i].life = 75; + } + /*Testing + if(t==PT_WOOD){ + parts[i].life = 150; + } + End Testing*/ + if(t==PT_FUSE) { + parts[i].life = 50; + parts[i].tmp = 50; + } + if(t==PT_FSEP) + parts[i].life = 50; + if(t==PT_COAL) + parts[i].life = 110; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_HFLM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NBLE) + parts[i].life = 0; + if(t==PT_ICEI) + parts[i].ctype = PT_WATR; + if(t==PT_NEUT) + { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) + { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f) + { + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } + else + { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //}/ + } + + if(t!=PT_STKM) + pmap[y][x] = t|(i<<8); + else + { + if(isplayer==0) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = PT_STKM; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 100; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + + + + player[3] = x-1; //Setting legs positions + player[4] = y+6; + player[5] = x-1; + player[6] = y+6; + + player[7] = x-3; + player[8] = y+12; + player[9] = x-3; + player[10] = y+12; + + player[11] = x+1; + player[12] = y+6; + player[13] = x+1; + player[14] = y+6; + + player[15] = x+3; + player[16] = y+12; + player[17] = x+3; + player[18] = y+12; + + isplayer = 1; + } + } + + return i; +} + +#ifdef WIN32 +_inline void delete_part(int x, int y) +#else +inline void delete_part(int x, int y) +#endif +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +#ifdef WIN32 +_inline int is_wire(int x, int y) +#else +inline int is_wire(int x, int y) +#endif +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} + +#ifdef WIN32 +_inline int is_wire_off(int x, int y) +#else +inline int is_wire_off(int x, int y) +#endif +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) + { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) + { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y>8) < NPART && (pmr>>8) >= 1) + { + return parts[pmr>>8].type; + } + else + { + return PT_NONE; + } +} + +int nearest_part(int ci, int t) +{ + int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); + int ndistance = 0; + int id = -1; + int i = 0; + int cx = (int)parts[ci].x; + int cy = (int)parts[ci].y; + for(i=0; i=XRES || y>=YRES || + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GAS||t==PT_NBLE) + { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) + { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_GOO && !parts[i].life) + { + if(pv[y/CELL][x/CELL]>1.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } + else + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + + if(ptypes[t].diffusion) + { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) + { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } + else + { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) + { + mv -= ISTP; + if(mv <= 0.0f) + { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) + { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_OIL && pv[y/CELL][x/CELL]<-6.0f) + t = parts[i].type = PT_GAS; + if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_OIL; + if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) + t = parts[i].type = PT_FIRE; + } + if(t==PT_GAS && pv[y/CELL][x/CELL]<-6.0f) + t = parts[i].type = PT_OIL; + if(t==PT_DESL && pv[y/CELL][x/CELL]>5.0f) // Only way I know to make it + t = parts[i].type = PT_FIRE; // combust under pressure. + if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_OIL; + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + if(t==PT_BRCK && pv[y/CELL][x/CELL]>2.8f) + t = parts[i].type = PT_STNE; + //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + // t = parts[i].type = PT_BGLA; + if(t==PT_GLAS) + { + parts[i].pavg[0] = parts[i].pavg[1]; + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) + { + parts[i].type = PT_BGLA; + } + } + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) + { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) + { + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1) + { + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + + if(!legacy_enable) + { + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(t==PT_ICEI && !parts[i].ctype) + parts[i].ctype = PT_WATR; + if(ptypes[t].hconduct>(rand()%250)&&!(parts[i].type==PT_HSWC&&parts[i].life!=10)) + { + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)) + { + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)) + { + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) + { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE||t==PT_PLSM) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) + { + if(t==PT_LAVA&&parts[i].ctype) + { + parts[i].life = 0; + if(parts[i].ctype==PT_THRM) + { + parts[i].tmp = 0; + parts[i].ctype = PT_BMTL; + } + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) + { + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } + else + { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } + else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) + { + if(pstates[t].liquid==PT_LAVA) + { + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } + else if(t==PT_ICEI&&parts[i].ctype) + { + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else + { + t = parts[i].type = pstates[t].liquid; + } + } + else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) + { + t = parts[i].type = pstates[t].liquid; + } + else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) + { + if(t==PT_SLTW&&1>rand()%6) + { + t = parts[i].type = PT_SALT; + } + else + { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_HFLM) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) + { + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA) + { + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + if(parts[i].ctype==PT_THRM&&parts[i].tmp>0) + { + parts[i].tmp--; + parts[i].temp = 3500; + } + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_PTCT&&parts[i].temp>295.0f) + { + pt = parts[i].temp -= 2.5f; + } + if(t==PT_NTCT&&parts[i].temp>295.0f) + { + pt = parts[i].temp -= 2.5f; + } + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) + { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) + { + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } + else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) + { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)) + { + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } + else + { + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_ICEI || t==PT_SNOW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if(legacy_enable) + { + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } + } + } + else if(t==PT_COAL) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + create_part(-1, x, y, PT_FIRE); + goto killed; + } else if(parts[i].life < 100) { + parts[i].life--; + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); + } + + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) + { + if(parts[i].life>100) { + parts[i].life = 99; + } + } + } + } + else if(t==PT_FUSE) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%100)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + if(pv[y/CELL][x/CELL] > 0.8f) + parts[i].tmp--; + else if(parts[i].tmp<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_FSEP); + goto killed; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) + { + if(parts[i].life>40) { + parts[i].life = 39; + } + } + } + } + else if(t==PT_FSEP) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%10)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) + { + if(parts[i].life>40) { + parts[i].life = 39; + } + } + } + } + else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL && parts_avg(i, r>>8)!=PT_INSL) + { + parts[i].temp = 473.0f; + } + } + } + else if(t==PT_PLNT) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) + { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } + else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_THRM) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM || (r&0xFF)==PT_LAVA)) + { + if(1>(rand()%500)) { + t = parts[i].type = PT_LAVA; + parts[i].ctype = PT_BMTL; + pt = parts[i].temp = 3500.0f; + pv[y/CELL][x/CELL] += 50.0f; + } else { + t = parts[i].type = PT_LAVA; + parts[i].life = 400; + parts[i].ctype = PT_THRM; + pt = parts[i].temp = 3500.0f; + parts[i].tmp = 20; + } + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%250)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_SLTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) + { + parts[r>>8].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_WTRV) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } + + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } + } + } + else if(t==PT_YEST) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_DYST && 1>(rand()%30) && !legacy_enable) + { + t = parts[i].type = PT_DYST; + } + } + } + else if(t==PT_ACID) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID) + { + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) + { + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } + else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) + { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } + else if (parts[i].life==50) + { + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_NEUT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) + { + if(33>rand()%100) + { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } + else + { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_DYST && 15>(rand()%1000)) + parts[r>>8].type = PT_YEST; + if((r&0xFF)==PT_YEST) { + if(15>(rand()%100000)&&isplayer==0) + parts[r>>8].type = PT_STKM; + else + parts[r>>8].type = PT_DYST; + } + + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_GOO; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_DESL; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + if((r&0xFF)==PT_DESL && 15>(rand()%1000)) + parts[r>>8].type = PT_GAS; + if((r&0xFF)==PT_COAL && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && + (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| + ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| + ptypes[parts[r>>8].type-1].menusection==SC_GAS|| + ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) + parts[r>>8].type--;*/ + } + } + else if(t==PT_PHOT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + } + } + else if(t==PT_LCRY) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_LCRY) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_PCLN) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_PCLN) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_HSWC) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_HSWC) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_AMTR) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if((r&0xFF)!=PT_AMTR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_NONE && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_BHOL) + { + t = parts[i].life++; + if(parts[i].life==3) + { + parts[i].type = PT_NONE; + kill_part(i); + } + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + kill_part(r>>8); + if(2>(rand()/(RAND_MAX/100))) + create_part(r>>8, x+nx, y+ny, PT_PHOT); + pv[y/CELL][x/CELL] -= 5.0f; + continue; + } + } + } + else if(t==PT_FIRW) { + if(parts[i].tmp==0) { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR) + { + parts[i].tmp = 1; + parts[i].life = rand()%50+120; + } + } + } + else if(parts[i].tmp==1) { + if(parts[i].life==0) { + parts[i].tmp=2; + } else { + float newVel = parts[i].life/50; + parts[i].flags = parts[i].flags&0xFFFFFFFE; + if((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE) { + parts[i].vy = -newVel; + ly-=newVel; + iy-=newVel; + } + } + } + else if(parts[i].tmp==2) { + for(nx=-2; nx<3; nx++) { + for(ny=-2; ny<3; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type==PT_FIRW) { + parts[r>>8].vx = (rand()%3-1)*tmul; + parts[r>>8].vy = (rand()%3-1)*tmul; + parts[r>>8].tmp = 3; + parts[r>>8].life = rand()%100+100; + parts[r>>8].temp = 6000.0f; + } + } + } + } + pv[y/CELL][x/CELL] += 20; + kill_part(i); + } else if(parts[i].tmp==3) { + if(parts[i].life<=0) { + kill_part(i); + } + } + } + else if(t==PT_BTRY) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts_avg(i,r>>8) != PT_INSL) + { + if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + parts[r>>8].type = PT_SPRK; + } + } + } + } else if(t==PT_SWCH) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + { + parts[r>>8].type = PT_FIRE; + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; + if(legacy_enable) + { + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && + ptypes[rt].meltable*lpv>(rand()%1000)) + { + if(t!=PT_LAVA || parts[i].life>0) + { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } + else + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) + { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = PT_STNE; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) + { + kill_part(r>>8); + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; + parts[i].ctype = PT_NONE; + goto killed; + } + } + } + pavg = parts_avg(i, r>>8); + if(rt==PT_SWCH && t==PT_SPRK) + { + pavg = parts_avg(r>>8, i); + if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) + parts[r>>8].life = 10; + if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) + parts[r>>8].life = 9; + if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].ctype = PT_SWCH; + parts[r>>8].life = 4; + } + } + pavg = parts_avg(i, r>>8); + if(pavg != PT_INSL) + { + if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=373.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=373.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + if(parts[r>>8].temp+10.0f<673.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; + } + } + if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>373.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<373.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) + { + if(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) + { + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { + parts[i].life = rand()%150+50; + parts[i].type = PT_PLSM; + parts[i].ctype = PT_NBLE; + parts[i].temp = 3500; + pv[y/CELL][x/CELL] += 1; + } + if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) + { + parts[i].type = PT_SWCH; + parts[i].life = 11; + } + } + } +killed: + if(parts[i].type == PT_NONE) + continue; + } + if(t==PT_STKM) + { + float dt = 0.9;///(FPSB*FPSB); //Delta time in square + //Tempirature handling + if(parts[i].temp<243) + parts[i].life -= 1; + if((parts[i].temp<309.6f) && (parts[i].temp>=243)) + parts[i].temp += 1; + + //Death + if(parts[i].life<1 || death == 1 || (pv[y/CELL][x/CELL]>=4.5f && player[2] != SPC_AIR) ) //If his HP is less that 0 or there is very big wind... + { + death = 0; + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } + + parts[i].vy += -0.7*dt; //Head up! + + //Verlet integration + pp = 2*player[3]-player[5]+player[19]*dt*dt;; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]+player[20]*dt*dt;; + player[6] = player[4]; + player[4] = pp; + + pp = 2*player[7]-player[9]+player[21]*dt*dt;; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+(player[22]+1)*dt*dt;; + player[10] = player[8]; + player[8] = pp; + + pp = 2*player[11]-player[13]+player[23]*dt*dt;; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]+player[24]*dt*dt;; + player[14] = player[12]; + player[12] = pp; + + pp = 2*player[15]-player[17]+player[25]*dt*dt;; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+(player[26]+1)*dt*dt;; + player[18] = player[16]; + player[16] = pp; + + //Setting acceleration to 0 + player[19] = 0; + player[20] = 0; + + player[21] = 0; + player[22] = 0; + + player[23] = 0; + player[24] = 0; + + player[25] = 0; + player[26] = 0; + + //Go left + if (((int)(player[0])&0x01) == 0x01 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[21] = -3; + player[22] = -2; + player[19] = -2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[25] = -3; + player[26] = -2; + player[23] = -2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[21] = -1; + player[22] = -1; + player[19] = -1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[25] = -1; + player[26] = -1; + player[23] = -1; + } + } + } + + //Go right + if (((int)(player[0])&0x02) == 0x02 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[21] = 3; + player[22] = -2; + player[19] = 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[25] = 3; + player[26] = -2; + player[23] = 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[21] = 1; + player[22] = -1; + player[19] = 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[25] = 1; + player[26] = -1; + player[23] = 1; + } + + } + } + + //Jump + if (((int)(player[0])&0x04) == 0x04 && (pstates[pmap[(int)(player[8]-0.5)][(int)(player[7])]&0xFF].state != ST_GAS || pstates[pmap[(int)(player[16]-0.5)][(int)(player[15])]&0xFF].state != ST_GAS)) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[22] -= 1; + player[26] -= 1; + } + } + + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if(ptypes[pmap[ny+y][nx+x]&0xFF].falldown!=0 || (pmap[ny+y][nx+x]&0xFF) == PT_NEUT || (pmap[ny+y][nx+x]&0xFF) == PT_PHOT) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } + + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + if(bmap[(ny+y)/CELL][(nx+x)/CELL]==4) + player[2] = SPC_AIR; + } + + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); + + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + if(player[2] == SPC_AIR) + create_parts(nx + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01), ny, 4, SPC_AIR); + else + create_part(-1, nx, ny, player[2]); + + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2] != PT_PHOT && player[2] != SPC_AIR) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = 0; + parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } + + } + } + } + + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; + + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; + + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; + + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; + + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + r = pmap[(int)(player[16]-2)][(int)(player[15]+nx)]; + if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) + player[15] -= nx; + + r = pmap[(int)(player[8]-2)][(int)(player[7]+nx)]; + if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) + player[7] -= nx; + } + + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || (r&0xFF) == PT_LNTG) //Liquid checks //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1*dt; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5*dt; + } + else + { + if(pstates[r&0xFF].state != ST_GAS) + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy*dt; + } + } + player[9] = player[7]; + } + + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || (r&0xFF) == PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1*dt; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5*dt; + } + else + { + if(pstates[r&0xFF].state != ST_GAS) + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy*dt; + } + } + player[17] = player[15]; + } + + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= (10+ny)*dt; + parts[i].vy = -10*dt; + } + + } + + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[21] -= 0.2; + player[25] += 0.2; + } + + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[19] -= 0.2; + player[23] += 0.2; + } + + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=323 || parts[r>>8].temp<=243) + { + parts[i].life -= 2; + player[26] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=323 || parts[r>>8].temp<=243) + { + parts[i].life -= 2; + player[22] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } + if(t==PT_CLNE) + { + if(!parts[i].ctype) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx=0 && y+ny>0 && + x+nx303&&parts[i].temp<317) { + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); + } + } + if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) + { + parts[i].type = PT_NBLE; + parts[i].life = 0; + } + if (t==PT_FIRE && parts[i].life <=1 && parts[i].temp<625) + { + t = parts[i].type = PT_SMKE; + parts[i].life = rand()%20+250; + } + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) + { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) + { + if(nx!=x && try_move(i, x, y, nx, y)) + { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x, ny)) + { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else + { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) + { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x-r, ny)) + { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y+r)) + { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y-r)) + { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) + { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) + { + kill_part(i); + continue; + } + else if(try_move(i, x, y, 2*x-nx, ny)) + { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } + else if(try_move(i, x, y, nx, 2*y-ny)) + { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } + else + { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + if(nx=XRES-CELL || ny=YRES-CELL) + { + kill_part(i); + continue; + } + } + if(framerender) { + framerender = 0; + sys_pause = 1; + } +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + isplayer = 0; //Needed for player spawning + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && (!sys_pause||framerender)) + emap[y][x] --; + } + } + } + else + { + for(y=0; y>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && (!sys_pause||framerender)) + emap[y][x] --; + } + } + } + + update_particles_i(vid, 0, 1); + + for(y=0; y=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} + +void clear_area(int area_x, int area_y, int area_w, int area_h) +{ + int cx = 0; + int cy = 0; + for(cy=0; cyx2) + { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) + { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) + { + c = c-100; + } + if(cm==-1) + { + if(c==0) + { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } + else + cm = 0; + } + if(bm==-1) + { + if(c==30) + { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } + else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) + { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(y=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) + { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } +} diff --git a/src/update.c b/src/update.c new file mode 100644 index 000000000..99b9d1bc2 --- /dev/null +++ b/src/update.c @@ -0,0 +1,201 @@ +/** + * Powder Toy - Update Helper + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * 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 02111-1301 USA + */ + +#include +#ifndef MACOSX +#include +#endif +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif +#ifdef MACOSX +#include +#include +#include +#endif + +#include + +static char *exe_name(void) +{ +#if defined WIN32 + char *name= (char *)malloc(64), max=64, res; + while((res = (char)GetModuleFileName(NULL, name, max)) >= max) + { +#elif defined MACOSX + char *fn=malloc(64),*name=malloc(PATH_MAX), max=64, res; + if(_NSGetExecutablePath(fn, &max) != 0) + { + fn = realloc(fn, max); + _NSGetExecutablePath(fn, &max); + } + if(realpath(fn, name) == NULL) + { + free(fn); + free(name); + return NULL; + } + res = 1; +#else + char fn[64], *name=malloc(64), max=64, res; + sprintf(fn, "/proc/self/exe"); + memset(name, 0, max); + while((res = readlink(fn, name, max)) >= max-1) + { +#endif +#ifndef MACOSX + max *= 2; + name = realloc(name, max); + memset(name, 0, max); + } +#endif + if(res <= 0) + { + free(name); + return NULL; + } + return name; +} + +int update_start(char *data, int len) +{ + char *self=exe_name(), *temp; +#ifdef WIN32 + char *p; +#endif + FILE *f; + int res = 1; + + if(!self) + return 1; + +#ifdef WIN32 + temp = malloc(strlen(self)+12); + strcpy(temp, self); + p = temp + strlen(temp) - 4; + if(_stricmp(p, ".exe")) + p += 4; + strcpy(p, "_update.exe"); + + if(!MoveFile(self, temp)) + goto fail; + + f = fopen(self, "wb"); + if(!f) + goto fail; + if(fwrite(data, 1, len, f) != len) + { + fclose(f); + DeleteFile(self); + goto fail; + } + fclose(f); + + if((int)ShellExecute(NULL, "open", self, NULL, NULL, SW_SHOWNORMAL) <= 32) + { + DeleteFile(self); + goto fail; + } + + return 0; +#else + temp = malloc(strlen(self)+8); + strcpy(temp, self); + strcat(temp, "-update"); + + f = fopen(temp, "w"); + if(!f) + goto fail; + if(fwrite(data, 1, len, f) != len) + { + fclose(f); + unlink(temp); + goto fail; + } + fclose(f); + + if(chmod(temp, 0755)) + { + unlink(temp); + goto fail; + } + + if(rename(temp, self)) + { + unlink(temp); + goto fail; + } + + execl(self, "powder-update", NULL); +#endif + +fail: + free(temp); + free(self); + return res; +} + +int update_finish(void) +{ +#ifdef WIN32 + char *temp, *self=exe_name(), *p; + int timeout = 60, err; + + temp = malloc(strlen(self)+12); + strcpy(temp, self); + p = temp + strlen(temp) - 4; + if(_stricmp(p, ".exe")) + p += 4; + strcpy(p, "_update.exe"); + + while(!DeleteFile(temp)) + { + err = GetLastError(); + if(err == ERROR_FILE_NOT_FOUND) + { + // just as well, then + free(temp); + return 0; + } + Sleep(500); + timeout--; + if(timeout <= 0) + { + free(temp); + return 1; + } + } + free(temp); +#endif + return 0; +} + +void update_cleanup(void) +{ +#ifdef WIN32 + update_finish(); +#endif +} From 99e2782ebc8445b9ff5e63c641ab4752896962d5 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 27 Sep 2010 12:54:56 +0200 Subject: [PATCH 173/237] Try to automerge with this, haha --- air.c | 141 --- air.h | 21 - defines.h | 118 -- font.h | 32 - graphics.c | 2567 ----------------------------------------- graphics.h | 144 --- hmap.h | 33 - http.h | 43 - icon.h | 22 - interface.c | 2961 ----------------------------------------------- interface.h | 183 --- main.c | 2096 --------------------------------- md5.c | 231 ---- md5.h | 18 - misc.c | 283 ----- misc.h | 72 -- powder.c | 3199 --------------------------------------------------- powder.h | 512 --------- update.c | 201 ---- update.h | 27 - version.h | 25 - 21 files changed, 12929 deletions(-) delete mode 100644 air.c delete mode 100644 air.h delete mode 100644 defines.h delete mode 100644 font.h delete mode 100644 graphics.c delete mode 100644 graphics.h delete mode 100755 hmap.h delete mode 100755 http.h delete mode 100755 icon.h delete mode 100644 interface.c delete mode 100644 interface.h delete mode 100755 main.c delete mode 100644 md5.c delete mode 100644 md5.h delete mode 100644 misc.c delete mode 100644 misc.h delete mode 100644 powder.c delete mode 100644 powder.h delete mode 100644 update.c delete mode 100755 update.h delete mode 100755 version.h diff --git a/air.c b/air.c deleted file mode 100644 index 55108d683..000000000 --- a/air.c +++ /dev/null @@ -1,141 +0,0 @@ -#include -#include "air.h" -#include "powder.h" -#include "defines.h" -float kernel[9]; - -float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; - -float cb_vx[YRES/CELL][XRES/CELL], cb_ovx[YRES/CELL][XRES/CELL]; -float cb_vy[YRES/CELL][XRES/CELL], cb_ovy[YRES/CELL][XRES/CELL]; -float cb_pv[YRES/CELL][XRES/CELL], cb_opv[YRES/CELL][XRES/CELL]; - -float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; - -void make_kernel(void) -{ - int i, j; - float s = 0.0f; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - { - kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); - s += kernel[(i+1)+3*(j+1)]; - } - s = 1.0f / s; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - kernel[(i+1)+3*(j+1)] *= s; -} -void update_air(void) -{ - int x, y, i, j; - float dp, dx, dy, f, tx, ty; - - for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; - if(dp < -256.0f) dp = -256.0f; - if(dx > 256.0f) dx = 256.0f; - if(dx < -256.0f) dx = -256.0f; - if(dy > 256.0f) dy = 256.0f; - if(dy < -256.0f) dy = -256.0f; - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); -} \ No newline at end of file diff --git a/air.h b/air.h deleted file mode 100644 index d9e04f631..000000000 --- a/air.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef AIR_H -#define AIR_H -#include "defines.h" - -extern float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -extern float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -extern float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; - -extern float cb_vx[YRES/CELL][XRES/CELL], cb_ovx[YRES/CELL][XRES/CELL]; -extern float cb_vy[YRES/CELL][XRES/CELL], cb_ovy[YRES/CELL][XRES/CELL]; -extern float cb_pv[YRES/CELL][XRES/CELL], cb_opv[YRES/CELL][XRES/CELL]; - -extern float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; - -extern float kernel[9]; - -void make_kernel(void); - -void update_air(void); - -#endif \ No newline at end of file diff --git a/defines.h b/defines.h deleted file mode 100644 index a324e9f54..000000000 --- a/defines.h +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef DEFINE_H -#define DEFINE_H - -#ifdef WIN32 -#define PATH_SEP "\\" -#else -#define PATH_SEP "/" -#endif - -#define SAVE_VERSION 43 -#define MINOR_VERSION 0 -#define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. -#define BETA - -#define SERVER "powdertoy.co.uk" - -#undef PLOSS - -#define THUMB_CACHE_SIZE 256 - -#define IMGCONNS 3 -#define TIMEOUT 100 -#define HTTP_TIMEOUT 10 - -#define MENUSIZE 40 -#define BARSIZE 14 -#define XRES 612 -#define YRES 384 -#define NPART XRES*YRES - -#define MAXSIGNS 16 -#define TAG_MAX 256 - -#define ZSIZE_D 16 -#define ZFACTOR_D 8 -extern unsigned char ZFACTOR; -extern unsigned char ZSIZE; - -#define CELL 4 -#define ISTP (CELL/2) -#define CFDS (4.0f/CELL) - -#define TSTEPP 0.3f -#define TSTEPV 0.4f -#define VADV 0.3f -#define VLOSS 0.999f -#define PLOSS 0.9999f - -#define GRID_X 5 -#define GRID_Y 4 -#define GRID_P 3 -#define GRID_S 6 -#define GRID_Z 3 - -#define STAMP_X 4 -#define STAMP_Y 4 -#define STAMP_MAX 120 - -#ifdef PIX16 -typedef unsigned short pixel; -#else -typedef unsigned int pixel; -#endif - -typedef unsigned char uint8; - -extern int amd; - -extern int FPSB; - -extern int legacy_enable; - -extern int sys_pause; -extern int framerender; - -extern int mousex, mousey; -extern int death; - -struct sign -{ - int x,y,ju; - char text[256]; -}; -typedef struct sign sign; - -struct stamp -{ - char name[11]; - pixel *thumb; - int thumb_w, thumb_h, dodelete; -}; -typedef struct stamp stamp; - -extern sign signs[MAXSIGNS]; -extern stamp stamps[STAMP_MAX]; -extern int stamp_count; -extern int itc; -extern char itc_msg[64]; - -extern int do_open; -extern int sys_pause; -extern int legacy_enable; //Used to disable new features such as heat, will be set by commandline or save. -extern int death, framerender; - -extern unsigned char last_major, last_minor, update_flag; - -extern char http_proxy_string[256]; - -//Functions in main.c -void thumb_cache_inval(char *id); -void thumb_cache_add(char *id, void *thumb, int size); -int thumb_cache_find(char *id, void **thumb, int *size); -void *build_thumb(int *size, int bzip2); -void *build_save(int *size, int x0, int y0, int w, int h); -int parse_save(void *save, int size, int replace, int x0, int y0); -void del_stamp(int d); -void sdl_seticon(void); -#endif \ No newline at end of file diff --git a/font.h b/font.h deleted file mode 100644 index f8f9a58c5..000000000 --- a/font.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Powder Toy - Font Data - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw. - * - * 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 02111-1301 USA - */ -#ifndef FONT_H_CHECK -#define FONT_H_CHECK -#define FONT_H 10 -static char font_data[] = -{ - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xcc, 0x00, 0x00, 0x0a, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xff, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x80, 0xff, 0x2f, 0xfc, 0xff, 0xc3, 0x07, 0x3d, 0x3c, 0xc0, 0xc3, 0x03, 0x3c, 0x7c, 0xd0, 0xc3, 0xff, 0x3f, 0xf8, 0xff, 0x02, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, -}; -static short font_ptrs[] = -{ - 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, -}; -#endif \ No newline at end of file diff --git a/graphics.c b/graphics.c deleted file mode 100644 index aafe8973d..000000000 --- a/graphics.c +++ /dev/null @@ -1,2567 +0,0 @@ -#include -#include -#include - -#ifdef OpenGL -#ifdef MACOSX -#include -#include -#else -#include -#include -#endif -#endif - -#include "defines.h" -#include "air.h" -#include "powder.h" -#include "graphics.h" -#include "font.h" -#include "misc.h" - - -unsigned cmode = 3; -SDL_Surface *sdl_scrn; -int sdl_scale = 1; - -unsigned char fire_r[YRES/CELL][XRES/CELL]; -unsigned char fire_g[YRES/CELL][XRES/CELL]; -unsigned char fire_b[YRES/CELL][XRES/CELL]; - -unsigned int fire_alpha[CELL*3][CELL*3]; -pixel *fire_bg; - -pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) -{ - int i,j,x,y,w,h,r,g,b,c; - pixel p, *q; - w = (sw+f-1)/f; - h = (sh+f-1)/f; - q = malloc(w*h*PIXELSIZE); - for(y=0; y1) - { - r = (r+c/2)/c; - g = (g+c/2)/c; - b = (b+c/2)/c; - } - q[y*w+x] = PIXRGB(r, g, b); - } - *qw = w; - *qh = h; - return q; -} - -void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} - -void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - int i,k; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - } - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} - -void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) -{ -#ifdef OpenGL - RenderScene(); -#else - if(sdl_scale == 2) - sdl_blit_2(x, y, w, h, src, pitch); - else - sdl_blit_1(x, y, w, h, src, pitch); -#endif -} - -void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) -{ - blendpixel(vid, x+1, y, cr, cg, cb, 112); - blendpixel(vid, x-1, y, cr, cg, cb, 112); - blendpixel(vid, x, y+1, cr, cg, cb, 112); - blendpixel(vid, x, y-1, cr, cg, cb, 112); - - blendpixel(vid, x+1, y-1, cr, cg, cb, 64); - blendpixel(vid, x-1, y-1, cr, cg, cb, 64); - blendpixel(vid, x+1, y+1, cr, cg, cb, 64); - blendpixel(vid, x-1, y+1, cr, cg, cb, 64); -} - -void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) -{ - int x, y, i, j, c; - int bo = b; - if(iswall==1) - { - b = b-100; - x = (2+32*((b-22)/1)); - y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - x = 2+32*(b/2); - y = YRES+2+20*(b%2); - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - if(bo==sl || bo==sr) - { - c = 0; - if(bo==sl) - c |= PIXPACK(0xFF0000); - if(bo==sr) - c |= PIXPACK(0x0000FF); - for(i=0; i<30; i++) - { - vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; - } - for(j=0; j<18; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; - } - } -} - -int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) -{ - int i, j, c; - if(b>=121) - { - b = b-100; - //x = (2+32*((b-22)/1)); - //y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - case 40: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - //x = 2+32*(b/2); - //y = YRES+2+20*(b%2); -#ifdef OpenGL - fillrect(vid_buf, x, y, 28, 16, PIXR(pc), PIXG(pc), PIXB(pc), 255); -#else - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } -#endif - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - return 26; -} - -void draw_menu(pixel *vid_buf, int i, int hover) -{ - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - if(hover==i) - { - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); - } -} - -#ifdef WIN32 -_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#else -inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#endif -{ - pixel t; - if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -#ifdef WIN32 -_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) -#else -inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) -#endif -{ - int i, j, w, bn = 0, ba = 0; - char *rp = font_data + font_ptrs[c]; - w = *(rp++); - for(j=0; j>= 2; - bn -= 2; - } - return x + w; -} - -int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a) -{ -#ifdef OpenGL -#else - int sx = x; - for(; *s; s++) - { - if(*s == '\n') - { - x = sx; - y += FONT_H+2; - } - else if(*s == '\b') - { - switch(s[1]) - { - case 'w': - r = g = b = 255; - break; - case 'g': - r = g = b = 192; - break; - case 'o': - r = 255; - g = 216; - b = 32; - break; - case 'r': - r = 255; - g = b = 0; - break; - case 'b': - r = g = 0; - b = 255; - break; - } - s++; - } - else - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } -#endif - return x; -} - -void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) -{ -#ifdef OpenGL - glBegin(GL_LINE_LOOP); - glColor4ub(r, g, b, a); - glVertex2i(x, y); - glVertex2i(x+w, y); - glVertex2i(x+w, y+h); - glVertex2i(x, y+h); - glEnd(); -#else - int i; - for(i=0; i<=w; i++) - { - drawpixel(vid, x+i, y, r, g, b, a); - drawpixel(vid, x+i, y+h, r, g, b, a); - } - for(i=1; i=w && x+textwidth(s)>=w+5) - break; - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - if(*s) - for(i=0; i<3; i++) - x = drawchar(vid, x, y, '.', r, g, b, a); - return x; -} - -int textnwidth(char *s, int n) -{ - int x = 0; - for(; *s; s++) - { - if(!n) - break; - x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - n--; - } - return x-1; -} - -int textwidthx(char *s, int w) -{ - int x=0,n=0,cw; - for(; *s; s++) - { - cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - if(x+(cw/2) >= w) - break; - x += cw; - n++; - } - return n; -} - -#ifdef WIN32 -_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#else -inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#endif -{ -#ifdef OpenGL - if(x<0 || y<0 || x>=XRES || r>=YRES) - return; - if(a!=255) - { - glBegin (GL_QUADS); - glColor4ub(r,g,b,a); - glVertex2i(x, y); - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -#else - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -#endif //OpenGL -} - -void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) -{ - char t[2]; - t[0] = ch; - t[1] = 0; - if(flag) - { - fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); - } - else - { - drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); - } -} - -void draw_air(pixel *vid) -{ - int x, y, i, j; - pixel c; - - if(cmode == 2) - return; - - for(y=0; y 0.0f) - c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); - else - c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); - } - else - c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), - clamp_flt(pv[y][x], 0.0f, 8.0f), - clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); - for(j=0; jdx) - { - dx = dx+dy; - dy = dx-dy; - dx = dx-dy; - check = 1; - } - - e = (dy<<2)-dx; - for (i=0; i<=dx; i++) - { - vid[x+y*a] =PIXRGB(r, g, b); - if (e>=0) - { - if (check==1) - x = x+sx; - else - y = y+sy; - e = e-(dx<<2); - } - if (check==1) - y = y+sy; - else - x = x+sx; - e = e+(dy<<2); - } -} - -void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + 255*PIXR(t)) >> 8; - g = (a*g + 255*PIXG(t)) >> 8; - b = (a*b + 255*PIXB(t)) >> 8; - if(r>255) - r = 255; - if(g>255) - g = 255; - if(b>255) - b = 255; - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -void xor_pixel(int x, int y, pixel *vid) -{ - int c; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - c = vid[y*(XRES+BARSIZE)+x]; - c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); - if(c<512) - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); - else - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); -} - -void xor_line(int x1, int y1, int x2, int y2, pixel *vid) -{ - int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - e -= 1.0f; - } - } -} - -void xor_rect(pixel *vid, int x, int y, int w, int h) -{ - int i; - for(i=0; i(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; - vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; - vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; - vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; - } - draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); - draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); - draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); - draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); - - isplayer = 1; //It's a secret. Tssss... - } - if(t==PT_MWAX&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,224,170,255); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,224,170,20); - else - blendpixel(vid,x+nx,y+ny,224,224,170,40); - } - } - - } - else if(t==PT_ACID) - { - if(parts[i].life>255) parts[i].life = 255; - if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28)); - if(s==0) s = 1; - cr = PIXR(ptypes[t].pcolors)/s; - cg = PIXG(ptypes[t].pcolors)/s; - cb = PIXB(ptypes[t].pcolors)/s; - if(cmode==6) { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); - } - } - } else { - blendpixel(vid, nx, ny, cr, cg, cb, 255); - } - - if(cmode==4) - { - blendpixel(vid, nx+1, ny, cr, cg, cb, 223); - blendpixel(vid, nx-1, ny, cr, cg, cb, 223); - blendpixel(vid, nx, ny+1, cr, cg, cb, 223); - blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); - } - } - else if(t==PT_OIL&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,64,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,64,16,40); - } - } - } - else if(t==PT_NEUT) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 8; - cb = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = 0x20; - cg = 0xE0; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLUT&&cmode == 6) - { - int tempx; - int tempy; - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(tempx = 2; tempx < 10; tempx++) { - for(tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_URAN&&cmode == 6) - { - int tempx; - int tempy; - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(tempx = 2; tempx < 10; tempx++) { - for(tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_SLTW&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,80,240,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,80,240,50); - } - } - } - else if(t==PT_PHOT) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_SWCH && parts[i].life == 10) - { - x = nx; - y = ny; - blendpixel(vid,x,y,17,217,24,255); - } - else if(t==PT_LNTG&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,128,160,223,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,128,160,223,50); - } - } - } - else if(t==PT_SMKE) - { - if(cmode == 3||cmode==4 || cmode==6) - { - x = nx/CELL; - y = ny/CELL; - cg = 10; - cb = 10; - cr = 10; - cg += fire_g[y][x]; - if(cg > 50) cg = 50; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 50) cb = 50; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 50) cr = 50; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny,100,100,100,30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,100,100,100,10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,100,100,100,20); - } - } - } - } - else if(t==PT_WATR&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - - } else if(t==PT_DSTW&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - } - else if(t==PT_NITR&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,224,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,224,16,50); - } - } - - } - else if(t==PT_LRBD&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,170,170,170,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,170,170,170,50); - } - } - - } - - else if(t==PT_NBLE&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,235,73,23,100); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,235,73,23,30); - else - blendpixel(vid,x+nx,y+ny,235,73,23,50); - } - } - - } - else if(t==PT_GAS&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,255,255,0,180); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,255,255,0,50); - else - blendpixel(vid,x+nx,y+ny,255,255,0,80); - } - } - - } - else if(t==PT_WTRV) - { - if(cmode == 3||cmode==4 || cmode==6) - { - x = nx/CELL; - y = ny/CELL; - cg = PIXG(ptypes[t].pcolors)/3; - cb = PIXB(ptypes[t].pcolors)/3; - cr = PIXR(ptypes[t].pcolors)/3; - cg += fire_g[y][x]; - if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); - } - } - } - } - else if(t==PT_THDR) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 16; - cb = 20; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xA0; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_GLOW) - { - fg = 0; - fb = 0; - fr = 0; - if(pv[ny/CELL][nx/CELL]>0) { - fg = 6 * pv[ny/CELL][nx/CELL]; - fb = 4 * pv[ny/CELL][nx/CELL]; - fr = 2 * pv[ny/CELL][nx/CELL]; - } - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB((int)restrict_flt(0x44 + fr*8, 0, 255), (int)restrict_flt(0x88 + fg*8, 0, 255), (int)restrict_flt(0x44 + fb*8, 0, 255)); - if(cmode == 3||cmode==4 || cmode==6) - { - x = nx/CELL; - y = ny/CELL; - fg += fire_g[y][x]; - if(fg > 255) fg = 255; - fire_g[y][x] = fg; - fb += fire_b[y][x]; - if(fb > 255) fb = 255; - fire_b[y][x] = fb; - fr += fire_r[y][x]; - if(fr > 255) fr = 255; - fire_r[y][x] = fr; - } - if(cmode == 4) { - uint8 R = (int)restrict_flt(0x44 + fr*8, 0, 255); - uint8 G = (int)restrict_flt(0x88 + fg*8, 0, 255); - uint8 B = (int)restrict_flt(0x44 + fb*8, 0, 255); - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - } - else if(t==PT_LCRY) - { - uint8 GR = 0x50+(parts[i].life*10); - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, GR); - if(cmode == 4) { - blendpixel(vid, nx+1, ny, GR, GR, GR, 223); - blendpixel(vid, nx-1, ny, GR, GR, GR, 223); - blendpixel(vid, nx, ny+1, GR, GR, GR, 223); - blendpixel(vid, nx, ny-1, GR, GR, GR, 223); - - blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112); - blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112); - blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112); - blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112); - } - } - else if(t==PT_PCLN) - { - uint8 GR = 0x3B+(parts[i].life*19); - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, 10); - if(cmode == 4) { - blendpixel(vid, nx+1, ny, GR, GR, 10, 223); - blendpixel(vid, nx-1, ny, GR, GR, 10, 223); - blendpixel(vid, nx, ny+1, GR, GR, 10, 223); - blendpixel(vid, nx, ny-1, GR, GR, 10, 223); - - blendpixel(vid, nx+1, ny-1, GR, GR, 10, 112); - blendpixel(vid, nx-1, ny-1, GR, GR, 10, 112); - blendpixel(vid, nx+1, ny+1, GR, GR, 10, 112); - blendpixel(vid, nx-1, ny+1, GR, GR, 10, 112); - } - } - else if(t==PT_HSWC) - { - uint8 GR = 0x3B+(parts[i].life*19); - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, 10, 10); - if(cmode == 4) { - blendpixel(vid, nx+1, ny, GR, 10, 10, 223); - blendpixel(vid, nx-1, ny, GR, 10, 10, 223); - blendpixel(vid, nx, ny+1, GR, 10, 10, 223); - blendpixel(vid, nx, ny-1, GR, 10, 10, 223); - - blendpixel(vid, nx+1, ny-1, GR, 10, 10, 112); - blendpixel(vid, nx-1, ny-1, GR, 10, 10, 112); - blendpixel(vid, nx+1, ny+1, GR, 10, 10, 112); - blendpixel(vid, nx-1, ny+1, GR, 10, 10, 112); - } - } - else if(t==PT_PLSM) - { - float ttemp = (float)parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = plasma_data[caddress]; - uint8 G = plasma_data[caddress+1]; - uint8 B = plasma_data[caddress+2]; - if(cmode == 3||cmode==4 || cmode==6) - { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_HFLM) - { - float ttemp = (float)parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = hflm_data[caddress]; - uint8 G = hflm_data[caddress+1]; - uint8 B = hflm_data[caddress+2]; - if(cmode == 3||cmode==4 || cmode==6) - { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_FIRW&&parts[i].tmp==3) - { - float ttemp = (float)parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = firw_data[caddress]; - uint8 G = firw_data[caddress+1]; - uint8 B = firw_data[caddress+2]; - if(cmode == 3||cmode==4 || cmode==6) - { - cr = R/2; - cg = G/2; - cb = B/2; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_FIRE && parts[i].life) - { - if(cmode == 3||cmode==4 || cmode==6) - { - cr = parts[i].life / 4; - cg = parts[i].life / 16; - cb = parts[i].life / 32; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = parts[i].life * 8; - cg = parts[i].life * 2; - cb = parts[i].life; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LAVA && parts[i].life) - { - cr = parts[i].life * 2 + 0xE0; - cg = parts[i].life * 1 + 0x50; - cb = parts[i].life/2 + 0x10; - if(cr>255) cr = 255; - if(cg>192) cg = 192; - if(cb>128) cb = 128; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 64); - blendpixel(vid, nx-1, ny, cr, cg, cb, 64); - blendpixel(vid, nx, ny+1, cr, cg, cb, 64); - blendpixel(vid, nx, ny-1, cr, cg, cb, 64); - if(cmode == 3||cmode==4 || cmode==6) - { - cr /= 32; - cg /= 32; - cb /= 32; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else if(t==PT_LAVA || t==PT_SPRK) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - if(cmode == 3 || cmode==4 || cmode==6) - { - if(t == PT_LAVA) - { - cr = 3; - cg = i%2; - cb = 0; - } - else - { - cr = 8; - cg = 12; - cb = 16; - } - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - } - else - { - float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); - uint8 R = color_data[caddress]; - uint8 G = color_data[caddress+1]; - uint8 B = color_data[caddress+2]; - - if(t==PT_STKM) //Stick man should be visible in heat mode - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); - vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); - vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); - vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); - } - draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); - draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); - draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); - draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); - - isplayer = 1; //It's a secret. Tssss... - } - else - { - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); - } - } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_HFLM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH&&t!=PT_SMKE&&t!=PT_WTRV&&!(t==PT_FIRW&&parts[i].tmp==3)) - { - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); - - //if(vid[(ny-1)*YRES+(nx-1)]!=0){ - // blendpixel(vid, nx, ny-1, R, G, B, 46); - //} - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - } -#endif - } -#ifdef OpenGL - glFlush (); -#endif - -} - -void render_signs(pixel *vid_buf) -{ - int i, j, x, y, w, h, dx, dy; - char buff[30]; //Buffer - for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp-273.15); //...tempirature - else - sprintf(buff, "Temp: 0.00"); //...tempirature - drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); - } - - //Usual text - if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) - drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); - x = signs[i].x; - y = signs[i].y; - dx = 1 - signs[i].ju; - dy = (signs[i].y > 18) ? -1 : 1; - for(j=0; j<4; j++) - { - drawpixel(vid_buf, x, y, 192, 192, 192, 255); - x+=dx; - y+=dy; - } - } -} - -void render_fire(pixel *dst) -{ - int i,j,x,y,r,g,b; - for(j=0; j=0 && j+y>=0 && i+x4 ? r-4 : 0; - fire_g[j][i] = g>4 ? g-4 : 0; - fire_b[j][i] = b>4 ? b-4 : 0; - } -} - -void prepare_alpha(void) -{ - int x,y,i,j; - float temp[CELL*3][CELL*3]; - memset(temp, 0, sizeof(temp)); - for(x=0; x0) - r--; - if(g>0) - g--; - if(b>0) - b--; - dst[i] = PIXRGB(r,g,b); - } -} - -void render_zoom(pixel *img) -{ - int x, y, i, j; - pixel pix; - drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); - drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); - clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); - for(j=0; jSAVE_VERSION) - return NULL; - - bw = c[6]; - bh = c[7]; - w = bw*CELL; - h = bh*CELL; - - if(c[5]!=CELL) - return NULL; - - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return NULL; - fb = calloc(w*h, PIXELSIZE); - if(!fb) - { - free(d); - return NULL; - } - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - goto corrupt; - size = i; - - if(size < bw*bh) - goto corrupt; - - k = 0; - for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) - goto corrupt; - - for(y=0; y= size) - goto corrupt; - j=d[p++]; - if(j0) - { - if(j==PT_STKM) //Stickman should be drawed another way - { - //Stickman drawing - for(k=-2; k<=1; k++) - { - fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); - fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); - fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); - fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); - } - draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); - draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); - draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); - draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); - } - else - fb[y*w+x] = ptypes[j].pcolors; - } - } - - free(d); - *width = w; - *height = h; - return fb; - -corrupt: - free(d); - free(fb); - return NULL; -} - -int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) -{ - unsigned char *d,*c=thumb; - int i,j,x,y,a,t,r,g,b,sx,sy; - - if(bzip2) - { - if(size<16) - return 1; - if(c[3]!=0x74 || c[2]!=0x49 || c[1]!=0x68 || c[0]!=0x53) - return 1; - if(c[4]>PT_NUM) - return 2; - if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) - return 3; - i = XRES*YRES; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) - return 1; - size = i; - } - else - d = c; - - if(size < XRES*YRES) - { - if(bzip2) - free(d); - return 1; - } - - sy = 0; - for(y=0; y+scl<=YRES; y+=scl) - { - sx = 0; - for(x=0; x+scl<=XRES; x+=scl) - { - a = 0; - r = g = b = 0; - for(j=0; j=PT_NUM) - goto corrupt; - r += PIXR(ptypes[t].pcolors); - g += PIXG(ptypes[t].pcolors); - b += PIXB(ptypes[t].pcolors); - a ++; - } - } - if(a) - { - a = 256/a; - r = (r*a)>>8; - g = (g*a)>>8; - b = (b*a)>>8; - } - - drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); - sx++; - } - sy++; - } - - if(bzip2) - free(d); - return 0; - -corrupt: - if(bzip2) - free(d); - return 1; -} - -void render_cursor(pixel *vid, int x, int y, int t, int r) -{ - int i,j,c; - if(tr*r || i*i+(j+1)*(j+1)>r*r)) - { - xor_pixel(x+i, y+j, vid); - if(j) xor_pixel(x+i, y-j, vid); - if(i) xor_pixel(x-i, y+j, vid); - if(i&&j) xor_pixel(x-i, y-j, vid); - } - } - else - { - int tc; - c = (r/CELL) * CELL; - x = (x/CELL) * CELL; - y = (y/CELL) * CELL; - - tc = !((c%(CELL*2))==0); - - x -= c/2; - y -= c/2; - - x += tc*(CELL/2); - y += tc*(CELL/2); - - for(i=0; i -#include "defines.h" -#include "hmap.h" - -#ifdef PIX16 -#define PIXELSIZE 2 -#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) -#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) -#define PIXR(x) (((x)>>8)&0xF8) -#define PIXG(x) (((x)>>3)&0xFC) -#define PIXB(x) (((x)<<3)&0xF8) -#else -#define PIXELSIZE 4 -#ifdef PIX32BGR -#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) -#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) -#define PIXR(x) ((x)&0xFF) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)>>16) -#else -#ifdef PIX32BGRA -#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) -#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) -#define PIXR(x) (((x)>>8)&0xFF) -#define PIXG(x) (((x)>>16)&0xFF) -#define PIXB(x) (((x)>>24)) -#else -#define PIXPACK(x) (x) -#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) -#define PIXR(x) ((x)>>16) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)&0xFF) -#endif -#endif -#endif - -extern unsigned cmode; -extern SDL_Surface *sdl_scrn; -extern int sdl_scale; - -extern unsigned char fire_r[YRES/CELL][XRES/CELL]; -extern unsigned char fire_g[YRES/CELL][XRES/CELL]; -extern unsigned char fire_b[YRES/CELL][XRES/CELL]; - -extern unsigned int fire_alpha[CELL*3][CELL*3]; -extern pixel *fire_bg; - -pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); - -void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch); - -void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch); - -void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch); - -void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb); - -void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall); - -int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc); - -void draw_menu(pixel *vid_buf, int i, int hover); - -#ifdef WIN32 -_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); -#else -extern inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); -#endif - -#ifdef WIN32 -_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); -#else -extern inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); -#endif - -int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a); - -void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); - -void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); - -void clearrect(pixel *vid, int x, int y, int w, int h); - -void drawdots(pixel *vid, int x, int y, int h, int r, int g, int b, int a); - -int textwidth(char *s); - -int drawtextmax(pixel *vid, int x, int y, int w, char *s, int r, int g, int b, int a); - -int textnwidth(char *s, int n); - -int textwidthx(char *s, int w); - -#ifdef WIN32 -_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); -#else -inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); -#endif - -void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag); - -void draw_air(pixel *vid); - -void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a); - -void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a); - -void xor_pixel(int x, int y, pixel *vid); - -void xor_line(int x1, int y1, int x2, int y2, pixel *vid); - -void xor_rect(pixel *vid, int x, int y, int w, int h); - -void draw_parts(pixel *vid); - -void render_signs(pixel *vid_buf); - -void render_fire(pixel *dst); - -void prepare_alpha(void); - -void draw_image(pixel *vid, pixel *img, int x, int y, int w, int h, int a); - -void dim_copy(pixel *dst, pixel *src); - -void render_zoom(pixel *img); - -pixel *prerender_save(void *save, int size, int *width, int *height); - -int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl); - -void render_cursor(pixel *vid, int x, int y, int t, int r); - -void sdl_open(void); - -#ifdef OpenGL -void Enable2D (); -void RenderScene (); -void ClearScreen(); -#endif - -#endif diff --git a/hmap.h b/hmap.h deleted file mode 100755 index 1af80132c..000000000 --- a/hmap.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Powder Toy - Heatmap Data - * - * Copyright (c) 2010 Simon Robertshaw - * - * 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 02111-1301 USA - */ -#ifndef HMAP_H -#define HMAP_H -//Original Heat Scale -//static char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; -//Modified Hue Scale -//static char color_data[] = {0x00,0x00,0x00,0x02,0x00,0x02,0x04,0x00,0x04,0x06,0x00,0x06,0x09,0x00,0x08,0x0B,0x00,0x0B,0x0E,0x00,0x0D,0x11,0x00,0x10,0x14,0x00,0x13,0x17,0x00,0x16,0x1B,0x00,0x19,0x1E,0x00,0x1C,0x22,0x00,0x1F,0x26,0x00,0x22,0x29,0x00,0x26,0x2D,0x00,0x29,0x32,0x00,0x2D,0x36,0x00,0x30,0x3A,0x00,0x34,0x3E,0x00,0x38,0x43,0x00,0x3C,0x47,0x00,0x40,0x4C,0x00,0x44,0x51,0x00,0x48,0x55,0x00,0x4C,0x5A,0x00,0x50,0x5F,0x00,0x54,0x64,0x00,0x59,0x69,0x00,0x5D,0x6E,0x00,0x61,0x73,0x00,0x66,0x77,0x00,0x6A,0x7C,0x00,0x6E,0x81,0x00,0x73,0x86,0x00,0x77,0x8B,0x00,0x7C,0x90,0x00,0x80,0x95,0x00,0x85,0x9A,0x00,0x89,0x9F,0x00,0x8D,0xA3,0x00,0x92,0xA8,0x00,0x96,0xAD,0x00,0x9B,0xB1,0x00,0x9F,0xB6,0x00,0xA3,0xBA,0x00,0xA8,0xBF,0x00,0xAC,0xC3,0x00,0xB0,0xC7,0x00,0xB4,0xCB,0x00,0xB8,0xCF,0x00,0xBD,0xD3,0x00,0xC1,0xD7,0x00,0xC4,0xDB,0x00,0xC8,0xDE,0x00,0xCC,0xE1,0x00,0xD0,0xE5,0x00,0xD4,0xE8,0x00,0xD7,0xEA,0x00,0xDB,0xED,0x00,0xDE,0xF0,0x00,0xE1,0xF2,0x00,0xE4,0xF4,0x00,0xE8,0xF6,0x00,0xEB,0xF8,0x00,0xED,0xFA,0x00,0xF0,0xFB,0x00,0xF3,0xFC,0x00,0xF5,0xFD,0x00,0xF8,0xFE,0x00,0xFA,0xFF,0x00,0xFC,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFE,0x00,0xFF,0xFE,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF8,0x00,0xFF,0xF6,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE6,0x00,0xFF,0xE3,0x00,0xFF,0xE0,0x00,0xFF,0xDD,0x00,0xFF,0xD9,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xCF,0x00,0xFF,0xCB,0x00,0xFF,0xC7,0x00,0xFF,0xC4,0x00,0xFF,0xC0,0x00,0xFF,0xBC,0x00,0xFF,0xB7,0x00,0xFF,0xB3,0x00,0xFF,0xAF,0x00,0xFF,0xAB,0x00,0xFF,0xA6,0x00,0xFF,0xA2,0x00,0xFF,0x9E,0x00,0xFF,0x99,0x00,0xFF,0x95,0x00,0xFF,0x90,0x00,0xFF,0x8B,0x00,0xFF,0x87,0x00,0xFF,0x82,0x00,0xFF,0x7E,0x00,0xFF,0x79,0x00,0xFF,0x74,0x00,0xFF,0x70,0x00,0xFF,0x6B,0x00,0xFF,0x67,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x59,0x00,0xFF,0x55,0x00,0xFF,0x50,0x00,0xFF,0x4C,0x00,0xFF,0x48,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x37,0x00,0xFF,0x33,0x00,0xFF,0x2F,0x00,0xFF,0x2B,0x00,0xFF,0x28,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1D,0x00,0xFF,0x1A,0x00,0xFF,0x17,0x00,0xFF,0x14,0x00,0xFF,0x11,0x00,0xFF,0x0E,0x00,0xFF,0x0C,0x00,0xFF,0x09,0x00,0xFF,0x07,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x01,0x00,0xFF,0x00,0x01,0xFF,0x00,0x03,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x09,0xFF,0x00,0x0C,0xFF,0x00,0x0F,0xFF,0x00,0x11,0xFF,0x00,0x14,0xFF,0x00,0x17,0xFF,0x00,0x1A,0xFF,0x00,0x1D,0xFF,0x00,0x20,0xFF,0x00,0x24,0xFF,0x00,0x27,0xFF,0x00,0x2B,0xFF,0x00,0x2E,0xFF,0x00,0x32,0xFF,0x00,0x36,0xFF,0x00,0x3A,0xFF,0x00,0x3E,0xFF,0x00,0x42,0xFF,0x00,0x46,0xFF,0x00,0x4A,0xFF,0x00,0x4E,0xFF,0x00,0x52,0xFF,0x00,0x56,0xFF,0x00,0x5B,0xFF,0x00,0x5F,0xFF,0x00,0x63,0xFF,0x00,0x68,0xFF,0x00,0x6C,0xFF,0x00,0x71,0xFF,0x00,0x75,0xFF,0x00,0x79,0xFF,0x00,0x7E,0xFF,0x00,0x82,0xFF,0x00,0x87,0xFF,0x00,0x8B,0xFF,0x00,0x90,0xFF,0x00,0x94,0xFF,0x00,0x98,0xFF,0x00,0x9D,0xFF,0x00,0xA1,0xFF,0x00,0xA6,0xFF,0x00,0xAA,0xFF,0x00,0xAE,0xFF,0x00,0xB2,0xFF,0x00,0xB6,0xFF,0x00,0xBA,0xFF,0x00,0xBF,0xFF,0x00,0xC2,0xFF,0x00,0xC6,0xFF,0x00,0xCA,0xFF,0x00,0xCE,0xFF,0x00,0xD2,0xFF,0x00,0xD5,0xFF,0x00,0xD9,0xFF,0x00,0xDC,0xFF,0x00,0xE0,0xFF,0x00,0xE3,0xFF,0x00,0xE6,0xFF,0x00,0xE9,0xFF,0x00,0xEC,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF4,0xFF,0x00,0xF6,0xFF,0x00,0xF9,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF2,0x00,0xFF,0xEF,0x00,0xFF,0xED,0x00,0xFF,0xEA,0x00,0xFF,0xE7,0x00,0xFF,0xE4,0x00,0xFF,0xE1,0x00,0xFF,0xDD,0x00,0xFF,0xDA,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xCF,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC4,0x00,0xFF,0xC0,0x00,0xFF,0xBC,0x00,0xFF,0xB8,0x00,0xFF,0xB4,0x00,0xFF,0xAF,0x00,0xFF,0xAB,0x00,0xFF,0xA7,0x00,0xFF,0xA3,0x00,0xFF,0x9E,0x00,0xFF,0x9A,0x00,0xFF,0x96,0x00,0xFF,0x91,0x00,0xFF,0x8D,0x00,0xFF,0x88,0x00,0xFF,0x84,0x00,0xFF,0x80,0x00,0xFF,0x7B,0x00,0xFF,0x77,0x00,0xFF,0x72,0x00,0xFF,0x6E,0x00,0xFF,0x69,0x00,0xFF,0x65,0x00,0xFF,0x61,0x00,0xFF,0x5C,0x00,0xFF,0x58,0x00,0xFF,0x54,0x00,0xFF,0x50,0x00,0xFF,0x4B,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x37,0x00,0xFF,0x34,0x00,0xFF,0x30,0x00,0xFF,0x2C,0x00,0xFF,0x29,0x00,0xFF,0x25,0x00,0xFF,0x22,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x18,0x00,0xFF,0x15,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x0D,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x04,0x00,0xFF,0x02,0x00,0xFF,0x00,0x02,0xFD,0x00,0x04,0xFB,0x00,0x06,0xF9,0x00,0x09,0xF6,0x00,0x0B,0xF3,0x00,0x0E,0xF1,0x00,0x10,0xEE,0x00,0x13,0xEB,0x00,0x16,0xE7,0x00,0x19,0xE4,0x00,0x1C,0xE0,0x00,0x1F,0xDD,0x00,0x23,0xD9,0x00,0x26,0xD5,0x00,0x29,0xD1,0x00,0x2D,0xCD,0x00,0x31,0xC9,0x00,0x35,0xC4,0x00,0x38,0xC0,0x00,0x3C,0xBC,0x00,0x40,0xB7,0x00,0x44,0xB2,0x00,0x48,0xAE,0x00,0x4C,0xA9,0x00,0x51,0xA4,0x00,0x55,0x9F,0x00,0x59,0x9B,0x00,0x5D,0x96,0x00,0x62,0x91,0x00,0x66,0x8C,0x00,0x6A,0x87,0x00,0x6F,0x82,0x00,0x73,0x7D,0x00,0x78,0x78,0x00,0x7C,0x73,0x00,0x81,0x6E,0x00,0x85,0x69,0x00,0x8A,0x65,0x00,0x8E,0x60,0x00,0x92,0x5B,0x00,0x97,0x56,0x00,0x9B,0x52,0x00,0xA0,0x4D,0x00,0xA4,0x49,0x00,0xA8,0x44,0x00,0xAC,0x40,0x00,0xB1,0x3B,0x00,0xB5,0x37,0x00,0xB9,0x33,0x00,0xBD,0x2F,0x00,0xC1,0x2B,0x00,0xC5,0x28,0x00,0xC9,0x24,0x00,0xCD,0x21,0x00,0xD0,0x1D,0x00,0xD4,0x1A,0x00,0xD8,0x17,0x00,0xDB,0x14,0x00,0xDE,0x11,0x00,0xE2,0x0F,0x00,0xE5,0x0D,0x00,0xE8,0x0A,0x00,0xEB,0x08,0x00,0xEE,0x07,0x00,0xF0,0x05,0x00,0xF3,0x04,0x00,0xF6,0x02,0x00,0xF8,0x01,0x00,0xFA,0x01,0x00,0xFC,0x00,0x00,0xFE,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x02,0x00,0xFF,0x03,0x00,0xFF,0x04,0x00,0xFF,0x06,0x00,0xFF,0x07,0x00,0xFF,0x09,0x00,0xFF,0x0B,0x00,0xFF,0x0D,0x00,0xFF,0x0F,0x00,0xFF,0x12,0x00,0xFF,0x14,0x00,0xFF,0x17,0x00,0xFF,0x1A,0x00,0xFF,0x1C,0x00,0xFF,0x1F,0x00,0xFF,0x23,0x00,0xFF,0x26,0x00,0xFF,0x29,0x00,0xFF,0x2D,0x00,0xFF,0x31,0x00,0xFF,0x34,0x00,0xFF,0x38,0x00,0xFF,0x3C,0x00,0xFF,0x40,0x00,0xFF,0x44,0x00,0xFF,0x48,0x00,0xFF,0x4C,0x00,0xFF,0x51,0x00,0xFF,0x55,0x00,0xFF,0x59,0x00,0xFF,0x5E,0x00,0xFF,0x62,0x00,0xFF,0x67,0x00,0xFF,0x6B,0x00,0xFF,0x70,0x00,0xFF,0x74,0x00,0xFF,0x79,0x00,0xFF,0x7D,0x00,0xFF,0x82,0x00,0xFF,0x87,0x00,0xFF,0x8B,0x00,0xFF,0x90,0x00,0xFF,0x94,0x00,0xFF,0x99,0x00,0xFF,0x9D,0x00,0xFF,0xA2,0x00,0xFF,0xA6,0x00,0xFF,0xAB,0x00,0xFF,0xAF,0x00,0xFF,0xB4,0x00,0xFF,0xB8,0x00,0xFF,0xBC,0x00,0xFF,0xC0,0x00,0xFF,0xC4,0x00,0xFF,0xC8,0x00,0xFF,0xCC,0x00,0xFF,0xD0,0x00,0xFF,0xD4,0x00,0xFF,0xD8,0x00,0xFF,0xDB,0x00,0xFF,0xDF,0x00,0xFF,0xE2,0x00,0xFF,0xE5,0x00,0xFF,0xE9,0x00,0xFF,0xEC,0x00,0xFF,0xEE,0x00,0xFF,0xF1,0x00,0xFF,0xF4,0x00,0xFF,0xF6,0x00,0xFF,0xF8,0x00,0xFF,0xFB,0x00,0xFF,0xFD,0x00,0xFF,0xFE,0x00,0xFF,0xFF,0x01,0xFF,0xFF,0x03,0xFF,0xFF,0x05,0xFF,0xFF,0x07,0xFF,0xFF,0x0A,0xFF,0xFF,0x0C,0xFF,0xFF,0x0F,0xFF,0xFF,0x12,0xFF,0xFF,0x14,0xFF,0xFF,0x17,0xFF,0xFF,0x1A,0xFF,0xFF,0x1E,0xFF,0xFF,0x21,0xFF,0xFF,0x24,0xFF,0xFF,0x28,0xFF,0xFF,0x2B,0xFF,0xFF,0x2F,0xFF,0xFF,0x33,0xFF,0xFF,0x36,0xFF,0xFF,0x3A,0xFF,0xFF,0x3E,0xFF,0xFF,0x42,0xFF,0xFF,0x46,0xFF,0xFF,0x4A,0xFF,0xFF,0x4F,0xFF,0xFF,0x53,0xFF,0xFF,0x57,0xFF,0xFF,0x5B,0xFF,0xFF,0x60,0xFF,0xFF,0x64,0xFF,0xFF,0x68,0xFF,0xFF,0x6D,0xFF,0xFF,0x71,0xFF,0xFF,0x76,0xFF,0xFF,0x7A,0xFF,0xFF,0x7E,0xFF,0xFF,0x83,0xFF,0xFF,0x87,0xFF,0xFF,0x8C,0xFF,0xFF,0x90,0xFF,0xFF,0x95,0xFF,0xFF,0x99,0xFF,0xFF,0x9D,0xFF,0xFF,0xA2,0xFF,0xFF,0xA6,0xFF,0xFF,0xAA,0xFF,0xFF,0xAF,0xFF,0xFF,0xB3,0xFF,0xFF,0xB7,0xFF,0xFF,0xBB,0xFF,0xFF,0xBF,0xFF,0xFF,0xC3,0xFF,0xFF,0xC7,0xFF,0xFF,0xCB,0xFF,0xFF,0xCE,0xFF,0xFF,0xD2,0xFF,0xFF,0xD6,0xFF,0xFF,0xD9,0xFF,0xFF,0xDD,0xFF,0xFF,0xE0,0xFF,0xFF,0xE3,0xFF,0xFF,0xE6,0xFF,0xFF,0xE9,0xFF,0xFF,0xEC,0xFF,0xFF,0xEF,0xFF,0xFF,0xF2,0xFF,0xFF,0xF4,0xFF,0xFF,0xF7,0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0xFF,0xFF,0xFD}; -//Hue Scale -//static char color_data[] = {0xFF,0x00,0xFF,0xFE,0x00,0xFF,0xFC,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF8,0x00,0xFF,0xF6,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xEA,0x00,0xFF,0xE8,0x00,0xFF,0xE5,0x00,0xFF,0xE3,0x00,0xFF,0xE1,0x00,0xFF,0xDE,0x00,0xFF,0xDC,0x00,0xFF,0xD9,0x00,0xFF,0xD6,0x00,0xFF,0xD4,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCC,0x00,0xFF,0xC9,0x00,0xFF,0xC6,0x00,0xFF,0xC3,0x00,0xFF,0xC1,0x00,0xFF,0xBE,0x00,0xFF,0xBB,0x00,0xFF,0xB8,0x00,0xFF,0xB5,0x00,0xFF,0xB2,0x00,0xFF,0xAF,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA7,0x00,0xFF,0xA4,0x00,0xFF,0xA1,0x00,0xFF,0x9E,0x00,0xFF,0x9B,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x93,0x00,0xFF,0x90,0x00,0xFF,0x8D,0x00,0xFF,0x8A,0x00,0xFF,0x88,0x00,0xFF,0x85,0x00,0xFF,0x83,0x00,0xFF,0x80,0x00,0xFF,0x7E,0x00,0xFF,0x7B,0x00,0xFF,0x78,0x00,0xFF,0x76,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6E,0x00,0xFF,0x6B,0x00,0xFF,0x68,0x00,0xFF,0x65,0x00,0xFF,0x63,0x00,0xFF,0x60,0x00,0xFF,0x5D,0x00,0xFF,0x5A,0x00,0xFF,0x57,0x00,0xFF,0x54,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x49,0x00,0xFF,0x46,0x00,0xFF,0x43,0x00,0xFF,0x40,0x00,0xFF,0x3D,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x35,0x00,0xFF,0x32,0x00,0xFF,0x2F,0x00,0xFF,0x2C,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x25,0x00,0xFF,0x22,0x00,0xFF,0x20,0x00,0xFF,0x1D,0x00,0xFF,0x1B,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x14,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x0E,0x00,0xFF,0x0C,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x08,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x14,0xFF,0x00,0x16,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1D,0xFF,0x00,0x20,0xFF,0x00,0x22,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x32,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3D,0xFF,0x00,0x40,0xFF,0x00,0x43,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x57,0xFF,0x00,0x5A,0xFF,0x00,0x5D,0xFF,0x00,0x60,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6B,0xFF,0x00,0x6E,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x76,0xFF,0x00,0x79,0xFF,0x00,0x7B,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x86,0xFF,0x00,0x88,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x93,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9E,0xFF,0x00,0xA1,0xFF,0x00,0xA4,0xFF,0x00,0xA7,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB5,0xFF,0x00,0xB8,0xFF,0x00,0xBB,0xFF,0x00,0xBE,0xFF,0x00,0xC1,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xC9,0xFF,0x00,0xCC,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD4,0xFF,0x00,0xD7,0xFF,0x00,0xD9,0xFF,0x00,0xDC,0xFF,0x00,0xDF,0xFF,0x00,0xE1,0xFF,0x00,0xE3,0xFF,0x00,0xE6,0xFF,0x00,0xE8,0xFF,0x00,0xEA,0xFF,0x00,0xEC,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF4,0xFF,0x00,0xF6,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE5,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDE,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC3,0x00,0xFF,0xC0,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA6,0x00,0xFF,0xA3,0x00,0xFF,0xA0,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x92,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x8A,0x00,0xFF,0x87,0x00,0xFF,0x85,0x00,0xFF,0x82,0x00,0xFF,0x80,0x00,0xFF,0x7D,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6D,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x65,0x00,0xFF,0x62,0x00,0xFF,0x5F,0x00,0xFF,0x5C,0x00,0xFF,0x59,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x48,0x00,0xFF,0x45,0x00,0xFF,0x42,0x00,0xFF,0x3F,0x00,0xFF,0x3C,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2C,0x00,0xFF,0x29,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1F,0x00,0xFF,0x1D,0x00,0xFF,0x1A,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x09,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x15,0xFF,0x00,0x17,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1E,0xFF,0x00,0x20,0xFF,0x00,0x23,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x33,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3E,0xFF,0x00,0x41,0xFF,0x00,0x44,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x58,0xFF,0x00,0x5B,0xFF,0x00,0x5E,0xFF,0x00,0x61,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6C,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x77,0xFF,0x00,0x79,0xFF,0x00,0x7C,0xFF,0x00,0x7F,0xFF,0x00,0x81,0xFF,0x00,0x84,0xFF,0x00,0x86,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x91,0xFF,0x00,0x94,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9C,0xFF,0x00,0x9F,0xFF,0x00,0xA2,0xFF,0x00,0xA5,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB3,0xFF,0x00,0xB6,0xFF,0x00,0xB9,0xFF,0x00,0xBC,0xFF,0x00,0xBF,0xFF,0x00,0xC2,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xCA,0xFF,0x00,0xCD,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD5,0xFF,0x00,0xD7,0xFF,0x00,0xDA,0xFF,0x00,0xDD,0xFF,0x00,0xDF,0xFF,0x00,0xE2,0xFF,0x00,0xE4,0xFF,0x00,0xE6,0xFF,0x00,0xE9,0xFF,0x00,0xEB,0xFF,0x00,0xED,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF5,0xFF,0x00,0xF7,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF3,0x00,0xFF,0xF1,0x00,0xFF,0xEF,0x00,0xFF,0xED,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE4,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDD,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD0,0x00,0xFF,0xCD,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC2,0x00,0xFF,0xBF,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAB,0x00,0xFF,0xA8,0x00,0xFF,0xA5,0x00,0xFF,0xA2,0x00,0xFF,0x9F,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x97,0x00,0xFF,0x94,0x00,0xFF,0x91,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x89,0x00,0xFF,0x87,0x00,0xFF,0x84,0x00,0xFF,0x81,0x00,0xFF,0x7F,0x00,0xFF,0x7C,0x00,0xFF,0x7A,0x00,0xFF,0x77,0x00,0xFF,0x75,0x00,0xFF,0x72,0x00,0xFF,0x6F,0x00,0xFF,0x6C,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x64,0x00,0xFF,0x61,0x00,0xFF,0x5E,0x00,0xFF,0x5B,0x00,0xFF,0x58,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x50,0x00,0xFF,0x4D,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x44,0x00,0xFF,0x41,0x00,0xFF,0x3E,0x00,0xFF,0x3C,0x00,0xFF,0x39,0x00,0xFF,0x36,0x00,0xFF,0x33,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2B,0x00,0xFF,0x29,0x00,0xFF,0x26,0x00,0xFF,0x23,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1C,0x00,0xFF,0x1A,0x00,0xFF,0x17,0x00,0xFF,0x15,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x09,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x01,0x00}; -//Scaled Hue Scale -static char color_data[] = {0xFF,0x00,0xFF,0xF1,0x00,0xFF,0xDE,0x00,0xFF,0xC7,0x00,0xFF,0xAF,0x00,0xFF,0x97,0x00,0xFF,0x82,0x00,0xFF,0x6C,0x00,0xFF,0x56,0x00,0xFF,0x41,0x00,0xFF,0x2E,0x00,0xFF,0x21,0x05,0xFF,0x16,0x0F,0xFF,0x0E,0x1B,0xFF,0x07,0x29,0xFF,0x02,0x39,0xFF,0x00,0x4B,0xFF,0x00,0x5E,0xFF,0x00,0x74,0xFF,0x00,0x8A,0xFF,0x00,0xA0,0xFF,0x00,0xAF,0xFF,0x00,0xB8,0xFE,0x00,0xC2,0xFD,0x00,0xCC,0xFD,0x00,0xD5,0xFC,0x00,0xDF,0xFA,0x00,0xE7,0xF9,0x00,0xEF,0xF6,0x00,0xF6,0xF3,0x00,0xFC,0xEE,0x00,0xFF,0xE8,0x00,0xFF,0xE1,0x00,0xFF,0xD8,0x00,0xFF,0xCE,0x00,0xFF,0xC4,0x00,0xFF,0xB9,0x00,0xFF,0xAD,0x00,0xFF,0xA1,0x00,0xFF,0x96,0x00,0xFF,0x8A,0x00,0xFF,0x80,0x00,0xFF,0x7C,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x71,0x00,0xFF,0x6D,0x00,0xFF,0x69,0x00,0xFF,0x66,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x5A,0x00,0xFF,0x56,0x00,0xFF,0x52,0x00,0xFF,0x4E,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x38,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2D,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x19,0x00,0xFF,0x17,0x01,0xFF,0x14,0x02,0xFF,0x13,0x04,0xFF,0x11,0x06,0xFF,0x0F,0x07,0xFF,0x0E,0x0A,0xFF,0x0C,0x0C,0xFF,0x0B,0x0E,0xFF,0x0A,0x10,0xFF,0x09,0x13,0xFF,0x08,0x16,0xFF,0x07,0x18,0xFF,0x06,0x1B,0xFF,0x06,0x1E,0xFF,0x05,0x21,0xFF,0x04,0x24,0xFF,0x04,0x27,0xFF,0x04,0x2A,0xFF,0x03,0x2D,0xFF,0x03,0x30,0xFF,0x03,0x34,0xFF,0x02,0x37,0xFF,0x02,0x3A,0xFF,0x02,0x3D,0xFF,0x02,0x41,0xFF,0x02,0x44,0xFF,0x01,0x47,0xFF,0x01,0x4A,0xFF,0x01,0x4E,0xFF,0x01,0x51,0xFF,0x00,0x54,0xFF,0x00,0x56,0xFF,0x00,0x58,0xFF,0x00,0x5A,0xFF,0x00,0x5C,0xFF,0x00,0x5E,0xFF,0x00,0x60,0xFF,0x00,0x62,0xFF,0x00,0x64,0xFF,0x00,0x66,0xFF,0x00,0x68,0xFF,0x00,0x6A,0xFF,0x00,0x6D,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x73,0xFF,0x00,0x75,0xFF,0x00,0x77,0xFF,0x00,0x7A,0xFF,0x00,0x7C,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x85,0xFF,0x00,0x87,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x92,0xFF,0x00,0x94,0xFF,0x00,0x97,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9D,0xFF,0x00,0x9F,0xFF,0x00,0xA1,0xFF,0x00,0xA3,0xFF,0x00,0xA6,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAC,0xFF,0x00,0xAE,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB5,0xFF,0x00,0xB7,0xFF,0x00,0xB9,0xFF,0x00,0xBB,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xC0,0xFF,0x00,0xC1,0xFF,0x00,0xC2,0xFE,0x00,0xC3,0xFE,0x00,0xC4,0xFE,0x00,0xC6,0xFD,0x00,0xC7,0xFD,0x00,0xC8,0xFD,0x00,0xC9,0xFC,0x00,0xCA,0xFC,0x00,0xCB,0xFC,0x00,0xCC,0xFB,0x00,0xCE,0xFB,0x00,0xCF,0xFB,0x00,0xD0,0xFA,0x00,0xD1,0xFA,0x00,0xD2,0xF9,0x00,0xD3,0xF9,0x00,0xD4,0xF9,0x00,0xD5,0xF8,0x00,0xD6,0xF8,0x00,0xD7,0xF7,0x00,0xD8,0xF7,0x00,0xD9,0xF7,0x00,0xDA,0xF6,0x00,0xDC,0xF6,0x00,0xDD,0xF5,0x00,0xDE,0xF5,0x00,0xDF,0xF4,0x00,0xE0,0xF4,0x00,0xE1,0xF3,0x00,0xE2,0xF3,0x00,0xE2,0xF2,0x00,0xE3,0xF2,0x00,0xE4,0xF1,0x00,0xE5,0xF1,0x00,0xE6,0xF0,0x00,0xE7,0xF0,0x00,0xE8,0xEF,0x00,0xE9,0xEE,0x00,0xEA,0xEE,0x00,0xEB,0xED,0x00,0xEC,0xED,0x00,0xEC,0xEC,0x00,0xED,0xEB,0x00,0xEE,0xEB,0x00,0xEF,0xEA,0x00,0xF0,0xE9,0x00,0xF1,0xE9,0x00,0xF1,0xE8,0x00,0xF2,0xE7,0x00,0xF3,0xE6,0x00,0xF4,0xE6,0x00,0xF4,0xE5,0x00,0xF5,0xE4,0x00,0xF6,0xE3,0x00,0xF6,0xE3,0x00,0xF7,0xE2,0x00,0xF8,0xE1,0x00,0xF8,0xE0,0x00,0xF9,0xDF,0x00,0xFA,0xDE,0x00,0xFA,0xDD,0x00,0xFB,0xDD,0x00,0xFB,0xDC,0x00,0xFC,0xDB,0x00,0xFC,0xDA,0x00,0xFD,0xD9,0x00,0xFD,0xD8,0x00,0xFE,0xD7,0x00,0xFE,0xD6,0x00,0xFF,0xD5,0x00,0xFF,0xD4,0x00,0xFF,0xD3,0x00,0xFF,0xD3,0x00,0xFF,0xD2,0x00,0xFF,0xD1,0x00,0xFF,0xD1,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCE,0x00,0xFF,0xCE,0x00,0xFF,0xCD,0x00,0xFF,0xCC,0x00,0xFF,0xCB,0x00,0xFF,0xCB,0x00,0xFF,0xCA,0x00,0xFF,0xC9,0x00,0xFF,0xC8,0x00,0xFF,0xC7,0x00,0xFF,0xC7,0x00,0xFF,0xC6,0x00,0xFF,0xC5,0x00,0xFF,0xC4,0x00,0xFF,0xC3,0x00,0xFF,0xC2,0x00,0xFF,0xC1,0x00,0xFF,0xC1,0x00,0xFF,0xC0,0x00,0xFF,0xBF,0x00,0xFF,0xBE,0x00,0xFF,0xBD,0x00,0xFF,0xBC,0x00,0xFF,0xBB,0x00,0xFF,0xBA,0x00,0xFF,0xB9,0x00,0xFF,0xB8,0x00,0xFF,0xB8,0x00,0xFF,0xB7,0x00,0xFF,0xB6,0x00,0xFF,0xB5,0x00,0xFF,0xB4,0x00,0xFF,0xB3,0x00,0xFF,0xB2,0x00,0xFF,0xB1,0x00,0xFF,0xB0,0x00,0xFF,0xAF,0x00,0xFF,0xAE,0x00,0xFF,0xAD,0x00,0xFF,0xAC,0x00,0xFF,0xAB,0x00,0xFF,0xAA,0x00,0xFF,0xA9,0x00,0xFF,0xA8,0x00,0xFF,0xA7,0x00,0xFF,0xA6,0x00,0xFF,0xA5,0x00,0xFF,0xA4,0x00,0xFF,0xA3,0x00,0xFF,0xA2,0x00,0xFF,0xA1,0x00,0xFF,0xA0,0x00,0xFF,0x9F,0x00,0xFF,0x9E,0x00,0xFF,0x9D,0x00,0xFF,0x9C,0x00,0xFF,0x9B,0x00,0xFF,0x9A,0x00,0xFF,0x99,0x00,0xFF,0x98,0x00,0xFF,0x97,0x00,0xFF,0x96,0x00,0xFF,0x95,0x00,0xFF,0x94,0x00,0xFF,0x92,0x00,0xFF,0x91,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8E,0x00,0xFF,0x8D,0x00,0xFF,0x8C,0x00,0xFF,0x8B,0x00,0xFF,0x8A,0x00,0xFF,0x89,0x00,0xFF,0x88,0x00,0xFF,0x87,0x00,0xFF,0x86,0x00,0xFF,0x85,0x00,0xFF,0x84,0x00,0xFF,0x83,0x00,0xFF,0x82,0x00,0xFF,0x81,0x00,0xFF,0x80,0x00,0xFF,0x7F,0x00,0xFF,0x7E,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7B,0x00,0xFF,0x7A,0x00,0xFF,0x79,0x00,0xFF,0x78,0x00,0xFF,0x77,0x00,0xFF,0x76,0x00,0xFF,0x75,0x00,0xFF,0x74,0x00,0xFF,0x73,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x70,0x00,0xFF,0x6F,0x00,0xFF,0x6E,0x00,0xFF,0x6D,0x00,0xFF,0x6C,0x00,0xFF,0x6B,0x00,0xFF,0x6A,0x00,0xFF,0x6A,0x00,0xFF,0x69,0x00,0xFF,0x68,0x00,0xFF,0x68,0x00,0xFF,0x67,0x00,0xFF,0x66,0x00,0xFF,0x66,0x00,0xFF,0x65,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x63,0x00,0xFF,0x63,0x00,0xFF,0x62,0x00,0xFF,0x61,0x00,0xFF,0x61,0x00,0xFF,0x60,0x00,0xFF,0x5F,0x00,0xFF,0x5F,0x00,0xFF,0x5E,0x00,0xFF,0x5D,0x00,0xFF,0x5D,0x00,0xFF,0x5C,0x00,0xFF,0x5B,0x00,0xFF,0x5B,0x00,0xFF,0x5A,0x00,0xFF,0x59,0x00,0xFF,0x59,0x00,0xFF,0x58,0x00,0xFF,0x57,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x55,0x00,0xFF,0x54,0x00,0xFF,0x54,0x00,0xFF,0x53,0x00,0xFF,0x52,0x00,0xFF,0x52,0x00,0xFF,0x51,0x00,0xFF,0x50,0x00,0xFF,0x50,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4E,0x00,0xFF,0x4D,0x00,0xFF,0x4C,0x00,0xFF,0x4B,0x00,0xFF,0x4B,0x00,0xFF,0x4A,0x00,0xFF,0x49,0x00,0xFF,0x49,0x00,0xFF,0x48,0x00,0xFF,0x47,0x00,0xFF,0x46,0x00,0xFF,0x46,0x00,0xFF,0x45,0x00,0xFF,0x44,0x00,0xFF,0x44,0x00,0xFF,0x43,0x00,0xFF,0x42,0x00,0xFF,0x41,0x00,0xFF,0x41,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00,0xFF,0x3E,0x00,0xFF,0x3D,0x00,0xFF,0x3C,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x3A,0x00,0xFF,0x3A,0x00,0xFF,0x39,0x00,0xFF,0x38,0x00,0xFF,0x38,0x00,0xFF,0x37,0x00,0xFF,0x36,0x00,0xFF,0x35,0x00,0xFF,0x35,0x00,0xFF,0x34,0x00,0xFF,0x33,0x00,0xFF,0x33,0x00,0xFF,0x32,0x00,0xFF,0x31,0x00,0xFF,0x31,0x00,0xFF,0x30,0x00,0xFF,0x2F,0x00,0xFF,0x2E,0x00,0xFF,0x2E,0x00,0xFF,0x2D,0x00,0xFF,0x2C,0x00,0xFF,0x2C,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x2A,0x00,0xFF,0x29,0x00,0xFF,0x28,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x26,0x00,0xFF,0x26,0x00,0xFF,0x25,0x00,0xFF,0x24,0x00,0xFF,0x24,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x21,0x00,0xFF,0x20,0x00,0xFF,0x1F,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1D,0x00,0xFF,0x1D,0x00,0xFF,0x1C,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x17,0x00,0xFF,0x17,0x00,0xFF,0x16,0x00,0xFF,0x16,0x00,0xFF,0x15,0x00,0xFF,0x14,0x00,0xFF,0x14,0x00,0xFF,0x13,0x00,0xFF,0x13,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x11,0x00,0xFF,0x11,0x00,0xFF,0x10,0x00,0xFF,0x10,0x00,0xFF,0x0F,0x00,0xFF,0x0F,0x00,0xFF,0x0E,0x00,0xFF,0x0E,0x00,0xFF,0x0D,0x00,0xFF,0x0D,0x00,0xFF,0x0C,0x00,0xFF,0x0C,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x0A,0x00,0xFF,0x09,0x00,0xFF,0x09,0x00,0xFF,0x08,0x00,0xFF,0x08,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00}; -static char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; -static char hflm_data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04, 0x02, 0x03, 0x05, 0x03, 0x03, 0x07, 0x04, 0x04, 0x08, 0x04, 0x03, 0x09, 0x04, 0x04, 0x0B, 0x05, 0x04, 0x0C, 0x05, 0x05, 0x0D, 0x06, 0x05, 0x0E, 0x07, 0x06, 0x10, 0x07, 0x07, 0x11, 0x08, 0x07, 0x12, 0x09, 0x08, 0x14, 0x09, 0x08, 0x15, 0x0A, 0x09, 0x17, 0x0A, 0x09, 0x19, 0x0B, 0x0A, 0x1A, 0x0C, 0x0A, 0x1C, 0x0D, 0x0B, 0x1D, 0x0D, 0x0B, 0x1F, 0x0D, 0x0C, 0x22, 0x0F, 0x0D, 0x23, 0x0F, 0x0E, 0x25, 0x10, 0x0E, 0x26, 0x11, 0x0F, 0x28, 0x12, 0x10, 0x2A, 0x13, 0x10, 0x2C, 0x13, 0x11, 0x2E, 0x14, 0x12, 0x2F, 0x15, 0x12, 0x31, 0x15, 0x13, 0x33, 0x16, 0x14, 0x35, 0x17, 0x15, 0x36, 0x18, 0x15, 0x39, 0x19, 0x16, 0x3B, 0x19, 0x17, 0x3D, 0x1B, 0x17, 0x3E, 0x1B, 0x18, 0x40, 0x1C, 0x19, 0x42, 0x1D, 0x1A, 0x43, 0x1D, 0x1B, 0x45, 0x1E, 0x1C, 0x47, 0x1F, 0x1C, 0x49, 0x20, 0x1D, 0x4B, 0x21, 0x1F, 0x4C, 0x21, 0x1F, 0x4E, 0x22, 0x20, 0x50, 0x23, 0x21, 0x52, 0x23, 0x22, 0x53, 0x24, 0x23, 0x55, 0x25, 0x23, 0x56, 0x26, 0x24, 0x59, 0x26, 0x25, 0x5A, 0x27, 0x26, 0x5B, 0x28, 0x27, 0x5D, 0x28, 0x28, 0x5E, 0x29, 0x29, 0x60, 0x29, 0x2A, 0x62, 0x2A, 0x2B, 0x63, 0x2B, 0x2C, 0x64, 0x2C, 0x2E, 0x65, 0x2C, 0x2E, 0x66, 0x2C, 0x2F, 0x68, 0x2D, 0x31, 0x69, 0x2E, 0x32, 0x6A, 0x2F, 0x32, 0x6B, 0x2F, 0x34, 0x6C, 0x30, 0x34, 0x6D, 0x30, 0x35, 0x6F, 0x31, 0x37, 0x70, 0x31, 0x38, 0x71, 0x32, 0x39, 0x72, 0x33, 0x3B, 0x73, 0x33, 0x3C, 0x74, 0x34, 0x3D, 0x75, 0x35, 0x3E, 0x76, 0x35, 0x3F, 0x78, 0x36, 0x41, 0x78, 0x36, 0x42, 0x79, 0x36, 0x43, 0x7A, 0x37, 0x44, 0x7B, 0x37, 0x46, 0x7C, 0x38, 0x48, 0x7D, 0x39, 0x48, 0x7E, 0x3A, 0x49, 0x7F, 0x39, 0x4B, 0x80, 0x3A, 0x4C, 0x81, 0x3B, 0x4E, 0x82, 0x3C, 0x4F, 0x83, 0x3C, 0x51, 0x84, 0x3C, 0x52, 0x84, 0x3D, 0x54, 0x86, 0x3E, 0x55, 0x87, 0x3E, 0x56, 0x88, 0x3F, 0x57, 0x89, 0x40, 0x59, 0x8A, 0x40, 0x5A, 0x8A, 0x41, 0x5C, 0x8B, 0x41, 0x5D, 0x8C, 0x42, 0x5F, 0x8D, 0x41, 0x60, 0x8E, 0x42, 0x62, 0x8E, 0x42, 0x62, 0x8F, 0x44, 0x65, 0x90, 0x43, 0x65, 0x91, 0x45, 0x67, 0x91, 0x44, 0x69, 0x92, 0x45, 0x6A, 0x93, 0x46, 0x6B, 0x94, 0x46, 0x6C, 0x94, 0x46, 0x6E, 0x96, 0x47, 0x70, 0x96, 0x48, 0x70, 0x97, 0x48, 0x72, 0x98, 0x48, 0x73, 0x99, 0x49, 0x74, 0x99, 0x49, 0x76, 0x9A, 0x4A, 0x77, 0x9A, 0x4B, 0x78, 0x9B, 0x4B, 0x7A, 0x9C, 0x4B, 0x7B, 0x9D, 0x4B, 0x7C, 0x9E, 0x4C, 0x7D, 0x9F, 0x4C, 0x7E, 0x9F, 0x4D, 0x7F, 0xA0, 0x4E, 0x80, 0xA0, 0x4E, 0x82, 0xA1, 0x4E, 0x83, 0xA2, 0x4F, 0x84, 0xA3, 0x4F, 0x85, 0xA3, 0x4F, 0x86, 0xA4, 0x4F, 0x88, 0xA5, 0x50, 0x89, 0xA5, 0x50, 0x89, 0xA6, 0x51, 0x8B, 0xA6, 0x51, 0x8B, 0xA7, 0x51, 0x8D, 0xA8, 0x51, 0x8E, 0xA9, 0x52, 0x8F, 0xAA, 0x52, 0x90, 0xAA, 0x53, 0x92, 0xAB, 0x53, 0x92, 0xAB, 0x53, 0x93, 0xAC, 0x54, 0x95, 0xAD, 0x53, 0x95, 0xAE, 0x54, 0x96, 0xAE, 0x55, 0x98, 0xAE, 0x54, 0x98, 0xAF, 0x55, 0x9A, 0xB0, 0x56, 0x9B, 0xB0, 0x56, 0x9C, 0xB1, 0x56, 0x9D, 0xB1, 0x56, 0x9E, 0xB2, 0x56, 0xA0, 0xB3, 0x57, 0xA0, 0xB3, 0x57, 0xA1, 0xB3, 0x57, 0xA2, 0xB4, 0x58, 0xA3, 0xB4, 0x58, 0xA4, 0xB5, 0x57, 0xA5, 0xB6, 0x58, 0xA6, 0xB6, 0x58, 0xA7, 0xB7, 0x58, 0xA8, 0xB7, 0x59, 0xA9, 0xB8, 0x58, 0xAA, 0xB9, 0x5A, 0xAB, 0xB9, 0x59, 0xAC, 0xBA, 0x5A, 0xAD, 0xBA, 0x5A, 0xAE, 0xBB, 0x5A, 0xAF, 0xBB, 0x5A, 0xB0, 0xBC, 0x5B, 0xB0, 0xBC, 0x5A, 0xB1, 0xBD, 0x5B, 0xB2, 0xBD, 0x5B, 0xB3, 0xBD, 0x5B, 0xB4, 0xBE, 0x5C, 0xB5, 0xBE, 0x5B, 0xB5, 0xBE, 0x5B, 0xB7, 0xBF, 0x5C, 0xB7, 0xBF, 0x5C, 0xB8, 0xBF, 0x5C, 0xB9, 0xC0, 0x5C, 0xB9, 0xC0, 0x5C, 0xBA, 0xC0, 0x5C, 0xBA, 0xC1, 0x5D, 0xBB, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBD, 0xC2, 0x5E, 0xBE, 0xC3, 0x5E, 0xBE, 0xC3, 0x5E, 0xBF, 0xC3, 0x5E, 0xC0, 0xC3, 0x5E, 0xC0, 0xC4, 0x5E, 0xC1, 0xC4}; -static char firw_data[] = {0x86,0xC6,0xF8,0x8B,0xCC,0xFC,0x80,0xD9,0xF7,0x7B,0xE9,0xF5,0x7A,0xE3,0xF8,0x84,0xEE,0xF8,0x85,0xEB,0xEB,0x89,0xEB,0xF1,0x7B,0xEA,0xED,0x7F,0xEB,0xF2,0x84,0xF1,0xFF,0x87,0xFC,0xFF,0x8F,0xEE,0xFF,0x8C,0xED,0xFB,0x9E,0xF8,0xF5,0xA2,0xF2,0xF1,0xA1,0xF8,0xED,0x99,0xED,0xE8,0x99,0xED,0xEC,0x8E,0xE6,0xEB,0x93,0xE4,0xE5,0x90,0xE0,0xDE,0x90,0xE0,0xDB,0xA0,0xD2,0xDF,0x9A,0xCB,0xDB,0x9F,0xBD,0xE0,0x99,0xB8,0xE0,0xA5,0xBE,0xD9,0xAB,0xAF,0xD8,0xB0,0xB7,0xD9,0xB8,0xAA,0xD2,0xC6,0xA3,0xC3,0xC6,0xA7,0xC0,0xC2,0xB0,0xC0,0xC9,0xB3,0xBA,0xC9,0xB8,0xBC,0xE0,0xB1,0xBB,0xD8,0xAE,0xB9,0xD8,0xB5,0xAE,0xD9,0xAF,0xA9,0xDE,0xB7,0xB0,0xE7,0xB2,0xB0,0xE2,0xB8,0xA8,0xDB,0xB5,0xA8,0xDC,0xB9,0xA6,0xEA,0xC3,0xA2,0xEA,0xC1,0xA5,0xF9,0xB9,0x9B,0xFA,0xB1,0x95,0xFF,0xAA,0x81,0xFF,0xA0,0x81,0xFF,0x9F,0x86,0xFF,0x94,0x82,0xFF,0x91,0x86,0xFF,0x8E,0x8F,0xFF,0x82,0x8F,0xFF,0x86,0x93,0xFB,0x8F,0x92,0xF9,0x90,0x94,0xE8,0x83,0xA2,0xE4,0x7E,0x95,0xE6,0x71,0x8E,0xE2,0x6A,0x82,0xE9,0x62,0x72,0xEC,0x57,0x6F,0xF2,0x54,0x71,0xF4,0x48,0x78,0xF5,0x45,0x7C,0xEB,0x46,0x7A,0xF2,0x54,0x88,0xF9,0x59,0x8C,0xFF,0x58,0x84,0xFF,0x52,0x8A,0xFF,0x56,0x85,0xFF,0x54,0x84,0xFF,0x57,0x8E,0xFF,0x61,0x97,0xFF,0x51,0x9F,0xFF,0x54,0xA0,0xFF,0x50,0x9A,0xFF,0x53,0xA7,0xFF,0x59,0xA1,0xFF,0x5E,0xA3,0xFF,0x5C,0xAB,0xFF,0x63,0xA7,0xFF,0x5B,0xA5,0xFB,0x57,0xA6,0xFB,0x5C,0xAF,0xF7,0x57,0xB3,0xEB,0x58,0xB5,0xE4,0x47,0xBB,0xE7,0x4C,0xC9,0xD8,0x50,0xC5,0xD4,0x51,0xD0,0xC8,0x4E,0xD8,0xC6,0x4A,0xDC,0xC9,0x44,0xDB,0xB7,0x47,0xCF,0xB0,0x44,0xC7,0x9E,0x44,0xC3,0x9C,0x4A,0xC5,0x97,0x44,0xC8,0x8E,0x44,0xCD,0x81,0x44,0xC6,0x8A,0x44,0xC1,0x87,0x44,0xC8,0x8A,0x44,0xCE,0x90,0x44,0xC7,0x86,0x44,0xC5,0x8A,0x44,0xC9,0x7F,0x44,0xC7,0x82,0x44,0xBF,0x87,0x44,0xBA,0x8C,0x44,0xB7,0x86,0x44,0xAE,0x7C,0x46,0xA5,0x73,0x4A,0xA9,0x75,0x49,0xA5,0x7B,0x47,0xA1,0x73,0x44,0x9D,0x7C,0x44,0x92,0x7D,0x44,0x90,0x87,0x44,0x88,0x7F,0x44,0x93,0x76,0x44,0x9D,0x7A,0x44,0x9D,0x7C,0x44,0x9F,0x80,0x44,0xA7,0x7E,0x44,0x98,0x82,0x44,0x94,0x80,0x44,0x94,0x8E,0x46,0x92,0x85,0x44,0x95,0x7F,0x44,0x89,0x7B,0x49,0x95,0x77,0x57,0x9E,0x7A,0x58,0xA7,0x77,0x5D,0xB3,0x76,0x64,0xAE,0x71,0x6B,0xA5,0x78,0x7A,0xA5,0x76,0x7D,0x9C,0x85,0x7F,0xA0,0x89,0x7C,0x9B,0x92,0x77,0x8C,0x96,0x6A,0x97,0x96,0x77,0x93,0xA9,0x7F,0x92,0xAC,0x80,0x9A,0xAD,0x89,0xA1,0xAA,0x86,0xA8,0xAF,0x98,0xAC,0xAE,0x9F,0xAF,0xB6,0xA6,0xB9,0xB1,0xA8,0xAF,0xBA,0xB0,0xAB,0xBF,0xAA,0xAD,0xBB,0xAD,0xA6,0xC3,0xAC,0xA4,0xC0,0xB7,0xA5,0xCD,0xB9,0xA9,0xDD,0xB1,0xA9,0xE8,0xBF,0x9D,0xEC,0xB9,0x9A,0xF4,0xC9,0x9E,0xEE,0xD3,0x95,0xF4,0xD5,0x9C,0xF1,0xD1,0x9F,0xF1,0xD3,0x9A,0xF2,0xCD,0x8F,0xE4,0xD7,0x92,0xE8,0xD6,0x98,0xE8,0xCA,0x9D,0xE6,0xCE,0xA2,0xE0,0xC3,0xA2,0xDE,0xBE,0xA0,0xDB,0xB2,0x9C,0xED,0xB1,0xA1,0xEF,0xAA,0x9F,0xED,0x9B,0x9D,0xEE,0x8F,0x96,0xEB,0x95,0x9C,0xF3,0x95,0xA3,0xED,0x9A,0xAB,0xF0,0x92,0xB3,0xF1,0x85,0xBD,0xF5,0x89,0xC9,0xF3,0x81,0xC7,0xF6,0x81,0xC2,0xEF,0x87,0xC7,0xF3,0x8A,0xC2,0xF5,0x85,0xC3,0xE4,0x86,0xC5,0xE1,0x87,0xBE,0xD6,0x92,0xBC,0xD5,0x9D,0xB7,0xCE,0x9F,0xB7,0xCC,0xA0,0xAD,0xCD,0x9C,0x9B,0xCF,0x9D,0x93}; -#endif \ No newline at end of file diff --git a/http.h b/http.h deleted file mode 100755 index 2ad7ccc28..000000000 --- a/http.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Powder Toy - HTTP Library (Header) - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * - * 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 02111-1301 USA - */ -#ifndef HTTP_H -#define HTTP_H - -void http_init(char *proxy); -void http_done(void); - -char *http_simple_get(char *uri, int *ret, int *len); -char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len); -char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len); - -void http_auth_headers(void *ctx, char *user, char *pass); - -void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep); -void http_async_add_header(void *ctx, char *name, char *data); -int http_async_req_status(void *ctx); -void http_async_get_length(void *ctx, int *total, int *done); -char *http_async_req_stop(void *ctx, int *ret, int *len); -void http_async_req_close(void *ctx); - -char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len); - -char *http_ret_text(int ret); - -#endif diff --git a/icon.h b/icon.h deleted file mode 100755 index 89b2c7f83..000000000 --- a/icon.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Powder Toy - Main source - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * - * 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 02111-1301 USA - */ -static unsigned char app_icon[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x05,0x06,0x06,0xFF,0x09,0x09,0x0A,0xFF,0x2F,0x08,0x08,0xFF,0x56,0x06,0x07,0xFF,0x23,0x06,0x06,0xFF,0x85,0x02,0x06,0xFF,0xE5,0x02,0x07,0xFF,0xF2,0x1E,0x08,0xFF,0xED,0x0A,0x08,0xFF,0x60,0x07,0x08,0xFF,0x5F,0x08,0x08,0xFF,0x68,0x08,0x08,0xFF,0x18,0x07,0x08,0xFF,0x05,0x04,0x04,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB6,0x00,0x00,0xFF,0xD3,0x00,0x00,0xFF,0xEE,0x00,0x00,0xFF,0xF9,0x00,0x00,0xFF,0x91,0x00,0x00,0xFF,0xDD,0x15,0x00,0xFF,0xFF,0x74,0x00,0xFF,0xFF,0xBF,0x00,0xFF,0xFC,0x37,0x00,0xFF,0xAE,0x00,0x00,0xFF,0xD7,0x00,0x00,0xFF,0xFA,0x00,0x00,0xFF,0xE5,0x01,0x00,0xFF,0xB3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xF9,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE9,0x00,0x00,0xFF,0xFA,0x90,0x02,0xFF,0xFF,0xFF,0x1A,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0xA4,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xF6,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE8,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xB7,0x2E,0xFF,0xFF,0xFF,0xA1,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFA,0x3E,0xFF,0xFF,0x63,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE4,0x00,0x00,0xFF,0xFF,0x21,0x00,0xFF,0xFF,0x61,0x00,0xFF,0xFF,0x94,0x00,0xFF,0xFF,0x8C,0x00,0xFF,0xFF,0xE1,0x5C,0xFF,0xFF,0xFF,0xCD,0xFF,0xFF,0xFF,0xAE,0xFF,0xFF,0xFF,0x6F,0xFF,0xFF,0xF9,0x1D,0xFF,0xFF,0xC3,0x00,0xFF,0xFF,0x99,0x00,0xFF,0xFF,0x48,0x00,0xFF,0xDF,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xC5,0x00,0x00,0xFF,0xFF,0x64,0x00,0xFF,0xFF,0xEF,0x09,0xFF,0xFF,0xFF,0x46,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBC,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF,0x69,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0x81,0x00,0xFF,0xD0,0x01,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB1,0x00,0x00,0xFF,0xEC,0x14,0x00,0xFF,0xFF,0x90,0x13,0xFF,0xFF,0xF9,0x8E,0xFF,0xFF,0xFF,0xE6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xF2,0xC9,0xFF,0xFF,0xFA,0xBD,0xFF,0xFF,0xFF,0xA8,0xFF,0xFF,0xFC,0x9A,0xFF,0xFF,0xA4,0x2A,0xFF,0xFD,0x15,0x00,0xFF,0xEB,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD5,0xFF,0x1F,0x30,0xD5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF }; -static unsigned char app_icon_w32[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x44,0x47,0x49,0x00,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x86,0x88,0x8A,0xFF,0xD8,0xDE,0xE6,0xFF,0xD1,0xD7,0xDF,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x81,0x84,0x88,0xFF,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x83,0x85,0x89,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x14,0x00,0x00,0xFF,0xE1,0x01,0x00,0xFF,0xF4,0x03,0x00,0xFF,0x24,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x86,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0xE7,0x0A,0x01,0xFF,0xFF,0x07,0x01,0xFF,0x41,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0x16,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x0B,0x00,0x00,0xFF,0x55,0x02,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x39,0x00,0x00,0xFF,0xF8,0x1B,0x02,0xFF,0xFF,0x2F,0x03,0xFF,0x52,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1C,0x00,0x00,0xFF,0x5C,0x01,0x00,0xFF,0x09,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0xAE,0x04,0x01,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x50,0x00,0x00,0xFF,0xFE,0x44,0x02,0xFF,0xFF,0x5C,0x03,0xFF,0x60,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x12,0x00,0x00,0xFF,0x9F,0x02,0x00,0xFF,0x49,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x73,0x04,0x00,0xFF,0xEC,0x09,0x01,0xFF,0x2B,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x13,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x4E,0x06,0x00,0xFF,0xFF,0xC1,0x08,0xFF,0xFD,0x9A,0x07,0xFF,0x49,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x01,0x00,0xFF,0xD5,0x03,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0xB7,0x0D,0x01,0xFF,0xFF,0x0F,0x02,0xFF,0xDE,0x00,0x00,0xFF,0xAB,0x00,0x00,0xFF,0xA5,0x01,0x00,0xFF,0x3D,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x35,0x03,0xFF,0xFF,0xF0,0x0E,0xFF,0xDF,0x4B,0x01,0xFF,0x14,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x55,0x00,0x00,0xFF,0xFF,0x05,0x01,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xE5,0x0F,0x01,0xFF,0xFF,0x0D,0x02,0xFF,0xFF,0x04,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xFF,0x01,0x00,0xFF,0x8F,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xD9,0x47,0x03,0xFF,0xFF,0x92,0x06,0xFF,0xAF,0x12,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x20,0x00,0x00,0xFF,0xE5,0x08,0x01,0xFF,0xD1,0x04,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x30,0x01,0x00,0xFF,0xF6,0x47,0x04,0xFF,0xFF,0x1F,0x02,0xFF,0xFF,0x03,0x01,0xFF,0xFF,0x06,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xC7,0x01,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x06,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x38,0x02,0x00,0xFF,0xFB,0x72,0x07,0xFF,0xFF,0x5A,0x03,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA1,0x02,0x00,0xFF,0xFF,0x0C,0x03,0xFF,0x7B,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x06,0x00,0xFF,0xFF,0xBB,0x0C,0xFF,0xFF,0x56,0x04,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x10,0x03,0xFF,0xFF,0x02,0x01,0xFF,0xDE,0x01,0x00,0xFF,0x34,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x05,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x03,0x00,0xFF,0xFC,0x83,0x06,0xFF,0xFF,0x71,0x03,0xFF,0x83,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFB,0x18,0x03,0xFF,0xFF,0x0E,0x02,0xFF,0xB9,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x21,0x01,0x00,0xFF,0xE8,0xB9,0x0F,0xFF,0xFF,0x8F,0x0C,0xFF,0xFF,0x02,0x00,0xFF,0xFF,0x3C,0x04,0xFF,0xFF,0x16,0x02,0xFF,0xFD,0x00,0x00,0xFF,0x63,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x40,0x0B,0x00,0xFF,0xFE,0xAD,0x06,0xFF,0xFF,0xC9,0x06,0xFF,0xCC,0x45,0x02,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x49,0x03,0xFF,0xFF,0x7E,0x03,0xFF,0xFF,0x45,0x01,0xFF,0x67,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0xFF,0xCC,0xA0,0x08,0xFF,0xFB,0xAA,0x0A,0xFF,0xC9,0x00,0x00,0xFF,0xFE,0x6B,0x03,0xFF,0xFF,0x79,0x02,0xFF,0xF9,0x0A,0x00,0xFF,0x4C,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3F,0x14,0x00,0xFF,0xFC,0xDF,0x10,0xFF,0xFF,0xFF,0x10,0xFF,0xFA,0xCD,0x14,0xFF,0x46,0x0C,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x7F,0x03,0xFF,0xFF,0xFF,0x06,0xFF,0xFF,0xE7,0x03,0xFF,0xD5,0x39,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x06,0x00,0xFF,0xEA,0xCF,0x17,0xFF,0xE2,0xA6,0x10,0xFF,0x32,0x00,0x00,0xFF,0xCB,0x80,0x06,0xFF,0xFF,0xF4,0x09,0xFF,0xD8,0x44,0x00,0xFF,0x10,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x44,0x21,0x00,0xFF,0xFD,0xE9,0x1C,0xFF,0xFF,0xD6,0x09,0xFF,0xFF,0xFF,0x28,0xFF,0xB4,0x75,0x04,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x8D,0x03,0xFF,0xFF,0xFF,0x41,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0x7E,0x01,0xFF,0x4C,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x49,0x30,0x04,0xFF,0xFF,0xFC,0x5A,0xFF,0xB0,0x7E,0x14,0xFF,0x00,0x00,0x00,0xFF,0x89,0x66,0x0F,0xFF,0xFF,0xFF,0x6B,0xFF,0xE6,0xA7,0x1E,0xFF,0x1E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x6F,0x5A,0x18,0xFF,0xFF,0xFE,0x70,0xFF,0xCD,0x6C,0x04,0xFF,0xE8,0xB5,0x27,0xFF,0xFE,0xF3,0x60,0xFF,0x6E,0x3D,0x08,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xDB,0x8A,0x26,0xFF,0xFF,0xFF,0xD5,0xFF,0xFF,0xFF,0xD8,0xFF,0xFF,0xCF,0x3A,0xFF,0x94,0x12,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x15,0x0A,0x01,0xFF,0xBF,0xAC,0x7E,0xFF,0xFF,0xFF,0xDE,0xFF,0x82,0x5F,0x20,0xFF,0x00,0x00,0x00,0xFF,0x67,0x5B,0x28,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xF1,0xAA,0xFF,0x5D,0x2E,0x07,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x18,0x0D,0x02,0xFF,0xD0,0xC0,0x90,0xFF,0xFF,0xFF,0xF4,0xFF,0x92,0x61,0x27,0xFF,0x72,0x3F,0x0F,0xFF,0xFF,0xFF,0xE2,0xFF,0xFA,0xE5,0xAE,0xFF,0x80,0x4B,0x19,0xFF,0x02,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xC9,0xA1,0x64,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xB2,0xFF,0xA1,0x33,0x03,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x96,0x7E,0x5E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7E,0x6A,0x41,0xFF,0x00,0x00,0x00,0xFF,0x7F,0x75,0x56,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9,0x8D,0x54,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8C,0x69,0x4F,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x93,0x82,0x58,0xFF,0x16,0x05,0x00,0xFF,0xEB,0xDB,0xB8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0xBD,0xFF,0x62,0x42,0x14,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA3,0x7F,0x47,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xDD,0xA4,0xFF,0x51,0x19,0x02,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0xD0,0xB6,0x88,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x6A,0x5A,0x39,0xFF,0x00,0x00,0x00,0xFF,0x85,0x7D,0x4E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB4,0xA5,0x73,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xB5,0x9B,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8B,0x78,0x4E,0xFF,0x00,0x00,0x00,0xFF,0xCC,0xAE,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x74,0x38,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x24,0x14,0x03,0xFF,0x8C,0x7E,0x44,0xFF,0xA2,0x8E,0x5D,0xFF,0x5B,0x37,0x17,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x71,0x46,0x1E,0xFF,0xCB,0xA4,0x71,0xFF,0xAC,0x93,0x66,0xFF,0x17,0x0E,0x04,0xFF,0x00,0x00,0x00,0xFF,0x30,0x23,0x0A,0xFF,0xBF,0xA4,0x60,0xFF,0xC4,0xAC,0x78,0xFF,0x43,0x34,0x1A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x5C,0x3D,0x18,0xFF,0xC9,0xA9,0x6F,0xFF,0xB8,0x94,0x63,0xFF,0x2A,0x19,0x07,0xFF,0x00,0x00,0x00,0xFF,0x53,0x3B,0x16,0xFF,0xC7,0xB6,0x70,0xFF,0xBD,0xA2,0x66,0xFF,0x2C,0x1C,0x09,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD6,0xFF,0x1F,0x30,0xD6,0xFF,0x00,0x00,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0x00,0x00,0x00,0xFF,0xC8,0x47,0x0E,0xFF,0xC8,0x47,0x0E,0xFF,0x00,0x00,0x00,0xFF,0x20,0xE6,0x0F,0xFF,0x20,0xE6,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xEB,0xF5,0x22,0xFF,0xEB,0xF5,0x22,0xFF,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x44,0x46,0x48,0x00,0x7A,0x7D,0x81,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x83,0x86,0x8A,0xFF,0x86,0x89,0x8C,0xFF,0x89,0x8C,0x8F,0xFF,0x87,0x8A,0x8F,0xFF,0x85,0x87,0x8B,0xFF,0x82,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00 }; \ No newline at end of file diff --git a/interface.c b/interface.c deleted file mode 100644 index 27232c969..000000000 --- a/interface.c +++ /dev/null @@ -1,2961 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "http.h" -#include "md5.h" -#include "font.h" -#include "defines.h" -#include "powder.h" -#include "interface.h" -#include "misc.h" - -SDLMod sdl_mod; -int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; - -char *shift_0="`1234567890-=[]\\;',./"; -char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; - -int svf_login = 0; -int svf_admin = 0; -int svf_mod = 0; -char svf_user[64] = ""; -char svf_pass[64] = ""; - -int svf_open = 0; -int svf_own = 0; -int svf_myvote = 0; -int svf_publish = 0; -char svf_id[16] = ""; -char svf_name[64] = ""; -char svf_tags[256] = ""; -void *svf_last = NULL; -int svf_lsize; - -char *search_ids[GRID_X*GRID_Y]; -char *search_dates[GRID_X*GRID_Y]; -int search_votes[GRID_X*GRID_Y]; -int search_publish[GRID_X*GRID_Y]; -int search_scoredown[GRID_X*GRID_Y]; -int search_scoreup[GRID_X*GRID_Y]; -char *search_names[GRID_X*GRID_Y]; -char *search_owners[GRID_X*GRID_Y]; -void *search_thumbs[GRID_X*GRID_Y]; -int search_thsizes[GRID_X*GRID_Y]; - -int search_own = 0; -int search_date = 0; -int search_page = 0; -char search_expr[256] = ""; - -char *tag_names[TAG_MAX]; -int tag_votes[TAG_MAX]; - -int Z_keysym = 'z'; - -int zoom_en = 0; -int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; -int zoom_wx=0, zoom_wy=0; -unsigned char ZFACTOR = 256/ZSIZE_D; -unsigned char ZSIZE = ZSIZE_D; - -void menu_count(void) -{ - int i=0; - msections[SC_WALL].itemcount = UI_WALLCOUNT-4; - msections[SC_SPECIAL].itemcount = 4; - for(i=0; i 18) ? signs[i].y - 18 : signs[i].y + 4; -} - -void add_sign_ui(pixel *vid_buf, int mx, int my) -{ - int i, w, h, x, y, nm=0, ju; - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; - ui_edit ed; - - // check if it is an existing sign - for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) - break; - } - // else look for empty spot - if(i >= MAXSIGNS) - { - nm = 1; - for(i=0; i= MAXSIGNS) - return; - - if(nm) - { - signs[i].x = mx; - signs[i].y = my; - signs[i].ju = 1; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = x0+25; - ed.y = y0+25; - ed.w = 158; - ed.nx = 1; - ed.def = "[message]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(signs[i].text); - strcpy(ed.str, signs[i].text); - ju = signs[i].ju; - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed); - drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); - draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); - draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); - draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); - - if(!nm) - { - drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); - drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); - drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); - } - - drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) - ju = 0; - if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) - ju = 1; - if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) - ju = 2; - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) - { - signs[i].text[0] = 0; - return; - } - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - { - if(!ed.focus) - return; - ed.focus = 0; - } - } - - strcpy(signs[i].text, ed.str); - signs[i].ju = ju; -} - -void ui_edit_draw(pixel *vid_buf, ui_edit *ed) -{ - int cx, i; - char echo[256], *str; - - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(ed->str[0]) - { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); - } - else if(!ed->focus) - drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); - if(ed->focus) - { - cx = textnwidth(str, ed->cursor); - for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); - } -} - -void ui_edit_process(int mx, int my, int mb, ui_edit *ed) -{ - char ch, ts[2], echo[256], *str; - int l, i; -#ifdef RAWINPUT - char *p; -#endif - - if(mb) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } - else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } - else - ed->focus = 0; - } - if(ed->focus && sdl_key) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - l = strlen(ed->str); - switch(sdl_key) - { - case SDLK_HOME: - ed->cursor = 0; - break; - case SDLK_END: - ed->cursor = l; - break; - case SDLK_LEFT: - if(ed->cursor > 0) - ed->cursor --; - break; - case SDLK_RIGHT: - if(ed->cursor < l) - ed->cursor ++; - break; - case SDLK_DELETE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - ed->str[ed->cursor] = 0; - else if(ed->cursor < l) - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - break; - case SDLK_BACKSPACE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - { - if(ed->cursor > 0) - memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); - ed->cursor = 0; - } - else if(ed->cursor > 0) - { - ed->cursor--; - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - } - break; - default: -#ifdef RAWINPUT - if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) - { - ch = sdl_key; - if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) - { - if(ch>='a' && ch<='z') - ch &= ~0x20; - p = strchr(shift_0, ch); - if(p) - ch = shift_1[p-shift_0]; - } - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#else - if(sdl_ascii>=' ' && sdl_ascii<127) - { - ch = sdl_ascii; - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#endif - break; - } - } -} - -void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) -{ - int w = 12; - if(ed->checked) - { - drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); - } - if(ed->focus) - { - drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); - } - else - { - drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); - } -} - -void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) -{ - int w = 12; - - if(mb && !mbq) - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->checked = (ed->checked)?0:1; - } - } - else - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->focus = 1; - } - else - { - ed->focus = 0; - } - } -} - -void draw_svf_ui(pixel *vid_buf) -{ - int c; - - drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); - drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - c = svf_open ? 255 : 128; - drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); - drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); - - c = svf_login ? 255 : 128; - drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); - if(svf_open) - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); - else - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); - drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); - if(svf_open && svf_own) - drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); - - c = (svf_login && svf_open) ? 255 : 128; - - drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - - if(svf_myvote==1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); - } - else if(svf_myvote==-1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); - } - - drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); - drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); - - drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); - if(svf_tags[0]) - drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); - else - drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); - - drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); - - drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); - drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); - if(svf_login) - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); - else - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); - drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); - - if(sys_pause) - { - fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); - drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - if(!legacy_enable) - { - fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - switch(cmode) - { - case 0: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); - break; - case 1: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); - break; - case 2: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); - break; - case 3: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); - break; - case 4: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); - break; - case 5: - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - break; - case 6: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xC4", 100, 150, 255, 255); - break; - } - drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - - if(svf_admin) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); - } - else if(svf_mod) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - }//else if(amd) - // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? -} - -void error_ui(pixel *vid_buf, int err, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - char *msg; - - msg = malloc(strlen(txt)+16); - if(err) - sprintf(msg, "%03d %s", err, txt); - else - sprintf(msg, "%s", txt); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - if(err) - drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); - else - drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - free(msg); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_ui(pixel *vid_buf, char *top, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); - drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_box(pixel *vid_buf, char *msg) -{ - int w = textwidth(msg)+16; - int x0=(XRES-w)/2,y0=(YRES-24)/2; - - clearrect(vid_buf, x0-2, y0-2, w+4, 28); - drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); -} - -int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - int ret = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); - drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); - drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); - drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) - { - ret = 1; - break; - } - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - { - ret = 1; - break; - } - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - return ret; -} - -void login_ui(pixel *vid_buf) -{ - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq,mx,my,err; - ui_edit ed1,ed2; - char *res; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed1.x = x0+25; - ed1.y = y0+25; - ed1.w = 158; - ed1.nx = 1; - ed1.def = "[user name]"; - ed1.focus = 1; - ed1.hide = 0; - ed1.cursor = strlen(svf_user); - strcpy(ed1.str, svf_user); - ed2.x = x0+25; - ed2.y = y0+45; - ed2.w = 158; - ed2.nx = 1; - ed2.def = "[password]"; - ed2.focus = 0; - ed2.hide = 1; - ed2.cursor = 0; - strcpy(ed2.str, ""); - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, "Server login:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\x8B", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\x8A", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - drawtext(vid_buf, x0+11, y0+44, "\x8C", 160, 144, 32, 255); - drawtext(vid_buf, x0+11, y0+44, "\x84", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+40, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed1); - ui_edit_draw(vid_buf, &ed2); - drawtext(vid_buf, x0+5, y0+69, "Sign in", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed1); - ui_edit_process(mx, my, b, &ed2); - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) - { - if(!ed1.focus) - break; - ed1.focus = 0; - ed2.focus = 1; - } - if(sdl_key==SDLK_ESCAPE) - { - if(!ed1.focus && !ed2.focus) - return; - ed1.focus = 0; - ed2.focus = 0; - } - } - - strcpy(svf_user, ed1.str); - md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); - - res = http_multipart_post( - "http://" SERVER "/Login.api", - NULL, NULL, NULL, - svf_user, svf_pass, - &err, NULL); - if(err != 200) - { - error_ui(vid_buf, err, http_ret_text(err)); - if(res) - free(res); - goto fail; - } - if(res && !strncmp(res, "OK", 2)) - { - if(!strcmp(res, "OK ADMIN")) - { - svf_admin = 1; - svf_mod = 0; - } - else if(!strcmp(res, "OK MOD")) - { - svf_admin = 0; - svf_mod = 1; - } - else - { - svf_admin = 0; - svf_mod = 0; - } - free(res); - svf_login = 1; - return; - } - if(!res) - res = mystrdup("Unspecified Error"); - error_ui(vid_buf, 0, res); - free(res); - -fail: - strcpy(svf_user, ""); - strcpy(svf_pass, ""); - svf_login = 0; - svf_own = 0; - svf_admin = 0; - svf_mod = 0; -} - -int stamp_ui(pixel *vid_buf) -{ - int b=1,bq,mx,my,d=-1,i,j,k,x,gx,gy,y,w,h,r=-1,stamp_page=0,per_page=STAMP_X*STAMP_Y,page_count; - char page_info[64]; - page_count = ceil((float)stamp_count/(float)per_page); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); - k = stamp_page*per_page;//0; - r = -1; - d = -1; - for(j=0; j=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) - { - if(stamp_page) - { - stamp_page --; - } - sdl_wheel = 0; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=20) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - if(b==1&&h!=-1) - { - *sl = h; - } - if(b==4&&h!=-1) - { - *sr = h; - } -} - -int sdl_poll(void) -{ - SDL_Event event; - sdl_key=sdl_wheel=sdl_ascii=0; - while(SDL_PollEvent(&event)) - { - switch (event.type) - { - case SDL_KEYDOWN: - sdl_key=event.key.keysym.sym; - sdl_ascii=event.key.keysym.unicode; - if(event.key.keysym.sym == SDLK_CAPSLOCK) - sdl_caps = 1; - if(event.key.keysym.unicode=='z' || event.key.keysym.unicode=='Z') - { - sdl_zoom_trig = 1; - Z_keysym = event.key.keysym.sym; - } - if( event.key.keysym.sym == SDLK_PLUS) - { - sdl_wheel++; - } - if( event.key.keysym.sym == SDLK_MINUS) - { - sdl_wheel--; - } - // 4 - //1 8 2 - if(event.key.keysym.sym == SDLK_RIGHT) - { - player[0] = (int)(player[0])|0x02; //Go right command - } - if(event.key.keysym.sym == SDLK_LEFT) - { - player[0] = (int)(player[0])|0x01; //Go left command - } - if(event.key.keysym.sym == SDLK_DOWN && ((int)(player[0])&0x08)!=0x08) - { - player[0] = (int)(player[0])|0x08; //Go left command - } - if(event.key.keysym.sym == SDLK_UP && ((int)(player[0])&0x04)!=0x04) - { - player[0] = (int)(player[0])|0x04; //Jump command - } - break; - - case SDL_KEYUP: - if(event.key.keysym.sym == SDLK_CAPSLOCK) - sdl_caps = 0; - if(event.key.keysym.sym == Z_keysym) - sdl_zoom_trig = 0; - if(event.key.keysym.sym == SDLK_RIGHT || event.key.keysym.sym == SDLK_LEFT) - { - player[1] = player[0]; //Saving last movement - player[0] = (int)(player[0])&12; //Stop command - } - if(event.key.keysym.sym == SDLK_UP) - { - player[0] = (int)(player[0])&11; - } - if(event.key.keysym.sym == SDLK_DOWN) - { - player[0] = (int)(player[0])&7; - } - break; - case SDL_MOUSEBUTTONDOWN: - if(event.button.button == SDL_BUTTON_WHEELUP) - sdl_wheel++; - if(event.button.button == SDL_BUTTON_WHEELDOWN) - sdl_wheel--; - break; - case SDL_QUIT: - return 1; - } - } - sdl_mod = SDL_GetModState(); - return 0; -} - -void set_cmode(int cm) -{ - cmode = cm; - itc = 51; - if(cmode==4) - { - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - strcpy(itc_msg, "Blob Display"); - } - else if(cmode==5) - { - strcpy(itc_msg, "Heat Display"); - } - else if(cmode==6) - { - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - strcpy(itc_msg, "Fancy Display"); - } - else if(cmode==3) - { - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - strcpy(itc_msg, "Fire Display"); - } - else if(cmode==2) - { - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - strcpy(itc_msg, "Persistent Display"); - } - else if(cmode==1) - strcpy(itc_msg, "Pressure Display"); - else - strcpy(itc_msg, "Velocity Display"); -} - -char *download_ui(pixel *vid_buf, char *uri, int *len) -{ - int dstate = 0; - void *http = http_async_req_start(NULL, uri, NULL, 0, 0); - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2; - int done, total, i, ret, zlen, ulen; - char str[16], *tmp, *res; - - while(!http_async_req_status(http)) - { - sdl_poll(); - - http_async_get_length(http, &total, &done); - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, "Please wait", 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, "Downloading update...", 255, 255, 255, 255); - - if(total) - { - i = (236*done)/total; - fillrect(vid_buf, x0+1, y0+45, i+1, 14, 255, 216, 32, 255); - i = (100*done)/total; - sprintf(str, "%d%%", i); - if(i<50) - drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 192, 192, 192, 255); - else - drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 0, 0, 0, 255); - } - else - drawtext(vid_buf, x0+120-textwidth("Waiting...")/2, y0+48, "Waiting...", 255, 216, 32, 255); - - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - } - - tmp = http_async_req_stop(http, &ret, &zlen); - if(ret!=200) - { - error_ui(vid_buf, ret, http_ret_text(ret)); - if(tmp) - free(tmp); - return NULL; - } - if(!tmp) - { - error_ui(vid_buf, 0, "Server did not return data"); - return NULL; - } - - if(zlen<16) - { - printf("ZLen is not 16!\n"); - goto corrupt; - } - if(tmp[0]!=0x42 || tmp[1]!=0x75 || tmp[2]!=0x54 || tmp[3]!=0x54) - { - printf("Tmperr %d, %d, %d, %d\n", tmp[0], tmp[1], tmp[2], tmp[3]); - goto corrupt; - } - - ulen = (unsigned char)tmp[4]; - ulen |= ((unsigned char)tmp[5])<<8; - ulen |= ((unsigned char)tmp[6])<<16; - ulen |= ((unsigned char)tmp[7])<<24; - - res = (char *)malloc(ulen); - if(!res) - { - printf("No res!\n"); - goto corrupt; - } - dstate = BZ2_bzBuffToBuffDecompress((char *)res, (unsigned *)&ulen, (char *)(tmp+8), zlen-8, 0, 0); - if(dstate) - { - printf("Decompression failure: %d!\n", dstate); - free(res); - goto corrupt; - } - - free(tmp); - if(len) - *len = ulen; - return res; - -corrupt: - error_ui(vid_buf, 0, "Downloaded update is corrupted"); - free(tmp); - return NULL; -} - -int search_ui(pixel *vid_buf) -{ - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; - int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; - int thumb_drawn[GRID_X*GRID_Y]; - pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - float ry; - time_t http_last_use=HTTP_TIMEOUT; - ui_edit ed; - - - void *http = NULL; - int active = 0; - char *last = NULL; - int search = 0; - int lasttime = TIMEOUT; - char *uri; - int status; - char *results; - char *tmp, ts[64]; - - void *img_http[IMGCONNS]; - char *img_id[IMGCONNS]; - void *thumb, *data; - int thlen, dlen; - - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - - memset(img_http, 0, sizeof(img_http)); - memset(img_id, 0, sizeof(img_id)); - - memset(search_ids, 0, sizeof(search_ids)); - memset(search_dates, 0, sizeof(search_dates)); - memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); - memset(search_publish, 0, sizeof(search_publish)); - memset(search_owners, 0, sizeof(search_owners)); - memset(search_thumbs, 0, sizeof(search_thumbs)); - memset(search_thsizes, 0, sizeof(search_thsizes)); - - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - - do_open = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = 65; - ed.y = 13; - ed.w = XRES-200; - ed.nx = 1; - ed.def = "[search terms]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(search_expr); - strcpy(ed.str, search_expr); - - sdl_wheel = 0; - - while(!sdl_poll()) - { - uih = 0; - bq = b; - mxq = mx; - myq = my; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - if(mx!=mxq || my!=myq || sdl_wheel || b) - mmt = 0; - else if(mmt 9) - { - drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); - drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); - } - - ui_edit_draw(vid_buf, &ed); - - if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) - { - if(search_page) - { - search_page --; - lasttime = TIMEOUT; - } - sdl_wheel = 0; - uih = 1; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) - { - lasttime = TIMEOUT; - search_page ++; - page_count = exp_res; - } - sdl_wheel = 0; - uih = 1; - } - - tp = -1; - if(is_p1) - { - drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); - for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) - for(gi=0; giTAG_MAX || !tag_names[pos]) - break; - if(tag_votes[0]) - i = 127+(128*tag_votes[pos])/tag_votes[0]; - else - i = 192; - w = textwidth(tag_names[pos]); - if(w>XRES/GRID_X-5) - w = XRES/GRID_X-5; - gx = (XRES/GRID_X)*gi; - gy = gj*14 + 46; - if(mx>=gx && mx=gy && my XRES/GRID_X-10) - { - tmp = malloc(strlen(search_names[pos])+4); - strcpy(tmp, search_names[pos]); - j = textwidthx(tmp, XRES/GRID_X-15); - strcpy(tmp+j, "..."); - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); - free(tmp); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); - j = textwidth(search_owners[pos]); - if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && - my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) - { - st = 1; - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); - if(search_thumbs[pos]&&thumb_drawn[pos]==0) - { - render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); - thumb_drawn[pos] = 1; - } - own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); - if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) - mp = pos; - if(own) - { - if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) - { - mp = -1; - dp = pos; - } - if(!search_dates[pos] && mx>=gx-6 && mx<=gx+4 && my>=gy+YRES/GRID_S-4 && my<=gy+YRES/GRID_S+6) - { - mp = -1; - dap = pos; - } - } - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, 1+(YRES/GRID_S+3)/2, 0, 107, 10, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 6, 1+(YRES/GRID_S+3)/2, 107, 10, 0, 255); - - if(mp==pos && !st) - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); - else - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); - if(own) - { - if(dp == pos) - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); - else - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); - } - if(!search_publish[pos]) - { - drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); - drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(!search_dates[pos] && own) - { - fillrect(vid_buf, gx-5, gy+YRES/GRID_S-3, 7, 8, 255, 255, 255, 255); - if(dap == pos) { - drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 200, 100, 80, 255); - } else { - drawtext(vid_buf, gx-6, gy+YRES/GRID_S-4, "\xA6", 160, 70, 50, 255); - } - //drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(view_own || svf_admin || svf_mod) - { - sprintf(ts+1, "%d", search_votes[pos]); - ts[0] = 0xBB; - for(j=1; ts[j]; j++) - ts[j] = 0xBC; - ts[j-1] = 0xB9; - ts[j] = 0xBA; - ts[j+1] = 0; - w = gx+XRES/GRID_S-2-textwidth(ts); - h = gy+YRES/GRID_S-11; - drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); - for(j=0; ts[j]; j++) - ts[j] -= 14; - drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); - sprintf(ts, "%d", search_votes[pos]); - for(j=0; ts[j]; j++) - ts[j] += 127; - drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); - } - if(search_scoreup[pos]>0||search_scoredown[pos]>0) - { - lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); - - if(((YRES/GRID_S+3)/2)>lv) - { - ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); - if(lv<8) - { - ry = ry/(8-lv); - } - nyu = search_scoreup[pos]*ry; - nyd = search_scoredown[pos]*ry; - } - else - { - ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); - nyu = search_scoreup[pos]/ry; - nyd = search_scoredown[pos]/ry; - } - - - fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-1+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 57, 187, 57, 255); - fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2), 4, nyd, 187, 57, 57, 255); - //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); - } - } - - if(mp!=-1 && mmt>=TIMEOUT/5 && !st) - { - gi = mp % GRID_X; - gj = mp / GRID_X; - if(is_p1) - gj += GRID_Y-GRID_P; - gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; - gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; - i = w = textwidth(search_names[mp]); - h = YRES/GRID_Z+30; - if(w=XRES-2) gx=XRES-3-w; - if(gy<32) gy=32; - if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; - clearrect(vid_buf, gx-2, gy-3, w+4, h); - drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); - if(search_thumbs[mp]) - render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); - drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); - drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(sdl_key==SDLK_RETURN) - { - if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) - lasttime = TIMEOUT; - else if(search_ids[0] && !search_ids[1]) - { - bq = 0; - b = 1; - mp = 0; - } - } - if(sdl_key==SDLK_ESCAPE) - goto finish; - - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) - { - search_own = !search_own; - lasttime = TIMEOUT; - } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) - { - search_date = !search_date; - lasttime = TIMEOUT; - } - - if(b && !bq && dp!=-1) - if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) - { - execute_delete(vid_buf, search_ids[dp]); - lasttime = TIMEOUT; - if(last) - { - free(last); - last = NULL; - } - } - if(b && !bq && dap!=-1) - { - sprintf(ed.str, "history:%s", search_ids[dap]); - lasttime = TIMEOUT; - } - - if(b && !bq && tp!=-1) - { - strncpy(ed.str, tag_names[tp], 255); - lasttime = TIMEOUT; - } - - if(b && !bq && mp!=-1 && st) - { - sprintf(ed.str, "user:%s", search_owners[mp]); - lasttime = TIMEOUT; - } - - if(do_open==1) - { - mp = 0; - } - - if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) - { - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); - - if(search_dates[mp]) { - uri = malloc(strlen(search_ids[mp])*3+strlen(search_dates[mp])*3+strlen(SERVER)+71); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - strappend(uri, "&Date="); - strcaturl(uri, search_dates[mp]); - } else { - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - } - data = http_simple_get(uri, &status, &dlen); - free(uri); - - if(status == 200) - { - status = parse_save(data, dlen, 1, 0, 0); - switch(status) - { - case 1: - error_ui(vid_buf, 0, "Simulation corrupted"); - break; - case 2: - error_ui(vid_buf, 0, "Simulation from a newer version"); - break; - case 3: - error_ui(vid_buf, 0, "Simulation on a too large grid"); - break; - } - if(!status) - { - char *tnames[] = {"ID", NULL}; - char *tparts[1]; - int tplens[1]; - if(svf_last) - free(svf_last); - svf_last = data; - svf_lsize = dlen; - - tparts[0] = search_ids[mp]; - tplens[0] = strlen(search_ids[mp]); - data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); - - svf_open = 1; - svf_own = svf_login && !strcmp(search_owners[mp], svf_user); - svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); - - strcpy(svf_id, search_ids[mp]); - strcpy(svf_name, search_names[mp]); - if(status == 200) - { - if(data) - { - strncpy(svf_tags, data, 255); - svf_tags[255] = 0; - } - else - svf_tags[0] = 0; - } - else - { - svf_tags[0] = 0; - } - - if(svf_login) - { - char *names[] = {"ID", NULL}; - char *parts[1]; - parts[0] = search_ids[mp]; - data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); - if(status == 200) - { - if(data) - { - if(!strcmp(data, "Up")) - { - svf_myvote = 1; - } - else if(!strcmp(data, "Down")) - { - svf_myvote = -1; - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - } - else - { - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - } - } - else - error_ui(vid_buf, status, http_ret_text(status)); - - if(data) - free(data); - goto finish; - } - - if(!last) - { - search = 1; - } - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) - { - search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) - { - search_page = 0; - page_count = 0; - } - free(last); - last = NULL; - } - else - search = 0; - - if(search && lasttime>=TIMEOUT) - { - lasttime = 0; - last = mystrdup(ed.str); - last_own = search_own; - last_date = search_date; - last_page = search_page; - active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); - if(search_own || svf_admin || svf_mod) - tmp = "&ShowVotes=true"; - else - tmp = ""; - if(!search_own && !search_date && !*last) - { - if(search_page) - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); - } - else - { - exp_res = GRID_X*GRID_P; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); - } - } - else - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); - } - strcaturl(uri, last); - if(search_own) - { - strcaturl(uri, " user:"); - strcaturl(uri, svf_user); - } - if(search_date) - strcaturl(uri, " sort:date"); - - http = http_async_req_start(http, uri, NULL, 0, 1); - if(svf_login) - { - http_auth_headers(http, svf_user, svf_pass); - } - http_last_use = time(NULL); - free(uri); - } - - if(active && http_async_req_status(http)) - { - http_last_use = time(NULL); - results = http_async_req_stop(http, &status, NULL); - view_own = last_own; - if(status == 200) - { - page_count = search_results(results, last_own||svf_admin||svf_mod); - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - } - is_p1 = (exp_res < GRID_X*GRID_Y); - free(results); - active = 0; - } - - if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) - { - http_async_req_close(http); - http = NULL; - } - - for(i=0; i=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+5); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str+5, search_thumbs+i, search_thsizes+i); - i++; - } - else if(!strncmp(str, "HISTORY ", 8)) - { - if(i>=GRID_X*GRID_Y) - break; - if(votes) - { - sd = strchr(str+8, ' '); - if(!sd) - return i; - *(sd++) = 0; - pu = strchr(sd, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - sd = strchr(str+8, ' '); - if(!sd) - return i; - *(sd++) = 0; - pu = strchr(sd, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+8); - - search_dates[i] = mystrdup(sd); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str+8, search_thumbs+i, search_thsizes+i); - i++; - } - else if(!strncmp(str, "TAG ", 4)) - { - if(j >= TAG_MAX) - { - str = p; - continue; - } - q = strchr(str+4, ' '); - if(!q) - { - str = p; - continue; - } - *(q++) = 0; - tag_names[j] = mystrdup(str+4); - tag_votes[j] = atoi(q); - j++; - } - else - { - if(i>=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - str = p; - } - if(*str) - i++; - return i; -} - -int execute_tagop(pixel *vid_buf, char *op, char *tag) -{ - int status; - char *result; - - char *names[] = {"ID", "Tag", NULL}; - char *parts[2]; - - char *uri = malloc(strlen(SERVER)+strlen(op)+36); - sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); - - parts[0] = svf_id; - parts[1] = tag; - - result = http_multipart_post( - uri, - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - free(uri); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 1; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 1; - } - - if(result[2]) - { - strncpy(svf_tags, result+3, 255); - svf_id[15] = 0; - } - - if(result) - free(result); - - return 0; -} - -void execute_save(pixel *vid_buf) -{ - int status; - char *result; - - char *names[] = {"Name", "Data:save.bin", "Thumb:thumb.bin", "Publish", "ID", NULL}; - char *parts[5]; - int plens[5]; - - parts[0] = svf_name; - plens[0] = strlen(svf_name); - parts[1] = build_save(plens+1, 0, 0, XRES, YRES); - parts[2] = build_thumb(plens+2, 1); - parts[3] = (svf_publish==1)?"Public":"Private"; - plens[3] = strlen((svf_publish==1)?"Public":"Private"); - - if(svf_id[0]) - { - parts[4] = svf_id; - plens[4] = strlen(svf_id); - } - else - names[4] = NULL; - - result = http_multipart_post( - "http://" SERVER "/Save.api", - names, parts, plens, - svf_user, svf_pass, - &status, NULL); - - if(svf_last) - free(svf_last); - svf_last = parts[1]; - svf_lsize = plens[1]; - - free(parts[2]); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result[2]) - { - strncpy(svf_id, result+3, 15); - svf_id[15] = 0; - } - - if(!svf_id[0]) - { - error_ui(vid_buf, 0, "No ID supplied by server"); - free(result); - return; - } - - thumb_cache_inval(svf_id); - - svf_own = 1; - if(result) - free(result); -} - -void execute_delete(pixel *vid_buf, char *id) -{ - int status; - char *result; - - char *names[] = {"ID", NULL}; - char *parts[1]; - - parts[0] = id; - - result = http_multipart_post( - "http://" SERVER "/Delete.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result) - free(result); -} - -int execute_vote(pixel *vid_buf, char *id, char *action) -{ - int status; - char *result; - - char *names[] = {"ID", "Action", NULL}; - char *parts[2]; - - parts[0] = id; - parts[1] = action; - - result = http_multipart_post( - "http://" SERVER "/Vote.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 0; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 0; - } - - if(result) - free(result); - return 1; -} \ No newline at end of file diff --git a/interface.h b/interface.h deleted file mode 100644 index 7f130649a..000000000 --- a/interface.h +++ /dev/null @@ -1,183 +0,0 @@ -#ifndef INTERFACE_H -#define INTERFACE_H -#include -#include "graphics.h" - -struct menu_section -{ - char *icon; - const char *name; - int itemcount; -}; -typedef struct menu_section menu_section; - -struct menu_wall -{ - pixel colour; - const char *descs; -}; -typedef struct menu_wall menu_wall; - -static menu_wall mwalls[] = -{ - {PIXPACK(0xC0C0C0), "Wall. Indestructible. Blocks everything. Conductive."}, - {PIXPACK(0x808080), "E-Wall. Becomes transparent when electricity is connected."}, - {PIXPACK(0xFF8080), "Detector. Generates electricity when a particle is inside."}, - {PIXPACK(0x808080), "Streamline. Set start point of a streamline."}, - {PIXPACK(0x808080), "Sign. Click on a sign to edit it or anywhere else to place a new one."}, - {PIXPACK(0x8080FF), "Fan. Accelerates air. Use line tool to set direction and strength."}, - {PIXPACK(0xC0C0C0), "Wall. Blocks most particles but lets liquids through. Conductive."}, - {PIXPACK(0x808080), "Wall. Absorbs particles but lets air currents through."}, - {PIXPACK(0x808080), "Erases walls."}, - {PIXPACK(0x808080), "Wall. Indestructible. Blocks everything."}, - {PIXPACK(0x3C3C3C), "Wall. Indestructible. Blocks particles, allows air"}, - {PIXPACK(0x575757), "Wall. Indestructible. Blocks liquids and gasses, allows solids"}, - {PIXPACK(0xFFFF22), "Conductor, allows particles, conducts electricity"}, - {PIXPACK(0x242424), "E-Hole, absorbs particles, release them when powered"}, - {PIXPACK(0xFFFFFF), "Air, creates airflow and pressure"}, - {PIXPACK(0xFFBB00), "Heats the targetted element."}, - {PIXPACK(0x00BBFF), "Cools the targetted element."}, - {PIXPACK(0x303030), "Vacuum, reduces air pressure."}, - {PIXPACK(0x579777), "Wall. Indestructible. Blocks liquids and solids, allows gasses"}, -}; - -#define SC_WALL 0 -#define SC_SPECIAL 8 -#define SC_POWDERS 5 -#define SC_SOLIDS 6 -#define SC_ELEC 1 -#define SC_EXPLOSIVE 2 -#define SC_GAS 3 -#define SC_LIQUID 4 -#define SC_NUCLEAR 7 -#define SC_TOTAL 9 - -static menu_section msections[] = -{ - {"\xC1", "Walls", 0}, - {"\xC2", "Electronics", 0}, - {"\xC3", "Explosives", 0}, - {"\xC5", "Gasses", 0}, - {"\xC4", "Liquids", 0}, - {"\xD0", "Powders", 0}, - {"\xD1", "Solids", 0}, - {"\xC6", "Radioactive", 0}, - {"\xCC", "Special", 0}, -}; - -struct ui_edit -{ - int x, y, w, nx; - char str[256],*def; - int focus, cursor, hide; -}; -typedef struct ui_edit ui_edit; - -struct ui_checkbox -{ - int x, y; - int focus, checked; -}; -typedef struct ui_checkbox ui_checkbox; - -extern SDLMod sdl_mod; -extern int sdl_key, sdl_wheel, sdl_caps, sdl_ascii, sdl_zoom_trig; -extern char *shift_0; -extern char *shift_1; -extern int svf_login; -extern int svf_admin; -extern int svf_mod; -extern char svf_user[64]; -extern char svf_pass[64]; - -extern int svf_open; -extern int svf_own; -extern int svf_myvote; -extern int svf_publish; -extern char svf_id[16]; -extern char svf_name[64]; -extern char svf_tags[256]; -extern void *svf_last; -extern int svf_lsize; - -extern char *search_ids[GRID_X*GRID_Y]; -extern char *search_dates[GRID_X*GRID_Y]; -extern int search_votes[GRID_X*GRID_Y]; -extern int search_publish[GRID_X*GRID_Y]; -extern int search_scoredown[GRID_X*GRID_Y]; -extern int search_scoreup[GRID_X*GRID_Y]; -extern char *search_names[GRID_X*GRID_Y]; -extern char *search_owners[GRID_X*GRID_Y]; -extern void *search_thumbs[GRID_X*GRID_Y]; -extern int search_thsizes[GRID_X*GRID_Y]; - -extern int search_own; -extern int search_date; -extern int search_page; -extern char search_expr[256]; - -extern char *tag_names[TAG_MAX]; -extern int tag_votes[TAG_MAX]; - -extern int Z_keysym; - -extern int zoom_en; -extern int zoom_x, zoom_y; -extern int zoom_wx, zoom_wy; - -void menu_count(void); - -void get_sign_pos(int i, int *x0, int *y0, int *w, int *h); - -void add_sign_ui(pixel *vid_buf, int mx, int my); - -void ui_edit_draw(pixel *vid_buf, ui_edit *ed); - -void ui_edit_process(int mx, int my, int mb, ui_edit *ed); - -void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed); - -void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed); - -void draw_svf_ui(pixel *vid_buf); - -void error_ui(pixel *vid_buf, int err, char *txt); - -void info_ui(pixel *vid_buf, char *top, char *txt); - -void info_box(pixel *vid_buf, char *msg); - -int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn); - -void login_ui(pixel *vid_buf); - -int stamp_ui(pixel *vid_buf); - -void tag_list_ui(pixel *vid_buf); - -int save_name_ui(pixel *vid_buf); - -void menu_ui(pixel *vid_buf, int i, int *sl, int *sr); - -void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int my); - -int sdl_poll(void); - -void set_cmode(int cm); - -char *download_ui(pixel *vid_buf, char *uri, int *len); - -int search_ui(pixel *vid_buf); - -int search_results(char *str, int votes); - -int execute_tagop(pixel *vid_buf, char *op, char *tag); - -void execute_save(pixel *vid_buf); - -void execute_delete(pixel *vid_buf, char *id); - -int execute_vote(pixel *vid_buf, char *id, char *action); - -#endif - diff --git a/main.c b/main.c deleted file mode 100755 index e0c5d629b..000000000 --- a/main.c +++ /dev/null @@ -1,2096 +0,0 @@ -/** - * Powder Toy - Main source - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * Copyright (c) 2010 Skresanov Savely - * Copyright (c) 2010 Bryan Hoyle - * Copyright (c) 2010 Nathan Cousins - * - * 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 02111-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef WIN32 -#include -#else -#include -#include -#endif - -#include "misc.h" -#include "font.h" -#include "defines.h" -#include "powder.h" -#include "graphics.h" -#include "version.h" -#include "http.h" -#include "md5.h" -#include "update.h" -#include "hmap.h" -#include "air.h" -#include "icon.h" - -static const char *it_msg = - "\brThe Powder Toy\n" - "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" - "\n" - "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" - "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" - "\bgPick your material from the menu using mouse left/right buttons.\n" - "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" - "Shift+drag will create straight lines of particles.\n" - "Ctrl+drag will result in filled rectangles.\n" - "Ctrl+Shift+click will flood-fill a closed area.\n" - "Ctrl+Z will act as Undo.\n" - "Middle click or Alt+Click to \"sample\" the particles.\n" - "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" - "Use 'S' to save parts of the window as 'stamps'.\n" - "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" - "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 7 will do the same\n" - "Use the mouse scroll wheel to change the tool size for particles.\n" - "'Q' will quit the application.\n" - "The spacebar can be used to pause physics.\n" - "'P' will take a screenshot and save it into the current directory.\n" - "\n" - "\brhttp://powdertoy.co.uk/\n" - "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" - "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" - "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" - "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" - "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" - "\n" - "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" - "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" - ; - -typedef struct -{ - int start, inc; - pixel *vid; -} upstruc; - -#ifdef BETA -static const char *old_ver_msg_beta = "A new beta is available - click here!"; -#endif -static const char *old_ver_msg = "A new version is available - click here!"; -float mheat = 0.0f; - -int do_open = 0; -int sys_pause = 0; -int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. -int death = 0, framerender = 0; -int amd = 1; -int FPSB = 0; - -sign signs[MAXSIGNS]; - -int numCores = 4; - -int core_count() -{ - int numCPU = 1; -#ifdef MT -#ifdef WIN32 - SYSTEM_INFO sysinfo; - GetSystemInfo( &sysinfo ); - numCPU = sysinfo.dwNumberOfProcessors; -#else -#ifdef MACOSX - numCPU = 4; -#else - numCPU = sysconf( _SC_NPROCESSORS_ONLN ); -#endif -#endif - - printf("Cpus: %d\n", numCPU); - if(numCPU>1) - printf("Multithreading enabled\n"); - else - printf("Multithreading disabled\n"); -#endif - return numCPU; -} - -int mousex = 0, mousey = 0; //They contain mouse position - -void sdl_seticon(void) -{ -#ifdef WIN32 - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else -#ifdef MACOSX - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else - SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#endif -#endif -} - -int frame_idx=0; -void dump_frame(pixel *src, int w, int h, int pitch) -{ - char frame_name[32]; - int j,i; - unsigned char c[3]; - FILE *f; - sprintf(frame_name,"frame%04d.ppm",frame_idx); - f=fopen(frame_name,"wb"); - fprintf(f,"P6\n%d %d\n255\n",w,h); - for(j=0; j=0 && x=0 && y255) i=255; - d[p++] = i; - } - for(y=by0; y255) i=255; - d[p++] = i; - } - - // save the particle map - for(i=0; i=x0 && x=y0 && y255) x=255; - if(y<0) y=0; - if(y>255) y=255; - d[p++] = x; - d[p++] = y; - } - } - for(j=0; j>8); - d[p++] = (tttemp&0x00FF); - } - } - for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; - d[p++] = (signs[i].y-y0); - d[p++] = (signs[i].y-y0)>>8; - d[p++] = signs[i].ju; - x = strlen(signs[i].text); - d[p++] = x; - memcpy(d+p, signs[i].text, x); - p+=x; - } - - i = (p*101+99)/100 + 612; - c = malloc(i); - - //New file header uses PSv, replacing fuC. This is to detect if the client uses a new save format for temperatures - //This creates a problem for old clients, that display and "corrupt" error instead of a "newer version" error - - c[0] = 0x50; //0x66; - c[1] = 0x53; //0x75; - c[2] = 0x76; //0x43; - c[3] = legacy_enable; - c[4] = SAVE_VERSION; - c[5] = CELL; - c[6] = bw; - c[7] = bh; - c[8] = p; - c[9] = p >> 8; - c[10] = p >> 16; - c[11] = p >> 24; - - i -= 12; - - if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) - { - free(d); - free(c); - return NULL; - } - free(d); - - *size = i+12; - return c; -} - -int parse_save(void *save, int size, int replace, int x0, int y0) -{ - unsigned char *d,*c=save; - int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; - int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; - int fp[NPART], nf=0, new_format = 0, ttv = 0; - - //New file header uses PSv, replacing fuC. This is to detect if the client uses a new save format for temperatures - //This creates a problem for old clients, that display and "corrupt" error instead of a "newer version" error - - if(size<16) - return 1; - if(!(c[2]==0x43 && c[1]==0x75 && c[0]==0x66) && !(c[2]==0x76 && c[1]==0x53 && c[0]==0x50)) - return 1; - if(c[2]==0x76 && c[1]==0x53 && c[0]==0x50) { - new_format = 1; - } - if(c[4]>SAVE_VERSION) - return 2; - ver = c[4]; - - if(ver<34) - { - legacy_enable = 1; - } - else - { - if(c[3]==1||c[3]==0) - legacy_enable = c[3]; - else - legacy_beta = 1; - } - - bw = c[6]; - bh = c[7]; - if(bx0+bw > XRES/CELL) - bx0 = XRES/CELL - bw; - if(by0+bh > YRES/CELL) - by0 = YRES/CELL - bh; - if(bx0 < 0) - bx0 = 0; - if(by0 < 0) - by0 = 0; - - if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) - return 3; - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - return 1; - size = i; - - if(size < bw*bh) - return 1; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - if(replace) - { - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(signs, 0, sizeof(signs)); - memset(parts, 0, sizeof(particle)*NPART); - memset(pmap, 0, sizeof(pmap)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(pv, 0, sizeof(pv)); - } - - // make a catalog of free parts - memset(pmap, 0, sizeof(pmap)); - for(i=0; i= size) - goto corrupt; - fvx[y][x] = (d[p++]-127.0f)/64.0f; - } - for(y=by0; y= size) - goto corrupt; - fvy[y][x] = (d[p++]-127.0f)/64.0f; - } - - // load the particle map - i = 0; - pty = p; - for(y=y0; y= size) - goto corrupt; - j=d[p++]; - if(j >= PT_NUM) - goto corrupt; - if(j)// && !(isplayer == 1 && j==PT_STKM)) - { - if(pmap[y][x]) - { - k = pmap[y][x]>>8; - parts[k].type = j; - parts[k].x = (float)x; - parts[k].y = (float)y; - m[(x-x0)+(y-y0)*w] = k+1; - } - else if(i < nf) - { - parts[fp[i]].type = j; - parts[fp[i]].x = (float)x; - parts[fp[i]].y = (float)y; - m[(x-x0)+(y-y0)*w] = fp[i]+1; - i++; - } - else - m[(x-x0)+(y-y0)*w] = NPART+1; - } - } - - // load particle properties - for(j=0; j= size) - goto corrupt; - if(i < NPART) - { - parts[i].vx = (d[p++]-127.0f)/16.0f; - parts[i].vy = (d[p++]-127.0f)/16.0f; - if(parts[i].type == PT_STKM) - { - //player[2] = PT_DUST; - - player[3] = parts[i].x-1; //Setting legs positions - player[4] = parts[i].y+6; - player[5] = parts[i].x-1; - player[6] = parts[i].y+6; - - player[7] = parts[i].x-3; - player[8] = parts[i].y+12; - player[9] = parts[i].x-3; - player[10] = parts[i].y+12; - - player[11] = parts[i].x+1; - player[12] = parts[i].y+6; - player[13] = parts[i].x+1; - player[14] = parts[i].y+6; - - player[15] = parts[i].x+3; - player[16] = parts[i].y+12; - player[17] = parts[i].x+3; - player[18] = parts[i].y+12; - - } - } - else - p += 2; - } - } - for(j=0; j= size) - goto corrupt; - if(i <= NPART) - parts[i-1].life = d[p++]*4; - else - p++; - } - } - for(j=0; j=34&&legacy_beta==0) - { - if(p >= size) - { - goto corrupt; - } - if(i <= NPART) - { - if(ver>=42) { - if(new_format) { - ttv = (d[p++])<<8; - ttv |= (d[p++]); - parts[i-1].temp = ttv; - } else { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } - } else { - parts[i-1].temp = ((d[p++]*((O_MAX_TEMP+(-O_MIN_TEMP))/255))+O_MIN_TEMP)+273; - } - } - else - { - p++; - if(new_format) { - p++; - } - } - } - else - { - parts[i-1].temp = ptypes[parts[i-1].type].heat; - } - } - } - for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) - { - if(p >= size) - goto corrupt; - if(i <= NPART) - parts[i-1].ctype = d[p++]; - else - p++; - } - } - - if(p >= size) - goto version1; - j = d[p++]; - for(i=0; i size) - goto corrupt; - for(k=0; k size) - goto corrupt; - if(kXRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) - { - factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); - factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); - if(factor_y > factor_x) - factor_x = factor_y; - tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); - free(stamps[i].thumb); - stamps[i].thumb = tmp; - } - } - - free(data); -} - -int clipboard_ready = 0; -void *clipboard_data = 0; -int clipboard_length = 0; - -void stamp_save(int x, int y, int w, int h) -{ - FILE *f; - int n; - char fn[64], sn[16]; - void *s=build_save(&n, x, y, w, h); - -#ifdef WIN32 - _mkdir("stamps"); -#else - mkdir("stamps", 0755); -#endif - - stamp_gen_name(sn); - sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); - - f = fopen(fn, "wb"); - if(!f) - return; - fwrite(s, n, 1, f); - fclose(f); - - free(s); - - if(stamps[STAMP_MAX-1].thumb) - free(stamps[STAMP_MAX-1].thumb); - memmove(stamps+1, stamps, sizeof(struct stamp)*(STAMP_MAX-1)); - memset(stamps, 0, sizeof(struct stamp)); - if(stamp_count0) - { - memcpy(&tmp, stamps+i, sizeof(struct stamp)); - memmove(stamps+1, stamps, sizeof(struct stamp)*i); - memcpy(stamps, &tmp, sizeof(struct stamp)); - - stamp_update(); - } - - return data; -} - -void stamp_init(void) -{ - int i; - FILE *f; - - memset(stamps, 0, sizeof(stamps)); - - f=fopen("stamps" PATH_SEP "stamps.def", "rb"); - if(!f) - return; - for(i=0; i= THUMB_CACHE_SIZE) - return; - free(thumb_cache_id[i]); - free(thumb_cache_data[i]); - thumb_cache_id[i] = NULL; - for(j=0; j thumb_cache_lru[i]) - thumb_cache_lru[j]--; -} -void thumb_cache_add(char *id, void *thumb, int size) -{ - int i,m=-1,j=-1; - thumb_cache_inval(id); - for(i=0; i m) - { - m = thumb_cache_lru[i]; - j = i; - } - } - if(i >= THUMB_CACHE_SIZE) - { - thumb_cache_inval(thumb_cache_id[j]); - i = j; - } - for(j=0; j= THUMB_CACHE_SIZE) - return 0; - for(j=0; jSAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) - old_version = 1; -#else - if(sscanf(ver_data, "%d.%d", &major, &minor)==2) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) - old_version = 1; -#endif - free(ver_data); - } - http_ver_check = NULL; - } - do_check = (do_check+1) & 15; - } - - if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) - { - if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) - { - break; - } - } - if(sdl_key=='d' && isplayer) - { - death = 1; - //death = !(death); - } - if(sdl_key=='f') - { - framerender = 1; - } - if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) - { - if(load_mode) - { - free(load_img); - free(load_data); - load_mode = 0; - load_data = NULL; - load_img = NULL; - } - if(it > 50) - it = 50; - if(sdl_key=='k' && stamps[1].name[0]) - { - j = stamp_ui(vid_buf); - if(j>=0) - load_data = stamp_load(j, &load_size); - else - load_data = NULL; - } - else - load_data = stamp_load(0, &load_size); - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - if(sdl_key=='s') - { - if(it > 50) - it = 50; - save_mode = 1; - } - if(sdl_key=='1') - { - set_cmode(0); - } - if(sdl_key=='2') - { - set_cmode(1); - } - if(sdl_key=='3') - { - set_cmode(2); - } - if(sdl_key=='4') - { - set_cmode(3); - } - if(sdl_key=='5') - { - set_cmode(4); - } - if(sdl_key=='6') - { - set_cmode(5); - } - if(sdl_key=='7') - { - set_cmode(6); - } - if(sdl_key==SDLK_LEFTBRACKET) { - if(sdl_zoom_trig==1) - { - ZSIZE -= 1; - if(ZSIZE>32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - } - else - { - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - bs -= 1; - else - bs -= ceil((bs/5)+0.5f); - if(bs>1224) - bs = 1224; - if(bs<0) - bs = 0; - } - } - if(sdl_key==SDLK_RIGHTBRACKET) { - if(sdl_zoom_trig==1) - { - ZSIZE += 1; - if(ZSIZE>32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - } - else - { - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - bs += 1; - else - bs += ceil((bs/5)+0.5f); - if(bs>1224) - bs = 1224; - if(bs<0) - bs = 0; - } - } - if(sdl_key==SDLK_SPACE) - sys_pause = !sys_pause; - if(sdl_key=='h') - hud_enable = !hud_enable; - if(sdl_key=='p') - dump_frame(vid_buf, XRES, YRES, XRES); - if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - if(clipboard_ready==1) - { - load_data = malloc(clipboard_length); - memcpy(load_data, clipboard_data, clipboard_length); - load_size = clipboard_length; - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - } - if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 2; - } - if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 1; - } - else if(sdl_key=='c') - { - set_cmode((cmode+1) % 7); - if(it > 50) - it = 50; - } - if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo - { - int cbx, cby, cbi; - - for(cbi=0; cbi32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - sdl_wheel = 0; - } - else - { - bs += sdl_wheel; - if(bs>1224) - bs = 1224; - if(bs<0) - bs = 0; - sdl_wheel = 0; - /*if(su >= PT_NUM) { - if(sl < PT_NUM) - su = sl; - if(sr < PT_NUM) - su = sr; - }*/ - } - } - - bq = b; - b = SDL_GetMouseState(&x, &y); - - for(i=0; i=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy - && x0 && y0 && x>8)>=NPART || !cr)) - { -#ifdef BETA - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life); -#else - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f); -#endif - } - else - { - sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); - } - } - mx = x; - my = y; - if(update_flag) - { - info_box(vid_buf, "Finalizing update..."); - if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) - { - update_cleanup(); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - { - if(update_finish()) - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - else - info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); - } - update_flag = 0; - } - - if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && - x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) - { - tmp = malloc(64); -#ifdef BETA - if(is_beta) - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); - } - else - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); - } -#else - sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); -#endif - if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) - { - free(tmp); - tmp = download_ui(vid_buf, my_uri, &i); - if(tmp) - { - save_presets(1); - if(update_start(tmp, i)) - { - update_cleanup(); - save_presets(0); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - return 0; - } - } - else - free(tmp); - } - if(y>=sdl_scale*(YRES+(MENUSIZE-20))) - { - if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) - { - db = (svf_myvote==1) ? 273 : 274; - if(da < 51) - da ++; - } - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) - { - db = svf_own ? 257 : 256; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) - { - db = 270; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) - { - db = 266; - if(da < 51) - da ++; - } - else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) - { - db = 259; - if(svf_open && svf_own && x<=55*sdl_scale) - db = 258; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) - { - db = svf_login ? 261 : 260; - if(svf_admin) - { - db = 268; - } - else if(svf_mod) - { - db = 271; - } - if(da < 51) - da ++; - } - else if(x>=sdl_scale && x<=17*sdl_scale) - { - db = 262; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) - { - db = sys_pause ? 264 : 263; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) - { - db = 267; - if(da < 51) - da ++; - } - else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) - { - db = 265; - if(da < 51) - da ++; - } - else if(da > 0) - da --; - } - else if(da > 0) - da --; - - if(!sdl_zoom_trig && zoom_en==1) - zoom_en = 0; - - if(sdl_key==Z_keysym && zoom_en==2) - zoom_en = 1; - - if(load_mode) - { - load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); - load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); - if(load_x+load_w>XRES) load_x=XRES-load_w; - if(load_y+load_h>YRES) load_y=YRES-load_h; - if(load_x<0) load_x=0; - if(load_y<0) load_y=0; - if(bq==1 && !b) - { - parse_save(load_data, load_size, 0, load_x, load_y); - free(load_data); - free(load_img); - load_mode = 0; - } - else if(bq==4 && !b) - { - free(load_data); - free(load_img); - load_mode = 0; - } - } - else if(save_mode==1) - { - save_x = (mx/sdl_scale)/CELL; - save_y = (my/sdl_scale)/CELL; - if(save_x >= XRES/CELL) save_x = XRES/CELL-1; - if(save_y >= YRES/CELL) save_y = YRES/CELL-1; - save_w = 1; - save_h = 1; - if(b==1) - { - save_mode = 2; - } - else if(b==4) - { - save_mode = 0; - copy_mode = 0; - } - } - else if(save_mode==2) - { - save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; - save_h = (my/sdl_scale+CELL/2)/CELL - save_y; - if(save_w>XRES/CELL) save_w = XRES/CELL; - if(save_h>YRES/CELL) save_h = YRES/CELL; - if(save_w<1) save_w = 1; - if(save_h<1) save_h = 1; - if(!b) - { - if(copy_mode==1) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - } - else if(copy_mode==2) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - } - else - { - stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - save_mode = 0; - } - } - } - else if(sdl_zoom_trig && zoom_en<2) - { - x /= sdl_scale; - y /= sdl_scale; - x -= ZSIZE/2; - y -= ZSIZE/2; - if(x<0) x=0; - if(y<0) y=0; - if(x>XRES-ZSIZE) x=XRES-ZSIZE; - if(y>YRES-ZSIZE) y=YRES-ZSIZE; - zoom_x = x; - zoom_y = y; - zoom_wx = (x 50) - it = 50; - x /= sdl_scale; - y /= sdl_scale; - if(y>=YRES+(MENUSIZE-20)) - { - if(!lb) - { - if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Up")) - { - svf_myvote = 1; - } - } - if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Down")) - { - svf_myvote = -1; - } - } - if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) - tag_list_ui(vid_buf); - if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) - { - legacy_enable = !legacy_enable; - } - if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) - { - memset(signs, 0, sizeof(signs)); - memset(pv, 0, sizeof(pv)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(fvx, 0, sizeof(fvx)); - memset(fvy, 0, sizeof(fvy)); - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(parts, 0, sizeof(particle)*NPART); - for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) - { - login_ui(vid_buf); - if(svf_login) - save_presets(0); - } - if(x>=37 && x<=187 && svf_login) - { - if(!svf_open || !svf_own || x>51) - { - if(save_name_ui(vid_buf)) - execute_save(vid_buf); - } - else - execute_save(vid_buf); - while(!sdl_poll()) - if(!SDL_GetMouseState(&x, &y)) - break; - b = bq = 0; - } - if(x>=1 && x<=17) - { - search_ui(vid_buf); - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - } - if(x>=19 && x<=35 && svf_last && svf_open && !bq) - parse_save(svf_last, svf_lsize, 1, 0, 0); - if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) - { - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 7); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+6) % 7); - save_presets(0); - } - if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) - sys_pause = !sys_pause; - lb = 0; - } - } - else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) - { - c = sl = cr&0xFF; - } - else - { - //Something - } - } - lx = x; - ly = y; - lb = 0; - lm = 0; - } - else - { - //Copy state before drawing any particles (for undo)7 - int cbx, cby, cbi; - - for(cbi=0; cbi=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) - create_line(lx, ly, x, y, bs, c); - } - else - create_box(lx, ly, x, y, c); - lm = 0; - } - lb = 0; - } - - if(load_mode) - { - draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); - xor_rect(vid_buf, load_x, load_y, load_w, load_h); - } - - if(save_mode) - { - xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - da = 51; - db = 269; - } - - if(zoom_en!=1 && !load_mode && !save_mode) - { - render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); - mousex = mx/sdl_scale; - mousey = my/sdl_scale; - } - - if(zoom_en) - render_zoom(vid_buf); - - if(da) - switch(db) - { - case 256: - drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); - break; - case 257: - drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); - break; - case 258: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); - break; - case 259: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); - break; - case 260: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); - break; - case 261: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); - break; - case 262: - drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); - break; - case 263: - drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); - break; - case 264: - drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); - break; - case 265: - drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); - break; - case 266: - drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); - break; - case 267: - drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); - break; - case 268: - drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); - break; - case 269: - drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); - break; - case 270: - drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); - break; - case 271: - drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); - break; - case 272: - drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); - break; - case 273: - drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); - break; - case 274: - drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); - break; - case 275: - drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); - break; - default: - drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); - } - if(itc) - { - itc--; - drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); - } - if(it) - { - it--; - drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); - } - - if(old_version) - { - clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); -#ifdef BETA - if(is_beta) - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); - } - else - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); - } -#else - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); -#endif - drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); - } - - if(hud_enable) - { - currentTime = SDL_GetTicks(); - if(currentTime-past>=16) - { - past = SDL_GetTicks(); - FPS++; - } - if(currentTime-pastFPS>=1000) - { -#ifdef BETA - sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); - //printf("%s\n", uitext); -#else - sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#endif - FPSB = FPS; - FPS = 0; - pastFPS = currentTime; - } - if(sdl_zoom_trig||zoom_en) - { - if(zoom_x0 || sr == PT_NEUT || sr == PT_PHOT) - player[2] = sr; - else - player[2] = PT_DUST; - } - - } - - http_done(); - return 0; -} - diff --git a/md5.c b/md5.c deleted file mode 100644 index 2e348e675..000000000 --- a/md5.c +++ /dev/null @@ -1,231 +0,0 @@ -// based on public-domain code from Colin Plumb (1993) -#include -#include "md5.h" - -static unsigned getu32(const unsigned char *addr) -{ - return (((((unsigned long)addr[3] << 8) | addr[2]) << 8) | addr[1]) << 8 | addr[0]; -} - -static void putu32(unsigned data, unsigned char *addr) -{ - addr[0] = (unsigned char)data; - addr[1] = (unsigned char)(data >> 8); - addr[2] = (unsigned char)(data >> 16); - addr[3] = (unsigned char)(data >> 24); -} - -void md5_init(struct md5_context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -void md5_update(struct md5_context *ctx, unsigned char const *buf, unsigned len) -{ - unsigned t; - - // update bit count - t = ctx->bits[0]; - if((ctx->bits[0] = (t + ((unsigned)len << 3)) & 0xffffffff) < t) - ctx->bits[1]++; // carry - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; - - // use leading data to top up the buffer - - if(t) - { - unsigned char *p = ctx->in + t; - - t = 64-t; - if (len < t) - { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - md5_transform(ctx->buf, ctx->in); - buf += t; - len -= t; - } - - // following 64-byte chunks - - while(len >= 64) - { - memcpy(ctx->in, buf, 64); - md5_transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; - } - - // save rest of bytes for later - - memcpy(ctx->in, buf, len); -} - -void md5_final(unsigned char digest[16], struct md5_context *ctx) -{ - unsigned count; - unsigned char *p; - - // #bytes mod64 - count = (ctx->bits[0] >> 3) & 0x3F; - - // first char of padding = 0x80 - p = ctx->in + count; - *p++ = 0x80; - - // calculate # of bytes to pad - count = 64 - 1 - count; - - // Pad out to 56 mod 64 - if(count < 8) - { - // we need to finish a whole block before padding - memset(p, 0, count); - md5_transform(ctx->buf, ctx->in); - memset(ctx->in, 0, 56); - } - else - { - // just pad to 56 bytes - memset(p, 0, count-8); - } - - // append length & final transform - putu32(ctx->bits[0], ctx->in + 56); - putu32(ctx->bits[1], ctx->in + 60); - - md5_transform(ctx->buf, ctx->in); - putu32(ctx->buf[0], digest); - putu32(ctx->buf[1], digest + 4); - putu32(ctx->buf[2], digest + 8); - putu32(ctx->buf[3], digest + 12); - memset(ctx, 0, sizeof(ctx)); -} - -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<>(32-s), w += x ) - -void md5_transform(unsigned buf[4], const unsigned char inraw[64]) -{ - unsigned a, b, c, d; - unsigned in[16]; - int i; - - for (i = 0; i < 16; ++i) - in[i] = getu32 (inraw + 4 * i); - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -static char hex[] = "0123456789abcdef"; -void md5_ascii(char *result, unsigned char const *buf, unsigned len) -{ - struct md5_context md5; - unsigned char hash[16]; - int i; - - if(len==0) - len = strlen((char *)buf); - - md5_init(&md5); - md5_update(&md5, buf, len); - md5_final(hash, &md5); - - for(i=0; i<16; i++) - { - result[i*2] = hex[(hash[i]>>4)&0xF]; - result[i*2+1] = hex[hash[i]&0x0F]; - } - result[32] = 0; -} diff --git a/md5.h b/md5.h deleted file mode 100644 index 2ae3ae843..000000000 --- a/md5.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef MD5_H -#define MD5_H - -struct md5_context -{ - unsigned buf[4]; - unsigned bits[2]; - unsigned char in[64]; -}; - -void md5_init(struct md5_context *context); -void md5_update(struct md5_context *context, unsigned char const *buf, unsigned len); -void md5_final(unsigned char digest[16], struct md5_context *context); -void md5_transform(unsigned buf[4], const unsigned char in[64]); - -void md5_ascii(char *result, unsigned char const *buf, unsigned len); - -#endif diff --git a/misc.c b/misc.c deleted file mode 100644 index 7c551e277..000000000 --- a/misc.c +++ /dev/null @@ -1,283 +0,0 @@ -#include -#include -#include -#include "misc.h" -#include "defines.h" -#include "interface.h" -#include "graphics.h" - -//Signum function -#ifdef WIN32 -_inline int isign(float i) -#else -inline int isign(float i) -#endif -{ - if (i<0) - return -1; - if (i>0) - return 1; - return 0; -} - -#ifdef WIN32 -_inline unsigned clamp_flt(float f, float min, float max) -#else -inline unsigned clamp_flt(float f, float min, float max) -#endif -{ - if(fmax) - return 255; - return (int)(255.0f*(f-min)/(max-min)); -} - -#ifdef WIN32 -_inline float restrict_flt(float f, float min, float max) -#else -inline float restrict_flt(float f, float min, float max) -#endif -{ - if(fmax) - return max; - return f; -} - -char *mystrdup(char *s) -{ - char *x; - if(s) - { - x = (char*)malloc(strlen(s)+1); - strcpy(x, s); - return x; - } - return s; -} - -void strlist_add(struct strlist **list, char *str) -{ - struct strlist *item = malloc(sizeof(struct strlist)); - item->str = mystrdup(str); - item->next = *list; - *list = item; -} - -int strlist_find(struct strlist **list, char *str) -{ - struct strlist *item; - for(item=*list; item; item=item->next) - if(!strcmp(item->str, str)) - return 1; - return 0; -} - -void strlist_free(struct strlist **list) -{ - struct strlist *item; - while(*list) - { - item = *list; - *list = (*list)->next; - free(item); - } -} - -void save_presets(int do_update) -{ - FILE *f=fopen("powder.def", "wb"); - unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; - unsigned char tmp = sdl_scale; - if(!f) - return; - fwrite(sig, 1, 4, f); - save_string(f, svf_user); - save_string(f, svf_pass); - fwrite(&tmp, 1, 1, f); - tmp = cmode; - fwrite(&tmp, 1, 1, f); - tmp = svf_admin; - fwrite(&tmp, 1, 1, f); - tmp = svf_mod; - fwrite(&tmp, 1, 1, f); - save_string(f, http_proxy_string); - tmp = SAVE_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = MINOR_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = do_update; - fwrite(&tmp, 1, 1, f); - fclose(f); -} - -void load_presets(void) -{ - FILE *f=fopen("powder.def", "rb"); - unsigned char sig[4], tmp; - if(!f) - return; - fread(sig, 1, 4, f); - if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) - { - if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) - { - if(fseek(f, -3, SEEK_END)) - { - remove("powder.def"); - return; - } - if(fread(sig, 1, 3, f) != 3) - { - remove("powder.def"); - goto fail; - } - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; - } - fclose(f); - remove("powder.def"); - return; - } - if(load_string(f, svf_user, 63)) - goto fail; - if(load_string(f, svf_pass, 63)) - goto fail; - svf_login = !!svf_user[0]; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - sdl_scale = (tmp == 2) ? 2 : 1; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - cmode = tmp%7; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_admin = tmp; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_mod = tmp; - if(load_string(f, http_proxy_string, 255)) - goto fail; - if(fread(sig, 1, 3, f) != 3) - goto fail; - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; -fail: - fclose(f); -} - -void save_string(FILE *f, char *str) -{ - int li = strlen(str); - unsigned char lb[2]; - lb[0] = li; - lb[1] = li >> 8; - fwrite(lb, 2, 1, f); - fwrite(str, li, 1, f); -} - -int load_string(FILE *f, char *str, int max) -{ - int li; - unsigned char lb[2]; - fread(lb, 2, 1, f); - li = lb[0] | (lb[1] << 8); - if(li > max) - { - str[0] = 0; - return 1; - } - fread(str, li, 1, f); - str[li] = 0; - return 0; -} - -void strcaturl(char *dst, char *src) -{ - char *d; - unsigned char *s; - - for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) - { - if((*s>='0' && *s<='9') || - (*s>='a' && *s<='z') || - (*s>='A' && *s<='Z')) - *(d++) = *s; - else - { - *(d++) = '%'; - *(d++) = hex[*s>>4]; - *(d++) = hex[*s&15]; - } - } - *d = 0; -} - -void strappend(char *dst, char *src) -{ - char *d; - unsigned char *s; - - for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) - { - *(d++) = *s; - } - *d = 0; -} - -void *file_load(char *fn, int *size) -{ - FILE *f = fopen(fn, "rb"); - void *s; - - if(!f) - return NULL; - fseek(f, 0, SEEK_END); - *size = ftell(f); - fseek(f, 0, SEEK_SET); - s = malloc(*size); - if(!s) - { - fclose(f); - return NULL; - } - fread(s, *size, 1, f); - fclose(f); - return s; -} - -int cpu_check(void) -{ -#ifdef MACOSX - return 0; -#else -#ifdef X86 - unsigned af,bf,cf,df; - x86_cpuid(0, af, bf, cf, df); - if(bf==0x68747541 && cf==0x444D4163 && df==0x69746E65) - amd = 1; - x86_cpuid(1, af, bf, cf, df); -#ifdef X86_SSE - if(!(df&(1<<25))) - return 1; -#endif -#ifdef X86_SSE2 - if(!(df&(1<<26))) - return 1; -#endif -#ifdef X86_SSE3 - if(!(cf&1)) - return 1; -#endif -#endif -#endif - return 0; -} \ No newline at end of file diff --git a/misc.h b/misc.h deleted file mode 100644 index 139468776..000000000 --- a/misc.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H -#include -#include - -#ifdef WIN32 -#define x86_cpuid(func,af,bf,cf,df) \ - do {\ - __asm mov eax, func\ - __asm cpuid\ - __asm mov af, eax\ - __asm mov bf, ebx\ - __asm mov cf, ecx\ - __asm mov df, edx\ - } while(0) -#else -#define x86_cpuid(func,af,bf,cf,df) \ -__asm__ __volatile ("cpuid":\ - "=a" (af), "=b" (bf), "=c" (cf), "=d" (df) : "a" (func)); -#endif - -static char hex[] = "0123456789ABCDEF"; -//Signum function -#ifdef WIN32 -extern _inline int isign(float i); -#else -extern inline int isign(float i); -#endif - -#ifdef WIN32 -extern _inline unsigned clamp_flt(float f, float min, float max); -#else -extern inline unsigned clamp_flt(float f, float min, float max); -#endif - -#ifdef WIN32 -extern _inline float restrict_flt(float f, float min, float max); -#else -extern inline float restrict_flt(float f, float min, float max); -#endif - -char *mystrdup(char *s); - -struct strlist -{ - char *str; - struct strlist *next; -}; - -void strlist_add(struct strlist **list, char *str); - -int strlist_find(struct strlist **list, char *str); - -void strlist_free(struct strlist **list); - -void save_presets(int do_update); - -void load_presets(void); - -void save_string(FILE *f, char *str); - -int load_string(FILE *f, char *str, int max); - -void strcaturl(char *dst, char *src); - -void strappend(char *dst, char *src); - -void *file_load(char *fn, int *size); - -int cpu_check(void); - -#endif \ No newline at end of file diff --git a/powder.c b/powder.c deleted file mode 100644 index b62a68ace..000000000 --- a/powder.c +++ /dev/null @@ -1,3199 +0,0 @@ -#include -#include -#include "defines.h" -#include "powder.h" -#include "air.h" -#include "misc.h" - -int isplayer = 0; -float player[27]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index, [19]-[26] are accelerations - -particle *parts; -particle *cb_parts; - -unsigned char bmap[YRES/CELL][XRES/CELL]; -unsigned char emap[YRES/CELL][XRES/CELL]; - -unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -unsigned char cb_emap[YRES/CELL][XRES/CELL]; - -int pfree; - -unsigned pmap[YRES][XRES]; -unsigned cb_pmap[YRES][XRES]; - -int try_move(int i, int x, int y, int nx, int ny) -{ - unsigned r; - - - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) - return 0; - if(x==nx && y==ny) - return 1; - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; - - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||(r&0xFF)==PT_PCLN||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) - { - return 1; - } - - if((r&0xFF)==PT_VOID) - { - parts[i].type=PT_NONE; - return 0; - } - if((r&0xFF)==PT_BHOL) - { - parts[i].type=PT_NONE; - if(!legacy_enable) - { - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; - } - return 0; - } - - if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide - { - return 1; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - { - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) - { - return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - { - return 0; - } - - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - - if(parts[i].type==PT_CNCT && y>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; - } - - return 1; -} - -void kill_part(int i) -{ - int x, y; - parts[i].type = PT_NONE; - - x = (int)(parts[i].x+0.5f); - y = (int)(parts[i].y+0.5f); - - if(x>=0 && y>=0 && x=XRES || y>=YRES) - return -1; - - if(t==SPC_HEAT||t==SPC_COOL) - { - if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); - } - if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) - { - parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); - } - return pmap[y][x]>>8; - } - else - { - return -1; - } - } - if(t==SPC_AIR) - { - pv[y/CELL][x/CELL] += 0.03f; - if(y+CELL>8].type = PT_SPRK; - parts[pmap[y][x]>>8].life = 4; - parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; - pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; - return pmap[y][x]>>8; - } - - if(p==-1) - { - if(pmap[y][x]) - return -1; - if(pfree == -1) - return -1; - i = pfree; - pfree = parts[i].life; - } - else - i = p; - - if(t==PT_GLAS) - { - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - } - if(t!=PT_STKM) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - parts[i].tmp = 0; - } - if(t==PT_ACID) - { - parts[i].life = 75; - } - /*Testing - if(t==PT_WOOD){ - parts[i].life = 150; - } - End Testing*/ - if(t==PT_FUSE) { - parts[i].life = 50; - parts[i].tmp = 50; - } - if(t==PT_FSEP) - parts[i].life = 50; - if(t==PT_COAL) - parts[i].life = 110; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_PLSM) - parts[i].life = rand()%150+50; - if(t==PT_HFLM) - parts[i].life = rand()%150+50; - if(t==PT_LAVA) - parts[i].life = rand()%120+240; - if(t==PT_NBLE) - parts[i].life = 0; - if(t==PT_ICEI) - parts[i].ctype = PT_WATR; - if(t==PT_NEUT) - { - float r = (rand()%128+128)/127.0f; - float a = (rand()%360)*3.14159f/180.0f; - parts[i].life = rand()%480+480; - parts[i].vx = r*cosf(a); - parts[i].vy = r*sinf(a); - } - if(t==PT_PHOT) - { - float r = (rand()%3-1)*3; - float a = (rand()%3-1)*3; - parts[i].life = 680; - if(a==0.0f&&r==0.0f) - { - parts[i].life = 0; - parts[i].type = PT_NONE; - return -1; - } - else - { - parts[i].vx = a; - parts[i].vy = r; - } - //} else { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - //}/ - } - - if(t!=PT_STKM) - pmap[y][x] = t|(i<<8); - else - { - if(isplayer==0) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = PT_STKM; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 100; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - - - - player[3] = x-1; //Setting legs positions - player[4] = y+6; - player[5] = x-1; - player[6] = y+6; - - player[7] = x-3; - player[8] = y+12; - player[9] = x-3; - player[10] = y+12; - - player[11] = x+1; - player[12] = y+6; - player[13] = x+1; - player[14] = y+6; - - player[15] = x+3; - player[16] = y+12; - player[17] = x+3; - player[18] = y+12; - - isplayer = 1; - } - } - - return i; -} - -#ifdef WIN32 -_inline void delete_part(int x, int y) -#else -inline void delete_part(int x, int y) -#endif -{ - unsigned i; - - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - i = pmap[y][x]; - if(!i || (i>>8)>=NPART) - return; - - kill_part(i>>8); - pmap[y][x] = 0; // just in case -} - -#ifdef WIN32 -_inline int is_wire(int x, int y) -#else -inline int is_wire(int x, int y) -#endif -{ - return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; -} - -#ifdef WIN32 -_inline int is_wire_off(int x, int y) -#else -inline int is_wire_off(int x, int y) -#endif -{ - return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; -} - -void set_emap(int x, int y) -{ - int x1, x2; - - if(!is_wire_off(x, y)) - return; - - // go left as far as possible - x1 = x2 = x; - while(x1>0) - { - if(!is_wire_off(x1-1, y)) - break; - x1--; - } - while(x21 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) - set_emap(x1, y-2); - else if(y>0) - for(x=x1; x<=x2; x++) - if(is_wire_off(x, y-1)) - { - if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) - set_emap(x, y-1); - } - - if(y>8) < NPART && (pmr>>8) >= 1) - { - return parts[pmr>>8].type; - } - else - { - return PT_NONE; - } -} - -int nearest_part(int ci, int t) -{ - int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); - int ndistance = 0; - int id = -1; - int i = 0; - int cx = (int)parts[ci].x; - int cy = (int)parts[ci].y; - for(i=0; i=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) - { - kill_part(i); - continue; - } - - vx[y/CELL][x/CELL] *= ptypes[t].airloss; - vy[y/CELL][x/CELL] *= ptypes[t].airloss; - vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; - vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GAS||t==PT_NBLE) - { - if(pv[y/CELL][x/CELL]<3.5f) - pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); - if(y+CELL2.5f) - { - parts[i].life = rand()%80+180; - rt = parts[i].type = PT_FIRE; - parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - pv[y/CELL][x/CELL] += 0.25f * CFDS; - t = PT_FIRE; - } - - parts[i].vx *= ptypes[t].loss; - parts[i].vy *= ptypes[t].loss; - - if(t==PT_GOO && !parts[i].life) - { - if(pv[y/CELL][x/CELL]>1.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - parts[i].life = rand()%80+300; - } - } - else - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - - if(ptypes[t].diffusion) - { - parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - } - - // interpolator -#ifdef WIN32 - mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#else - mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#endif - if(mv < ISTP) - { - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - } - else - { - dx = parts[i].vx*ISTP/mv; - dy = parts[i].vy*ISTP/mv; - ix = parts[i].x; - iy = parts[i].y; - while(1) - { - mv -= ISTP; - if(mv <= 0.0f) - { - // nothing found - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - break; - } - ix += dx; - iy += dy; - nx = (int)(ix+0.5f); - ny = (int)(iy+0.5f); - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) - { - parts[i].x = ix; - parts[i].y = iy; - break; - } - } - } - - a = nt = 0; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx4.0f) - t = parts[i].type = PT_DSTW; - if(t==PT_OIL && pv[y/CELL][x/CELL]<-6.0f) - t = parts[i].type = PT_GAS; - if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) - t = parts[i].type = PT_OIL; - if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) - t = parts[i].type = PT_FIRE; - } - if(t==PT_GAS && pv[y/CELL][x/CELL]<-6.0f) - t = parts[i].type = PT_OIL; - if(t==PT_DESL && pv[y/CELL][x/CELL]>5.0f) // Only way I know to make it - t = parts[i].type = PT_FIRE; // combust under pressure. - if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) - t = parts[i].type = PT_OIL; - if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - if(t==PT_BRCK && pv[y/CELL][x/CELL]>2.8f) - t = parts[i].type = PT_STNE; - //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - // t = parts[i].type = PT_BGLA; - if(t==PT_GLAS) - { - parts[i].pavg[0] = parts[i].pavg[1]; - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) - { - parts[i].type = PT_BGLA; - } - } - if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) - t = parts[i].type = PT_SNOW; - if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) - { - t = PT_NEUT; - create_part(i, x, y, t); - } - - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) - { - nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1) - { - create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[nearp].type = PT_SPRK; - parts[nearp].life = 9; - parts[nearp].ctype = PT_ETRD; - } - } - - if(!legacy_enable) - { - int ctemp = pv[y/CELL][x/CELL]*2; - c_heat = 0.0f; - h_count = 0; - if(t==PT_ICEI && !parts[i].ctype) - parts[i].ctype = PT_WATR; - if(ptypes[t].hconduct>(rand()%250)&&!(parts[i].type==PT_HSWC&&parts[i].life!=10)) - { - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)) - { - h_count++; - c_heat += parts[r>>8].temp; - } - } - } - } - pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)) - { - parts[r>>8].temp = parts[i].temp; - } - } - } - } - if(pt>=pstates[t].btemp&&pstates[t].burn) - { - t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE||t==PT_PLSM) - parts[i].life = rand()%50+120; - } - else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) - { - if(t==PT_LAVA&&parts[i].ctype) - { - parts[i].life = 0; - if(parts[i].ctype==PT_THRM) - { - parts[i].tmp = 0; - parts[i].ctype = PT_BMTL; - } - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) - { - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } - else - { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } - else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) - { - if(pstates[t].liquid==PT_LAVA) - { - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } - else if(t==PT_ICEI&&parts[i].ctype) - { - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else - { - t = parts[i].type = pstates[t].liquid; - } - } - else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) - { - t = parts[i].type = pstates[t].liquid; - } - else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) - { - if(t==PT_SLTW&&1>rand()%6) - { - t = parts[i].type = PT_SALT; - } - else - { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_HFLM) - parts[i].life = rand()%50+120; - } - } - if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) - { - float atemp = parts[i].temp + (-MIN_TEMP); - pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; - } - if(t==PT_LAVA) - { - parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - if(parts[i].ctype==PT_THRM&&parts[i].tmp>0) - { - parts[i].tmp--; - parts[i].temp = 3500; - } - } - pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); - } - } - if(t==PT_PTCT&&parts[i].temp>295.0f) - { - pt = parts[i].temp -= 2.5f; - } - if(t==PT_NTCT&&parts[i].temp>295.0f) - { - pt = parts[i].temp -= 2.5f; - } - - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) - { - nx = x % CELL; - if(nx == 0) - nx = x/CELL - 1; - else if(nx == CELL-1) - nx = x/CELL + 1; - else - nx = x/CELL; - ny = y % CELL; - if(ny == 0) - ny = y/CELL - 1; - else if(ny == CELL-1) - ny = y/CELL + 1; - else - ny = y/CELL; - if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) - { - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - } - else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) - { - pv[y/CELL][x/CELL] += 100.0f; - if(legacy_enable&&1>(rand()%200)) - { - parts[i].life = rand()%50+120; - t = parts[i].type = PT_FIRE; - } - else - { - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_ICEI || t==PT_SNOW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if(legacy_enable) - { - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; - } - } - } - else if(t==PT_COAL) - { - if(parts[i].life<=0) { - t = PT_NONE; - kill_part(i); - create_part(-1, x, y, PT_FIRE); - goto killed; - } else if(parts[i].life < 100) { - parts[i].life--; - create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); - } - - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) - { - if(parts[i].life>100) { - parts[i].life = 99; - } - } - } - } - else if(t==PT_FUSE) - { - if(parts[i].life<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; - } else if (parts[i].life < 40) { - parts[i].life--; - if((rand()%100)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } - } - if(pv[y/CELL][x/CELL] > 0.8f) - parts[i].tmp--; - else if(parts[i].tmp<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_FSEP); - goto killed; - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20)) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } - } - } - else if(t==PT_FSEP) - { - if(parts[i].life<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; - } else if (parts[i].life < 40) { - parts[i].life--; - if((rand()%10)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } - } - } - else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL && parts_avg(i, r>>8)!=PT_INSL) - { - parts[i].temp = 473.0f; - } - } - } - else if(t==PT_PLNT) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR && 1>(rand()%250)) - { - t = parts[i].type = PT_PLNT; - parts[r>>8].type = PT_PLNT; - } - else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_THRM) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM || (r&0xFF)==PT_LAVA)) - { - if(1>(rand()%500)) { - t = parts[i].type = PT_LAVA; - parts[i].ctype = PT_BMTL; - pt = parts[i].temp = 3500.0f; - pv[y/CELL][x/CELL] += 50.0f; - } else { - t = parts[i].type = PT_LAVA; - parts[i].life = 400; - parts[i].ctype = PT_THRM; - pt = parts[i].temp = 3500.0f; - parts[i].tmp = 20; - } - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WATR||t==PT_DSTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%250)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_WATR; - } - if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_SLTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) - { - parts[r>>8].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_WTRV) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - parts[r>>8].type = PT_WATR; - } - - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } - } - } - else if(t==PT_YEST) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_DYST && 1>(rand()%30) && !legacy_enable) - { - t = parts[i].type = PT_DYST; - } - } - } - else if(t==PT_ACID) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)!=PT_ACID) - { - if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) - { - t = parts[i].type = PT_FIRE; - parts[i].life = 4; - parts[r>>8].type = PT_FIRE; - parts[r>>8].life = 4; - } - else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) - { - parts[i].life--; - parts[r>>8].type = PT_NONE; - } - else if (parts[i].life==50) - { - parts[i].life = 0; - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_NEUT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) - { - if(33>rand()%100) - { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); - } - else - { - create_part(r>>8, x+nx, y+ny, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - pv[y/CELL][x/CELL] += 10.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - fe ++; - } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) - parts[r>>8].type = PT_DUST; - if((r&0xFF)==PT_DYST && 15>(rand()%1000)) - parts[r>>8].type = PT_YEST; - if((r&0xFF)==PT_YEST) { - if(15>(rand()%100000)&&isplayer==0) - parts[r>>8].type = PT_STKM; - else - parts[r>>8].type = PT_DYST; - } - - if((r&0xFF)==PT_WATR && 15>(rand()%100)) - parts[r>>8].type = PT_DSTW; - if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_GOO; - if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_DESL; - if((r&0xFF)==PT_PLNT && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - if((r&0xFF)==PT_DESL && 15>(rand()%1000)) - parts[r>>8].type = PT_GAS; - if((r&0xFF)==PT_COAL && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && - (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| - ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| - ptypes[parts[r>>8].type-1].menusection==SC_GAS|| - ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) - parts[r>>8].type--;*/ - } - } - else if(t==PT_PHOT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=0; nx<1; nx++) - for(ny=0; ny<1; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - } - } - else if(t==PT_LCRY) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_LCRY) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_PCLN) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_PCLN) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_HSWC) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_HSWC) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_AMTR) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if((r&0xFF)!=PT_AMTR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_NONE && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_BHOL) - { - t = parts[i].life++; - if(parts[i].life==3) - { - parts[i].type = PT_NONE; - kill_part(i); - } - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - kill_part(r>>8); - if(2>(rand()/(RAND_MAX/100))) - create_part(r>>8, x+nx, y+ny, PT_PHOT); - pv[y/CELL][x/CELL] -= 5.0f; - continue; - } - } - } - else if(t==PT_FIRW) { - if(parts[i].tmp==0) { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR) - { - parts[i].tmp = 1; - parts[i].life = rand()%50+120; - } - } - } - else if(parts[i].tmp==1) { - if(parts[i].life==0) { - parts[i].tmp=2; - } else { - float newVel = parts[i].life/50; - parts[i].flags = parts[i].flags&0xFFFFFFFE; - if((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE) { - parts[i].vy = -newVel; - ly-=newVel; - iy-=newVel; - } - } - } - else if(parts[i].tmp==2) { - for(nx=-2; nx<3; nx++) { - for(ny=-2; ny<3; ny++) { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type==PT_FIRW) { - parts[r>>8].vx = (rand()%3-1)*tmul; - parts[r>>8].vy = (rand()%3-1)*tmul; - parts[r>>8].tmp = 3; - parts[r>>8].life = rand()%100+100; - parts[r>>8].temp = 6000.0f; - } - } - } - } - pv[y/CELL][x/CELL] += 20; - kill_part(i); - } else if(parts[i].tmp==3) { - if(parts[i].life<=0) { - kill_part(i); - } - } - } - else if(t==PT_BTRY) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts_avg(i,r>>8) != PT_INSL) - { - if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) - { - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - parts[r>>8].type = PT_SPRK; - } - } - } - } else if(t==PT_SWCH) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) - continue; - rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) - { - parts[r>>8].type = PT_FIRE; - parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - parts[r>>8].life = rand()%80+180; - if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; - continue; - } - lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; - if(lpv < 1) lpv = 1; - if(legacy_enable) - { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && - ptypes[rt].meltable*lpv>(rand()%1000)) - { - if(t!=PT_LAVA || parts[i].life>0) - { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } - else - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) - { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = PT_STNE; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) - { - kill_part(r>>8); - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; - parts[i].ctype = PT_NONE; - goto killed; - } - } - } - pavg = parts_avg(i, r>>8); - if(rt==PT_SWCH && t==PT_SPRK) - { - pavg = parts_avg(r>>8, i); - if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) - parts[r>>8].life = 10; - if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) - parts[r>>8].life = 9; - if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].ctype = PT_SWCH; - parts[r>>8].life = 4; - } - } - pavg = parts_avg(i, r>>8); - if(pavg != PT_INSL) - { - if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)=373.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=373.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<673.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; - } - } - if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp>373.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp<373.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 6; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) - { - if(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) - { - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) - { - parts[i].life = rand()%150+50; - parts[i].type = PT_PLSM; - parts[i].ctype = PT_NBLE; - parts[i].temp = 3500; - pv[y/CELL][x/CELL] += 1; - } - if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) - { - parts[i].type = PT_SWCH; - parts[i].life = 11; - } - } - } -killed: - if(parts[i].type == PT_NONE) - continue; - } - if(t==PT_STKM) - { - float dt = 0.9;///(FPSB*FPSB); //Delta time in square - //Tempirature handling - if(parts[i].temp<243) - parts[i].life -= 1; - if((parts[i].temp<309.6f) && (parts[i].temp>=243)) - parts[i].temp += 1; - - //Death - if(parts[i].life<1 || death == 1 || (pv[y/CELL][x/CELL]>=4.5f && player[2] != SPC_AIR) ) //If his HP is less that 0 or there is very big wind... - { - death = 0; - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } - - parts[i].vy += -0.7*dt; //Head up! - - //Verlet integration - pp = 2*player[3]-player[5]+player[19]*dt*dt;; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]+player[20]*dt*dt;; - player[6] = player[4]; - player[4] = pp; - - pp = 2*player[7]-player[9]+player[21]*dt*dt;; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+(player[22]+1)*dt*dt;; - player[10] = player[8]; - player[8] = pp; - - pp = 2*player[11]-player[13]+player[23]*dt*dt;; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]+player[24]*dt*dt;; - player[14] = player[12]; - player[12] = pp; - - pp = 2*player[15]-player[17]+player[25]*dt*dt;; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+(player[26]+1)*dt*dt;; - player[18] = player[16]; - player[16] = pp; - - //Setting acceleration to 0 - player[19] = 0; - player[20] = 0; - - player[21] = 0; - player[22] = 0; - - player[23] = 0; - player[24] = 0; - - player[25] = 0; - player[26] = 0; - - //Go left - if (((int)(player[0])&0x01) == 0x01 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[21] = -3; - player[22] = -2; - player[19] = -2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[25] = -3; - player[26] = -2; - player[23] = -2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[21] = -1; - player[22] = -1; - player[19] = -1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[25] = -1; - player[26] = -1; - player[23] = -1; - } - } - } - - //Go right - if (((int)(player[0])&0x02) == 0x02 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[21] = 3; - player[22] = -2; - player[19] = 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[25] = 3; - player[26] = -2; - player[23] = 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[21] = 1; - player[22] = -1; - player[19] = 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[25] = 1; - player[26] = -1; - player[23] = 1; - } - - } - } - - //Jump - if (((int)(player[0])&0x04) == 0x04 && (pstates[pmap[(int)(player[8]-0.5)][(int)(player[7])]&0xFF].state != ST_GAS || pstates[pmap[(int)(player[16]-0.5)][(int)(player[15])]&0xFF].state != ST_GAS)) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[22] -= 1; - player[26] -= 1; - } - } - - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if(ptypes[pmap[ny+y][nx+x]&0xFF].falldown!=0 || (pmap[ny+y][nx+x]&0xFF) == PT_NEUT || (pmap[ny+y][nx+x]&0xFF) == PT_PHOT) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } - - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - if(bmap[(ny+y)/CELL][(nx+x)/CELL]==4) - player[2] = SPC_AIR; - } - - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); - - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - if(player[2] == SPC_AIR) - create_parts(nx + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01), ny, 4, SPC_AIR); - else - create_part(-1, nx, ny, player[2]); - - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 && player[2] != PT_PHOT && player[2] != SPC_AIR) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) - { - int random = abs(rand()%3-1)*3; - if (random==0) - { - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - } - else - { - parts[r>>8].vy = 0; - parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; - } - } - - } - } - } - - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; - - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; - - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; - - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; - - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - r = pmap[(int)(player[16]-2)][(int)(player[15]+nx)]; - if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) - player[15] -= nx; - - r = pmap[(int)(player[8]-2)][(int)(player[7]+nx)]; - if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) - player[7] -= nx; - } - - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || (r&0xFF) == PT_LNTG) //Liquid checks //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1*dt; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5*dt; - } - else - { - if(pstates[r&0xFF].state != ST_GAS) - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy*dt; - } - } - player[9] = player[7]; - } - - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || (r&0xFF) == PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1*dt; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5*dt; - } - else - { - if(pstates[r&0xFF].state != ST_GAS) - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy*dt; - } - } - player[17] = player[15]; - } - - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= (10+ny)*dt; - parts[i].vy = -10*dt; - } - - } - - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[21] -= 0.2; - player[25] += 0.2; - } - - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[19] -= 0.2; - player[23] += 0.2; - } - - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=323 || parts[r>>8].temp<=243) - { - parts[i].life -= 2; - player[26] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=323 || parts[r>>8].temp<=243) - { - parts[i].life -= 2; - player[22] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - isplayer = 1; - } - if(t==PT_CLNE) - { - if(!parts[i].ctype) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx=0 && y+ny>0 && - x+nx303&&parts[i].temp<317) { - create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); - } - } - if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) - { - parts[i].type = PT_NBLE; - parts[i].life = 0; - } - if (t==PT_FIRE && parts[i].life <=1 && parts[i].temp<625) - { - t = parts[i].type = PT_SMKE; - parts[i].life = rand()%20+250; - } - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - continue; - } - - rt = parts[i].flags & FLAG_STAGNANT; - parts[i].flags &= ~FLAG_STAGNANT; - if(!try_move(i, x, y, nx, ny)) - { - parts[i].x = lx; - parts[i].y = ly; - if(ptypes[t].falldown) - { - if(nx!=x && try_move(i, x, y, nx, y)) - { - parts[i].x = ix; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x, ny)) - { - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else - { - r = (rand()%2)*2-1; - if(ny!=y && try_move(i, x, y, x+r, ny)) - { - parts[i].x += r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x-r, ny)) - { - parts[i].x -= r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y+r)) - { - parts[i].x = ix; - parts[i].y += r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y-r)) - { - parts[i].x = ix; - parts[i].y -= r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) - { - s = 0; - if(!rt || nt) - rt = 50; - else - rt = 10; - for(j=x+r; j>=0 && j>=x-rt && j0) - r = 1; - else - r = -1; - if(s) - for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) - { - kill_part(i); - continue; - } - else if(try_move(i, x, y, 2*x-nx, ny)) - { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } - else if(try_move(i, x, y, nx, 2*y-ny)) - { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } - else - { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } - } - if(nx=XRES-CELL || ny=YRES-CELL) - { - kill_part(i); - continue; - } - } - if(framerender) { - framerender = 0; - sys_pause = 1; - } -} - -void update_particles(pixel *vid) -{ - int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; - float lx, ly; -#ifdef MT - int pt = 0, pc = 0; - pthread_t *InterThreads; -#endif - - isplayer = 0; //Needed for player spawning - memset(pmap, 0, sizeof(pmap)); - r = rand()%2; - for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==13) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && (!sys_pause||framerender)) - emap[y][x] --; - } - } - } - else - { - for(y=0; y>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==9) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && (!sys_pause||framerender)) - emap[y][x] --; - } - } - } - - update_particles_i(vid, 0, 1); - - for(y=0; y=XRES || ny<0 || ny>=YRES) - break; - addpixel(vid, nx, ny, 255, 255, 255, 64); - i = nx/CELL; - j = ny/CELL; - lx += vx[j][i]*0.125f; - ly += vy[j][i]*0.125f; - if(bmap[j][i]==5 && i!=x && j!=y) - break; - } - drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); - } - -} - -void clear_area(int area_x, int area_y, int area_w, int area_h) -{ - int cx = 0; - int cy = 0; - for(cy=0; cyx2) - { - i = x2; - x2 = x1; - x1 = i; - } - if(y1>y2) - { - j = y2; - y2 = y1; - y1 = j; - } - for(j=y1; j<=y2; j++) - for(i=x1; i<=x2; i++) - create_parts(i, j, 1, c); -} - -int flood_parts(int x, int y, int c, int cm, int bm) -{ - int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) - { - c = c-100; - } - if(cm==-1) - { - if(c==0) - { - cm = pmap[y][x]&0xFF; - if(!cm) - return 0; - } - else - cm = 0; - } - if(bm==-1) - { - if(c==30) - { - bm = bmap[y/CELL][x/CELL]; - if(!bm) - return 0; - if(bm==1) - cm = 0xFF; - } - else - bm = 0; - } - - if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) - return 1; - - // go left as far as possible - x1 = x2 = x; - while(x1>=CELL) - { - if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) - break; - x1--; - } - while(x2=CELL+dy) - for(x=x1; x<=x2; x++) - if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) - if(!flood_parts(x, y-dy, co, cm, bm)) - return 0; - if(y=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) - { - if(cp) - create_parts(y, x, r, c); - else - create_parts(x, y, r, c); - } - e -= 1.0f; - } - } -} diff --git a/powder.h b/powder.h deleted file mode 100644 index eda30d2ca..000000000 --- a/powder.h +++ /dev/null @@ -1,512 +0,0 @@ -#ifndef POWDER_H -#define POWDER_H - -#include "graphics.h" -#include "defines.h" -#include "interface.h" - -#define CM_COUNT 7 -#define CM_FANCY 6 -#define CM_HEAT 5 -#define CM_BLOB 4 -#define CM_FIRE 3 -#define CM_PERS 2 -#define CM_PRESS 1 -#define CM_VEL 0 - -#define UI_WALLSTART 37 -#define UI_WALLCOUNT 19 - -#define SPC_AIR 136 -#define SPC_HEAT 137 -#define SPC_COOL 138 -#define SPC_VACUUM 139 - -#define WL_WALLELEC 22 -#define WL_EWALL 23 -#define WL_DETECT 24 -#define WL_STREAM 25 -#define WL_SIGN 26 -#define WL_FAN 27 -#define WL_ALLOWLIQUID 28 -#define WL_DESTROYALL 29 -#define WL_ERASE 30 -#define WL_WALL 31 -#define WL_ALLOWAIR 32 -#define WL_ALLOWSOLID 33 -#define WL_ALLOWALLELEC 34 -#define WL_EHOLE 35 -#define WL_ALLOWGAS 40 - -#define PT_NONE 0 -#define PT_DUST 1 -#define PT_WATR 2 -#define PT_OIL 3 -#define PT_FIRE 4 -#define PT_STNE 5 -#define PT_LAVA 6 -#define PT_GUNP 7 -#define PT_NITR 8 -#define PT_CLNE 9 -#define PT_GAS 10 -#define PT_PLEX 11 -#define PT_GOO 12 -#define PT_ICEI 13 -#define PT_METL 14 -#define PT_SPRK 15 -#define PT_SNOW 16 -#define PT_WOOD 17 -#define PT_NEUT 18 -#define PT_PLUT 19 -#define PT_PLNT 20 -#define PT_ACID 21 -#define PT_VOID 22 -#define PT_WTRV 23 -#define PT_CNCT 24 -#define PT_DSTW 25 -#define PT_SALT 26 -#define PT_SLTW 27 -#define PT_DMND 28 -#define PT_BMTL 29 -#define PT_BRMT 30 -#define PT_PHOT 31 -#define PT_URAN 32 -#define PT_WAX 33 -#define PT_MWAX 34 -#define PT_PSCN 35 -#define PT_NSCN 36 -#define PT_LNTG 37 -#define PT_INSL 38 -#define PT_BHOL 39 -#define PT_WHOL 40 -#define PT_RBDM 41 -#define PT_LRBD 42 -#define PT_NTCT 43 -#define PT_SAND 44 -#define PT_GLAS 45 -#define PT_PTCT 46 -#define PT_BGLA 47 -#define PT_THDR 48 -#define PT_PLSM 49 -#define PT_ETRD 50 -#define PT_NICE 51 -#define PT_NBLE 52 -#define PT_BTRY 53 -#define PT_LCRY 54 -#define PT_STKM 55 -#define PT_SWCH 56 -#define PT_SMKE 57 -#define PT_DESL 58 -#define PT_COAL 59 -#define PT_LO2 60 -#define PT_O2 61 -#define PT_INWR 62 -#define PT_YEST 63 -#define PT_DYST 64 -#define PT_THRM 65 -#define PT_GLOW 66 -#define PT_BRCK 67 -#define PT_HFLM 68 -#define PT_FIRW 69 -#define PT_FUSE 70 -#define PT_FSEP 71 -#define PT_AMTR 72 -#define PT_PCLN 73 -#define PT_HSWC 74 -#define PT_NUM 75 - -#define R_TEMP 22 -#define MAX_TEMP 9999 -#define MIN_TEMP 0 -#define O_MAX_TEMP 3500 -#define O_MIN_TEMP -273 - -#define ST_NONE 0 -#define ST_SOLID 1 -#define ST_LIQUID 2 -#define ST_GAS 3 -/* - We should start to implement these. -*/ -static const unsigned short TYPE_PART = 0x01; //1 -static const unsigned short TYPE_LIQUID = 0x02; //2 -static const unsigned short TYPE_SOLID = 0x04; //4 -static const unsigned short TYPE_GAS = 0x08; //8 -static const unsigned short PROP_CONDUCTS = 0x10; //16 -static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. -#define FLAG_STAGNANT 1 - -struct particle -{ - int type; - int life, ctype; - float x, y, vx, vy; - float temp; - float pavg[2]; - int flags; - int tmp; -}; -typedef struct particle particle; - -struct part_type -{ - const char *name; - pixel pcolors; - float advection; - float airdrag; - float airloss; - float loss; - float collision; - float gravity; - float diffusion; - float hotair; - int falldown; - int flammable; - int explosive; - int meltable; - int hardness; - int menu; - int menusection; - float heat; - unsigned char hconduct; - const char *descs; - const unsigned short properties; -}; -typedef struct part_type part_type; - -struct part_state -{ - char state; - int solid; - float stemp; - int liquid; - float ltemp; - int gas; - float gtemp; - int burn; - float btemp; -}; -typedef struct part_state part_state; -//Should probably be const. -static const part_type ptypes[PT_NUM] = -{ - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f+273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f+273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f+273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f+273.15f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f+273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f+273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f+273.15f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f+273.15f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f+273.15f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f+273.15f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f+273.15f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f+273.15f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f+273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow, Glows under pressure"}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description -}; - -static part_state pstates[PT_NUM] = -{ - // Name Solid Frzp Liquid Mpnt Gas Bpoint - /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, - /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, - /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, - /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, - /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, - /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, - /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, - /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, - /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, - /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, - /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, - /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, -}; - -static unsigned char can_move[PT_NUM][PT_NUM] = -{ - /* A B */ - /* A 0 1 | B ligher than A */ - /* B 1 0 | A heavier than B */ - - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A P H */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C S */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T L W */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R N C */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* GLOW */ - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ - /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ - /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ - /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ - /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* FSEP */ - /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ - /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ - /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A P H */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C S */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T L W */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R N C */ -}; - -extern int isplayer; -extern float player[27]; - -extern particle *parts; -extern particle *cb_parts; - -extern unsigned char bmap[YRES/CELL][XRES/CELL]; -extern unsigned char emap[YRES/CELL][XRES/CELL]; - -extern unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -extern unsigned char cb_emap[YRES/CELL][XRES/CELL]; - -extern int pfree; - -extern unsigned pmap[YRES][XRES]; -unsigned cb_pmap[YRES][XRES]; - -int try_move(int i, int x, int y, int nx, int ny); - -void kill_part(int i); - -#ifdef WIN32 -extern _inline int create_part(int p, int x, int y, int t); -#else -extern inline int create_part(int p, int x, int y, int t); -#endif - -#ifdef WIN32 -extern _inline void delete_part(int x, int y); -#else -extern inline void delete_part(int x, int y); -#endif - -#ifdef WIN32 -extern _inline int is_wire(int x, int y); -#else -extern inline int is_wire(int x, int y); -#endif - -#ifdef WIN32 -extern _inline int is_wire_off(int x, int y); -#else -extern inline int is_wire_off(int x, int y); -#endif - -void set_emap(int x, int y); - -#ifdef WIN32 -_inline int parts_avg(int ci, int ni); -#else -inline int parts_avg(int ci, int ni); -#endif - -int nearest_part(int ci, int t); - -void update_particles_i(pixel *vid, int start, int inc); - -void update_particles(pixel *vid); - -void clear_area(int area_x, int area_y, int area_w, int area_h); - -void create_box(int x1, int y1, int x2, int y2, int c); - -int flood_parts(int x, int y, int c, int cm, int bm); - -int create_parts(int x, int y, int r, int c); - -void create_line(int x1, int y1, int x2, int y2, int r, int c); - -#endif diff --git a/update.c b/update.c deleted file mode 100644 index ba32b54c6..000000000 --- a/update.c +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Powder Toy - Update Helper - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * - * 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 02111-1301 USA - */ - -#include -#ifndef MACOSX -#include -#endif -#include - -#ifdef WIN32 -#include -#else -#include -#include -#endif -#ifdef MACOSX -#include -#include -#include -#endif - -#include "update.h" - -static char *exe_name(void) -{ -#if defined WIN32 - char *name= (char *)malloc(64), max=64, res; - while((res = (char)GetModuleFileName(NULL, name, max)) >= max) - { -#elif defined MACOSX - char *fn=malloc(64),*name=malloc(PATH_MAX), max=64, res; - if(_NSGetExecutablePath(fn, &max) != 0) - { - fn = realloc(fn, max); - _NSGetExecutablePath(fn, &max); - } - if(realpath(fn, name) == NULL) - { - free(fn); - free(name); - return NULL; - } - res = 1; -#else - char fn[64], *name=malloc(64), max=64, res; - sprintf(fn, "/proc/self/exe"); - memset(name, 0, max); - while((res = readlink(fn, name, max)) >= max-1) - { -#endif -#ifndef MACOSX - max *= 2; - name = realloc(name, max); - memset(name, 0, max); - } -#endif - if(res <= 0) - { - free(name); - return NULL; - } - return name; -} - -int update_start(char *data, int len) -{ - char *self=exe_name(), *temp; -#ifdef WIN32 - char *p; -#endif - FILE *f; - int res = 1; - - if(!self) - return 1; - -#ifdef WIN32 - temp = malloc(strlen(self)+12); - strcpy(temp, self); - p = temp + strlen(temp) - 4; - if(_stricmp(p, ".exe")) - p += 4; - strcpy(p, "_update.exe"); - - if(!MoveFile(self, temp)) - goto fail; - - f = fopen(self, "wb"); - if(!f) - goto fail; - if(fwrite(data, 1, len, f) != len) - { - fclose(f); - DeleteFile(self); - goto fail; - } - fclose(f); - - if((int)ShellExecute(NULL, "open", self, NULL, NULL, SW_SHOWNORMAL) <= 32) - { - DeleteFile(self); - goto fail; - } - - return 0; -#else - temp = malloc(strlen(self)+8); - strcpy(temp, self); - strcat(temp, "-update"); - - f = fopen(temp, "w"); - if(!f) - goto fail; - if(fwrite(data, 1, len, f) != len) - { - fclose(f); - unlink(temp); - goto fail; - } - fclose(f); - - if(chmod(temp, 0755)) - { - unlink(temp); - goto fail; - } - - if(rename(temp, self)) - { - unlink(temp); - goto fail; - } - - execl(self, "powder-update", NULL); -#endif - -fail: - free(temp); - free(self); - return res; -} - -int update_finish(void) -{ -#ifdef WIN32 - char *temp, *self=exe_name(), *p; - int timeout = 60, err; - - temp = malloc(strlen(self)+12); - strcpy(temp, self); - p = temp + strlen(temp) - 4; - if(_stricmp(p, ".exe")) - p += 4; - strcpy(p, "_update.exe"); - - while(!DeleteFile(temp)) - { - err = GetLastError(); - if(err == ERROR_FILE_NOT_FOUND) - { - // just as well, then - free(temp); - return 0; - } - Sleep(500); - timeout--; - if(timeout <= 0) - { - free(temp); - return 1; - } - } - free(temp); -#endif - return 0; -} - -void update_cleanup(void) -{ -#ifdef WIN32 - update_finish(); -#endif -} diff --git a/update.h b/update.h deleted file mode 100755 index 6398d4d79..000000000 --- a/update.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Powder Toy - Main source - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * - * 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 02111-1301 USA - */ -#ifndef UPDATE_H -#define UPDATE_H - -int update_start(char *data, int len); -int update_finish(void); -void update_cleanup(void); - -#endif diff --git a/version.h b/version.h deleted file mode 100755 index 41e9672df..000000000 --- a/version.h +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Powder Toy - Version (Header) - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * - * 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 02111-1301 USA - */ -#ifndef VERSION_H -#define VERSION_H - - - -#endif From 07283c6f5507816bb76b1752b306c3806d7280da Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 27 Sep 2010 12:55:39 +0200 Subject: [PATCH 174/237] Try to automerge with this, haha --- Resources/Font-Data | Bin 4442 -> 0 bytes Resources/Font-Pointers | Bin 512 -> 0 bytes Resources/Icon-16.png | Bin 3161 -> 0 bytes Resources/Icon-32.png | Bin 3896 -> 0 bytes Resources/powder-res.rc | 2 -- Resources/powder.icns | Bin 98761 -> 0 bytes Resources/powder.ico | Bin 90174 -> 0 bytes 7 files changed, 2 deletions(-) delete mode 100644 Resources/Font-Data delete mode 100644 Resources/Font-Pointers delete mode 100755 Resources/Icon-16.png delete mode 100755 Resources/Icon-32.png delete mode 100644 Resources/powder-res.rc delete mode 100755 Resources/powder.icns delete mode 100755 Resources/powder.ico diff --git a/Resources/Font-Data b/Resources/Font-Data deleted file mode 100644 index a38415251c4672b7a0a27e45d10cef660ced29bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4442 zcmeHJ;cpyA6@R;PcWd8`v!zGpO_umuq0jr})k_cEN!J!dZ-4|gR_Fxux2FWTu7hFl?2v!Nj7 zWDH_t9OPp7#gN5m;)tI<8WfNE=_5)l0id(G#UKKKkR;I_qN<7)Lmuto#4X{FsOa<( zkgst_Dp_K?e$cRo$>L~B@o^T+5X!i#;3Qgqa>hwAR{|j|K%#Zb(Z~SU&W@&dPDawR z&N5+cC>J(-uWmsfi{#C9FoG;u|cZh}h1WGXl z8v{$nR9u*40Pdywd5VWVrKO-KKZ>N>teEqsO*7=%$Ji;d2Qw*?3DC7|X4r#~+4QDm zK)YY9L1NC&OxjG?jD$v)+2}+gJ7GH_1m3*ukUWr52WXjPCQ$jITnqyVQiSzJi4u0N z;#KA`adJN!+YJ<*kw%f&Y*P7)WvHYKqDlA~fHNy&*qSzRdG$yB+kuS?7Bv~CHg$G4Wp9)#*J^mzX(RG!WxIu&JH$B==5lfl( z6*6^4omJe2)4#R7bfk&0DqE(0O4^AXHV6WeyKoa<9rl`Jik+0$(BMIj&Zd=GEDb&3 zamRpxBY_S`o&3!`*;+o-QE^QkMtuqT;;|9i9-ashV8K`O9<|jilIW0|TJK<$vZ+Q@ zmY$T|l`@lYv=6LYl_wyvReKAuMp%557AZ~3(?daNgQ0$y1proK>l-Vo$|QLu#JO3OZpqbHb#B6-xEHzL`CKmdzPf|4QA!D=qi8@Mw(UNMr6^^T%9Kf~ znV*l`!7oLz=vj9KBL_yplumPn}uD1;|2`v%`E{ZMT$$5^vK-i=T0r$RDNZtHK zS|B85g_tojs%e(b0diSxLJ7BxcVl1ftGxr+Bo zMR33w>llx27Dmw$W(%>Y7^9HF+%MHFv1u)-HR)VfZSkS#&|Oj97BWaz!#C!J(d$9J z2e3I~vB+kHfbringW%HxO5AuwoE`9=Mo4v$0uz?V)pvwGt#t{543Jr}MR?~=paQ^s ztKN@IP>^fEb?sG$A4su{`vx{?b-4g8>z5Yb@{0L&LH<^(w9G+OUKFrhaAV;=S%Fm| zsf=@6k?Z&xxU=E7KV`|0{}MJ((H#E1po4V9RWQvmTZ zaQ}5>8dnD4D0J70rI{b``;`@9m;*l%Ulm1s@lgNB5qM(!rPxzX{pve|Lo2l|7WTSs zOjHJr!)r!h@sHt}-Za|sQIWq8B)NdO-3ynYqS%M)SUV6%gkht4WF1fjEfxHu>vBW% z5TboNaR@e62?+7LfiJph5XvtXrmWP^V>pJ@YQSIhe=pVxfAol1kj0DDn&LP3`Tn&7 z4`7n~p>m)tu3!9UX=&-t7qCuDbuvUEZDCDI=b{)$+qY2IB~8DWU1eUe3MXZjkdo?} zQ1Dtd-RJQ1AysND`D$eA-9qnrQK$lUAHW4Zl3@hIEUYRkkn=2so;+EZEN zkpp5LpqD~$@_`<^IBpbo9}=2r@#Bl`TGg_#d-JH#C(6a2hT-c zd1Ya2u#SVif=3)$>(V*Ho`jF`PRcLC%NqK)g#Q&dwXgTrF!*El$#4H~{=5GBLt1-$ z+(1bj<=D}-byVL;;YNJg%h1%69|zvn{DfP^PSZ4e`3U%E5fSdBUb0>YrnThTSIX@V zs;Mz-g)eK#idFf6g(U>Cjx@*Nn$hF`qGL_wwW+Drh_i^KAM8t8@Olb+%0jZT7mn&m z+{um$z56Q tqe3FA9r3YxP_T2O1LJUkd!+E9kJkx1H}?2X*TQ4|(Yx_DAD`)b{2zD8w6*{M diff --git a/Resources/Font-Pointers b/Resources/Font-Pointers deleted file mode 100644 index 621258b8240d3a4489dc661c661b8b77476a772a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 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 diff --git a/Resources/Icon-32.png b/Resources/Icon-32.png deleted file mode 100755 index 1f056bd778a1a0f9f6dc4c94ad864e7dcaf1db4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3896 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]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 S;?fN;ne)(?8bTL3 z^Xd=RkwcosGd}rE<;(1grJ&TA)zQai!36(l1Vr*+*@!xE5p_Z7$khQJve&Tj2^5jl zmG?92+a{QCnx52-0KhibwI1o!;)W)3a{`QMN_8Lez)9^>H;2YfNhnO^P()5CrFA`G zNW3$$Sd-ZV_+cEVF4m8ZzwS=3&|>S#u}gOA-X%J~q}dp0D5J=slWrVYi2dw>!9URc z14}%>WM`cy$v9?IP#A1OHrlk`^P=E(VNMEjN3Ml(Lwhtle~FyLXgnxWg2yhsM8hh? z+TGioEZ1gs?YCG;rMDvzb5(Q{@55%_Wl;qQ5-a`-UdM8Gp(;UEo{VG3|6pK*_15?p zXEA>5vSVudcTCtP@k{sppPP2qq$i4k0Q`}5V`&rienNpEE3Cs8E!I6s&NZuSQ}8`k zFY@>tAIX53$FBA+R_JAaFYxm8;u#;fDyEHwPcdwz$cC`_w_)8E?jV4Ls1;RNwq8bh zqvsXI@|3WJQhe@Epit`pxMDrBy8bAokcN$JrMt{OmJ3cTWSbVG>M(DXqyxB#zJuM)kBn?C<+KhH{}Rs)0?P zGA7lgettW#2i)VFS@}fT6sMo{dpST5x&l=OSn&6x4mxB$V zC7>u2%Tp=`CFDwy>OO?>Ww7xjMSm*FvbGKhXpa5ox;$WC^4}aODGbJ&{uUT|12Dap zF-YWV?zs%F4f@`_0boB0+z2i~gzO>?j!Gfl=u~HKiF<-YLj+V;XM>n^t>W{1`WKbR z6j7t0AuWVIkv!MH3hHTMa`zE;#VpnP%y2?HW}DgH9M8iym2v)PkS2y9EQ;hec7djn zaj{YEGs`gfp6o$TSk-C5bNV~+M0Vo8`mA&2f)fdPa1iS+%ffaU%+byxP2}z&P^w1B;>ttIJ6@j8{ zTq<_x7D0vXt1mPKNfVwN#u}Yx;(DF1aE%RoJ;xC2bM8!Yq|>Nu`Icmz09|*i`Wu7S+=A+pQxiiaD;#L{*+ql5+rQDwN5G(1274K?P9wwiGHa* zI$gc!)M|~Z-43A>Rz&E4y=kS=8V^U6o)LE@CQsX#83oZT(~}Q-fHf1Izf&yGk79Hf zGOl|8)n<*oBpp)lou>6!(wTPK(^ zI^quGGV>7K;g+T=@(CF$2tzWf*Q-H3sh`MplYnqr<0T!|VBw5v@x=B%u8#A=weR&AM&u35gJMkrh>QckIs8~Rtr+cm6i_1TM@R=vu9f|9!Nr^iSy#) zG7g5~cEh~&4;9os*{B~zx@z@s_(n6#pRKw#=SMl(;YHiw1j3+J_nwaQryBW>1rl2% z%P=A8cngn>rxooaNV<``h%{C%nWdelEPqunL}Rv5EBKOByRbuW%LtwufFF_pBru39 zFFlz8)zor7#KdRuI?Au7lS%}w@ANi7%u9(H0?e3MUGWO>y-CGxs$Ra@R~Wm* z(84E><7**=F`QYWJ&1^yD#BsuH^M5Nkoh$kulb_mL?7fIHsq#=i8c7_bgO6E0xzwf zOy-CWFDmEG(j~y>mB2zEN$Ryx+rm0XJ0gjXhU2t~92d64N^g0cQ>(^d+DrA4H?_Pl zkK570BxBl$j;ZGONRKLkySSA2di&JHwiznwi1icW4emQSy@;pS6SM@Im>jB6h=Qoe zqr?S)SyfHWWNJq;*4g1FZk?LIkJz?A2wy8+a$ZO?p~hl^iM1-Et<{nTk$20+6Lwlv zlux5P%hGp3N&y4_s_=RgYJ=F)EX{03n^DHb5(#AGu{|$3`HmcQ>34L*hf%ytO7fPD zw|VbHh^NGJPWnn--QuCb8SJ)HyK%(O+*p9I>^4<~G2N&ojfJq@|^qGsWW0p0o|hnnlQT0(Wf&PoHQ_DvubWHmgzO_jeGR|;;rXrF`5 zL05Z%mO0%lZ``lZN0=s={#)a6XepIgXK1uUbeq7=K8vM$TD*~ZIm4DxAvezQpV*p= zh}^5AK=|q_ReFq82{eXr{D)O)8IVsF-vwrMo@02|(Ft5LBzggowRh0dD~ZkE;Q&#Qz4gIkWvv z{6&iS_&SDI>ea3-zhRe~5Tz>K`*lI0E)Kmky+v+zUYn-0QXEv3YyH`$;Xlma%5F|y z;u!Xn8nQz{ci~*eRJTPoZ66-z(v0*x9Wi{KVPluqaT{w37|Xywp*w2A|l@C-P9ycrUr@j z2J5pArt0sL_30LIm5`h(=VahPt4%YEaS+==?)YQw$7X= zFQlM`IT(_lAROLhD5GLUg!E7B=Mb#MVqxMig=emQH;MpJsH_E`uCM0PL|Vp;3ZY)<$!NbN+k^=D|8D0Ut(I zrb>#YQq+P{+i9zi%U_@(AYoP8k_~c58y0b^!y6Wh7UdvJnWlWI_lH^SsKY3r!%2us z-gWP+3*G^b^(F4H_xu*c3>IuaJ^zdab0e1PN{AkusjB%BjBgySz1PD}{lDg_eQQ1p zUg@#7UdPnbAS((QtMza|<7#!$^`5Hr-PC9VC?Sp(=dFAjLHQLa5u+=g`uO1I)G_ zAiXZxz*+NY>$roEYAze(A=p_-MR^k42*V-WYoHmWI>e`yL847d^In|#R^Dr1bRSE) zH5DhT<-7gLMLcHe5=*Lc$D~YL<0tOj#z}hZ73(HmES;yN6Q|x(U3L9dOexgx^i(Vf zqSZva2`Mnl@V(JJ0cgA^+4d86@|>e;yvg+t6Ia;4gT;9xm!2IYfqJ^fTR!MHstekv zwZt^dvf1MvM2HuY$wA{L*fr_Js=i2IqjAEwGL>t@R)1M+p58}W61S#R+nQPERl|W! z_bSSo=*fdP*4iMh2ZV1vAA{A`mH;pS0nPH)QuR71@Qv`KZ|$?91K=f^^IutGMs+G& z7QDd_zyJvUC8E~}1*U8Q_~iGtUWKk-jAAnIwpFb|UEgtHMWLRoBtJXwZ802rEcU5? zs<|zeijfRjIEF!xk^;Mr)ja?_h=25B@ULpW5`}@R+aC}QTK$(eEbT8RM&n|L(lODn zTx?y5b`oi{V5Z84E-$)`6t=fr;=zUuE!tvW1xvAQNrjx+2wQXol@wi103)g11FJR0 z?u>XGt8F$CCJG-Kg=lxyL119KZpmfioU$Av&deCYXJ@WAjIQ9m`>YKl97m^2zFLBr z6+r%tH)TDLmD~>T0G#i(Bg!>aEC(OzsbhRV&oZ+$4u-1wsEDr!IP_-vn&Q?uGU*>9 zHmLM>q)Dh=;`UTT8g%bP=3C7>5Fy{RDy~~79&2Ip z5PnyPve!VrN(CDR`_5;yv@@7O&-~{N4B13}C!(WxeUlXjgdQvMz=-8e=ym| z(u#MpRax?r@nFL>L^`;T6A^HYAA1BlolkcH*ylh}+&G4KHJupCOi|I}8A6D}lglsI zO;%*NF6}u>lX2;bTy-b`(UE?pEtv$l5#~?A^!h7AJ$p?&OCpk2H>cFny{7ni*`=e= zKytG?hnFItWNdLbE}~?$w~yzn6rfD4{Zo;1Mu*_B`nZ$p=eTXMpjasDK`~l+Rl3QN zm-a6q4WKHPNLED-M5!k7I=E~(@n)xiWA2P~QpT8LYJ1t!-Zb2TUealg@dBaHv^Y_1 zMJ=FM8HePJ+Wd+UZBlftR02!g?AO?=EP1&OAF=B}CmXCcdCb(Mwl*O`evtarGuu!w zzS|KsWIHVEn$Jnak_vXW1NIs~B<_reGhUlmdA4M6*$)u~oj2>%F##s(%wZQLxQ*fM zyH%Y7Mt*Q47;`L$(F!O+1+lLO(sG8~8a5kiE1!}QqzeJ`bal{O_@EArpKDCRdI7o*9|M!&T6;i4+;454%Pb+0k)c*!Aps)a zFg;-x8qLjs(Pbb|Owzi0o~#Lj_lm7K_4I=ZT$&ogJV>P?LuwV#vqvODC`Uv!!+gh` zlr|feJS5NCK!V3U2t7DL?0CT!XC@D2@z#^NF9a_DxJnxBf0=L;4Kh1(6G}y#Xi;h> zp}E4rJ<{UK#*wx2Al~*{PQNb*!vWlu^do_wCRjCo2@3rZrIS;)`=klNQ1bgfjk1dM zoxyE(QuVXEL;=zC-<0Qs9wJgCq3hz}J^fP%;(CBLSF)!`cnhWF1oCpWC=W6ib9JBC z>DV&F+GE)vkbWFtile@>4?oTgYlg!ScF&|Q#KJP`bm1W{__+l}9dyDj^a2V2R0}0j z`Pe0vXn>IlZ-Mi5Zo1X`#*KEWs;a80o*fgas;aLVrd1ZI22NFer6uQ)4>KEz8eEoU zKlQvk3ylGVlxEM3xg?TFB$7!Qk-8@&l1U_zN)kwq3Yl5kRYb8rSTJEf9>uN# z0$`(~mx|29Li+>ncx|@ZYb?hh4~4qbW8ajUgohNH zZMNHOxg=pdk$Jhnwe9%h2GY~7DJv#(QFH`Lj}}V%e!L2y7J?{I-q(J}&rMvfyTakB z`N72{u_;_KdbM23z%eR7QlMn{sE-g*lbs_QCodq9*~!dC+ikZt&aYH3l$zc8LW4#| zNTWwmjT#tj$wEm1aj?ehJin%D^jaw561?JgKkD?P(|=(E((>G9A^P`^pp7{V>vGb6 zGJ7SUYo7pb8tjL#coCJE34d}laB>D8R5IuqsXFMeh6n$D`^%irQPWqk-kVF-=J%X& z;pkVL*>Y^L6sg4TkO#wxTH1!nXN=rqYs&tF|6rn&Ta=$_kFeJ{bW$_{m^2F!N`Gr; z8>RN`(<7`}MiuWgfG8OTHBMzy~8E=?ZiABC267}3Nt$9P4R3eK?N3z4gKvFU*gXKk~rGlVX;d$nIUrT8yR35ulx!7~(z|$I|q0A1XhU`VvnFa<@^y33HA4z67cwGru zkHfe#JBJVsQ#)018I(w)gmY!6fAX#dC=1b+z_z+h24XU&IL_Tj$G{|U%+msj1e54a znbJ-M2mgNqcWFfiW>rC2<=6!IC_{H@h)eX&<$mFdEW=hsK6ga0(1kZ6jgn@d36CD+Sj|;A^MasH#&|r}nfz zy&Hu2l>~;cs&(EM-q`>K3yc5&0ZZcjqF4`6v_49U3?h-OZ*ZX6WF254a!DkTNhFO@ z$;jy63Lj;|txuLG-~KNvO6}}Q578V%(u){D_76qveil?2@r_eBXq+DOpDjpR-ah@l ziM3ZOxMBKCEyuiYI%bnOT+U11TRp1>Rs>GJFIxnWDr!=5qD*XNv%EXWUB?nhJwVTK zNw(WLsXlRVJTjge0p zb_+IKvB{QBV^&R%-Gde=$d-J~ob0J=Bctg70Z0}TAqir|?iks|_`b8_MtYLd)2Fj= z-*n{0^;Xn?hgwDXlSLad;GVKK%o-BsN?$hDOtrg?1H{D9h{#P)l#&Mix&BxSpC+Y} zMp2#y_O2N*PztuK2dx^bBU zP)mhC-3jBQ7c4f;Wp{Mc>@cSQ4!q*j)O8`hfJX|~f-f4!FTmzNLSKbLGl}E-W-IRT z3YB5V?~|q1VIt$@kVN*Afo;?=&edxZFo#^Ia)S}TeZw+Yr4NF?^2UyQhSV#V(-Kw?SXKeH^Ct!rv?Cw=Q~iRzsgo9J{ps@pg}NcG7VAB{UmiftE?pwpJn4-ap*kAWYe&8xjnd>0*D!>0 zDJ-Kqn}MQt>`&UI58rm4=OyB8Wjkt50#tRZvsKTw)(1BBbip}GzkME`26v!wpchHN z+)9skSNQY-cfe#NCfSVF;XbApVTlTa$Rr{YA=Rz(I>3GK*ObK@aEG7~CbG&3xc9uD z+M7^fiVTVkw$8wUpo_CesTjdDhbVDL6P%LN+Yll7K+qNEfjbg@>q81P3`l=~Z)ir*(L?V^GKe%RKoSh5z|F|y>5Syvj1NPJX+w#Oze4|&Z@)@QC)_fK2_3g(q%D* z1Q^7<5DPcVokuASwBoy5liq-?!?Iu8B)bV36*XB6zacWLr7QSw=HZl&y2oW88Pt<% z5~~hS*NBsS&LO(*fEzJ0Bnfp>PIO4yyt0Yjq=rpgy3WT=6_5J3FZ10gu}9R>iF@nB z$1V_aMC=Vy2~#okp~EZ_du^~(k@v8UcnAnH$8C5qEsxTlcFhb#l5`JSf@m!2aI<*C zHuf;z2vT}iDmV<}_4HsIi>c$GyYyj433vp`eP+VVRu^O~ZUx9Er>hHd9zGk7*kE z=7H5C%S$yrEtV9uJdH}Z$xHjYx+cMnuz`_wK&ub!4B&IWIK@Q~MuLw@}EGV>P7i1r9Ugk0V!1XE)E~yS-LJC@tqZ%PG~dB#M~gDYs+N$4dcl( z$ru=bhM*Ldl$`!5JC4&v!R1%CL@pl8%Fvhjiq%~IPHduJ=V;xS-IC6lLVDuU6k}eaZoLW%p&|gE3^q3S!L&D5vt* z-fUByCVW{zlQSr2uBb*J#BkbjAH(}6YYcJ-8(R1iB1#+$Hyereo(l3BbroFtO@0TJ zM-y`B+5BKpMp6QS^qQk;K1m8{f{~8Y{g^RMc6rO=>I6?PVWdSE+-Z*GDD){BqZO@ap{{TBQteLi0l>v%AAh~UA@a9U&oZD8915IQs(JSNbyB7?ZdKWw$fBdS1LnApT9& zEWJjIC?*f-*R2#<^&>Vg9kk2mB9p`2OX&#b<#t6Tl%&6t@?}x{$B3a9gerSwV1VP{ z=0V<)xL9mRzpP4^DZsiUa?wi}TP*D+R3&`*)Jek#$aqt6A16mqthML<(2=D?P6!cM z&gZ?FVSG+N%=Quu2f)&3?Tc4_Rm+2(0v$zw9v zc&3*x^~x19`t^q&MyI@tl#Azr8lBy>MAfYchnNf-Sp7KJ@bY> zcEG}M7IF^y8yZm4jVtM1uasH1FvqGCcgp?;gkg@uJ7KmC68Me)=^V~!JH}eOOm)x$ zs^(OX!~r#~&El%9dR;2ssPJlWW(1e@da!N%n5O9*Ei8@303S-ECsBkGU`vi1rDGXZ zYF-tsywy*JPYk{K0;!;#0dySnlvU&kE6}-DmG-e=R&IBRm_tgJAN8Ir@Wh(cG(fb# zcbJ{$X5g9+w5;XT3oPYlf-9PniOy32gv(m}ie6EBpEQXR)M+3Y+p|9Ck@<@0Xe-!7 z1L17ujDL~F1Ng@bqo?j`nlM+?Jd@#;1$RpPJO<%?wyj>cV79s8)_pY~IJuIaoMA9Z z=GrMlorwb+ssY<|RjbWjR3JGzniBuptX zWOMbM$pX~WAfWK;x-OkQ7cD?QK}{O}IWldbY`VF9Fb+H_-!1(F3nXkQwZ3h$oiJKZ~+S0qUm%D)LgA$?`j^UWp|Owe*lUA%)I4 z%bO$fT{^I&R@c=T3g?Pe@^-z4)UdZ@v;rv*cA_gHMB0(A!Eu+Y*rQ5|X@I_vjRtfO60Ag-ErGu^{tj&^CRC^t8SeFaK~c_E z>}kteg95*!d_Fa}z|lrV-o1WI%g9Y1;_Zr=jY(qRE6n8iGU(1&2@&J?QjQw1Y$Uaomy5;K+VHG;CrTe3GS{MQynWLN^jMskgy=Jji^(}5Uob<30g9Dk zawT_y9Kz)EP~j=BwbyqSQqLuZM|Xvv^ePoe9|p}mD+~Tx<&nI9cNj4C5La~DZybRZ z)}d)an)@uCw~Ksm2ZZ2J9A`3Thdmc`bzJm$eU( zak2&yfAX>kN@dSP_zyz~l`D2VAouj9k#unS!O^~tJTuC?nA zintm7Hb2z}Sc~Bdx*O#vCxsv)%M-@)D2#e{u_p;NUM_4^T%W zHoy5x!HT_FoYrT{HT_!% z8lV42MKL6rwe$%&XGdzr{EE!`Aa~b2S`&DevWq6NukT)AU?LcvJsIf(he#Si5wBN5 ztK_R}1B@Pg4kM%G;W0;&4ElGHFpi%5FXxBq@UaK@Ql$IW~2>=(uFgc&F8#=m~AJthNwHf0O^5S?<`qp1QgHrL+a{w z%p=$Kj@3?UXcC6pI2WK*#hJ^F<@WlHUvHwn@ajVQdiBTc z^+^4`k+bLa6MbEN;Qd~gKdZk<@_MZOT~q+^J)OP+wDBEO3p?4iZ5Ox^GE7w`9StTZ z{oeSLdKd^o{Q&yIq(86Qy`~Lr5&?K?lINQ9R%*K?3BDLqXNc$3c4n-J4C2&3{Eq6i z$`+8jD+3z;LI9IRm|8UMDR15me4ogU9xY6%#U&uwTZ-;Y85t;y`q8~;z397z(%Zo$ z!Xv#Dx#%pC_$&7>AkfSsr8-r32R{3m2BzlJVS_O^wIzQ<%~uw?Kgkxkm(oeipKL_Z>z#Px4 z@R!>7xL+xy!lnUsCnJ=x&i2h$_gkUUDYAQVMksv?92mR{5)a6izsByo2vnjjVYix> zt@T58RvsbRFWu7@Q>BM%r2u>|R>FRKYQqA6#gCMd5q zr{kpEi8;`+o(icm*MU6}LSE3$qb*}*82LDHf~Ffm+ck#kxpF%8dA|#B;=yE6Ba+d8 z`_1&T!sWL^Zv=nwSTi~ykHlACMrBNp?)__Aj(B`*(Q}t$V>OjyP15`vv6JQI8`Xlsb!92+Hk#5c6N>D1#tyq&7rPNOpi(Vl_ z>LbXXlJ^RI8oBCrw|U~;|4>V8nZlTTs>y8yVi$cd9%|yGb+LYz8uGq7Fhv}uqQ9}Y zeuC{Y(IdE@g@sm?pUzbgmTl*rm!+@+n=qX;NVgrhzB+7-RO*B81w6`$p^53- z{XSa3!p~hro+#m@Nd+;UzFz!=fUs`Q#S-aDL9>9I2n=q+26@q+G}r6|LCxp`4Z^Xg zS*>ygVJbiaSWmm=J*YLd_^$ozzb!{?nY4%(dkma~#c!KMOv+u%@$er44VuzJB_{Dv z*-S=Q#VLh3XXlsvZfhQQ$t`K7#fa>wiKdz9_R!44umn=7t!j=)u!uE1O1|(Ud%PJT zg`WQPo&5q&1s+EtDJ!&BOo5RXbCL_hl^@0#>82u+0{vri>Bp%Odd*0()|1M2{KC<^ z*{cz@V>n>51UJ0>`>@n|_il-LwJ@0Jz8X~IF}RWVIG@vmPpzdd=x<-G{F(;h_j`?+ z`>L zLi%%*Xbs)b2bZ&;32K2*`GY8IZj4?%cz=aWfT!Mo0%@Tau7UEY-b-;fu7-@WxH@T+ zi7l}XL$BDG4^!gVJ62$5Jpc$mjR~#3qeB-#EzkPv*T(7P*$Q!*{{VnM0>BA-aJqEq z?jC~PbDxzrgfrK?pm^aRtFG8Rjt~`J5!l(o9Cw<`A=^p19GYacS;bpnBVzI)sU~n5 z4PsXjD?}s&DD!lS+|KVgkf6gcAH?$PNn2yJgXPNI&Nm{o$L|RxZ)tweqS$hw;FCPr z?G<91RZ@BD8hLqJx2J4ytkU!n>?VjqW3XVXG~nmx-0)dWRY0!RAgq2}B$wEUn=bpE z!`WyAIJwZ0i5SS(EGk<@{QPM5&=e`HC%c4LtgFXRQmTuC`|cwGm%JNr)QDbR+hI)CrRIk?;;>frAZ$G)pF1eUzB8WDCc4CU>6uCL>5ssL!{8-@wd1Nj-w}hF? zpb4c7eBDyJw~sxhVQ>P&9a9F>8aPS8c1k;K*EM+r=%c}+Mivjxz^b* zfSJ*SI>=VPUITPpY~%@mMt|v4@sCQgj=6KWo|zT!3rx7=t)@0NNqictbwH%}nJ0=W z6l9Y}%hqM`)YBtR626E342e?}0;;1X?}Q$_r#BQpGn5fMUq0YbvlJ2?Pb5AY`vI<<7(9->GZ82+2*l!bO^n} zK0bdQh7%Zn53OkIgj_zIhJ(FF{EG7eL;N9U9QWNS(r~4LGnQkV=LLHomEc30)pBcQ zwpPRIt?Uh^TXVr<#cws#si@G>E10<)o_v&`Z+L7ZK({gM+zI*vpSy&M&nu5TT#}_Z zJb32snl!>H-(}&*DhoJy1J*k*lPLn66f>>2NjS1LbwY^pVY7XB-( zLN2NoFA~|8n6XQX7`G0oTp_U_iF2$>8#7ONhH<)L06Sx+R%~-ADM!gXRRbmTbvvI;_cv~8MP6*Oxws+T&&cy%_B$9p z|5G_xvsK)^TKCX#?4J9K;mtmu6y?yl0ols}T+0X~!TP#XL*yp?O!dzmhe--Ol(|Q@ z@w2`V7EIU@k%Dr0YyzPX?I^LIv~E>_JfRQ?V*zj7L0&ahS*2^9uOGTL@Cb2{s+i8z zumnZpq}6MEZcVpHe_O#4z^&zTi-1iuqO7KKx82_kU|iM`dLuLNEqwufr{Z#my&B(- zu1M?&rwO0Ad-4=PxQ0lVEK1i#>Y>4~y6r2k3p`pWc+rtL_C?DmU*`>uRg{$r`F=&| z0Nb*|nhi{%Xrny7``~iBguh-FqE;=p@N#L**1#LV9sG1Im02s`2LB^tlJ46s{25v~ zIH>ZCq^R;DslhxbMBQTWpM$q5-GS5qJ0aenO)!zzD#@qaD*#$RrN1oh=-SUKJlQpY zwj3JGq-HcrQ%#$(x4T~@!KW^|3;A>=7l}zy@(vFDIZ)2Z6 z-04CwE3#Kd6A)nmE@s43iXn^t5`c<#!g2UIC@l0U*fcV*LM9 zo{lCe1roy()N6U2YTG-xj9URDa@hfA1nKH6DmsA^8zb6h?WdbXYP7pu)N>{(3LcDipH#_&o%F1m?ZfOndqI8b#khyK*Bh-Gp^vZHoe}ds?+CiF z-Q4#Vq&si*B1-uWJ-?ck6@_lAH)|>+L$3D+ABz$3b;ClLx1A+N0;aphto3InQ-{Gk zkaia2tgXh>FK>x%mA7e5l;D30rVE;21wO*lCCZ3)TxJB0zaqXHKXM=NYCy8ELm?`k zA|8oCOFa-OLeUZ67a|C<(WCywf7L6mEq0R;+oW&6yHa`Zl5#-RZHw3ChANs0?BeV(vq&L;Pg(ECxne9yiF?lY;$gc& zEuu^erwIlkUy&nPk)}^ErtC zsy$PK!psKeDspR=Uhny6FMorUm0}mD%A4SH(F>mQp|y>crKIqCD0TN*zHILY5g1Ikrka+~%z<@wSQk93dUqH4oeI^G&&ZL)FjO~&)8YLycoqu`M>4NDr{esO*#4`0`z zQ4${o{V;OV*3j#la@-y8lPN(akpW$cuM$KQs5>HG;ee|41hZ)LN{m;9^a*KGPr*zw zDTR6NSEGuz{Ub&-|ocMF`8~AaAiI+|!p{$A`qb132y--Vz2{O0%-HBC7C} zNzG~!QtCLVSen+2*3g5jk`c#*!Mo6!27eY$;+b<}5$)t<`99i{0 zcD(8nvJMp)jvMtsyGc-yoV)B7WzJyq9}(&LnXMJKzzU=nP)sDftB^y=IHb zH(6?R%3JT~FW>b)zpn*Ey+bK7^K+=R*BlxfPWmMu;Ri>iW-G&p@|y_K^p)}dO^u$ zJdP;BmH%SX%m`G>l(u-jVzOkqZ~0vQw=M7|e(2vur(FX8q)Qfs25Or^w3|X8(n3`J zItDPvbRs2*9bZIc`Sc^qGs!V(cOPp0o)zfuWOKL*#!^~hJCJBzaFBGCv9Acd87ERw zO~6?yh8i)N)NAt=2yxV&2S%eSWtL&@n6J`@1s2AEYGDlNo3E9J4gpLd;(Ubd{iH_z z^_uXms{WztW5DZ&i4dV-DD?fctha~;w%0NpCQ4PdUBaQfi{w?`*GKeJ#gBVh8oUwU z!1yMBYsa=osV_ZX7)fppC614m{u<*Eq@m%x@7M1 zu)ZBp$2}XChCNg*gQWq9qOx34jn1G*?}P@S{oIV)mD-I4_>D#;(WvHOaLET$vun73bp zKeiO0j?K!*1=_8+I|hO)Pc~bLH@f?&f{>lCX6H<36v8K!g``uC+?NVLNsa=q%HNMH z8z{Ye8KKhL=W}v7?JfTYgetW9qRNk4G2%_US{yQ~iNBA8y931TXD^!608s7!i87Q5 zkf44i+)F%zj*Zl?+J>iN%Thc7jq^Ng`Xq$MOgRH05voC2pJKL+ z(PCMOpA1knFw|5y^y>PGin+~WrW~M&m9_^Oz8L*GXeWw?GuH*gWPQQs_#DDfxHL46_I*;Y#s4W=yVKV(G&zz-quLiiDA)Ni1Ku*_cCDG5tQ6v^bUxcmjG-{3q59-XUgDz;G2RB%2|n;S z(ow0s$b0S)E=GIuDIylyPFDg`=xy8DJ9Ph?m6qHj@OA%264T~pH_#mfT**9sn z?wWt|yh_q)&%myF7mF6x7ZP&m|A1Sy?+L$|oWD=|QXGF=)2RJ2HkX%4T~+<(CG#ij z2HE=ig7jty&(vn-4W}=fBhNAYb|x^LMNG(EEA)k+`I+(O+H=X}OedvKMdn@O(iDHK z(#(_8t{q=xt3E_pGAfaB%)Up&+lko5X&Xk!0cSwVt_U5eC8US!=8pwM-$<*G(`ViT zO-_#g5UUr%#vxdrXA<&GF@&yrj5Foicw7 zpGG?6dK$<9xbPA7_UCp)NO$1uX11?chy}1JH zC~)Oqn%6w(Y14r(Qs#$75%|-j9%6brG8&Cy8xQ=0Iy%b^#vc1qwqy+yHsuh5i%S?V z6*-YZ8`5(gcI3oGc6u0#S5Tl|=EtCi`^XU(acjat7mm(9G+96Koxp$WgQfJPh@-L~ z;985&*bvb|vTV(}pKjyw7JtWQmMZ;K4awEPQZ3N+@`gl#Plb}UEJ9uOQ{^pa$%h&J zYxs(fZKd>O$MCCq$Um~fQ%tWZ2Jt<4x#CMBO4sNoE;k(iaL#1NtwhxuKs9uFT~vCM zH=Wz}F3%GH`DDi4KXessbd`6~kf__Vq%2J0UT=CtEUK#2c!TFjowM_|-Ub`Ot$Vk9 z+2;BeaL4<$WT39{gv?<2$C9t>O${JvHX#Xzy2o_BRe|FDny$@KeW(lMTh!MGs%I7GLHCk_+A- zkpR-j9C#By$p$;<+Y|KqB1lqoAJRI1UPm(|r|(R;oAV84RwKAhdj*jdInttENlstR zdZ;>PE7J=J$~BD*Yu_z9(>VaCQl&jGP}Tit8vSbdfy_R%Q?i$~`_1_rrmw3sosJHw zD6H$wOb}*pIjWTa7&;~DJDeguk+|hcl|uCAzOv8VE0%X5171v!8AZU_SS3o6DQPY) zq9U&Wz<;9SrqveD!tzPmI*ixbW74*kLl|VgDQjTn)hw9qfv&W+ouB$%3MzVno<0+C zu*?8ew2{{Yp}rT_tt}$qvAnHD*6dFl)9i?jdab_Ib>QkAfZK(A5TfprVtEXDTyh(# zGu@Dye=1H-isAcrg$$LvOD=eWa|1!i0XTc5MEm;DowuAzdR>3jmUTBx5;Q{O;nI{^ z!hDw`U&-k)8qC~`7c^;2;RR|~@j>Bj3f7w)Ik@YZnhAmsj+%WJN`VO*8GsB^-6B`r zW{kXiWNjb-CC^o`!D7Ii;o>aMgTZhbu8w{zV6RqRrT13n|6n`ui^mzDd`k<3o*9$~7a4rz z%DD&)+Dr14T#Oy(0+%Mv5UUae7iL?2KS$;&|4`7+_K`J0N$ZQN>a@1mx0j4k4bBaGRs4-?9P22l~BI)kyyf zhVP!`G<0tA`)D+vaA>zW!)+{0e&lqFFPW7Qt0DtmMec$~TuOSU@&T#KMmA1aZ{3@w zevbix0O{XY-wiaFceJM^E;7!^|5MvU#1qw-D+3U*FR}RvsUUch4a6D<984fjc~Co< zwIZH-?tbzZ$bqPMGyA6S4~LuhG*;*4$07`fcvD}c^6wnJLJfohyPOQs47nXNzulsw*=27a_&cWaDDV%>o;Y$~~y^K!Iw~Tic+RQCV7pUud zoex%cth*1fdiOvRNB3KDhE^oyOH|x}XgV?h?~4R~tfinsIwU+UFIaG_kzI8KN(kNa zJgCr&0e}5^gx}E&qv=jnCu2@7mByOHT6LeWbXxmolYX_r*rF~@I9+p#vrE=o`*&jr zTeQ9YB1o9nYo<$DVDkwf#W@v};Qh3vG*P9JwS)vMG`?Y!4SYJa=1TdQmX~Yznk(5!O6x8QWoKSDqutR-Fl9dz&3}F3xDuE7pZv! zo&{iZ-3Y^`REgAEMb4g+m)H_>5_}a zaWuRI=}#IlC!vxet1IT))vEy`9BMF z6TlLXnO#;VW&n`a5gs^i6Ig?>1BHXFx~Y@^#r>hCux$ZMG5B$Um$(vXw1BQr(d8kG~^W4vw9Lv9led&a>ifgo-u~I~>J- zT;t{_EF6QqFgVgA_BtB7S_p)^tTKB<{+dgsdgH(zRFWk+FxURPo_YpH{UwA-&JaHT zWb?Q>Mg#905=TLA8*WJ?j(hAl4W&jf$;UeVb}M^mg5?zQcewn6M9*|GQq1oH=~%oV zaS;Qm!B`&HWq0@OV_msG?9>G9s#WK$M(nTW0@Tm%cgqcQ=35!C;4bAp_XhBoigXpC zo`|0#51cRe>-b{tL;?}EK4=Nla@a<--evJqpa!}#T)y7^Gl8`mzv?CS2^&xoRsrV) z2Xq(udqwF<+|PT6W*kjEY{__`m=Z~d5Ca1BqH&q6aX70>c`eaa47h{=f!Q)mF`)BR z+U=Iyn_gd3J0^H7ml(2lK=yWT-A2$4b!iZsSai=ttxDz4tHC8KSwg_{n2Wfbhr#y; zRslZXPH2B?SQFJYsXT+$XC9ndQ8^^?Bo^1KNMc(aiZB!FOo6Kr32mC`kOR|Zov_>~ z6daxC2=|rneWA`&{v_4D3T-2$Pq}+om@%5+2hXgR88Aq~(iWVn3wd~7fAM;8UfPIH zTR2$HP-sIrbDIw-)y^?`SH5AW0;0q7eK;VWmT? zqBd>dm!j-&u}BI(^Oy>$Vu-s4mX0!ACW?n&p9GFvyNF*V&Kc$#Nu#O!20aco^3^scx zn*f7{_?XwvI03Kr#LR%Y+-7wg2>Prwx?nt)TPde*rME`VuwyoTpOW?tcLs&3Q1|@H zqet;$NEtjPOJ8aSpRGku1=tmvF`gGWgjnD!J1-4y*~pA2Auo-Er*0C8+v-=LE1xn{ z<=MAN%i`bk6FUj=CW^+}-Zz+9IaMI@_g5d3+#o=glFw=yZ!|$=U`lRpbiRr+8$lr0 z=uT}O3F+}h`^(2n4aH~qz=Rkhp3$McrOR#wH1gwzT1^!ZzG}zG1&slc#Yyi3T&^s}d>h7(vX01Wu?GMH+Po+Fy3%zEr%8 zmg-W2Ryu%Ta|(Um#KI4b)uvcJgMdpC5#vytx@Zoac_{oGzX?0J*O*sycOszrNxXxY z&JoJ|7my?ajYKGAZux0$J9eAgNm$rokS{;KAbyx8p%u{FQ+N@? z4-1KO0qzkvVhrq5$(w<)6}N%+bkEjN739hg$&2AL48-AZjp4N5^kI~5ZjREmtI80x zn&y~inM1KdUzLJO%PBpWem_joEbdn|@rC>#b~K20PI5Ak3?R}b#k7YZXq z`zo<`oI{=CMxtKk`=dIU@W2Z;r2?d^ku2j{rjHOF%^Yfq?slchdlf~BNYC&<7Ccy; z_(G)r3(T#Bf&9BlaqaBosWefnM%8%zu)Wr}Tzu@?jiFKq=&9~8^~4o<>Le@LjzYekZ4;nD)K_=o zT^@$xlC<~3PQ3qN1#82E+2v)IK``6)fawWjFZ&5uM?l^Od$(3)DK4PwH7Xkz!zEbM zq4}k5nhxd{8SzHUz*)#zVB(e--7ELBZNX?mzs;Q1w0ayNC3?#8h?nZG@Fh3Syho{L zCj5d>UJu#B7jR$JmT`4e`S%ZpsY3`&pn&$!`5fQwQkTMim2w2jZ;zn!TvKkRwE>W| z8}h5W#D-dcAcA~*&|W}FM4MS;Y&(S3+)pN-MJwXLJx-MJB0&C3@KSr07B`MP8)Y3e zk&~^EF2f6nv?RSC0Mr(7P2O5zB1%(CA7-F$EcnOrK6Oqt|3L>VZlrmXrGYeDk%8d* zv|DJQwAyDxty@9zCA;fP{=q17K3rSj`FI3Z2^Aye3553c~+s9G?atVHWkW zPfS;_UZJu8@fx<2A?QS?Tm8tFSo?}OO2^P zXjKh-xao=9mNd@URT*_GXz>OAb_Yu$@m&jmj+W#jcg!=O-;l7pz!B_H1}Q1p5vC*y z*Zx7~qQgCUP*`xi&Dkl}{|o@zO_ieiRFCwuSq?yaVgD(4oRCDF$X~`r?(vQK>dUrk zTDxfqXWuiMXsYnTIF&~rggA>L)kwvdXs4O+04a)bNhjsK!xOJ%C4&QRdNArd9{G3z zBr2j(Y{?N3(`M$G;-snN3*XzDKzYApp_#E9VJ!Q>@KNmp%cH$K{5phJS723Q<1ijc zBUBW(gJ$2u-V(4Da?hr-3~Ym9i|Y`1?}E#edwA^;lA^iuB~I65*pMDGX@iw!eyu)< zEN|uv{|8h>sHQT@tIuAZKCP;>DCr0~qm$*mP*tzd_e$tDSs_j(3GjfVR@B8-?V@%= zk~eFjwNQDIhZk-mQJK?8O6u`(jKG+_1-_{$X!6LfvJR0JlO3+m;EZ?q3uif{V zaXanO0q^}=a#FkQl^fOqSdDJBB7QW(83PCo!I9=kR*LV)rbwy2s-*GoBvRO_m(|d9 zZWwMDu3_qTLKcZJ9jBg#z(@3zIdgDd=Cn?REYofGx@)KPAf{@*X#RzK_I_3OMp&cb ziIYF~f%k>J>?s*$7P7D$P?v$So57o6CU6egfvjL=iF19y+}WZMO*7-iKb+O?VRt25AFQ|* zIBE7OKL{i_Tq=pR?t6rEhs=`EK+h#x^CV*J#?y=+Bk-(6xdw7$Oa%u;;4alas>roz zHx3`(hhC^~a7Z%PY81(wY(D#W&{S!32)-pxFOhIlMqW*@)h*?u%xVZwH>2s73AAP; zgProh!@No))tOyD0>*D3t2!W*nQ!5>YwbT6A;}kT1c;5euN(#Rh`oN>eCC7&UwtV` z!S#}u%Gho3ZBfzl_UjfRn>Q1tK#4#7$#-*sdcYmvUCE6YZ~V${y#`C6{8tf!-VVEW z+eKDO-48{IZO=5RvrjxdOoxg6SSk24d7<2xHFEw%=E`Jp*dp>deGi8zUVx=6vTw=v zvU2I{kBot`#+vQXSY1!{$Yj!E*Wxt^xP+T=4vhB1=BBx6Mh;kR%m~sV^bF|F-L@tV zP7at=9IjYr^s!OJ8NHY3{D-j>75d+mJgP18l}Pf59c#NAY-_(^Ya3$^|7T!JEPm)p za)G7Btjs-Ylqt`o_a_0m>k*`R*+ydRt;VyrQX8iW1czSbZsZvWx|eyO4-XuAROPi! z`f`-1&}Wv3SpW`T`tb_yt;^+x>~YMuB_tEcGWzp1oT59^oCSd##a$i5Iq9EIBaOze z8HV#@G~e}zjZ>f!`UjV%y1irg^6WD?7gv|b^!yzy z1|NGWMTDk9*1Tqm_WjT*KtgF}dA|DNElTuB>m6<|8c!b)Ij=}W3P2#zcSTS#GVxEk z$mI>1u;uo~>M|yNyk7m=0J~~P`KHTDufIJO+?RSZG`D|jWo=!C9twK8pwhPnt%w!@ zeoZY~mDvc46CA)Gt|W@SA+2Sx&lTxK;i<0bmEJa^NoYuZML6J9QOKkhWv(a|@<7p) z!{HmyT3sjD+RM6G-ABYl<@WaxeZANJ2U0iN(}q89d!M(^FZT7@`+B6oeE#tNE4okB z)rIr=OWs_LD>*m+pca(N!23IWpf|F5v9p=jGWNBvwUl+Z$EW>;R&!=2~BV? zuP2Kxad~fam%t$-gy&fX#BLi4c#s+44+d&G?k)0zn+Cdo6{OSDbnuiTiFf;1WSm)H zt6(Q@a#N&Y&hki2lYCh2I{G#@>Rr^p0`I4RWwtI{vHqOCXc{V+F(Q8xujP7EOrT9n z(XEpfC_;K}EbyndTxI2+VlA~lBiCg75YXIH{+e|BkFvPAmo5Spx~MKox6ejO{|vQy z`$okK>GcWnmv0N?3Yz_iW&8TY3ksXf?xfx$IK%bZ?b)=^_3EV(WU zTcUO#b%jJQZI+;>tPZ6qS;-pBLH;jiKB<6oJyZq^C`~!?Jjm|(V5p5AoAj6^daHvQ z+*e);9}d9N@b4uZUPln6V@VO6Z*~$_v9nH&7(hl`?P+rSbiWgbcI(gtIsQf(!TCkZ zEl^$oivC$e^pRo@s$EctdG)_F)W8lRO1h@bU%v$W8vEAHP;lb~%u{SdR(uN4RQ<0P zl=JNS7{dOLhN_wqFN`!Qoo+Jq=m7g}C<@)Uo9fz(8dRVzq9OFkkti`R#Kua8@D#79 zYWx8kc2&Tcyhw2HY`AAms_JSr zrov3&8xfs&OrbB=$_%Qk3;Aq!3$O?7$yr~RqGMP85+@(vUq$s|k#}-ejLfDvXKv<& zw-8GQ*a`b(ps{8`5S}FW>qzojOa8p5 zC7l0B6oB+%{~N^l0W7PDBt5?Y7`&FY9RuwLO=eZ$d5CHj*?S12QvSrkUKN4|v&!#~ zW*4n0%tU5#otvQwDt1^k!5r!Y3M3-8ALlo20))?=4NRrL^XwW7cP6kANV{NlAVCW4 zO(prCPdN}guk*BRXV#1uL?(8mcTkNNy6IV7LaQShf_CT4f^K3G%BfqgW3a$Y+NXj9 zn~%4#memUUKrv1KG4JTY9GFB!KNwk+yX6=!W)Oc*oLm^HC?^mbVz>Gb#@u0^K9$w7 zp@#a`oM5(}xwaaXFi4-o(o0qHQ%Oc)nO5<*Xb`Q~*i3DD`e zqnbVhA-=ufB%C44WLXZyqR#v{Az{^`Xp5k>Opls`ZrYoE(kytIh7Z3k`qYRle)2$qrUhlR)(HV4;F7nUkmD$d9D`bOa0M zze%Mw`uE!9r;UzpXh#B90V&AWpaxJ6$nPe>IdkhBV(Gv_xKdktt(ZavjUq9{y)tl? zk-QBiyQdS8Rqql!xS&(OdUxAkmpZ3v3nSaEYf^S!LGhXRLa-%9#AffLWk#nz^@kPSEF`%7AWFaVydFJ)@;v+#L0Nu_G%-TVaQl?U32ac70iJ zks8!#qnf^ZjJ{Pi@wJDxkigmS3RMnyW|BUE&_Qn^tNjyh^n78JiVl9{g!kdBk(~=a z-LP~k@=N1I2g!&wXZ^bY(9bNQnvmw2|*|#iEx6cmR0NJa9 zq=p(?qf;Q7{TQo!uNs{Ud&u);t612s-7(SEmCVeJwrceh2v$sb|(2rxPo+;RgI4eOIL)c(m%$gOGB@jID={9gFDlKvWLWj3TAqA5)4 zie0meDRl8fjij2JUk|6o4#A%qbdzv0n|v=FeT}=H9c9SBbO5)Pac3w$|5S&Ryw++m znyA_BNL!8NAMK%*_$GeXktgD%dk?@5 zd&N>@ujl4f>Jc{NS{&}BJLamP_k;vTE~c3{1R32amYUiw7(v)q@*1!_Sde;s!Q)Mc zxA2|1qB&CXNeSgS3az`Ei9bYm-lhQSHLX&IkmvqE^!d4!h85q2YUnId9Fn#aY9m?R zUmXXa$AMq9XrzxyY_@OQWq$YB<+=j&GKK5YbxOUVDf1Qo7^;k+*QA+PEmx~2Y@t{b zBvHfEPk{B*v^ZUn^_oV9_~=ELZYnck;uiGHIW(R-R4h>eUlG*-k!}c|fxUon%@$R0ouN zzy^uaI00|>^f*uGQrUH0qP}-Tq#Ffd;uBe3ib^5r`vxhs4j{J$s9NG-1o;QYna}h} zV_>$q^9YByLDk9t-Pkp9ZLB><*0w*KeTf=GHj(mNy4iP)Jh|r?tL8V3#R`t2DB8pn1=y5!%(O)axFdGu_pRT(u+S`p+XvN*JX zR-S?sCR!_Y$k>GhSnO>RhE5qc2k|H`bUCx7 zQ4cIiKv??TN|}YbC-C}pQMO(ukJ#H~1)Tp(po1Ge$hggee1ZL_X-Sa)_LmK-5wWJd z(u%@s&uE{F;56zG`F#r`SxNda2#LAX|}ZrdgTKInhl)JSn~I9i>P0q z?(9EKCA7zEtE?>4?>XQhr%qdm_UT_J$Bj2M5NQz1JX&zh5v%*;p~ts=pB0a+iD&(u zvk--YL589syO;%sSUhiO7_`jHDj3inGLHGw7enL%)0pCz?cx~D&$mx#+(h3dq}DUfD-^14i1JI(jnwP-;1S-JeZI=ZvDqt1vHR5s zr?}se(t;5(nDUr6R-6HXA@1bXcH;cDR=v&bn>ji`?Lt07Jh^?~Asyla8b+;^5Q73A zmOTK!TUwpQ9ZNfwraXI7yo7SIUiP?15x;7@HPv}KF}%*>YG}o$+=YuCmwC!E)+bIA zqy0D^&LlL>;B^d!p*F_eGvY0kata1nnLIq3BXQ#!q3ZV*jmSY zv`vUa<)crr@|-cD6w!K)HGD!lT0y7j_Yb}Mb8G@Gywv=x9eBdO7hu9)DHy0#gdJWw zSKm+;=faMm%pNa`JBf_)I65nHg1XpnzNgXT4jL>rnVd3wDe#KRio$ z$Dhj4$q+dJih_k(klOWW3|@zdsv zLpTF*G$Pz->CDo8m$$Ue=Ht%mfbwHTQAXfy$qpC*NlMuYqmm4Tl^>u)XNx%XAmuGK{HmwAzt5GHUFk2OM=&GV2(8z*vJcBvjvN%owF;CO9y zBr_wJq@1`os1=rU^Q!<@Lv2hf7JaW=9iDu9KP*R@P?l=Th-;`h-(*xNzRj-*eAL*4 zg*?BC26pUy%G6#E2|PclR0+u%%`TUBSv4q_BQ~%P{T49NXZ6u=Ak+-;Q)C@T*a;@= zxuFa>%0d9?FCuWFCw_=K62^X*dD?f_M@{VSK{=|ziIkYH2;;0f&?DFGW|%kFOGa3m zmqZKQu74Be$JNf*3Wu{21w+KSbI1xY+Za z0TilKWNqVG_oGP+=`Hh!V3MMIX?HVhh%H7^u<4d7S_Xo3y;1vS3%0eCYq(H&xm>tw zC8jrSXM|vsa0~|)s>XvSPRS0kM1~+W0T#V}jpz>)$`Pa!b=#q{D#9?^YSgzJ>Ox3c zg{A6haXDvp2_MUSmX}eh%$ZFJrJDJhxCd441YTLU>EiIYHro-CGs(^U9P!-2mB0BH z67bN8%)gZ|HZ&siBHqaU7qwf8@=f8BU zR2_Rc!6hFdId&PA@Jpw;v%Ef`{@cS7@4liYE5IzJDr6n{g=XXfkOi$qJm?b-ywR{* zub0Stwt-cEeJATDF z`OPag_l2Z_WV$hAe9o4tkBCnJifR+k7MoY-M-N1GfQp4t3U0qlbwX2jG*OZF-k6xjE2TSQWu%V7X4PAj(+js*wMCu^NFoQGJZd zYaY0XTSs`F%-#tXn5D>di-Ax@5x?l_v+{OuPGFb(_Q4I#V3d8)lHmJzwY57sO+Ta@ zK4JPBuqbR2WPBNU#v&YOm?2QqgGx#`u)fr%@fl`y=}AUwua>_;NOxmrLKlP&!PIxo zxub!E&1<*I*qwp4`^od5aX1!hS}&SOQ<*&Y8mP0gr&F9nW(O@W71L4ffR#7mWRdf` zahYcA05!k=6`q{GNE+h%Cgm>(df)R*EbW25Q~T|~on$?_YIJN$#t)T-g2U#l|L;F8cci*Wr6u4-;XVF_u3PPS+S^oHy#YhvVk$AfO8zi zbuD4!!^0i6{Fv=G7;H_HSu8}lTchKB=NEhUmUbn{A?61Gu|6!E*G@c9DtWf(zd@U4 z)s?T$L2i&rYI0OS!?(05EhDvA^sircBxXfQCX5 z$lN)*Je_K#+UswzJpC9ajV;5|JO!pE!_-B9tsUx0gvV*OR9_{I{?W9YGJ0(OYnQQ6N=QHX0IU~oM z1(334g+BKBs4RvHJUm(aN*4OAT4%iJ`62|_f4p7YI8n2S@-*Uv&_JZA4!m$ zzSog0E`w{)w%cvC+ikYnZMNHS2JIx0NQlaftoPY!KgeQ{!qM2!c8Do?)4~f-Z$Tka z`ixiClX&aY1*ea-<}G+fHVVE;#t@bQ7&qrKjk7=+9p=;H&+4J!7+X;t_d}9QdXY}{ z8!ATxv!Xjj28<`a+%zLSTVG)9-Fp3y4=u0MvNntwOP4W8L1S z8mF;X)Cnj-`Cx^lD&#$@D}?1cHDdu)kzN>pb!<=s8*B|0W$^H5ZmYwjGx|&WYF`+z zcv-Raih-C-aer+Vc#zRNICag9J}6`Dep(0+hw)|FsFXXC5L9!s0E<)FSy^H=W6fz4 zc3wL7!6-n*0iZfzD)rv2FYqG$Dpl$xn|Myc)RVpXj#sxiuZXJjKn`2YT*{J1dAt83 z!wmAniE}X>?uz)QjySLn`hsd@qI#YTpN0u=H<3@XRj&tiK59^<9>&d;vF*yIp_9Eg z(2}K`f9nm#E+V3$l*!>BibW2d$~CjrC0G%Bu!uLZK#9%rvquj#QfV7_Q$Pt53`)J* zqJ!dHru7hzzBz{-9Z_0TqdQ}6x2R~uVuGjlx-bD+k6{EaoV28G@HOi`V`l)(tHIcd zKsp;otlPbCPDv%La`xM8w)MaKi6oLqB$7w=Q{G5i@Mn_2O>Sb|dMq(-7F28$U_mSQ zXfUpj^5rLVjnDy4(_GT1f~mzQ4Bkj|%r2!wB2S+=hy3h#7$ZR2q3{p)xj5VgYZ9JN(40TxY90 zb;|Pzsqd$!&u7L!HK~UoyOtJB9EQ7;st1|LtQ?#jv~1TLBhY33iLFv<`9F=uxo!h=Dn}j5B{WYw{XvjWeZEzDG>$=$-OJ%YUq zBD*v2jYWY8OE%Y zLoA2cOX!}!{5pbAu04o+cBauC;kg2FTy2qsB~#3CZfe+xjVH@C3C;LpW~}#LhW|>~ zhZi1BP*$!gubh$)VK%mRk|Q&C8ArpPtK(TJWieqfHN%sWt|9hZ97}5%)YY=2e{xpn zaEIC_euFj4qU0O{2WP%sFDre$q4t@K-P6L*ae%7)d##@-;qzdGFvrSrQC@WsX9YfI zn^XvVK3L6a<4=q#a@$0JiLo-_X^25o5CAz05eV$9z<_z%G9fJk%F0FYvwNt~Y6w1` z?BZzXjo;SrSl08j4XG_9JZUEV69&3PO;NmDj<#oiDC*z;8H6P6F$==x^PhO0tnpS0 zBiBiBc<2%@nb1oY;k{H zN#wJ-wewM0V6$43QK#cXk6$0@^@xjFnNDJth1=LE(HAnJ;qz}gSr_S*d zWSkP-hnNqrYXQ`S_fVn1a3^}DG>vDS0;XfNG-G~33(-y_`c_7wD8_Rze{tXRP8MU=chDfo0z18~Xw5E!ioSx)a0 z*;JEHw)=r>i|9%_WY*`d6yw-)0PxgUkAt2%K_+PTeR6Y-4ol;a2K=sqK9&ejw0f{o zJYhfe=)^xA^Vc!+$cUrQ=D%pcEJ_W+(fzQf+d&hTp*5__~^ejSa^hOQ{0+Abi>v$)Opj{^KQNlS*@jK-1<0Ll_s<{i}1bH}1)!@0a?n0&az{oHmuKlSd^tD zmol4a#iHqDfy20>8ICT;v(S%e{j$yHw_n;7b+_}5Eal8{Q1})zs+XmMCwtE@vTD1k22FI%^a-mqqbN~+`g!cEqEuXHH@KN(L5?DevgKupM z_(&G4%!Ek6TB8loXD7Dk6@R%ZNl5WSnaF(Ls_#hDLZ7nki2p<#?JZP=A6|J8tC)AO zwmR6UFJ6DtQm4BH1v{vYqZ&v3h!r)5yNiUW@4#bkn6|`>Tfvb$$s_&w7fvFWEXf*f zby-z<#CyLwd;TR3(U=$B@v*fb%e|*>?LrG>CJSFG-y2Fy2^9HbUkTZljS<))O2oX< zY&qJoEmOY_c8Li?(kJ~g}JQ2zLX z^;`L>2f5c0IhF> z%u=Hs-yyDaqYx2xU~G+b1^80k>Ao*BLBMHRH$~M~N=H3T*~Tgah^qMb|8b;~zH14V z=4CBihKX?{28!fEoiA&in8dkRUFSUnAEs5hI6_U5+O)-lsexT zGKJU_hjR#G#9L^W6gsebO-E?V{$^ATel%UCnoFtFjiLWPu;Brd4u29MAP9PJP*~ z4t65wM$hN1Erv!S;}S!q)`b#=P;##D^m8s8M=3VVLcapqju)clvk`@ASc50n$<9RG z0d2Bhb0Uve)rmqz85+S_~~=~t82#ALQQ{sbiA?DEq3 zdhs5r)kh*u6BfhR3eo#R`6#~OcTGe@o@KZxnDWSwp3-e=O|S@GX}Hth{Lgm`dDGN( z+sRjHWRyTKvRAC6Glir5aLg2YOi$*w=EWVQ6UbwMJ z6b0NV+(rnd{a#LNC45bcCAQTG@?$55fu8J7evEmD>phQQXst≀0iwiUE9s3m_S| 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 byTM}{bv<>=)c?OJA@jd>%%ZgaZ@2#kNH-22 From 307e329dd7d82d76bf25840c0eec28aaaa52e876 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 27 Sep 2010 12:56:56 +0200 Subject: [PATCH 175/237] forgot one file --- http.c | 1051 -------------------------------------------------------- 1 file changed, 1051 deletions(-) delete mode 100644 http.c diff --git a/http.c b/http.c deleted file mode 100644 index 4713b37b5..000000000 --- a/http.c +++ /dev/null @@ -1,1051 +0,0 @@ -/** - * Powder Toy - HTTP Library - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * - * 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 02111-1301 USA - */ - - -#include -#include -#include -#ifndef MACOSX -#include -#endif -#include -#ifdef WIN32 -#define _WIN32_WINNT 0x0501 -//#include -#include -#include -#else -#include -#include -#include -#include -#include -#include -#include -#endif - -#include "defines.h" -#include "http.h" -#include "md5.h" - -#ifdef WIN32 -#define PERROR SOCKET_ERROR -#define PERRNO WSAGetLastError() -#define PEAGAIN WSAEWOULDBLOCK -#define PEINTR WSAEINTR -#define PEINPROGRESS WSAEINPROGRESS -#define PEALREADY WSAEALREADY -#define PCLOSE closesocket -#else -#define PERROR -1 -#define PERRNO errno -#define PEAGAIN EAGAIN -#define PEINTR EINTR -#define PEINPROGRESS EINPROGRESS -#define PEALREADY EALREADY -#define PCLOSE close -#endif - -static int http_up = 0; -static long http_timeout = 15; -static int http_use_proxy = 0; -static struct sockaddr_in http_proxy; - -static char *mystrdup(char *s) -{ - char *x; - if(s) - { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; - } - return s; -} - -static int splituri(char *uri, char **host, char **path) -{ - char *p=uri,*q,*x,*y; - if(!strncmp(p, "http://", 7)) - p += 7; - q = strchr(p, '/'); - if(!q) - q = p + strlen(p); - x = malloc(q-p+1); - if(*q) - y = mystrdup(q); - else - y = mystrdup("/"); - strncpy(x, p, q-p); - x[q-p] = 0; - if(q==p || x[q-p-1]==':') - { - free(x); - free(y); - return 1; - } - *host = x; - *path = y; - return 0; -} - -static char *getserv(char *host) -{ - char *q, *x = mystrdup(host); - q = strchr(x, ':'); - if(q) - *q = 0; - return x; -} - -static char *getport(char *host) -{ - char *p, *q; - q = strchr(host, ':'); - if(q) - p = mystrdup(q+1); - else - p = mystrdup("80"); - return p; -} - -static int resolve(char *dns, char *srv, struct sockaddr_in *addr) -{ - struct addrinfo hnt, *res = 0; - if(http_use_proxy) - { - memcpy(addr, &http_proxy, sizeof(struct sockaddr_in)); - return 0; - } - memset(&hnt, 0, sizeof(hnt)); - hnt.ai_family = AF_INET; - hnt.ai_socktype = SOCK_STREAM; - if(getaddrinfo(dns, srv, &hnt, &res)) - return 1; - if(res) - { - if(res->ai_family != AF_INET) - { - freeaddrinfo(res); - return 1; - } - memcpy(addr, res->ai_addr, res->ai_addrlen); - freeaddrinfo(res); - return 0; - } - return 1; -} - -void http_init(char *proxy) -{ - char *host, *port; -#ifdef WIN32 - WSADATA wsadata; - if(!WSAStartup(MAKEWORD(2,2), &wsadata)) - http_up = 1; -#else - signal(SIGPIPE, SIG_IGN); - http_up = 1; -#endif - if(proxy) - { - host = getserv(proxy); - port = getport(proxy); - if(resolve(host, port, &http_proxy)) - http_up = 0; - else - http_use_proxy = 1; - free(host); - free(port); - } -} - -void http_done(void) -{ -#ifdef WIN32 - WSACleanup(); -#endif - http_up = 0; -} - -#define CHUNK 4096 - -#define HTS_STRT 0 -#define HTS_RSLV 1 -#define HTS_CONN 2 -#define HTS_IDLE 3 -#define HTS_XMIT 4 -#define HTS_RECV 5 -#define HTS_DONE 6 -struct http_ctx -{ - int state; - time_t last; - int keep; - int ret; - char *host, *path; - char *thdr; - int thlen; - char *txd; - int txdl; - struct sockaddr_in addr; - char *tbuf; - int tlen, tptr; - char *hbuf; - int hlen, hptr; - char *rbuf; - int rlen, rptr; - int chunked, chunkhdr, rxtogo, contlen, cclose; - int fd; - char *fdhost; -}; -void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep) -{ - struct http_ctx *cx = ctx; - if(!ctx) - { - ctx = calloc(1, sizeof(struct http_ctx)); - cx = ctx; - cx->fd = PERROR; - } - - if(!cx->hbuf) - { - cx->hbuf = malloc(256); - cx->hlen = 256; - } - - if(!http_up) - { - cx->ret = 604; - cx->state = HTS_DONE; - return ctx; - } - - if(cx->state!=HTS_STRT && cx->state!=HTS_IDLE) - { - fprintf(stderr, "HTTP: unclean request restart state.\n"); - exit(1); - } - - cx->keep = keep; - cx->ret = 600; - if(splituri(uri, &cx->host, &cx->path)) - { - cx->ret = 601; - cx->state = HTS_DONE; - return ctx; - } - if(http_use_proxy) - { - free(cx->path); - cx->path = mystrdup(uri); - } - if(cx->fdhost && strcmp(cx->host, cx->fdhost)) - { - free(cx->fdhost); - cx->fdhost = NULL; - PCLOSE(cx->fd); - cx->fd = PERROR; - cx->state = HTS_STRT; - } - if(data) - { - if(!dlen) - dlen = strlen(data); - cx->txd = malloc(dlen); - memcpy(cx->txd, data, dlen); - cx->txdl = dlen; - } - else - cx->txdl = 0; - - cx->contlen = 0; - cx->chunked = 0; - cx->chunkhdr = 0; - cx->rxtogo = 0; - cx->cclose = 0; - - cx->tptr = 0; - cx->tlen = 0; - - cx->last = time(NULL); - - return ctx; -} - -void http_async_add_header(void *ctx, char *name, char *data) -{ - struct http_ctx *cx = ctx; - cx->thdr = realloc(cx->thdr, cx->thlen + strlen(name) + strlen(data) + 4); - cx->thlen += sprintf(cx->thdr+cx->thlen, "%s: %s\n", name, data); -} - -static void process_header(struct http_ctx *cx, char *str) -{ - char *p; - if(cx->chunkhdr) - { - p = strchr(str, ';'); - if(p) - *p = 0; - cx->rxtogo = strtoul(str, NULL, 16); - cx->chunkhdr = 0; - if(!cx->rxtogo) - cx->chunked = 0; - } - if(!str[0]) - { - cx->rxtogo = cx->contlen; - cx->chunkhdr = cx->chunked; - if(!cx->contlen && !cx->chunked && cx->ret!=100) - cx->state = HTS_DONE; - return; - } - if(!strncmp(str, "HTTP/", 5)) - { - p = strchr(str, ' '); - if(!p) - { - cx->ret = 603; - cx->state = HTS_DONE; - return; - } - p++; - cx->ret = atoi(p); - return; - } - if(!strncmp(str, "Content-Length: ", 16)) - { - cx->contlen = atoi(str+16); - return; - } - if(!strcmp(str, "Transfer-Encoding: chunked")) - { - cx->chunked = 1; - return; - } - if(!strcmp(str, "Connection: close")) - { - cx->cclose = 1; - return; - } -} - -static void process_byte(struct http_ctx *cx, char ch) -{ - if(cx->rxtogo) - { - cx->rxtogo--; - - if(!cx->rbuf) - { - cx->rbuf = malloc(256); - cx->rlen = 256; - } - if(cx->rptr >= cx->rlen-1) - { - cx->rlen *= 2; - cx->rbuf = realloc(cx->rbuf, cx->rlen); - } - cx->rbuf[cx->rptr++] = ch; - - if(!cx->rxtogo && !cx->chunked) - cx->state = HTS_DONE; - } - else - { - if(ch == '\n') - { - cx->hbuf[cx->hptr] = 0; - process_header(cx, cx->hbuf); - cx->hptr = 0; - } - else if(ch != '\r') - { - if(cx->hptr >= cx->hlen-1) - { - cx->hlen *= 2; - cx->hbuf = realloc(cx->hbuf, cx->hlen); - } - cx->hbuf[cx->hptr++] = ch; - } - } -} - -int http_async_req_status(void *ctx) -{ - struct http_ctx *cx = ctx; - char *dns,*srv,buf[CHUNK]; - int tmp, i; - time_t now = time(NULL); -#ifdef WIN32 - unsigned long tmp2; -#endif - - switch(cx->state) - { - case HTS_STRT: - dns = getserv(cx->host); - srv = getport(cx->host); - if(resolve(dns, srv, &cx->addr)) - { - free(dns); - free(srv); - cx->state = HTS_DONE; - cx->ret = 602; - return 1; - } - free(dns); - free(srv); - cx->state = HTS_RSLV; - return 0; - case HTS_RSLV: - cx->state = HTS_CONN; - cx->last = now; - return 0; - case HTS_CONN: - if(cx->fd == PERROR) - { - cx->fd = socket(AF_INET, SOCK_STREAM, 0); - if(cx->fd == PERROR) - goto fail; - cx->fdhost = mystrdup(cx->host); -#ifdef WIN32 - tmp2 = 1; - if(ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR) - goto fail; -#else - tmp = fcntl(cx->fd, F_GETFL); - if(tmp < 0) - goto fail; - if(fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0) - goto fail; -#endif - } - if(!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr))) - cx->state = HTS_IDLE; -#ifdef WIN32 - else if(PERRNO==WSAEISCONN) - cx->state = HTS_IDLE; -#endif -#ifdef MACOSX - else if(PERRNO==EISCONN) - cx->state = HTS_IDLE; -#endif - else if(PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY -#ifdef WIN32 - && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL -#endif - ) - goto fail; - if(now-cx->last>http_timeout) - goto timeout; - return 0; - case HTS_IDLE: - if(cx->txdl) - { - // generate POST - cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen); - cx->tptr = 0; - cx->tlen = 0; - cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path); - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); - if(!cx->keep) - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); - if(cx->thdr) - { - memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); - cx->tlen += cx->thlen; - free(cx->thdr); - cx->thdr = NULL; - cx->thlen = 0; - } - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl); -#ifdef BETA - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); -#else - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); -#endif - cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); - memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl); - cx->tlen += cx->txdl; - free(cx->txd); - cx->txd = NULL; - cx->txdl = 0; - } - else - { - // generate GET - cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen); - cx->tptr = 0; - cx->tlen = 0; - cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path); - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); - if(cx->thdr) - { - memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); - cx->tlen += cx->thlen; - free(cx->thdr); - cx->thdr = NULL; - cx->thlen = 0; - } - if(!cx->keep) - cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); -#ifdef BETA - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); -#else - cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); -#endif - cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); - } - cx->state = HTS_XMIT; - cx->last = now; - return 0; - case HTS_XMIT: - tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0); - if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) - goto fail; - if(tmp!=PERROR) - { - cx->tptr += tmp; - if(cx->tptr == cx->tlen) - { - cx->tptr = 0; - cx->tlen = 0; - if(cx->tbuf) - free(cx->tbuf); - cx->state = HTS_RECV; - } - cx->last = now; - } - if(now-cx->last>http_timeout) - goto timeout; - return 0; - case HTS_RECV: - tmp = recv(cx->fd, buf, CHUNK, 0); - if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) - goto fail; - if(tmp!=PERROR) - { - for(i=0; istate == HTS_DONE) - return 1; - } - cx->last = now; - } - if(now-cx->last>http_timeout) - goto timeout; - return 0; - case HTS_DONE: - return 1; - } - return 0; - -fail: - cx->ret = 600; - cx->state = HTS_DONE; - return 1; - -timeout: - cx->ret = 605; - cx->state = HTS_DONE; - return 1; -} - -char *http_async_req_stop(void *ctx, int *ret, int *len) -{ - struct http_ctx *cx = ctx; - char *rxd; - - if(cx->state != HTS_DONE) - while(!http_async_req_status(ctx)) ; - - if(cx->host) - { - free(cx->host); - cx->host = NULL; - } - if(cx->path) - { - free(cx->path); - cx->path = NULL; - } - if(cx->txd) - { - free(cx->txd); - cx->txd = NULL; - cx->txdl = 0; - } - if(cx->hbuf) - { - free(cx->hbuf); - cx->hbuf = NULL; - } - if(cx->thdr) - { - free(cx->thdr); - cx->thdr = NULL; - cx->thlen = 0; - } - - if(ret) - *ret = cx->ret; - if(len) - *len = cx->rptr; - if(cx->rbuf) - cx->rbuf[cx->rptr] = 0; - rxd = cx->rbuf; - cx->rbuf = NULL; - cx->rlen = 0; - cx->rptr = 0; - cx->contlen = 0; - - if(!cx->keep) - http_async_req_close(ctx); - else if(cx->cclose) - { - PCLOSE(cx->fd); - cx->fd = PERROR; - if(cx->fdhost) - { - free(cx->fdhost); - cx->fdhost = NULL; - } - cx->state = HTS_STRT; - } - else - cx->state = HTS_IDLE; - - return rxd; -} - -void http_async_get_length(void *ctx, int *total, int *done) -{ - struct http_ctx *cx = ctx; - if(done) - *done = cx->rptr; - if(total) - *total = cx->contlen; -} - -void http_async_req_close(void *ctx) -{ - struct http_ctx *cx = ctx; - void *tmp; - if(cx->host) - { - cx->keep = 1; - tmp = http_async_req_stop(ctx, NULL, NULL); - if(tmp) - free(tmp); - } - if(cx->fdhost) - free(cx->fdhost); - PCLOSE(cx->fd); - free(ctx); -} - -char *http_simple_get(char *uri, int *ret, int *len) -{ - void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); - if(!ctx) - { - if(ret) - *ret = 600; - if(len) - *len = 0; - return NULL; - } - return http_async_req_stop(ctx, ret, len); -} -static char hex[] = "0123456789abcdef"; -void http_auth_headers(void *ctx, char *user, char *pass) -{ - char *tmp; - int i; - unsigned char hash[16]; - unsigned int m; - struct md5_context md5; - - if(user) - { - http_async_add_header(ctx, "X-Auth-User", user); - if(pass) - { - md5_init(&md5); - md5_update(&md5, (unsigned char *)user, strlen(user)); - md5_update(&md5, (unsigned char *)"-", 1); - m = 0; - - md5_update(&md5, (unsigned char *)pass, strlen(pass)); - md5_final(hash, &md5); - tmp = malloc(33); - for(i=0; i<16; i++) - { - tmp[i*2] = hex[hash[i]>>4]; - tmp[i*2+1] = hex[hash[i]&15]; - } - tmp[32] = 0; - http_async_add_header(ctx, "X-Auth-Hash", tmp); - free(tmp); - } - } -} -char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len) -{ - void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); - - if(!ctx) - { - if(ret) - *ret = 600; - if(len) - *len = 0; - return NULL; - } - return http_async_req_stop(ctx, ret, len); -} - -char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len) -{ - void *ctx = http_async_req_start(NULL, uri, data, dlen, 0); - if(!ctx) - { - if(ret) - *ret = 600; - if(len) - *len = 0; - return NULL; - } - return http_async_req_stop(ctx, ret, len); -} - -char *http_ret_text(int ret) -{ - switch(ret) - { - case 100: - return "Continue"; - case 101: - return "Switching Protocols"; - case 102: - return "Processing"; - - case 200: - return "OK"; - case 201: - return "Created"; - case 202: - return "Accepted"; - case 203: - return "Non-Authoritative Information"; - case 204: - return "No Content"; - case 205: - return "Reset Content"; - case 206: - return "Partial Content"; - case 207: - return "Multi-Status"; - - case 300: - return "Multiple Choices"; - case 301: - return "Moved Permanently"; - case 302: - return "Found"; - case 303: - return "See Other"; - case 304: - return "Not Modified"; - case 305: - return "Use Proxy"; - case 306: - return "Switch Proxy"; - case 307: - return "Temporary Redirect"; - - case 400: - return "Bad Request"; - case 401: - return "Unauthorized"; - case 402: - return "Payment Required"; - case 403: - return "Forbidden"; - case 404: - return "Not Found"; - case 405: - return "Method Not Allowed"; - case 406: - return "Not Acceptable"; - case 407: - return "Proxy Authentication Required"; - case 408: - return "Request Timeout"; - case 409: - return "Conflict"; - case 410: - return "Gone"; - case 411: - return "Length Required"; - case 412: - return "Precondition Failed"; - case 413: - return "Request Entity Too Large"; - case 414: - return "Request URI Too Long"; - case 415: - return "Unsupported Media Type"; - case 416: - return "Requested Range Not Satisfiable"; - case 417: - return "Expectation Failed"; - case 422: - return "Unprocessable Entity"; - case 423: - return "Locked"; - case 424: - return "Failed Dependency"; - case 425: - return "Unordered Collection"; - case 426: - return "Upgrade Required"; - - case 500: - return "Internal Server Error"; - case 501: - return "Not Implemented"; - case 502: - return "Bad Gateway"; - case 503: - return "Service Unavailable"; - case 504: - return "Gateway Timeout"; - case 505: - return "HTTP Version Not Supported"; - case 506: - return "Variant Also Negotiates"; - case 507: - return "Insufficient Storage"; - case 509: - return "Bandwidth Limit Exceeded"; - case 510: - return "Not Extended"; - - case 600: - return "Internal Client Error"; - case 601: - return "Unsupported Protocol"; - case 602: - return "Server Not Found"; - case 603: - return "Malformed Response"; - case 604: - return "Network Not Available"; - case 605: - return "Request Timed Out"; - default: - return "Unknown Status Code"; - } -} -char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len) -{ - void *ctx; - char *data = NULL, *tmp, *p; - int dlen = 0, i, j; - unsigned char hash[16]; - unsigned char boundary[32], ch; - int blen = 0; - unsigned int map[62], m; - struct md5_context md5; - //struct md5_context md52; - int own_plen = 0; - - if(names) - { - if(!plens) - { - own_plen = 1; - for(i=0; names[i]; i++) ; - plens = calloc(i, sizeof(int)); - for(i=0; names[i]; i++) - plens[i] = strlen(parts[i]); - } - -retry: - if(blen >= 31) - goto fail; - memset(map, 0, 62*sizeof(int)); - for(i=0; names[i]; i++) - { - for(j=0; j='0' && ch<='9') - map[ch-'0']++; - else if(ch>='A' && ch<='Z') - map[ch-'A'+10]++; - else if(ch>='a' && ch<='z') - map[ch-'a'+36]++; - } - } - m = ~0; - j = 61; - for(i=0; i<62; i++) - if(map[i]>4]; - tmp[i*2+1] = hex[hash[i]&15]; - } - tmp[32] = 0; - http_async_add_header(ctx, "X-Auth-Hash", tmp); - free(tmp); - } - } - - if(data) - { - tmp = malloc(32+strlen((char *)boundary)); - sprintf(tmp, "multipart/form-data, boundary=%s", boundary); - http_async_add_header(ctx, "Content-type", tmp); - free(tmp); - free(data); - } - - if(own_plen) - free(plens); - return http_async_req_stop(ctx, ret, len); - -fail: - if(data) - free(data); - if(own_plen) - free(plens); - if(ret) - *ret = 600; - if(len) - *len = 0; - return NULL; -} From e3bbf00333a85c323bb7da97cb75e7e9788ee697 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 27 Sep 2010 13:07:57 +0200 Subject: [PATCH 176/237] fixed gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a6b750800..2cbf1f682 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ powder.def powder-debug gmon.out *.*.orig -build/ +build/* From 0a9d6adca47eae3b2c06c958a69352adeda4daca Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Mon, 27 Sep 2010 12:34:04 -0700 Subject: [PATCH 177/237] Makes insulator block electrodes --- src/powder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index 5400b7bd4..15a2afe0e 100644 --- a/src/powder.c +++ b/src/powder.c @@ -447,6 +447,7 @@ _inline int parts_avg(int ci, int ni) } } + int nearest_part(int ci, int t) { int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); @@ -705,7 +706,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) { nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1) + if(nearp!=-1&&parts_avg(i, nearp)!=PT_INSL) { create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); t = parts[i].type = PT_ETRD; From 6e81c2a88cc9a2bda3189b01b4edd5da1a0bd0a8 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 2 Oct 2010 17:59:24 +0200 Subject: [PATCH 178/237] Added reflection, thanks to Skylark --- includes/font.h | 4 +- src/graphics.c | 1 + src/main.c | 4 +- src/powder-reflection.diff | 510 +++++++++++++++++++++++++++++++++++++ src/powder.c | 305 +++++++++++++++++----- 5 files changed, 752 insertions(+), 72 deletions(-) create mode 100644 src/powder-reflection.diff diff --git a/includes/font.h b/includes/font.h index f8f9a58c5..38448d146 100644 --- a/includes/font.h +++ b/includes/font.h @@ -21,6 +21,7 @@ #ifndef FONT_H_CHECK #define FONT_H_CHECK #define FONT_H 10 +#ifdef INCLUDE_FONTDATA static char font_data[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xcc, 0x00, 0x00, 0x0a, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xff, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x80, 0xff, 0x2f, 0xfc, 0xff, 0xc3, 0x07, 0x3d, 0x3c, 0xc0, 0xc3, 0x03, 0x3c, 0x7c, 0xd0, 0xc3, 0xff, 0x3f, 0xf8, 0xff, 0x02, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, @@ -29,4 +30,5 @@ static short font_ptrs[] = { 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, }; -#endif \ No newline at end of file +#endif +#endif diff --git a/src/graphics.c b/src/graphics.c index 7ac641e7f..08798dc1d 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -16,6 +16,7 @@ #include #include #include +#define INCLUDE_FONTDATA #include #include diff --git a/src/main.c b/src/main.c index 8c7035b8a..d88b9726b 100755 --- a/src/main.c +++ b/src/main.c @@ -1302,7 +1302,7 @@ int main(int argc, char *argv[]) if(sdl_key=='h') hud_enable = !hud_enable; if(sdl_key=='p') - dump_frame(vid_buf, XRES, YRES, XRES); + dump_frame(vid_buf, XRES, YRES, XRES+BARSIZE); if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) { if(clipboard_ready==1) @@ -1361,7 +1361,7 @@ int main(int argc, char *argv[]) if(sdl_key=='v') vs = !vs; if(vs) - dump_frame(vid_buf, XRES, YRES, XRES); + dump_frame(vid_buf, XRES, YRES, XRES+BARSIZE); #endif if(sdl_wheel) diff --git a/src/powder-reflection.diff b/src/powder-reflection.diff new file mode 100644 index 000000000..1adcbf790 --- /dev/null +++ b/src/powder-reflection.diff @@ -0,0 +1,510 @@ +diff -urN powder-42.3/air.c powder-42.4/air.c +--- powder-42.3/air.c 2010-09-03 10:20:00.000000000 -0400 ++++ powder-42.4/air.c 2010-10-02 08:05:31.000000000 -0400 +@@ -138,4 +138,4 @@ + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +-} +\ No newline at end of file ++} +diff -urN powder-42.3/air.h powder-42.4/air.h +--- powder-42.3/air.h 2010-09-03 10:20:00.000000000 -0400 ++++ powder-42.4/air.h 2010-10-02 08:05:26.000000000 -0400 +@@ -18,4 +18,4 @@ + + void update_air(void); + +-#endif +\ No newline at end of file ++#endif +diff -urN powder-42.3/defines.h powder-42.4/defines.h +--- powder-42.3/defines.h 2010-09-22 15:07:00.000000000 -0400 ++++ powder-42.4/defines.h 2010-10-02 10:18:19.000000000 -0400 +@@ -8,8 +8,8 @@ + #endif + + #define SAVE_VERSION 42 +-#define MINOR_VERSION 3 +-#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. ++#define MINOR_VERSION 4 ++#define IDENT_VERSION "$" //Change this if you're not Simon! It should be a single letter. + //#define BETA + + #define SERVER "powdertoy.co.uk" +@@ -115,4 +115,4 @@ + int parse_save(void *save, int size, int replace, int x0, int y0); + void del_stamp(int d); + void sdl_seticon(void); +-#endif +\ No newline at end of file ++#endif +diff -urN powder-42.3/font.h powder-42.4/font.h +--- powder-42.3/font.h 2010-09-03 10:20:00.000000000 -0400 ++++ powder-42.4/font.h 2010-10-02 08:10:42.000000000 -0400 +@@ -21,5 +21,6 @@ + #ifndef FONT_H_CHECK + #define FONT_H_CHECK + #define FONT_H 10 ++#ifdef INCLUDE_FONTDATA + static char font_data[] = + { +@@ -31,2 +32,3 @@ + { +-#endif +\ No newline at end of file ++#endif ++#endif +diff -urN powder-42.3/graphics.c powder-42.4/graphics.c +--- powder-42.3/graphics.c 2010-09-22 14:05:00.000000000 -0400 ++++ powder-42.4/graphics.c 2010-10-02 08:10:38.000000000 -0400 +@@ -16,6 +16,7 @@ + #include "air.h" + #include "powder.h" + #include "graphics.h" ++#define INCLUDE_FONTDATA + #include "font.h" + #include "misc.h" + +diff -urN powder-42.3/interface.c powder-42.4/interface.c +--- powder-42.3/interface.c 2010-09-22 14:05:00.000000000 -0400 ++++ powder-42.4/interface.c 2010-10-02 08:10:56.000000000 -0400 +@@ -6,10 +6,10 @@ + #include + #include "http.h" + #include "md5.h" +-#include "font.h" + #include "defines.h" + #include "powder.h" + #include "interface.h" ++#include "font.h" + #include "misc.h" + + SDLMod sdl_mod; +@@ -2958,4 +2958,4 @@ + if(result) + free(result); + return 1; +-} +\ No newline at end of file ++} +diff -urN powder-42.3/main.c powder-42.4/main.c +--- powder-42.3/main.c 2010-09-22 15:04:00.000000000 -0400 ++++ powder-42.4/main.c 2010-10-02 10:14:46.000000000 -0400 +@@ -38,7 +38,6 @@ + #endif + + #include "misc.h" +-#include "font.h" + #include "defines.h" + #include "powder.h" + #include "graphics.h" +@@ -1302,7 +1301,7 @@ + if(sdl_key=='h') + hud_enable = !hud_enable; + if(sdl_key=='p') +- dump_frame(vid_buf, XRES, YRES, XRES); ++ dump_frame(vid_buf, XRES, YRES, XRES+BARSIZE); + if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + if(clipboard_ready==1) +@@ -1361,7 +1360,7 @@ + if(sdl_key=='v') + vs = !vs; + if(vs) +- dump_frame(vid_buf, XRES, YRES, XRES); ++ dump_frame(vid_buf, XRES, YRES, XRES+BARSIZE); + #endif + + if(sdl_wheel) +diff -urN powder-42.3/misc.c powder-42.4/misc.c +--- powder-42.3/misc.c 2010-09-22 14:05:00.000000000 -0400 ++++ powder-42.4/misc.c 2010-10-02 08:05:12.000000000 -0400 +@@ -280,4 +280,4 @@ + #endif + #endif + return 0; +-} +\ No newline at end of file ++} +diff -urN powder-42.3/misc.h powder-42.4/misc.h +--- powder-42.3/misc.h 2010-09-22 14:05:00.000000000 -0400 ++++ powder-42.4/misc.h 2010-10-02 08:05:47.000000000 -0400 +@@ -69,4 +69,4 @@ + + int cpu_check(void); + +-#endif +\ No newline at end of file ++#endif +diff -urN powder-42.3/powder.c powder-42.4/powder.c +--- powder-42.3/powder.c 2010-09-22 14:05:00.000000000 -0400 ++++ powder-42.4/powder.c 2010-10-02 10:07:00.000000000 -0400 +@@ -21,80 +21,96 @@ + unsigned pmap[YRES][XRES]; + unsigned cb_pmap[YRES][XRES]; + +-int try_move(int i, int x, int y, int nx, int ny) ++static int eval_move(int pt, int nx, int ny, unsigned *rr) + { + unsigned r; + +- + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) + return 0; +- if(x==nx && y==ny) +- return 1; ++ + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; ++ if(rr) ++ *rr = r; ++ ++ if(pt==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) ++ return 2; + +- if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) ++ if(pt==PT_STKM) //Stick man's head shouldn't collide + { +- return 1; ++ return 2; + } + +- if((r&0xFF)==PT_VOID) ++ if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) + { +- parts[i].type=PT_NONE; + return 0; + } +- if((r&0xFF)==PT_BHOL) +- { +- parts[i].type=PT_NONE; +- if(!legacy_enable) +- { +- parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; +- } ++ ++ if(ptypes[pt].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; +- } + +- if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide +- { ++ if((pt==PT_NEUT ||pt==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) ++ return 0; ++ ++ if(bmap[ny/CELL][nx/CELL]==9) ++ return 0; ++ ++ if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) ++ return 0; ++ ++ if (r && ((r&0xFF) >= PT_NUM || !can_move[pt][(r&0xFF)])) ++ return 0; ++ ++ return 1; ++} ++ ++int try_move(int i, int x, int y, int nx, int ny) ++{ ++ unsigned r, e; ++ ++ if(x==nx && y==ny) + return 1; +- } ++ ++ e = eval_move(parts[i].type, nx, ny, &r); ++ if(!e) ++ return 0; ++ if(e == 2) ++ return 1; + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) + { + return 1; + } +- if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) +- { +- return 0; +- } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + { + return 0; + } +- +- if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) +- return 0; +- if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) +- return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) ++ if((r&0xFF)==PT_BHOL) ++ { ++ parts[i].type=PT_NONE; ++ if(!legacy_enable) ++ { ++ parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; ++ } + return 0; ++ } + + if(parts[i].type==PT_CNCT && y>8)>= 8; +@@ -456,10 +472,147 @@ + return id; + } + ++#define SURF_RANGE 10 ++#define NORMAL_MIN_EST 3 ++#define NORMAL_INTERP 20 ++#define NORMAL_FRAC 16 ++ ++static unsigned direction_to_map(float dx, float dy) ++{ ++ return (dx >= 0) | ++ (((dx + dy) >= 0) << 1) | /* 567 */ ++ ((dy >= 0) << 2) | /* 4+0 */ ++ (((dy - dx) >= 0) << 3) | /* 321 */ ++ ((dx <= 0) << 4) | ++ (((dx + dy) <= 0) << 5) | ++ ((dy <= 0) << 6) | ++ (((dy - dx) <= 0) << 7); ++} ++ ++static int is_blocking(int t, int x, int y) ++{ ++ return eval_move(t, x, y, NULL); ++} ++ ++static int is_boundary(int pt, int x, int y) ++{ ++ if(!is_blocking(pt,x,y)) ++ return 0; ++ if(is_blocking(pt,x,y-1) && is_blocking(pt,x,y+1) && is_blocking(pt,x-1,y) && is_blocking(pt,x+1,y)) ++ return 0; ++ return 1; ++} ++ ++static int find_next_boundary(int pt, int *x, int *y, int dm, int *em) ++{ ++ static int dx[8] = {1,1,0,-1,-1,-1,0,1}; ++ static int dy[8] = {0,1,1,1,0,-1,-1,-1}; ++ static int de[8] = {0x83,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC1}; ++ int i, ii, i0; ++ ++ if(*x <= 0 || *x >= XRES-1 || *y <= 0 || *y >= YRES-1) ++ return 0; ++ ++ if(*em != -1) { ++ i0 = *em; ++ dm &= de[i0]; ++ } else ++ i0 = 0; ++ ++ for(ii=0; ii<8; ii++) { ++ i = (ii + i0) & 7; ++ if((dm & (1 << i)) && is_boundary(pt, *x+dx[i], *y+dy[i])) { ++ *x += dx[i]; ++ *y += dy[i]; ++ *em = i; ++ return 1; ++ } ++ } ++ ++ return 0; ++} ++ ++static int vec_colinear(float nx, float ny, float vx, float vy) ++{ ++ float d = 1.0f/hypot(vx, vy); ++ d *= nx*vx + ny*vy; ++ return (d >= 0.99) || (d <= -0.99); ++} ++ ++int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny) ++{ ++ int ldm, rdm, lm, rm; ++ int lx, ly, lv, rx, ry, rv; ++ int i, j; ++ float r, ex, ey; ++ ++ if(!dx && !dy) ++ return 0; ++ ++ if(!is_boundary(pt, x, y)) ++ return 0; ++ ++ ldm = direction_to_map(-dy, dx); ++ rdm = direction_to_map(dy, -dx); ++ lx = rx = x; ++ ly = ry = y; ++ lv = rv = 1; ++ lm = rm = -1; ++ ++ j = 0; ++ for(i=0; i= NORMAL_INTERP) ++ return 0; ++ ++ return get_normal(pt, x, y, dx, dy, nx, ny); ++} ++ + void update_particles_i(pixel *vid, int start, int inc) + { + int i, j, x, y, t, nx, ny, r, a, s, rt, fe, nt, lpv, nearp, pavg; +- float mv, dx, dy, ix, iy, lx, ly, d, pp; ++ float mv, dx, dy, ix, iy, lx, ly, d, pp, nrx, nry, dp; + float pt = R_TEMP; + float c_heat = 0.0f; + int h_count = 0; +@@ -886,7 +1039,7 @@ + r = pmap[y+ny][x+nx]; + if((r>>8)>=NPART || !r) + continue; +- if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) ++ if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) + { + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; +@@ -2075,32 +2228,55 @@ + else + { + parts[i].flags |= FLAG_STAGNANT; +- if(nx>x+ISTP) nx=x+ISTP; +- if(nxy+ISTP) ny=y+ISTP; +- if(ny(rand()%1000)) + { + kill_part(i); + continue; + } +- else if(try_move(i, x, y, 2*x-nx, ny)) +- { +- parts[i].x = (float)(2*x-nx); +- parts[i].y = (float)iy; +- parts[i].vx *= ptypes[t].collision; +- } +- else if(try_move(i, x, y, nx, 2*y-ny)) +- { +- parts[i].x = (float)ix; +- parts[i].y = (float)(2*y-ny); +- parts[i].vy *= ptypes[t].collision; +- } +- else +- { +- parts[i].vx *= ptypes[t].collision; +- parts[i].vy *= ptypes[t].collision; +- } ++ else if(t==PT_NEUT || t==PT_PHOT) ++ { ++ if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { ++ dp = nrx*parts[i].vx + nry*parts[i].vy; ++ parts[i].vx -= 2.0f*dp*nrx; ++ parts[i].vy -= 2.0f*dp*nry; ++ nx = (int)(parts[i].x + parts[i].vx + 0.5f); ++ ny = (int)(parts[i].y + parts[i].vy + 0.5f); ++ if(try_move(i, x, y, nx, ny)) { ++ parts[i].x = (float)nx; ++ parts[i].y = (float)ny; ++ } else { ++ kill_part(i); ++ continue; ++ } ++ } else { ++ kill_part(i); ++ continue; ++ } ++ } ++ else ++ { ++ if(nx>x+ISTP) nx=x+ISTP; ++ if(nxy+ISTP) ny=y+ISTP; ++ if(ny=XRES-CELL || ny=YRES-CELL) +Binary files powder-42.3/powder.def and powder-42.4/powder.def differ diff --git a/src/powder.c b/src/powder.c index 15a2afe0e..f5da09c53 100644 --- a/src/powder.c +++ b/src/powder.c @@ -22,25 +22,66 @@ int pfree; unsigned pmap[YRES][XRES]; unsigned cb_pmap[YRES][XRES]; -int try_move(int i, int x, int y, int nx, int ny) +static int eval_move(int pt, int nx, int ny, unsigned *rr) { unsigned r; if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) return 0; - if(x==nx && y==ny) - return 1; - r = pmap[ny][nx]; + + r = pmap[ny][nx]; if(r && (r>>8)>8].type; + if(rr) + *rr = r; - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||(r&0xFF)==PT_PCLN||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) - { + if(pt==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY||((r&0xFF)==PT_PCLN&&parts[r>>8].life > 5)))) + return 2; + + if(pt==PT_STKM) //Stick man's head shouldn't collide + { + return 2; + } + + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) + return 0; + if(ptypes[pt].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((pt==PT_NEUT ||pt==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + + if(bmap[ny/CELL][nx/CELL]==9) + return 0; + + if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) + return 0; + + if (r && ((r&0xFF) >= PT_NUM || !can_move[pt][(r&0xFF)])) + return 0; + + return 1; +} +int try_move(int i, int x, int y, int nx, int ny) +{ + unsigned r, e; + + if(x==nx && y==ny) + return 1; + e = eval_move(parts[i].type, nx, ny, &r); + if(!e) + return 0; + if(e == 2) + return 1; + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) return 1; - } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + return 0; - if((r&0xFF)==PT_VOID) + if(r && (r>>8)>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; } - return 0; - } - if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide - { - return 1; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - { - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) - { return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - { - return 0; - } - - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - + } if(parts[i].type==PT_CNCT && y>8)>= 8; @@ -105,6 +111,142 @@ int try_move(int i, int x, int y, int nx, int ny) return 1; } +#define SURF_RANGE 10 +#define NORMAL_MIN_EST 3 +#define NORMAL_INTERP 20 +#define NORMAL_FRAC 16 + +static unsigned direction_to_map(float dx, float dy) +{ + return (dx >= 0) | + (((dx + dy) >= 0) << 1) | /* 567 */ + ((dy >= 0) << 2) | /* 4+0 */ + (((dy - dx) >= 0) << 3) | /* 321 */ + ((dx <= 0) << 4) | + (((dx + dy) <= 0) << 5) | + ((dy <= 0) << 6) | + (((dy - dx) <= 0) << 7); +} + +static int is_blocking(int t, int x, int y) +{ + return eval_move(t, x, y, NULL); +} + +static int is_boundary(int pt, int x, int y) +{ + if(!is_blocking(pt,x,y)) + return 0; + if(is_blocking(pt,x,y-1) && is_blocking(pt,x,y+1) && is_blocking(pt,x-1,y) && is_blocking(pt,x+1,y)) + return 0; + return 1; +} + +static int find_next_boundary(int pt, int *x, int *y, int dm, int *em) +{ + static int dx[8] = {1,1,0,-1,-1,-1,0,1}; + static int dy[8] = {0,1,1,1,0,-1,-1,-1}; + static int de[8] = {0x83,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC1}; + int i, ii, i0; + + if(*x <= 0 || *x >= XRES-1 || *y <= 0 || *y >= YRES-1) + return 0; + + if(*em != -1) { + i0 = *em; + dm &= de[i0]; + } else + i0 = 0; + + for(ii=0; ii<8; ii++) { + i = (ii + i0) & 7; + if((dm & (1 << i)) && is_boundary(pt, *x+dx[i], *y+dy[i])) { + *x += dx[i]; + *y += dy[i]; + *em = i; + return 1; + } + } + + return 0; +} + +static int vec_colinear(float nx, float ny, float vx, float vy) +{ + float d = 1.0f/hypot(vx, vy); + d *= nx*vx + ny*vy; + return (d >= 0.99) || (d <= -0.99); +} + +int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny) +{ + int ldm, rdm, lm, rm; + int lx, ly, lv, rx, ry, rv; + int i, j; + float r, ex, ey; + + if(!dx && !dy) + return 0; + + if(!is_boundary(pt, x, y)) + return 0; + + ldm = direction_to_map(-dy, dx); + rdm = direction_to_map(dy, -dx); + lx = rx = x; + ly = ry = y; + lv = rv = 1; + lm = rm = -1; + + j = 0; + for(i=0; i= NORMAL_INTERP) + return 0; + + return get_normal(pt, x, y, dx, dy, nx, ny); +} void kill_part(int i) { @@ -477,7 +619,7 @@ void update_particles_i(pixel *vid, int start, int inc) uint16_t tempu1, tempu2; int16_t temps1, temps2; float tempf1, tempf2; - float mv, dx, dy, ix, iy, lx, ly, d, pp; + float mv, dx, dy, ix, iy, lx, ly, d, pp, nrx, nry, dp; float pt = R_TEMP; float c_heat = 0.0f; int h_count = 0; @@ -906,7 +1048,8 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) + { t = parts[i].type = PT_NONE; parts[r>>8].ctype = parts[r>>8].type; @@ -2381,33 +2524,57 @@ void update_particles_i(pixel *vid, int start, int inc) else { parts[i].flags |= FLAG_STAGNANT; - if(nx>x+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) { kill_part(i); continue; } - else if(try_move(i, x, y, 2*x-nx, ny)) - { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } - else if(try_move(i, x, y, nx, 2*y-ny)) - { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } - else - { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } + else if(t==PT_NEUT || t==PT_PHOT) + { + if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { + dp = nrx*parts[i].vx + nry*parts[i].vy; + parts[i].vx -= 2.0f*dp*nrx; + parts[i].vy -= 2.0f*dp*nry; + nx = (int)(parts[i].x + parts[i].vx + 0.5f); + ny = (int)(parts[i].y + parts[i].vy + 0.5f); + if(try_move(i, x, y, nx, ny)) { + parts[i].x = (float)nx; + parts[i].y = (float)ny; + } else { + kill_part(i); + continue; + } + } else { + kill_part(i); + continue; + } + } + + else + { + if(nx>x+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny=XRES-CELL || ny=YRES-CELL) { From 52098f806bdc31959cefa0604420a14409f4bdc9 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 2 Oct 2010 17:59:42 +0200 Subject: [PATCH 179/237] removed diff file --- src/powder-reflection.diff | 510 ------------------------------------- 1 file changed, 510 deletions(-) delete mode 100644 src/powder-reflection.diff diff --git a/src/powder-reflection.diff b/src/powder-reflection.diff deleted file mode 100644 index 1adcbf790..000000000 --- a/src/powder-reflection.diff +++ /dev/null @@ -1,510 +0,0 @@ -diff -urN powder-42.3/air.c powder-42.4/air.c ---- powder-42.3/air.c 2010-09-03 10:20:00.000000000 -0400 -+++ powder-42.4/air.c 2010-10-02 08:05:31.000000000 -0400 -@@ -138,4 +138,4 @@ - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); --} -\ No newline at end of file -+} -diff -urN powder-42.3/air.h powder-42.4/air.h ---- powder-42.3/air.h 2010-09-03 10:20:00.000000000 -0400 -+++ powder-42.4/air.h 2010-10-02 08:05:26.000000000 -0400 -@@ -18,4 +18,4 @@ - - void update_air(void); - --#endif -\ No newline at end of file -+#endif -diff -urN powder-42.3/defines.h powder-42.4/defines.h ---- powder-42.3/defines.h 2010-09-22 15:07:00.000000000 -0400 -+++ powder-42.4/defines.h 2010-10-02 10:18:19.000000000 -0400 -@@ -8,8 +8,8 @@ - #endif - - #define SAVE_VERSION 42 --#define MINOR_VERSION 3 --#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. -+#define MINOR_VERSION 4 -+#define IDENT_VERSION "$" //Change this if you're not Simon! It should be a single letter. - //#define BETA - - #define SERVER "powdertoy.co.uk" -@@ -115,4 +115,4 @@ - int parse_save(void *save, int size, int replace, int x0, int y0); - void del_stamp(int d); - void sdl_seticon(void); --#endif -\ No newline at end of file -+#endif -diff -urN powder-42.3/font.h powder-42.4/font.h ---- powder-42.3/font.h 2010-09-03 10:20:00.000000000 -0400 -+++ powder-42.4/font.h 2010-10-02 08:10:42.000000000 -0400 -@@ -21,5 +21,6 @@ - #ifndef FONT_H_CHECK - #define FONT_H_CHECK - #define FONT_H 10 -+#ifdef INCLUDE_FONTDATA - static char font_data[] = - { -@@ -31,2 +32,3 @@ - { --#endif -\ No newline at end of file -+#endif -+#endif -diff -urN powder-42.3/graphics.c powder-42.4/graphics.c ---- powder-42.3/graphics.c 2010-09-22 14:05:00.000000000 -0400 -+++ powder-42.4/graphics.c 2010-10-02 08:10:38.000000000 -0400 -@@ -16,6 +16,7 @@ - #include "air.h" - #include "powder.h" - #include "graphics.h" -+#define INCLUDE_FONTDATA - #include "font.h" - #include "misc.h" - -diff -urN powder-42.3/interface.c powder-42.4/interface.c ---- powder-42.3/interface.c 2010-09-22 14:05:00.000000000 -0400 -+++ powder-42.4/interface.c 2010-10-02 08:10:56.000000000 -0400 -@@ -6,10 +6,10 @@ - #include - #include "http.h" - #include "md5.h" --#include "font.h" - #include "defines.h" - #include "powder.h" - #include "interface.h" -+#include "font.h" - #include "misc.h" - - SDLMod sdl_mod; -@@ -2958,4 +2958,4 @@ - if(result) - free(result); - return 1; --} -\ No newline at end of file -+} -diff -urN powder-42.3/main.c powder-42.4/main.c ---- powder-42.3/main.c 2010-09-22 15:04:00.000000000 -0400 -+++ powder-42.4/main.c 2010-10-02 10:14:46.000000000 -0400 -@@ -38,7 +38,6 @@ - #endif - - #include "misc.h" --#include "font.h" - #include "defines.h" - #include "powder.h" - #include "graphics.h" -@@ -1302,7 +1301,7 @@ - if(sdl_key=='h') - hud_enable = !hud_enable; - if(sdl_key=='p') -- dump_frame(vid_buf, XRES, YRES, XRES); -+ dump_frame(vid_buf, XRES, YRES, XRES+BARSIZE); - if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - if(clipboard_ready==1) -@@ -1361,7 +1360,7 @@ - if(sdl_key=='v') - vs = !vs; - if(vs) -- dump_frame(vid_buf, XRES, YRES, XRES); -+ dump_frame(vid_buf, XRES, YRES, XRES+BARSIZE); - #endif - - if(sdl_wheel) -diff -urN powder-42.3/misc.c powder-42.4/misc.c ---- powder-42.3/misc.c 2010-09-22 14:05:00.000000000 -0400 -+++ powder-42.4/misc.c 2010-10-02 08:05:12.000000000 -0400 -@@ -280,4 +280,4 @@ - #endif - #endif - return 0; --} -\ No newline at end of file -+} -diff -urN powder-42.3/misc.h powder-42.4/misc.h ---- powder-42.3/misc.h 2010-09-22 14:05:00.000000000 -0400 -+++ powder-42.4/misc.h 2010-10-02 08:05:47.000000000 -0400 -@@ -69,4 +69,4 @@ - - int cpu_check(void); - --#endif -\ No newline at end of file -+#endif -diff -urN powder-42.3/powder.c powder-42.4/powder.c ---- powder-42.3/powder.c 2010-09-22 14:05:00.000000000 -0400 -+++ powder-42.4/powder.c 2010-10-02 10:07:00.000000000 -0400 -@@ -21,80 +21,96 @@ - unsigned pmap[YRES][XRES]; - unsigned cb_pmap[YRES][XRES]; - --int try_move(int i, int x, int y, int nx, int ny) -+static int eval_move(int pt, int nx, int ny, unsigned *rr) - { - unsigned r; - -- - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) - return 0; -- if(x==nx && y==ny) -- return 1; -+ - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; -+ if(rr) -+ *rr = r; -+ -+ if(pt==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) -+ return 2; - -- if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) -+ if(pt==PT_STKM) //Stick man's head shouldn't collide - { -- return 1; -+ return 2; - } - -- if((r&0xFF)==PT_VOID) -+ if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) - { -- parts[i].type=PT_NONE; - return 0; - } -- if((r&0xFF)==PT_BHOL) -- { -- parts[i].type=PT_NONE; -- if(!legacy_enable) -- { -- parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; -- } -+ -+ if(ptypes[pt].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; -- } - -- if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide -- { -+ if((pt==PT_NEUT ||pt==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) -+ return 0; -+ -+ if(bmap[ny/CELL][nx/CELL]==9) -+ return 0; -+ -+ if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) -+ return 0; -+ -+ if (r && ((r&0xFF) >= PT_NUM || !can_move[pt][(r&0xFF)])) -+ return 0; -+ -+ return 1; -+} -+ -+int try_move(int i, int x, int y, int nx, int ny) -+{ -+ unsigned r, e; -+ -+ if(x==nx && y==ny) - return 1; -- } -+ -+ e = eval_move(parts[i].type, nx, ny, &r); -+ if(!e) -+ return 0; -+ if(e == 2) -+ return 1; - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - { - return 1; - } -- if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) -- { -- return 0; -- } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - { - return 0; - } -- -- if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) -- return 0; -- if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) -- return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) -+ if((r&0xFF)==PT_BHOL) -+ { -+ parts[i].type=PT_NONE; -+ if(!legacy_enable) -+ { -+ parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; -+ } - return 0; -+ } - - if(parts[i].type==PT_CNCT && y>8)>= 8; -@@ -456,10 +472,147 @@ - return id; - } - -+#define SURF_RANGE 10 -+#define NORMAL_MIN_EST 3 -+#define NORMAL_INTERP 20 -+#define NORMAL_FRAC 16 -+ -+static unsigned direction_to_map(float dx, float dy) -+{ -+ return (dx >= 0) | -+ (((dx + dy) >= 0) << 1) | /* 567 */ -+ ((dy >= 0) << 2) | /* 4+0 */ -+ (((dy - dx) >= 0) << 3) | /* 321 */ -+ ((dx <= 0) << 4) | -+ (((dx + dy) <= 0) << 5) | -+ ((dy <= 0) << 6) | -+ (((dy - dx) <= 0) << 7); -+} -+ -+static int is_blocking(int t, int x, int y) -+{ -+ return eval_move(t, x, y, NULL); -+} -+ -+static int is_boundary(int pt, int x, int y) -+{ -+ if(!is_blocking(pt,x,y)) -+ return 0; -+ if(is_blocking(pt,x,y-1) && is_blocking(pt,x,y+1) && is_blocking(pt,x-1,y) && is_blocking(pt,x+1,y)) -+ return 0; -+ return 1; -+} -+ -+static int find_next_boundary(int pt, int *x, int *y, int dm, int *em) -+{ -+ static int dx[8] = {1,1,0,-1,-1,-1,0,1}; -+ static int dy[8] = {0,1,1,1,0,-1,-1,-1}; -+ static int de[8] = {0x83,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC1}; -+ int i, ii, i0; -+ -+ if(*x <= 0 || *x >= XRES-1 || *y <= 0 || *y >= YRES-1) -+ return 0; -+ -+ if(*em != -1) { -+ i0 = *em; -+ dm &= de[i0]; -+ } else -+ i0 = 0; -+ -+ for(ii=0; ii<8; ii++) { -+ i = (ii + i0) & 7; -+ if((dm & (1 << i)) && is_boundary(pt, *x+dx[i], *y+dy[i])) { -+ *x += dx[i]; -+ *y += dy[i]; -+ *em = i; -+ return 1; -+ } -+ } -+ -+ return 0; -+} -+ -+static int vec_colinear(float nx, float ny, float vx, float vy) -+{ -+ float d = 1.0f/hypot(vx, vy); -+ d *= nx*vx + ny*vy; -+ return (d >= 0.99) || (d <= -0.99); -+} -+ -+int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny) -+{ -+ int ldm, rdm, lm, rm; -+ int lx, ly, lv, rx, ry, rv; -+ int i, j; -+ float r, ex, ey; -+ -+ if(!dx && !dy) -+ return 0; -+ -+ if(!is_boundary(pt, x, y)) -+ return 0; -+ -+ ldm = direction_to_map(-dy, dx); -+ rdm = direction_to_map(dy, -dx); -+ lx = rx = x; -+ ly = ry = y; -+ lv = rv = 1; -+ lm = rm = -1; -+ -+ j = 0; -+ for(i=0; i= NORMAL_INTERP) -+ return 0; -+ -+ return get_normal(pt, x, y, dx, dy, nx, ny); -+} -+ - void update_particles_i(pixel *vid, int start, int inc) - { - int i, j, x, y, t, nx, ny, r, a, s, rt, fe, nt, lpv, nearp, pavg; -- float mv, dx, dy, ix, iy, lx, ly, d, pp; -+ float mv, dx, dy, ix, iy, lx, ly, d, pp, nrx, nry, dp; - float pt = R_TEMP; - float c_heat = 0.0f; - int h_count = 0; -@@ -886,7 +1039,7 @@ - r = pmap[y+ny][x+nx]; - if((r>>8)>=NPART || !r) - continue; -- if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) -+ if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) - { - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; -@@ -2075,32 +2228,55 @@ - else - { - parts[i].flags |= FLAG_STAGNANT; -- if(nx>x+ISTP) nx=x+ISTP; -- if(nxy+ISTP) ny=y+ISTP; -- if(ny(rand()%1000)) - { - kill_part(i); - continue; - } -- else if(try_move(i, x, y, 2*x-nx, ny)) -- { -- parts[i].x = (float)(2*x-nx); -- parts[i].y = (float)iy; -- parts[i].vx *= ptypes[t].collision; -- } -- else if(try_move(i, x, y, nx, 2*y-ny)) -- { -- parts[i].x = (float)ix; -- parts[i].y = (float)(2*y-ny); -- parts[i].vy *= ptypes[t].collision; -- } -- else -- { -- parts[i].vx *= ptypes[t].collision; -- parts[i].vy *= ptypes[t].collision; -- } -+ else if(t==PT_NEUT || t==PT_PHOT) -+ { -+ if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { -+ dp = nrx*parts[i].vx + nry*parts[i].vy; -+ parts[i].vx -= 2.0f*dp*nrx; -+ parts[i].vy -= 2.0f*dp*nry; -+ nx = (int)(parts[i].x + parts[i].vx + 0.5f); -+ ny = (int)(parts[i].y + parts[i].vy + 0.5f); -+ if(try_move(i, x, y, nx, ny)) { -+ parts[i].x = (float)nx; -+ parts[i].y = (float)ny; -+ } else { -+ kill_part(i); -+ continue; -+ } -+ } else { -+ kill_part(i); -+ continue; -+ } -+ } -+ else -+ { -+ if(nx>x+ISTP) nx=x+ISTP; -+ if(nxy+ISTP) ny=y+ISTP; -+ if(ny=XRES-CELL || ny=YRES-CELL) -Binary files powder-42.3/powder.def and powder-42.4/powder.def differ From ad3fa82329e8a43b8908d64b2638b8a7e3ab9473 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 2 Oct 2010 18:43:42 +0200 Subject: [PATCH 180/237] added refraction, thanks to Skylark --- src/powder.c | 67 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/src/powder.c b/src/powder.c index f5da09c53..4b474b809 100644 --- a/src/powder.c +++ b/src/powder.c @@ -39,10 +39,8 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(pt==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY||((r&0xFF)==PT_PCLN&&parts[r>>8].life > 5)))) return 2; - if(pt==PT_STKM) //Stick man's head shouldn't collide - { - return 2; - } + if(pt==PT_STKM) //Stick man's head shouldn't collide + return 2; if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) return 0; @@ -60,6 +58,8 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if (r && ((r&0xFF) >= PT_NUM || !can_move[pt][(r&0xFF)])) return 0; + if(pt == PT_PHOT) + return 2; return 1; } int try_move(int i, int x, int y, int nx, int ny) @@ -68,11 +68,13 @@ int try_move(int i, int x, int y, int nx, int ny) if(x==nx && y==ny) return 1; - e = eval_move(parts[i].type, nx, ny, &r); + + e = eval_move(parts[i].type, nx, ny, &r); if(!e) return 0; if(e == 2) return 1; + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) return 1; if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) @@ -116,6 +118,8 @@ int try_move(int i, int x, int y, int nx, int ny) #define NORMAL_INTERP 20 #define NORMAL_FRAC 16 +#define REFRACT 0x80000000 + static unsigned direction_to_map(float dx, float dy) { return (dx >= 0) | @@ -130,6 +134,14 @@ static unsigned direction_to_map(float dx, float dy) static int is_blocking(int t, int x, int y) { + if(t & REFRACT) { + if(x<0 || y<0 || x>=XRES || y>=YRES) + return 0; + if((pmap[y][x] & 0xFF) == PT_GLAS) + return 1; + return 0; + } + return eval_move(t, x, y, NULL); } @@ -435,9 +447,9 @@ _inline int create_part(int p, int x, int y, int t) //}/ } - if(t!=PT_STKM) + if(t!=PT_STKM && t!=PT_PHOT) pmap[y][x] = t|(i<<8); - else + else if(t==PT_STKM) { if(isplayer==0) { @@ -615,11 +627,12 @@ int nearest_part(int ci, int t) void update_particles_i(pixel *vid, int start, int inc) { - int i, j, x, y, t, nx, ny, r, a, s, rt, fe, nt, lpv, nearp, pavg; + int i, j, x, y, t, nx, ny, r, a, s, lt, rt, fe, nt, lpv, nearp, pavg; uint16_t tempu1, tempu2; int16_t temps1, temps2; float tempf1, tempf2; float mv, dx, dy, ix, iy, lx, ly, d, pp, nrx, nry, dp; + float nn, ct1, ct2; float pt = R_TEMP; float c_heat = 0.0f; int h_count = 0; @@ -2411,6 +2424,42 @@ void update_particles_i(pixel *vid, int start, int inc) continue; } + if(parts[i].type == PT_PHOT) { + rt = pmap[ny][nx] & 0xFF; + + if(rt==PT_CLNE) { + lt = pmap[ny][nx] >> 8; + if(!parts[lt].ctype) + parts[lt].ctype = PT_PHOT; + } + + lt = pmap[y][x] & 0xFF; + + if((rt==PT_GLAS && lt!=PT_GLAS) || (rt!=PT_GLAS && lt==PT_GLAS)) { + if(!get_normal_interp(REFRACT|parts[i].type, x, y, parts[i].vx, parts[i].vy, &nrx, &nry)) { + kill_part(i); + continue; + } + nrx = -nrx; + nry = -nry; + if(rt!=PT_GLAS && lt==PT_GLAS) + nn = 2.0; + else + nn = 0.5; + ct1 = parts[i].vx*nrx + parts[i].vy*nry; + ct2 = 1.0f - (nn*nn)*(1.0f-(ct1*ct1)); + if(ct2 < 0.0f) { + parts[i].vx -= 2.0f*ct1*nrx; + parts[i].vy -= 2.0f*ct1*nry; + } else { + ct2 = sqrtf(ct2); + ct2 = ct2 - nn*ct1; + parts[i].vx = nn*parts[i].vx + ct2*nrx; + parts[i].vy = nn*parts[i].vy + ct2*nry; + } + } + } + rt = parts[i].flags & FLAG_STAGNANT; parts[i].flags &= ~FLAG_STAGNANT; if(!try_move(i, x, y, nx, ny)) @@ -2608,7 +2657,7 @@ void update_particles(pixel *vid) t = parts[i].type; x = (int)(parts[i].x+0.5f); y = (int)(parts[i].y+0.5f); - if(x>=0 && y>=0 && x=0 && y>=0 && x Date: Sat, 2 Oct 2010 19:45:55 +0200 Subject: [PATCH 181/237] fixed indention --- includes/powder.h | 20 +- src/powder.c | 621 +++++++++++++++++++++++----------------------- 2 files changed, 323 insertions(+), 318 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index 0ae548ddd..3b5e2f0d6 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -362,15 +362,15 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S */ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W */ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Clne */ /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Plex */ @@ -387,7 +387,7 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Wtrv */ /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Dstw */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Dstw */ /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0}, /* Salt */ /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Sltw */ /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ diff --git a/src/powder.c b/src/powder.c index 4b474b809..1943615bd 100644 --- a/src/powder.c +++ b/src/powder.c @@ -29,23 +29,23 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) return 0; - - r = pmap[ny][nx]; + + r = pmap[ny][nx]; if(r && (r>>8)>8].type; if(rr) - *rr = r; + *rr = r; if(pt==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY||((r&0xFF)==PT_PCLN&&parts[r>>8].life > 5)))) return 2; if(pt==PT_STKM) //Stick man's head shouldn't collide - return 2; + return 2; - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) + return 0; + if(ptypes[pt].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) return 0; - if(ptypes[pt].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; if((pt==PT_NEUT ||pt==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) return 0; @@ -59,7 +59,7 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) return 0; if(pt == PT_PHOT) - return 2; + return 2; return 1; } int try_move(int i, int x, int y, int nx, int ny) @@ -67,23 +67,28 @@ int try_move(int i, int x, int y, int nx, int ny) unsigned r, e; if(x==nx && y==ny) - return 1; + return 1; e = eval_move(parts[i].type, nx, ny, &r); - if(!e) - return 0; + if(!e) { + if(!legacy_enable) { + if((r >> 8) < PT_NUM) + | parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);; + } + return 0; + } if(e == 2) - return 1; + return 1; if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) return 1; if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) return 0; - if(r && (r>>8)>8)=XRES || y>=YRES) - return 0; - if((pmap[y][x] & 0xFF) == PT_GLAS) - return 1; - return 0; + return 0; + if((pmap[y][x] & 0xFF) == PT_GLAS) + return 1; + return 0; } return eval_move(t, x, y, NULL); @@ -148,9 +153,9 @@ static int is_blocking(int t, int x, int y) static int is_boundary(int pt, int x, int y) { if(!is_blocking(pt,x,y)) - return 0; + return 0; if(is_blocking(pt,x,y-1) && is_blocking(pt,x,y+1) && is_blocking(pt,x-1,y) && is_blocking(pt,x+1,y)) - return 0; + return 0; return 1; } @@ -162,22 +167,22 @@ static int find_next_boundary(int pt, int *x, int *y, int dm, int *em) int i, ii, i0; if(*x <= 0 || *x >= XRES-1 || *y <= 0 || *y >= YRES-1) - return 0; + return 0; if(*em != -1) { - i0 = *em; - dm &= de[i0]; + i0 = *em; + dm &= de[i0]; } else - i0 = 0; + i0 = 0; for(ii=0; ii<8; ii++) { - i = (ii + i0) & 7; - if((dm & (1 << i)) && is_boundary(pt, *x+dx[i], *y+dy[i])) { - *x += dx[i]; - *y += dy[i]; - *em = i; - return 1; - } + i = (ii + i0) & 7; + if((dm & (1 << i)) && is_boundary(pt, *x+dx[i], *y+dy[i])) { + *x += dx[i]; + *y += dy[i]; + *em = i; + return 1; + } } return 0; @@ -198,10 +203,10 @@ int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny) float r, ex, ey; if(!dx && !dy) - return 0; + return 0; if(!is_boundary(pt, x, y)) - return 0; + return 0; ldm = direction_to_map(-dy, dx); rdm = direction_to_map(dy, -dx); @@ -212,20 +217,20 @@ int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny) j = 0; for(i=0; i= NORMAL_INTERP) - return 0; + return 0; return get_normal(pt, x, y, dx, dy, nx, ny); } @@ -278,7 +283,7 @@ void kill_part(int i) #ifdef WIN32 _inline int create_part(int p, int x, int y, int t) #else - inline int create_part(int p, int x, int y, int t) +inline int create_part(int p, int x, int y, int t) #endif { int i; @@ -335,19 +340,19 @@ _inline int create_part(int p, int x, int y, int t) if(t==PT_SPRK) { if((pmap[y][x]&0xFF)!=PT_METL && - (pmap[y][x]&0xFF)!=PT_PSCN && - (pmap[y][x]&0xFF)!=PT_NSCN && - (pmap[y][x]&0xFF)!=PT_NTCT && - (pmap[y][x]&0xFF)!=PT_PTCT && - (pmap[y][x]&0xFF)!=PT_WATR && - (pmap[y][x]&0xFF)!=PT_SLTW && - (pmap[y][x]&0xFF)!=PT_BMTL && - (pmap[y][x]&0xFF)!=PT_RBDM && - (pmap[y][x]&0xFF)!=PT_LRBD && - (pmap[y][x]&0xFF)!=PT_ETRD && - (pmap[y][x]&0xFF)!=PT_BRMT && - (pmap[y][x]&0xFF)!=PT_NBLE && - (pmap[y][x]&0xFF)!=PT_INWR) + (pmap[y][x]&0xFF)!=PT_PSCN && + (pmap[y][x]&0xFF)!=PT_NSCN && + (pmap[y][x]&0xFF)!=PT_NTCT && + (pmap[y][x]&0xFF)!=PT_PTCT && + (pmap[y][x]&0xFF)!=PT_WATR && + (pmap[y][x]&0xFF)!=PT_SLTW && + (pmap[y][x]&0xFF)!=PT_BMTL && + (pmap[y][x]&0xFF)!=PT_RBDM && + (pmap[y][x]&0xFF)!=PT_LRBD && + (pmap[y][x]&0xFF)!=PT_ETRD && + (pmap[y][x]&0xFF)!=PT_BRMT && + (pmap[y][x]&0xFF)!=PT_NBLE && + (pmap[y][x]&0xFF)!=PT_INWR) return -1; parts[pmap[y][x]>>8].type = PT_SPRK; parts[pmap[y][x]>>8].life = 4; @@ -401,10 +406,10 @@ _inline int create_part(int p, int x, int y, int t) parts[i].life = 50; if(t==PT_COAL) { parts[i].life = 110; - parts[i].tmp = 50; - } - if(t==PT_BCOL) - parts[i].life = 110; + parts[i].tmp = 50; + } + if(t==PT_BCOL) + parts[i].life = 110; if(t==PT_FIRE) parts[i].life = rand()%50+120; if(t==PT_PLSM) @@ -494,7 +499,7 @@ _inline int create_part(int p, int x, int y, int t) #ifdef WIN32 _inline void delete_part(int x, int y) #else - inline void delete_part(int x, int y) +inline void delete_part(int x, int y) #endif { unsigned i; @@ -512,7 +517,7 @@ _inline void delete_part(int x, int y) #ifdef WIN32 _inline int is_wire(int x, int y) #else - inline int is_wire(int x, int y) +inline int is_wire(int x, int y) #endif { return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; @@ -521,7 +526,7 @@ _inline int is_wire(int x, int y) #ifdef WIN32 _inline int is_wire_off(int x, int y) #else - inline int is_wire_off(int x, int y) +inline int is_wire_off(int x, int y) #endif { return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; @@ -556,30 +561,30 @@ void set_emap(int x, int y) // fill children if(y>1 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) set_emap(x1, y-2); else if(y>0) for(x=x1; x<=x2; x++) if(is_wire_off(x, y-1)) { if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) set_emap(x, y-1); } if(y=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) { kill_part(i); continue; @@ -810,8 +815,8 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) { t = parts[i].type = PT_NONE; @@ -1089,7 +1094,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1122,20 +1127,20 @@ void update_particles_i(pixel *vid, int start, int inc) parts[i].life--; create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); } - if((pv[y/CELL][x/CELL] > 4.3f)&&parts[i].tmp>40) - parts[i].tmp=39; - else if(parts[i].tmp<40&&parts[i].tmp>0) - parts[i].tmp--; - else if(parts[i].tmp<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_BCOL); - goto killed; - } + if((pv[y/CELL][x/CELL] > 4.3f)&&parts[i].tmp>40) + parts[i].tmp=39; + else if(parts[i].tmp<40&&parts[i].tmp>0) + parts[i].tmp--; + else if(parts[i].tmp<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_BCOL); + goto killed; + } for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1143,12 +1148,12 @@ void update_particles_i(pixel *vid, int start, int inc) if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) { if(parts[i].life>100) { - parts[i].life = 99; + parts[i].life = 99; } } } } - else if(t==PT_BCOL) + else if(t==PT_BCOL) { if(parts[i].life<=0) { t = PT_NONE; @@ -1163,7 +1168,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1171,90 +1176,90 @@ void update_particles_i(pixel *vid, int start, int inc) if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) { if(parts[i].life>100) { - parts[i].life = 99; + parts[i].life = 99; } } } } - else if(t==PT_FUSE) - { - if(parts[i].life<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; - } else if (parts[i].life < 40) { - parts[i].life--; - if((rand()%100)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } - } - if((pv[y/CELL][x/CELL] > 2.7f)&&parts[i].tmp>40) - parts[i].tmp=39; - else if(parts[i].tmp<40&&parts[i].tmp>0) - parts[i].tmp--; - else if(parts[i].tmp<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_FSEP); - goto killed; - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || ((parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20))) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } - } - } - else if(t==PT_FSEP) - { - if(parts[i].life<=0) { - t = PT_NONE; - kill_part(i); - r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; - } else if (parts[i].life < 40) { - parts[i].life--; - if((rand()%10)==0) { - r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; - } - } - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) - { - if(parts[i].life>40) { - parts[i].life = 39; - } - } - } - } - else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx 2.7f)&&parts[i].tmp>40) + parts[i].tmp=39; + else if(parts[i].tmp<40&&parts[i].tmp>0) + parts[i].tmp--; + else if(parts[i].tmp<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_FSEP); + goto killed; + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || ((parts[i].temp>=(273.15+700.0f)) && 1>(rand()%20))) + { + if(parts[i].life>40) { + parts[i].life = 39; + } + } + } + } + else if(t==PT_FSEP) + { + if(parts[i].life<=0) { + t = PT_NONE; + kill_part(i); + r = create_part(-1, x, y, PT_PLSM); + parts[r].life = 50; + goto killed; + } else if (parts[i].life < 40) { + parts[i].life--; + if((rand()%10)==0) { + r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); + parts[r].life = 50; + } + } + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) + { + if(parts[i].life>40) { + parts[i].life = 39; + } + } + } + } + else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) continue; @@ -1262,14 +1267,14 @@ void update_particles_i(pixel *vid, int start, int inc) { parts[i].temp = 473.0f; } - } - } - else if(t==PT_PLNT) - { + } + } + else if(t==PT_PLNT) + { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1321,7 +1326,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1356,7 +1361,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1383,7 +1388,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1413,7 +1418,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1461,7 +1466,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1510,11 +1515,11 @@ void update_particles_i(pixel *vid, int start, int inc) if((r&0xFF)==PT_COAL && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && - (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| - ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| - ptypes[parts[r>>8].type-1].menusection==SC_GAS|| - ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) - parts[r>>8].type--;*/ + (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| + ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| + ptypes[parts[r>>8].type-1].menusection==SC_GAS|| + ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) + parts[r>>8].type--;*/ } } else if(t==PT_PHOT) @@ -1523,7 +1528,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=0; nx<1; nx++) for(ny=0; ny<1; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1734,7 +1739,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1756,7 +1761,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1785,7 +1790,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1794,8 +1799,8 @@ void update_particles_i(pixel *vid, int start, int inc) continue; rt = parts[r>>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); @@ -1809,7 +1814,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(legacy_enable) { if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && - ptypes[rt].meltable*lpv>(rand()%1000)) + ptypes[rt].meltable*lpv>(rand()%1000)) { if(t!=PT_LAVA || parts[i].life>0) { @@ -1881,7 +1886,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(pavg != PT_INSL) { if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)=373.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=373.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) { @@ -1893,7 +1898,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)>8].temp>373.0f))&&pavg != PT_INSL) { @@ -1903,7 +1908,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)>8].temp<373.0f))&&pavg != PT_INSL) { @@ -1913,7 +1918,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8)>8].life==0 && - (parts[i].life<2 || ((r>>8)>8)>8].type = PT_SPRK; parts[r>>8].life = 6; parts[r>>8].ctype = rt; } if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8)>8].type = PT_SPRK; parts[r>>8].life = 5; @@ -1964,7 +1969,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - killed: +killed: if(parts[i].type == PT_NONE) continue; } @@ -2040,7 +2045,7 @@ void update_particles_i(pixel *vid, int start, int inc) if (((int)(player[0])&0x01) == 0x01 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) { if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { @@ -2078,7 +2083,7 @@ void update_particles_i(pixel *vid, int start, int inc) if (((int)(player[0])&0x02) == 0x02 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) { if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { @@ -2366,11 +2371,11 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-1; nx<2; nx++) for(ny=-1; ny<2; ny++) if(x+nx>=0 && y+ny>0 && - x+nx=XRES-CELL || - ny=YRES-CELL) + ny=YRES-CELL) { parts[i].x = lx; parts[i].y = ly; @@ -2424,41 +2429,41 @@ void update_particles_i(pixel *vid, int start, int inc) continue; } - if(parts[i].type == PT_PHOT) { - rt = pmap[ny][nx] & 0xFF; + if(parts[i].type == PT_PHOT) { + rt = pmap[ny][nx] & 0xFF; - if(rt==PT_CLNE) { - lt = pmap[ny][nx] >> 8; - if(!parts[lt].ctype) - parts[lt].ctype = PT_PHOT; - } + if(rt==PT_CLNE) { + lt = pmap[ny][nx] >> 8; + if(!parts[lt].ctype) + parts[lt].ctype = PT_PHOT; + } - lt = pmap[y][x] & 0xFF; + lt = pmap[y][x] & 0xFF; - if((rt==PT_GLAS && lt!=PT_GLAS) || (rt!=PT_GLAS && lt==PT_GLAS)) { - if(!get_normal_interp(REFRACT|parts[i].type, x, y, parts[i].vx, parts[i].vy, &nrx, &nry)) { - kill_part(i); - continue; - } - nrx = -nrx; - nry = -nry; - if(rt!=PT_GLAS && lt==PT_GLAS) - nn = 2.0; - else - nn = 0.5; - ct1 = parts[i].vx*nrx + parts[i].vy*nry; - ct2 = 1.0f - (nn*nn)*(1.0f-(ct1*ct1)); - if(ct2 < 0.0f) { - parts[i].vx -= 2.0f*ct1*nrx; - parts[i].vy -= 2.0f*ct1*nry; - } else { - ct2 = sqrtf(ct2); - ct2 = ct2 - nn*ct1; - parts[i].vx = nn*parts[i].vx + ct2*nrx; - parts[i].vy = nn*parts[i].vy + ct2*nry; - } - } - } + if((rt==PT_GLAS && lt!=PT_GLAS) || (rt!=PT_GLAS && lt==PT_GLAS)) { + if(!get_normal_interp(REFRACT|parts[i].type, x, y, parts[i].vx, parts[i].vy, &nrx, &nry)) { + kill_part(i); + continue; + } + nrx = -nrx; + nry = -nry; + if(rt!=PT_GLAS && lt==PT_GLAS) + nn = 2.0; + else + nn = 0.5; + ct1 = parts[i].vx*nrx + parts[i].vy*nry; + ct2 = 1.0f - (nn*nn)*(1.0f-(ct1*ct1)); + if(ct2 < 0.0f) { + parts[i].vx -= 2.0f*ct1*nrx; + parts[i].vy -= 2.0f*ct1*nry; + } else { + ct2 = sqrtf(ct2); + ct2 = ct2 - nn*ct1; + parts[i].vx = nn*parts[i].vx + ct2*nrx; + parts[i].vy = nn*parts[i].vy + ct2*nry; + } + } + } rt = parts[i].flags & FLAG_STAGNANT; parts[i].flags &= ~FLAG_STAGNANT; @@ -2578,52 +2583,52 @@ void update_particles_i(pixel *vid, int start, int inc) kill_part(i); continue; } - else if(t==PT_NEUT || t==PT_PHOT) - { - if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { - dp = nrx*parts[i].vx + nry*parts[i].vy; - parts[i].vx -= 2.0f*dp*nrx; - parts[i].vy -= 2.0f*dp*nry; - nx = (int)(parts[i].x + parts[i].vx + 0.5f); - ny = (int)(parts[i].y + parts[i].vy + 0.5f); - if(try_move(i, x, y, nx, ny)) { - parts[i].x = (float)nx; - parts[i].y = (float)ny; - } else { - kill_part(i); - continue; - } - } else { - kill_part(i); - continue; - } - } + else if(t==PT_NEUT || t==PT_PHOT) + { + if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { + dp = nrx*parts[i].vx + nry*parts[i].vy; + parts[i].vx -= 2.0f*dp*nrx; + parts[i].vy -= 2.0f*dp*nry; + nx = (int)(parts[i].x + parts[i].vx + 0.5f); + ny = (int)(parts[i].y + parts[i].vy + 0.5f); + if(try_move(i, x, y, nx, ny)) { + parts[i].x = (float)nx; + parts[i].y = (float)ny; + } else { + kill_part(i); + continue; + } + } else { + kill_part(i); + continue; + } + } - else - { - if(nx>x+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(nyx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny=XRES-CELL || ny=YRES-CELL) { @@ -3282,8 +3287,8 @@ int create_parts(int x, int y, int r, int c) for(v=-1; v<2; v++) for(u=-1; u<2; u++) if(i+u>=0 && i+u=0 && j+v=0 && j+v Date: Sat, 2 Oct 2010 19:47:43 +0200 Subject: [PATCH 182/237] supposed fix for photon heat --- src/powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index 1943615bd..79c1bd4ee 100644 --- a/src/powder.c +++ b/src/powder.c @@ -73,7 +73,7 @@ int try_move(int i, int x, int y, int nx, int ny) if(!e) { if(!legacy_enable) { if((r >> 8) < PT_NUM) - | parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);; + parts[i].temp = parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP); } return 0; } From 769dbfeedddc774b177e2089eaa5abe870205e6b Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 2 Oct 2010 20:03:00 +0200 Subject: [PATCH 183/237] fixes to photons, thanks to skylark --- src/powder.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/powder.c b/src/powder.c index 79c1bd4ee..3ca1056f3 100644 --- a/src/powder.c +++ b/src/powder.c @@ -35,8 +35,11 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) r = (r&~0xFF) | parts[r>>8].type; if(rr) *rr = r; - - if(pt==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY||((r&0xFF)==PT_PCLN&&parts[r>>8].life > 5)))) + if(pt==PT_PHOT&&( + (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || + (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || + (r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || + ((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) return 2; if(pt==PT_STKM) //Stick man's head shouldn't collide @@ -73,7 +76,7 @@ int try_move(int i, int x, int y, int nx, int ny) if(!e) { if(!legacy_enable) { if((r >> 8) < PT_NUM) - parts[i].temp = parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP); + parts[i].temp = parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP); } return 0; } From 7692ee51fc38428e0fa894310b065752472ae8f1 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 2 Oct 2010 20:19:43 +0200 Subject: [PATCH 184/237] fixes, thanks to Mr. Stanislaw --- src/powder.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/powder.c b/src/powder.c index 3ca1056f3..c84d71ca0 100644 --- a/src/powder.c +++ b/src/powder.c @@ -74,11 +74,13 @@ int try_move(int i, int x, int y, int nx, int ny) e = eval_move(parts[i].type, nx, ny, &r); if(!e) { - if(!legacy_enable) { + if(!legacy_enable && parts[i].type==PT_PHOT) { if((r >> 8) < PT_NUM) - parts[i].temp = parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP); + parts[i].temp = parts[r>>8].temp = + restrict_flt((parts[r>>8].temp+parts[i].temp)/2, MIN_TEMP, MAX_TEMP); } return 0; + return 0; } if(e == 2) return 1; From d80f3e346b493c46855442609f1c3962af13be3a Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 2 Oct 2010 20:46:17 +0200 Subject: [PATCH 185/237] fixed temperature transfers, Skylark --- src/powder.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/powder.c b/src/powder.c index c84d71ca0..cdad9b09f 100644 --- a/src/powder.c +++ b/src/powder.c @@ -75,12 +75,11 @@ int try_move(int i, int x, int y, int nx, int ny) e = eval_move(parts[i].type, nx, ny, &r); if(!e) { if(!legacy_enable && parts[i].type==PT_PHOT) { - if((r >> 8) < PT_NUM) + if((r & 0xFF ) < PT_NUM) parts[i].temp = parts[r>>8].temp = restrict_flt((parts[r>>8].temp+parts[i].temp)/2, MIN_TEMP, MAX_TEMP); } return 0; - return 0; } if(e == 2) return 1; From 5591a7346cd11b2d45cb80e37526714741be5842 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 3 Oct 2010 14:56:30 +0100 Subject: [PATCH 186/237] Firework improvements and Fire changes --- includes/hmap.h | 9 +-- includes/misc.h | 2 +- src/graphics.c | 69 ++++++++++++++++--- src/powder.c | 178 +++++++++++++++++++++++++++++++++++++----------- 4 files changed, 206 insertions(+), 52 deletions(-) diff --git a/includes/hmap.h b/includes/hmap.h index 1af80132c..de18061be 100755 --- a/includes/hmap.h +++ b/includes/hmap.h @@ -26,8 +26,9 @@ //Hue Scale //static char color_data[] = {0xFF,0x00,0xFF,0xFE,0x00,0xFF,0xFC,0x00,0xFF,0xFB,0x00,0xFF,0xF9,0x00,0xFF,0xF8,0x00,0xFF,0xF6,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xEA,0x00,0xFF,0xE8,0x00,0xFF,0xE5,0x00,0xFF,0xE3,0x00,0xFF,0xE1,0x00,0xFF,0xDE,0x00,0xFF,0xDC,0x00,0xFF,0xD9,0x00,0xFF,0xD6,0x00,0xFF,0xD4,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCC,0x00,0xFF,0xC9,0x00,0xFF,0xC6,0x00,0xFF,0xC3,0x00,0xFF,0xC1,0x00,0xFF,0xBE,0x00,0xFF,0xBB,0x00,0xFF,0xB8,0x00,0xFF,0xB5,0x00,0xFF,0xB2,0x00,0xFF,0xAF,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA7,0x00,0xFF,0xA4,0x00,0xFF,0xA1,0x00,0xFF,0x9E,0x00,0xFF,0x9B,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x93,0x00,0xFF,0x90,0x00,0xFF,0x8D,0x00,0xFF,0x8A,0x00,0xFF,0x88,0x00,0xFF,0x85,0x00,0xFF,0x83,0x00,0xFF,0x80,0x00,0xFF,0x7E,0x00,0xFF,0x7B,0x00,0xFF,0x78,0x00,0xFF,0x76,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6E,0x00,0xFF,0x6B,0x00,0xFF,0x68,0x00,0xFF,0x65,0x00,0xFF,0x63,0x00,0xFF,0x60,0x00,0xFF,0x5D,0x00,0xFF,0x5A,0x00,0xFF,0x57,0x00,0xFF,0x54,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x49,0x00,0xFF,0x46,0x00,0xFF,0x43,0x00,0xFF,0x40,0x00,0xFF,0x3D,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x35,0x00,0xFF,0x32,0x00,0xFF,0x2F,0x00,0xFF,0x2C,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x25,0x00,0xFF,0x22,0x00,0xFF,0x20,0x00,0xFF,0x1D,0x00,0xFF,0x1B,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x14,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x0E,0x00,0xFF,0x0C,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x08,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x14,0xFF,0x00,0x16,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1D,0xFF,0x00,0x20,0xFF,0x00,0x22,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x32,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3D,0xFF,0x00,0x40,0xFF,0x00,0x43,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x57,0xFF,0x00,0x5A,0xFF,0x00,0x5D,0xFF,0x00,0x60,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6B,0xFF,0x00,0x6E,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x76,0xFF,0x00,0x79,0xFF,0x00,0x7B,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x86,0xFF,0x00,0x88,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x93,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9E,0xFF,0x00,0xA1,0xFF,0x00,0xA4,0xFF,0x00,0xA7,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB5,0xFF,0x00,0xB8,0xFF,0x00,0xBB,0xFF,0x00,0xBE,0xFF,0x00,0xC1,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xC9,0xFF,0x00,0xCC,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD4,0xFF,0x00,0xD7,0xFF,0x00,0xD9,0xFF,0x00,0xDC,0xFF,0x00,0xDF,0xFF,0x00,0xE1,0xFF,0x00,0xE3,0xFF,0x00,0xE6,0xFF,0x00,0xE8,0xFF,0x00,0xEA,0xFF,0x00,0xEC,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF4,0xFF,0x00,0xF6,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF4,0x00,0xFF,0xF2,0x00,0xFF,0xF0,0x00,0xFF,0xEE,0x00,0xFF,0xEC,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE5,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDE,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD1,0x00,0xFF,0xCE,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC3,0x00,0xFF,0xC0,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAC,0x00,0xFF,0xA9,0x00,0xFF,0xA6,0x00,0xFF,0xA3,0x00,0xFF,0xA0,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x98,0x00,0xFF,0x95,0x00,0xFF,0x92,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x8A,0x00,0xFF,0x87,0x00,0xFF,0x85,0x00,0xFF,0x82,0x00,0xFF,0x80,0x00,0xFF,0x7D,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x73,0x00,0xFF,0x70,0x00,0xFF,0x6D,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x65,0x00,0xFF,0x62,0x00,0xFF,0x5F,0x00,0xFF,0x5C,0x00,0xFF,0x59,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x51,0x00,0xFF,0x4E,0x00,0xFF,0x4B,0x00,0xFF,0x48,0x00,0xFF,0x45,0x00,0xFF,0x42,0x00,0xFF,0x3F,0x00,0xFF,0x3C,0x00,0xFF,0x3A,0x00,0xFF,0x37,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2C,0x00,0xFF,0x29,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1F,0x00,0xFF,0x1D,0x00,0xFF,0x1A,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x08,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x07,0xFF,0x00,0x09,0xFF,0x00,0x0A,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x10,0xFF,0x00,0x12,0xFF,0x00,0x15,0xFF,0x00,0x17,0xFF,0x00,0x19,0xFF,0x00,0x1B,0xFF,0x00,0x1E,0xFF,0x00,0x20,0xFF,0x00,0x23,0xFF,0x00,0x25,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2D,0xFF,0x00,0x30,0xFF,0x00,0x33,0xFF,0x00,0x35,0xFF,0x00,0x38,0xFF,0x00,0x3B,0xFF,0x00,0x3E,0xFF,0x00,0x41,0xFF,0x00,0x44,0xFF,0x00,0x46,0xFF,0x00,0x49,0xFF,0x00,0x4C,0xFF,0x00,0x4F,0xFF,0x00,0x52,0xFF,0x00,0x55,0xFF,0x00,0x58,0xFF,0x00,0x5B,0xFF,0x00,0x5E,0xFF,0x00,0x61,0xFF,0x00,0x63,0xFF,0x00,0x66,0xFF,0x00,0x69,0xFF,0x00,0x6C,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x74,0xFF,0x00,0x77,0xFF,0x00,0x79,0xFF,0x00,0x7C,0xFF,0x00,0x7F,0xFF,0x00,0x81,0xFF,0x00,0x84,0xFF,0x00,0x86,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x91,0xFF,0x00,0x94,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9C,0xFF,0x00,0x9F,0xFF,0x00,0xA2,0xFF,0x00,0xA5,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xB0,0xFF,0x00,0xB3,0xFF,0x00,0xB6,0xFF,0x00,0xB9,0xFF,0x00,0xBC,0xFF,0x00,0xBF,0xFF,0x00,0xC2,0xFF,0x00,0xC4,0xFF,0x00,0xC7,0xFF,0x00,0xCA,0xFF,0x00,0xCD,0xFF,0x00,0xCF,0xFF,0x00,0xD2,0xFF,0x00,0xD5,0xFF,0x00,0xD7,0xFF,0x00,0xDA,0xFF,0x00,0xDD,0xFF,0x00,0xDF,0xFF,0x00,0xE2,0xFF,0x00,0xE4,0xFF,0x00,0xE6,0xFF,0x00,0xE9,0xFF,0x00,0xEB,0xFF,0x00,0xED,0xFF,0x00,0xEF,0xFF,0x00,0xF1,0xFF,0x00,0xF3,0xFF,0x00,0xF5,0xFF,0x00,0xF7,0xFF,0x00,0xF8,0xFF,0x00,0xFA,0xFF,0x00,0xFB,0xFF,0x00,0xFD,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xFC,0x00,0xFF,0xFA,0x00,0xFF,0xF9,0x00,0xFF,0xF7,0x00,0xFF,0xF5,0x00,0xFF,0xF3,0x00,0xFF,0xF1,0x00,0xFF,0xEF,0x00,0xFF,0xED,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE7,0x00,0xFF,0xE4,0x00,0xFF,0xE2,0x00,0xFF,0xE0,0x00,0xFF,0xDD,0x00,0xFF,0xDB,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD3,0x00,0xFF,0xD0,0x00,0xFF,0xCD,0x00,0xFF,0xCB,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC2,0x00,0xFF,0xBF,0x00,0xFF,0xBD,0x00,0xFF,0xBA,0x00,0xFF,0xB7,0x00,0xFF,0xB4,0x00,0xFF,0xB1,0x00,0xFF,0xAE,0x00,0xFF,0xAB,0x00,0xFF,0xA8,0x00,0xFF,0xA5,0x00,0xFF,0xA2,0x00,0xFF,0x9F,0x00,0xFF,0x9D,0x00,0xFF,0x9A,0x00,0xFF,0x97,0x00,0xFF,0x94,0x00,0xFF,0x91,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x89,0x00,0xFF,0x87,0x00,0xFF,0x84,0x00,0xFF,0x81,0x00,0xFF,0x7F,0x00,0xFF,0x7C,0x00,0xFF,0x7A,0x00,0xFF,0x77,0x00,0xFF,0x75,0x00,0xFF,0x72,0x00,0xFF,0x6F,0x00,0xFF,0x6C,0x00,0xFF,0x6A,0x00,0xFF,0x67,0x00,0xFF,0x64,0x00,0xFF,0x61,0x00,0xFF,0x5E,0x00,0xFF,0x5B,0x00,0xFF,0x58,0x00,0xFF,0x56,0x00,0xFF,0x53,0x00,0xFF,0x50,0x00,0xFF,0x4D,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x44,0x00,0xFF,0x41,0x00,0xFF,0x3E,0x00,0xFF,0x3C,0x00,0xFF,0x39,0x00,0xFF,0x36,0x00,0xFF,0x33,0x00,0xFF,0x31,0x00,0xFF,0x2E,0x00,0xFF,0x2B,0x00,0xFF,0x29,0x00,0xFF,0x26,0x00,0xFF,0x23,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1C,0x00,0xFF,0x1A,0x00,0xFF,0x17,0x00,0xFF,0x15,0x00,0xFF,0x13,0x00,0xFF,0x11,0x00,0xFF,0x0F,0x00,0xFF,0x0D,0x00,0xFF,0x0B,0x00,0xFF,0x09,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x01,0x00}; //Scaled Hue Scale -static char color_data[] = {0xFF,0x00,0xFF,0xF1,0x00,0xFF,0xDE,0x00,0xFF,0xC7,0x00,0xFF,0xAF,0x00,0xFF,0x97,0x00,0xFF,0x82,0x00,0xFF,0x6C,0x00,0xFF,0x56,0x00,0xFF,0x41,0x00,0xFF,0x2E,0x00,0xFF,0x21,0x05,0xFF,0x16,0x0F,0xFF,0x0E,0x1B,0xFF,0x07,0x29,0xFF,0x02,0x39,0xFF,0x00,0x4B,0xFF,0x00,0x5E,0xFF,0x00,0x74,0xFF,0x00,0x8A,0xFF,0x00,0xA0,0xFF,0x00,0xAF,0xFF,0x00,0xB8,0xFE,0x00,0xC2,0xFD,0x00,0xCC,0xFD,0x00,0xD5,0xFC,0x00,0xDF,0xFA,0x00,0xE7,0xF9,0x00,0xEF,0xF6,0x00,0xF6,0xF3,0x00,0xFC,0xEE,0x00,0xFF,0xE8,0x00,0xFF,0xE1,0x00,0xFF,0xD8,0x00,0xFF,0xCE,0x00,0xFF,0xC4,0x00,0xFF,0xB9,0x00,0xFF,0xAD,0x00,0xFF,0xA1,0x00,0xFF,0x96,0x00,0xFF,0x8A,0x00,0xFF,0x80,0x00,0xFF,0x7C,0x00,0xFF,0x78,0x00,0xFF,0x75,0x00,0xFF,0x71,0x00,0xFF,0x6D,0x00,0xFF,0x69,0x00,0xFF,0x66,0x00,0xFF,0x62,0x00,0xFF,0x5E,0x00,0xFF,0x5A,0x00,0xFF,0x56,0x00,0xFF,0x52,0x00,0xFF,0x4E,0x00,0xFF,0x4A,0x00,0xFF,0x47,0x00,0xFF,0x43,0x00,0xFF,0x3F,0x00,0xFF,0x3B,0x00,0xFF,0x38,0x00,0xFF,0x34,0x00,0xFF,0x31,0x00,0xFF,0x2D,0x00,0xFF,0x2A,0x00,0xFF,0x27,0x00,0xFF,0x24,0x00,0xFF,0x21,0x00,0xFF,0x1E,0x00,0xFF,0x1B,0x00,0xFF,0x19,0x00,0xFF,0x17,0x01,0xFF,0x14,0x02,0xFF,0x13,0x04,0xFF,0x11,0x06,0xFF,0x0F,0x07,0xFF,0x0E,0x0A,0xFF,0x0C,0x0C,0xFF,0x0B,0x0E,0xFF,0x0A,0x10,0xFF,0x09,0x13,0xFF,0x08,0x16,0xFF,0x07,0x18,0xFF,0x06,0x1B,0xFF,0x06,0x1E,0xFF,0x05,0x21,0xFF,0x04,0x24,0xFF,0x04,0x27,0xFF,0x04,0x2A,0xFF,0x03,0x2D,0xFF,0x03,0x30,0xFF,0x03,0x34,0xFF,0x02,0x37,0xFF,0x02,0x3A,0xFF,0x02,0x3D,0xFF,0x02,0x41,0xFF,0x02,0x44,0xFF,0x01,0x47,0xFF,0x01,0x4A,0xFF,0x01,0x4E,0xFF,0x01,0x51,0xFF,0x00,0x54,0xFF,0x00,0x56,0xFF,0x00,0x58,0xFF,0x00,0x5A,0xFF,0x00,0x5C,0xFF,0x00,0x5E,0xFF,0x00,0x60,0xFF,0x00,0x62,0xFF,0x00,0x64,0xFF,0x00,0x66,0xFF,0x00,0x68,0xFF,0x00,0x6A,0xFF,0x00,0x6D,0xFF,0x00,0x6F,0xFF,0x00,0x71,0xFF,0x00,0x73,0xFF,0x00,0x75,0xFF,0x00,0x77,0xFF,0x00,0x7A,0xFF,0x00,0x7C,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x83,0xFF,0x00,0x85,0xFF,0x00,0x87,0xFF,0x00,0x89,0xFF,0x00,0x8B,0xFF,0x00,0x8E,0xFF,0x00,0x90,0xFF,0x00,0x92,0xFF,0x00,0x94,0xFF,0x00,0x97,0xFF,0x00,0x99,0xFF,0x00,0x9B,0xFF,0x00,0x9D,0xFF,0x00,0x9F,0xFF,0x00,0xA1,0xFF,0x00,0xA3,0xFF,0x00,0xA6,0xFF,0x00,0xA8,0xFF,0x00,0xAA,0xFF,0x00,0xAC,0xFF,0x00,0xAE,0xFF,0x00,0xB0,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB5,0xFF,0x00,0xB7,0xFF,0x00,0xB9,0xFF,0x00,0xBB,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xC0,0xFF,0x00,0xC1,0xFF,0x00,0xC2,0xFE,0x00,0xC3,0xFE,0x00,0xC4,0xFE,0x00,0xC6,0xFD,0x00,0xC7,0xFD,0x00,0xC8,0xFD,0x00,0xC9,0xFC,0x00,0xCA,0xFC,0x00,0xCB,0xFC,0x00,0xCC,0xFB,0x00,0xCE,0xFB,0x00,0xCF,0xFB,0x00,0xD0,0xFA,0x00,0xD1,0xFA,0x00,0xD2,0xF9,0x00,0xD3,0xF9,0x00,0xD4,0xF9,0x00,0xD5,0xF8,0x00,0xD6,0xF8,0x00,0xD7,0xF7,0x00,0xD8,0xF7,0x00,0xD9,0xF7,0x00,0xDA,0xF6,0x00,0xDC,0xF6,0x00,0xDD,0xF5,0x00,0xDE,0xF5,0x00,0xDF,0xF4,0x00,0xE0,0xF4,0x00,0xE1,0xF3,0x00,0xE2,0xF3,0x00,0xE2,0xF2,0x00,0xE3,0xF2,0x00,0xE4,0xF1,0x00,0xE5,0xF1,0x00,0xE6,0xF0,0x00,0xE7,0xF0,0x00,0xE8,0xEF,0x00,0xE9,0xEE,0x00,0xEA,0xEE,0x00,0xEB,0xED,0x00,0xEC,0xED,0x00,0xEC,0xEC,0x00,0xED,0xEB,0x00,0xEE,0xEB,0x00,0xEF,0xEA,0x00,0xF0,0xE9,0x00,0xF1,0xE9,0x00,0xF1,0xE8,0x00,0xF2,0xE7,0x00,0xF3,0xE6,0x00,0xF4,0xE6,0x00,0xF4,0xE5,0x00,0xF5,0xE4,0x00,0xF6,0xE3,0x00,0xF6,0xE3,0x00,0xF7,0xE2,0x00,0xF8,0xE1,0x00,0xF8,0xE0,0x00,0xF9,0xDF,0x00,0xFA,0xDE,0x00,0xFA,0xDD,0x00,0xFB,0xDD,0x00,0xFB,0xDC,0x00,0xFC,0xDB,0x00,0xFC,0xDA,0x00,0xFD,0xD9,0x00,0xFD,0xD8,0x00,0xFE,0xD7,0x00,0xFE,0xD6,0x00,0xFF,0xD5,0x00,0xFF,0xD4,0x00,0xFF,0xD3,0x00,0xFF,0xD3,0x00,0xFF,0xD2,0x00,0xFF,0xD1,0x00,0xFF,0xD1,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCE,0x00,0xFF,0xCE,0x00,0xFF,0xCD,0x00,0xFF,0xCC,0x00,0xFF,0xCB,0x00,0xFF,0xCB,0x00,0xFF,0xCA,0x00,0xFF,0xC9,0x00,0xFF,0xC8,0x00,0xFF,0xC7,0x00,0xFF,0xC7,0x00,0xFF,0xC6,0x00,0xFF,0xC5,0x00,0xFF,0xC4,0x00,0xFF,0xC3,0x00,0xFF,0xC2,0x00,0xFF,0xC1,0x00,0xFF,0xC1,0x00,0xFF,0xC0,0x00,0xFF,0xBF,0x00,0xFF,0xBE,0x00,0xFF,0xBD,0x00,0xFF,0xBC,0x00,0xFF,0xBB,0x00,0xFF,0xBA,0x00,0xFF,0xB9,0x00,0xFF,0xB8,0x00,0xFF,0xB8,0x00,0xFF,0xB7,0x00,0xFF,0xB6,0x00,0xFF,0xB5,0x00,0xFF,0xB4,0x00,0xFF,0xB3,0x00,0xFF,0xB2,0x00,0xFF,0xB1,0x00,0xFF,0xB0,0x00,0xFF,0xAF,0x00,0xFF,0xAE,0x00,0xFF,0xAD,0x00,0xFF,0xAC,0x00,0xFF,0xAB,0x00,0xFF,0xAA,0x00,0xFF,0xA9,0x00,0xFF,0xA8,0x00,0xFF,0xA7,0x00,0xFF,0xA6,0x00,0xFF,0xA5,0x00,0xFF,0xA4,0x00,0xFF,0xA3,0x00,0xFF,0xA2,0x00,0xFF,0xA1,0x00,0xFF,0xA0,0x00,0xFF,0x9F,0x00,0xFF,0x9E,0x00,0xFF,0x9D,0x00,0xFF,0x9C,0x00,0xFF,0x9B,0x00,0xFF,0x9A,0x00,0xFF,0x99,0x00,0xFF,0x98,0x00,0xFF,0x97,0x00,0xFF,0x96,0x00,0xFF,0x95,0x00,0xFF,0x94,0x00,0xFF,0x92,0x00,0xFF,0x91,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8E,0x00,0xFF,0x8D,0x00,0xFF,0x8C,0x00,0xFF,0x8B,0x00,0xFF,0x8A,0x00,0xFF,0x89,0x00,0xFF,0x88,0x00,0xFF,0x87,0x00,0xFF,0x86,0x00,0xFF,0x85,0x00,0xFF,0x84,0x00,0xFF,0x83,0x00,0xFF,0x82,0x00,0xFF,0x81,0x00,0xFF,0x80,0x00,0xFF,0x7F,0x00,0xFF,0x7E,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7B,0x00,0xFF,0x7A,0x00,0xFF,0x79,0x00,0xFF,0x78,0x00,0xFF,0x77,0x00,0xFF,0x76,0x00,0xFF,0x75,0x00,0xFF,0x74,0x00,0xFF,0x73,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x70,0x00,0xFF,0x6F,0x00,0xFF,0x6E,0x00,0xFF,0x6D,0x00,0xFF,0x6C,0x00,0xFF,0x6B,0x00,0xFF,0x6A,0x00,0xFF,0x6A,0x00,0xFF,0x69,0x00,0xFF,0x68,0x00,0xFF,0x68,0x00,0xFF,0x67,0x00,0xFF,0x66,0x00,0xFF,0x66,0x00,0xFF,0x65,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x63,0x00,0xFF,0x63,0x00,0xFF,0x62,0x00,0xFF,0x61,0x00,0xFF,0x61,0x00,0xFF,0x60,0x00,0xFF,0x5F,0x00,0xFF,0x5F,0x00,0xFF,0x5E,0x00,0xFF,0x5D,0x00,0xFF,0x5D,0x00,0xFF,0x5C,0x00,0xFF,0x5B,0x00,0xFF,0x5B,0x00,0xFF,0x5A,0x00,0xFF,0x59,0x00,0xFF,0x59,0x00,0xFF,0x58,0x00,0xFF,0x57,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x55,0x00,0xFF,0x54,0x00,0xFF,0x54,0x00,0xFF,0x53,0x00,0xFF,0x52,0x00,0xFF,0x52,0x00,0xFF,0x51,0x00,0xFF,0x50,0x00,0xFF,0x50,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4E,0x00,0xFF,0x4D,0x00,0xFF,0x4C,0x00,0xFF,0x4B,0x00,0xFF,0x4B,0x00,0xFF,0x4A,0x00,0xFF,0x49,0x00,0xFF,0x49,0x00,0xFF,0x48,0x00,0xFF,0x47,0x00,0xFF,0x46,0x00,0xFF,0x46,0x00,0xFF,0x45,0x00,0xFF,0x44,0x00,0xFF,0x44,0x00,0xFF,0x43,0x00,0xFF,0x42,0x00,0xFF,0x41,0x00,0xFF,0x41,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00,0xFF,0x3E,0x00,0xFF,0x3D,0x00,0xFF,0x3C,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x3A,0x00,0xFF,0x3A,0x00,0xFF,0x39,0x00,0xFF,0x38,0x00,0xFF,0x38,0x00,0xFF,0x37,0x00,0xFF,0x36,0x00,0xFF,0x35,0x00,0xFF,0x35,0x00,0xFF,0x34,0x00,0xFF,0x33,0x00,0xFF,0x33,0x00,0xFF,0x32,0x00,0xFF,0x31,0x00,0xFF,0x31,0x00,0xFF,0x30,0x00,0xFF,0x2F,0x00,0xFF,0x2E,0x00,0xFF,0x2E,0x00,0xFF,0x2D,0x00,0xFF,0x2C,0x00,0xFF,0x2C,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x2A,0x00,0xFF,0x29,0x00,0xFF,0x28,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x26,0x00,0xFF,0x26,0x00,0xFF,0x25,0x00,0xFF,0x24,0x00,0xFF,0x24,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x21,0x00,0xFF,0x20,0x00,0xFF,0x1F,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1D,0x00,0xFF,0x1D,0x00,0xFF,0x1C,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x17,0x00,0xFF,0x17,0x00,0xFF,0x16,0x00,0xFF,0x16,0x00,0xFF,0x15,0x00,0xFF,0x14,0x00,0xFF,0x14,0x00,0xFF,0x13,0x00,0xFF,0x13,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x11,0x00,0xFF,0x11,0x00,0xFF,0x10,0x00,0xFF,0x10,0x00,0xFF,0x0F,0x00,0xFF,0x0F,0x00,0xFF,0x0E,0x00,0xFF,0x0E,0x00,0xFF,0x0D,0x00,0xFF,0x0D,0x00,0xFF,0x0C,0x00,0xFF,0x0C,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x0A,0x00,0xFF,0x09,0x00,0xFF,0x09,0x00,0xFF,0x08,0x00,0xFF,0x08,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x05,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x02,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00}; -static char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; -static char hflm_data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04, 0x02, 0x03, 0x05, 0x03, 0x03, 0x07, 0x04, 0x04, 0x08, 0x04, 0x03, 0x09, 0x04, 0x04, 0x0B, 0x05, 0x04, 0x0C, 0x05, 0x05, 0x0D, 0x06, 0x05, 0x0E, 0x07, 0x06, 0x10, 0x07, 0x07, 0x11, 0x08, 0x07, 0x12, 0x09, 0x08, 0x14, 0x09, 0x08, 0x15, 0x0A, 0x09, 0x17, 0x0A, 0x09, 0x19, 0x0B, 0x0A, 0x1A, 0x0C, 0x0A, 0x1C, 0x0D, 0x0B, 0x1D, 0x0D, 0x0B, 0x1F, 0x0D, 0x0C, 0x22, 0x0F, 0x0D, 0x23, 0x0F, 0x0E, 0x25, 0x10, 0x0E, 0x26, 0x11, 0x0F, 0x28, 0x12, 0x10, 0x2A, 0x13, 0x10, 0x2C, 0x13, 0x11, 0x2E, 0x14, 0x12, 0x2F, 0x15, 0x12, 0x31, 0x15, 0x13, 0x33, 0x16, 0x14, 0x35, 0x17, 0x15, 0x36, 0x18, 0x15, 0x39, 0x19, 0x16, 0x3B, 0x19, 0x17, 0x3D, 0x1B, 0x17, 0x3E, 0x1B, 0x18, 0x40, 0x1C, 0x19, 0x42, 0x1D, 0x1A, 0x43, 0x1D, 0x1B, 0x45, 0x1E, 0x1C, 0x47, 0x1F, 0x1C, 0x49, 0x20, 0x1D, 0x4B, 0x21, 0x1F, 0x4C, 0x21, 0x1F, 0x4E, 0x22, 0x20, 0x50, 0x23, 0x21, 0x52, 0x23, 0x22, 0x53, 0x24, 0x23, 0x55, 0x25, 0x23, 0x56, 0x26, 0x24, 0x59, 0x26, 0x25, 0x5A, 0x27, 0x26, 0x5B, 0x28, 0x27, 0x5D, 0x28, 0x28, 0x5E, 0x29, 0x29, 0x60, 0x29, 0x2A, 0x62, 0x2A, 0x2B, 0x63, 0x2B, 0x2C, 0x64, 0x2C, 0x2E, 0x65, 0x2C, 0x2E, 0x66, 0x2C, 0x2F, 0x68, 0x2D, 0x31, 0x69, 0x2E, 0x32, 0x6A, 0x2F, 0x32, 0x6B, 0x2F, 0x34, 0x6C, 0x30, 0x34, 0x6D, 0x30, 0x35, 0x6F, 0x31, 0x37, 0x70, 0x31, 0x38, 0x71, 0x32, 0x39, 0x72, 0x33, 0x3B, 0x73, 0x33, 0x3C, 0x74, 0x34, 0x3D, 0x75, 0x35, 0x3E, 0x76, 0x35, 0x3F, 0x78, 0x36, 0x41, 0x78, 0x36, 0x42, 0x79, 0x36, 0x43, 0x7A, 0x37, 0x44, 0x7B, 0x37, 0x46, 0x7C, 0x38, 0x48, 0x7D, 0x39, 0x48, 0x7E, 0x3A, 0x49, 0x7F, 0x39, 0x4B, 0x80, 0x3A, 0x4C, 0x81, 0x3B, 0x4E, 0x82, 0x3C, 0x4F, 0x83, 0x3C, 0x51, 0x84, 0x3C, 0x52, 0x84, 0x3D, 0x54, 0x86, 0x3E, 0x55, 0x87, 0x3E, 0x56, 0x88, 0x3F, 0x57, 0x89, 0x40, 0x59, 0x8A, 0x40, 0x5A, 0x8A, 0x41, 0x5C, 0x8B, 0x41, 0x5D, 0x8C, 0x42, 0x5F, 0x8D, 0x41, 0x60, 0x8E, 0x42, 0x62, 0x8E, 0x42, 0x62, 0x8F, 0x44, 0x65, 0x90, 0x43, 0x65, 0x91, 0x45, 0x67, 0x91, 0x44, 0x69, 0x92, 0x45, 0x6A, 0x93, 0x46, 0x6B, 0x94, 0x46, 0x6C, 0x94, 0x46, 0x6E, 0x96, 0x47, 0x70, 0x96, 0x48, 0x70, 0x97, 0x48, 0x72, 0x98, 0x48, 0x73, 0x99, 0x49, 0x74, 0x99, 0x49, 0x76, 0x9A, 0x4A, 0x77, 0x9A, 0x4B, 0x78, 0x9B, 0x4B, 0x7A, 0x9C, 0x4B, 0x7B, 0x9D, 0x4B, 0x7C, 0x9E, 0x4C, 0x7D, 0x9F, 0x4C, 0x7E, 0x9F, 0x4D, 0x7F, 0xA0, 0x4E, 0x80, 0xA0, 0x4E, 0x82, 0xA1, 0x4E, 0x83, 0xA2, 0x4F, 0x84, 0xA3, 0x4F, 0x85, 0xA3, 0x4F, 0x86, 0xA4, 0x4F, 0x88, 0xA5, 0x50, 0x89, 0xA5, 0x50, 0x89, 0xA6, 0x51, 0x8B, 0xA6, 0x51, 0x8B, 0xA7, 0x51, 0x8D, 0xA8, 0x51, 0x8E, 0xA9, 0x52, 0x8F, 0xAA, 0x52, 0x90, 0xAA, 0x53, 0x92, 0xAB, 0x53, 0x92, 0xAB, 0x53, 0x93, 0xAC, 0x54, 0x95, 0xAD, 0x53, 0x95, 0xAE, 0x54, 0x96, 0xAE, 0x55, 0x98, 0xAE, 0x54, 0x98, 0xAF, 0x55, 0x9A, 0xB0, 0x56, 0x9B, 0xB0, 0x56, 0x9C, 0xB1, 0x56, 0x9D, 0xB1, 0x56, 0x9E, 0xB2, 0x56, 0xA0, 0xB3, 0x57, 0xA0, 0xB3, 0x57, 0xA1, 0xB3, 0x57, 0xA2, 0xB4, 0x58, 0xA3, 0xB4, 0x58, 0xA4, 0xB5, 0x57, 0xA5, 0xB6, 0x58, 0xA6, 0xB6, 0x58, 0xA7, 0xB7, 0x58, 0xA8, 0xB7, 0x59, 0xA9, 0xB8, 0x58, 0xAA, 0xB9, 0x5A, 0xAB, 0xB9, 0x59, 0xAC, 0xBA, 0x5A, 0xAD, 0xBA, 0x5A, 0xAE, 0xBB, 0x5A, 0xAF, 0xBB, 0x5A, 0xB0, 0xBC, 0x5B, 0xB0, 0xBC, 0x5A, 0xB1, 0xBD, 0x5B, 0xB2, 0xBD, 0x5B, 0xB3, 0xBD, 0x5B, 0xB4, 0xBE, 0x5C, 0xB5, 0xBE, 0x5B, 0xB5, 0xBE, 0x5B, 0xB7, 0xBF, 0x5C, 0xB7, 0xBF, 0x5C, 0xB8, 0xBF, 0x5C, 0xB9, 0xC0, 0x5C, 0xB9, 0xC0, 0x5C, 0xBA, 0xC0, 0x5C, 0xBA, 0xC1, 0x5D, 0xBB, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBC, 0xC2, 0x5D, 0xBD, 0xC2, 0x5E, 0xBE, 0xC3, 0x5E, 0xBE, 0xC3, 0x5E, 0xBF, 0xC3, 0x5E, 0xC0, 0xC3, 0x5E, 0xC0, 0xC4, 0x5E, 0xC1, 0xC4}; -static char firw_data[] = {0x86,0xC6,0xF8,0x8B,0xCC,0xFC,0x80,0xD9,0xF7,0x7B,0xE9,0xF5,0x7A,0xE3,0xF8,0x84,0xEE,0xF8,0x85,0xEB,0xEB,0x89,0xEB,0xF1,0x7B,0xEA,0xED,0x7F,0xEB,0xF2,0x84,0xF1,0xFF,0x87,0xFC,0xFF,0x8F,0xEE,0xFF,0x8C,0xED,0xFB,0x9E,0xF8,0xF5,0xA2,0xF2,0xF1,0xA1,0xF8,0xED,0x99,0xED,0xE8,0x99,0xED,0xEC,0x8E,0xE6,0xEB,0x93,0xE4,0xE5,0x90,0xE0,0xDE,0x90,0xE0,0xDB,0xA0,0xD2,0xDF,0x9A,0xCB,0xDB,0x9F,0xBD,0xE0,0x99,0xB8,0xE0,0xA5,0xBE,0xD9,0xAB,0xAF,0xD8,0xB0,0xB7,0xD9,0xB8,0xAA,0xD2,0xC6,0xA3,0xC3,0xC6,0xA7,0xC0,0xC2,0xB0,0xC0,0xC9,0xB3,0xBA,0xC9,0xB8,0xBC,0xE0,0xB1,0xBB,0xD8,0xAE,0xB9,0xD8,0xB5,0xAE,0xD9,0xAF,0xA9,0xDE,0xB7,0xB0,0xE7,0xB2,0xB0,0xE2,0xB8,0xA8,0xDB,0xB5,0xA8,0xDC,0xB9,0xA6,0xEA,0xC3,0xA2,0xEA,0xC1,0xA5,0xF9,0xB9,0x9B,0xFA,0xB1,0x95,0xFF,0xAA,0x81,0xFF,0xA0,0x81,0xFF,0x9F,0x86,0xFF,0x94,0x82,0xFF,0x91,0x86,0xFF,0x8E,0x8F,0xFF,0x82,0x8F,0xFF,0x86,0x93,0xFB,0x8F,0x92,0xF9,0x90,0x94,0xE8,0x83,0xA2,0xE4,0x7E,0x95,0xE6,0x71,0x8E,0xE2,0x6A,0x82,0xE9,0x62,0x72,0xEC,0x57,0x6F,0xF2,0x54,0x71,0xF4,0x48,0x78,0xF5,0x45,0x7C,0xEB,0x46,0x7A,0xF2,0x54,0x88,0xF9,0x59,0x8C,0xFF,0x58,0x84,0xFF,0x52,0x8A,0xFF,0x56,0x85,0xFF,0x54,0x84,0xFF,0x57,0x8E,0xFF,0x61,0x97,0xFF,0x51,0x9F,0xFF,0x54,0xA0,0xFF,0x50,0x9A,0xFF,0x53,0xA7,0xFF,0x59,0xA1,0xFF,0x5E,0xA3,0xFF,0x5C,0xAB,0xFF,0x63,0xA7,0xFF,0x5B,0xA5,0xFB,0x57,0xA6,0xFB,0x5C,0xAF,0xF7,0x57,0xB3,0xEB,0x58,0xB5,0xE4,0x47,0xBB,0xE7,0x4C,0xC9,0xD8,0x50,0xC5,0xD4,0x51,0xD0,0xC8,0x4E,0xD8,0xC6,0x4A,0xDC,0xC9,0x44,0xDB,0xB7,0x47,0xCF,0xB0,0x44,0xC7,0x9E,0x44,0xC3,0x9C,0x4A,0xC5,0x97,0x44,0xC8,0x8E,0x44,0xCD,0x81,0x44,0xC6,0x8A,0x44,0xC1,0x87,0x44,0xC8,0x8A,0x44,0xCE,0x90,0x44,0xC7,0x86,0x44,0xC5,0x8A,0x44,0xC9,0x7F,0x44,0xC7,0x82,0x44,0xBF,0x87,0x44,0xBA,0x8C,0x44,0xB7,0x86,0x44,0xAE,0x7C,0x46,0xA5,0x73,0x4A,0xA9,0x75,0x49,0xA5,0x7B,0x47,0xA1,0x73,0x44,0x9D,0x7C,0x44,0x92,0x7D,0x44,0x90,0x87,0x44,0x88,0x7F,0x44,0x93,0x76,0x44,0x9D,0x7A,0x44,0x9D,0x7C,0x44,0x9F,0x80,0x44,0xA7,0x7E,0x44,0x98,0x82,0x44,0x94,0x80,0x44,0x94,0x8E,0x46,0x92,0x85,0x44,0x95,0x7F,0x44,0x89,0x7B,0x49,0x95,0x77,0x57,0x9E,0x7A,0x58,0xA7,0x77,0x5D,0xB3,0x76,0x64,0xAE,0x71,0x6B,0xA5,0x78,0x7A,0xA5,0x76,0x7D,0x9C,0x85,0x7F,0xA0,0x89,0x7C,0x9B,0x92,0x77,0x8C,0x96,0x6A,0x97,0x96,0x77,0x93,0xA9,0x7F,0x92,0xAC,0x80,0x9A,0xAD,0x89,0xA1,0xAA,0x86,0xA8,0xAF,0x98,0xAC,0xAE,0x9F,0xAF,0xB6,0xA6,0xB9,0xB1,0xA8,0xAF,0xBA,0xB0,0xAB,0xBF,0xAA,0xAD,0xBB,0xAD,0xA6,0xC3,0xAC,0xA4,0xC0,0xB7,0xA5,0xCD,0xB9,0xA9,0xDD,0xB1,0xA9,0xE8,0xBF,0x9D,0xEC,0xB9,0x9A,0xF4,0xC9,0x9E,0xEE,0xD3,0x95,0xF4,0xD5,0x9C,0xF1,0xD1,0x9F,0xF1,0xD3,0x9A,0xF2,0xCD,0x8F,0xE4,0xD7,0x92,0xE8,0xD6,0x98,0xE8,0xCA,0x9D,0xE6,0xCE,0xA2,0xE0,0xC3,0xA2,0xDE,0xBE,0xA0,0xDB,0xB2,0x9C,0xED,0xB1,0xA1,0xEF,0xAA,0x9F,0xED,0x9B,0x9D,0xEE,0x8F,0x96,0xEB,0x95,0x9C,0xF3,0x95,0xA3,0xED,0x9A,0xAB,0xF0,0x92,0xB3,0xF1,0x85,0xBD,0xF5,0x89,0xC9,0xF3,0x81,0xC7,0xF6,0x81,0xC2,0xEF,0x87,0xC7,0xF3,0x8A,0xC2,0xF5,0x85,0xC3,0xE4,0x86,0xC5,0xE1,0x87,0xBE,0xD6,0x92,0xBC,0xD5,0x9D,0xB7,0xCE,0x9F,0xB7,0xCC,0xA0,0xAD,0xCD,0x9C,0x9B,0xCF,0x9D,0x93}; +static char color_data[] = {0x2B,0x00,0xFF,0x2B,0x00,0xFF,0x28,0x04,0xFF,0x24,0x08,0xFF,0x20,0x0D,0xFF,0x1C,0x12,0xFF,0x17,0x18,0xFF,0x12,0x1E,0xFF,0x0D,0x25,0xFF,0x07,0x2D,0xFF,0x03,0x35,0xFF,0x01,0x3E,0xFF,0x00,0x42,0xFF,0x00,0x44,0xFF,0x00,0x48,0xFF,0x00,0x4A,0xFF,0x00,0x4D,0xFF,0x00,0x51,0xFF,0x00,0x54,0xFF,0x00,0x58,0xFF,0x00,0x5C,0xFF,0x00,0x5E,0xFF,0x00,0x62,0xFF,0x00,0x66,0xFF,0x00,0x6A,0xFF,0x00,0x6D,0xFF,0x00,0x71,0xFF,0x00,0x75,0xFF,0x00,0x79,0xFF,0x00,0x7C,0xFF,0x00,0x7F,0xFF,0x00,0x83,0xFF,0x00,0x87,0xFF,0x00,0x8B,0xFF,0x00,0x8F,0xFF,0x00,0x92,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9C,0xFF,0x00,0xA0,0xFF,0x00,0xA3,0xFF,0x00,0xA7,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xAE,0xFE,0x00,0xB1,0xFE,0x00,0xB3,0xFE,0x00,0xB6,0xFE,0x00,0xB9,0xFE,0x00,0xBB,0xFD,0x00,0xBD,0xFD,0x00,0xC0,0xFD,0x00,0xC2,0xFD,0x00,0xC5,0xFD,0x00,0xC7,0xFD,0x00,0xC9,0xFD,0x00,0xCC,0xFC,0x00,0xCF,0xFD,0x00,0xD0,0xFC,0x00,0xD3,0xFC,0x00,0xD5,0xFC,0x00,0xD7,0xFB,0x00,0xDA,0xFB,0x00,0xDC,0xFB,0x00,0xDE,0xFB,0x00,0xE1,0xFA,0x00,0xE3,0xF9,0x00,0xE6,0xF9,0x00,0xE7,0xF9,0x00,0xEA,0xF8,0x00,0xEB,0xF7,0x00,0xED,0xF7,0x00,0xEF,0xF6,0x00,0xF1,0xF5,0x00,0xF2,0xF4,0x00,0xF5,0xF3,0x00,0xF6,0xF2,0x00,0xF7,0xF2,0x00,0xFA,0xF0,0x00,0xFA,0xEF,0x00,0xFC,0xEE,0x00,0xFD,0xEC,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE8,0x00,0xFF,0xE7,0x00,0xFF,0xE6,0x00,0xFF,0xE3,0x00,0xFF,0xE3,0x00,0xFF,0xE1,0x00,0xFF,0xDF,0x00,0xFF,0xDE,0x00,0xFF,0xDC,0x00,0xFF,0xDA,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD4,0x00,0xFF,0xD2,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCC,0x00,0xFF,0xCA,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC3,0x00,0xFF,0xC1,0x00,0xFF,0xBF,0x00,0xFF,0xBD,0x00,0xFF,0xBB,0x00,0xFF,0xB9,0x00,0xFF,0xB5,0x00,0xFF,0xB3,0x00,0xFF,0xB1,0x00,0xFF,0xAF,0x00,0xFF,0xAC,0x00,0xFF,0xAA,0x00,0xFF,0xA8,0x00,0xFF,0xA5,0x00,0xFF,0xA3,0x00,0xFF,0xA1,0x00,0xFF,0x9F,0x00,0xFF,0x9C,0x00,0xFF,0x99,0x00,0xFF,0x97,0x00,0xFF,0x95,0x00,0xFF,0x93,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x8A,0x00,0xFF,0x88,0x00,0xFF,0x86,0x00,0xFF,0x83,0x00,0xFF,0x81,0x00,0xFF,0x7F,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x76,0x00,0xFF,0x74,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x6F,0x00,0xFF,0x6D,0x00,0xFF,0x6A,0x00,0xFF,0x69,0x00,0xFF,0x67,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x61,0x00,0xFF,0x5F,0x00,0xFF,0x5D,0x00,0xFF,0x5B,0x00,0xFF,0x5A,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x54,0x00,0xFF,0x51,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4C,0x00,0xFF,0x4A,0x00,0xFF,0x48,0x00,0xFF,0x46,0x00,0xFF,0x45,0x00,0xFF,0x43,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x39,0x00,0xFF,0x37,0x00,0xFF,0x35,0x00,0xFF,0x33,0x00,0xFF,0x32,0x00,0xFF,0x30,0x00,0xFF,0x2F,0x00,0xFF,0x2D,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x25,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x16,0x01,0xFF,0x15,0x02,0xFF,0x14,0x02,0xFF,0x12,0x02,0xFF,0x12,0x03,0xFF,0x12,0x04,0xFF,0x10,0x05,0xFF,0x10,0x06,0xFF,0x0F,0x06,0xFF,0x0F,0x07,0xFF,0x0D,0x08,0xFF,0x0D,0x09,0xFF,0x0C,0x0A,0xFF,0x0C,0x0B,0xFF,0x0C,0x0C,0xFF,0x0B,0x0C,0xFF,0x0B,0x0E,0xFF,0x0A,0x0F,0xFF,0x09,0x10,0xFF,0x09,0x11,0xFF,0x08,0x12,0xFF,0x08,0x13,0xFF,0x08,0x14,0xFF,0x07,0x15,0xFF,0x07,0x16,0xFF,0x06,0x18,0xFF,0x06,0x19,0xFF,0x06,0x1A,0xFF,0x06,0x1C,0xFF,0x06,0x1D,0xFF,0x06,0x1E,0xFF,0x05,0x1F,0xFF,0x05,0x20,0xFF,0x05,0x21,0xFF,0x05,0x23,0xFF,0x04,0x24,0xFF,0x04,0x25,0xFF,0x04,0x26,0xFF,0x04,0x28,0xFF,0x03,0x29,0xFF,0x03,0x2B,0xFF,0x03,0x2B,0xFF,0x03,0x2D,0xFF,0x03,0x2E,0xFF,0x03,0x30,0xFF,0x03,0x31,0xFF,0x02,0x32,0xFF,0x03,0x34,0xFF,0x03,0x35,0xFF,0x02,0x37,0xFF,0x03,0x39,0xFF,0x02,0x3A,0xFF,0x02,0x3B,0xFF,0x01,0x3C,0xFF,0x01,0x3E,0xFF,0x01,0x3F,0xFF,0x01,0x40,0xFF,0x02,0x42,0xFF,0x02,0x44,0xFF,0x01,0x45,0xFF,0x01,0x46,0xFF,0x01,0x48,0xFF,0x01,0x49,0xFF,0x01,0x4A,0xFF,0x01,0x4C,0xFF,0x00,0x4E,0xFF,0x01,0x4E,0xFF,0x00,0x50,0xFF,0x01,0x52,0xFF,0x01,0x52,0xFF,0x00,0x54,0xFF,0x00,0x55,0xFF,0x00,0x56,0xFF,0x00,0x58,0xFF,0x00,0x58,0xFF,0x00,0x59,0xFF,0x00,0x5A,0xFF,0x00,0x5B,0xFF,0x00,0x5C,0xFF,0x00,0x5D,0xFF,0x00,0x5E,0xFF,0x00,0x5F,0xFF,0x00,0x60,0xFF,0x00,0x61,0xFF,0x00,0x62,0xFF,0x00,0x63,0xFF,0x00,0x64,0xFF,0x00,0x65,0xFF,0x00,0x66,0xFF,0x00,0x67,0xFF,0x00,0x69,0xFF,0x00,0x6A,0xFF,0x00,0x6A,0xFF,0x00,0x6B,0xFF,0x00,0x6C,0xFF,0x00,0x6E,0xFF,0x00,0x6F,0xFF,0x00,0x70,0xFF,0x00,0x71,0xFF,0x00,0x72,0xFF,0x00,0x73,0xFF,0x00,0x74,0xFF,0x00,0x75,0xFF,0x00,0x76,0xFF,0x00,0x77,0xFF,0x00,0x79,0xFF,0x00,0x7A,0xFF,0x00,0x7B,0xFF,0x00,0x7B,0xFF,0x00,0x7D,0xFF,0x00,0x7E,0xFF,0x00,0x7F,0xFF,0x00,0x80,0xFF,0x00,0x82,0xFF,0x00,0x83,0xFF,0x00,0x83,0xFF,0x00,0x84,0xFF,0x00,0x86,0xFF,0x00,0x87,0xFF,0x00,0x88,0xFF,0x00,0x89,0xFF,0x00,0x8A,0xFF,0x00,0x8C,0xFF,0x00,0x8D,0xFF,0x00,0x8E,0xFF,0x00,0x8F,0xFF,0x00,0x90,0xFF,0x00,0x92,0xFF,0x00,0x93,0xFF,0x00,0x93,0xFF,0x00,0x94,0xFF,0x00,0x96,0xFF,0x00,0x97,0xFF,0x00,0x98,0xFF,0x00,0x99,0xFF,0x00,0x9A,0xFF,0x00,0x9B,0xFF,0x00,0x9C,0xFF,0x00,0x9E,0xFF,0x00,0x9E,0xFF,0x00,0x9F,0xFF,0x00,0xA0,0xFF,0x00,0xA1,0xFF,0x00,0xA3,0xFF,0x00,0xA4,0xFF,0x00,0xA4,0xFF,0x00,0xA6,0xFF,0x00,0xA7,0xFF,0x00,0xA7,0xFF,0x00,0xA9,0xFF,0x00,0xAA,0xFF,0x00,0xAB,0xFF,0x00,0xAC,0xFF,0x00,0xAD,0xFF,0x00,0xAE,0xFF,0x00,0xAE,0xFF,0x00,0xB0,0xFF,0x00,0xB1,0xFF,0x00,0xB1,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB5,0xFF,0x00,0xB6,0xFF,0x00,0xB7,0xFF,0x00,0xB8,0xFF,0x00,0xB8,0xFF,0x00,0xBA,0xFF,0x00,0xBB,0xFF,0x00,0xBB,0xFF,0x00,0xBC,0xFF,0x00,0xBD,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xBF,0xFF,0x00,0xC0,0xFE,0x00,0xC1,0xFE,0x00,0xC2,0xFE,0x00,0xC2,0xFF,0x00,0xC3,0xFE,0x00,0xC4,0xFE,0x00,0xC5,0xFE,0x00,0xC6,0xFD,0x00,0xC7,0xFD,0x00,0xC8,0xFD,0x00,0xC8,0xFC,0x00,0xC9,0xFC,0x00,0xCA,0xFC,0x00,0xCB,0xFC,0x00,0xCC,0xFB,0x00,0xCC,0xFC,0x00,0xCD,0xFB,0x00,0xCE,0xFB,0x00,0xCF,0xFB,0x00,0xCF,0xFA,0x00,0xD0,0xFA,0x00,0xD1,0xFA,0x00,0xD1,0xFA,0x00,0xD3,0xF9,0x00,0xD3,0xFA,0x00,0xD4,0xF9,0x00,0xD5,0xF9,0x00,0xD5,0xF8,0x00,0xD6,0xF8,0x00,0xD7,0xF8,0x00,0xD8,0xF7,0x00,0xD9,0xF7,0x00,0xD9,0xF6,0x00,0xDA,0xF7,0x00,0xDB,0xF6,0x00,0xDC,0xF5,0x00,0xDC,0xF5,0x00,0xDD,0xF5,0x00,0xDD,0xF5,0x00,0xDE,0xF5,0x00,0xDF,0xF4,0x00,0xDF,0xF4,0x00,0xE0,0xF3,0x00,0xE1,0xF4,0x00,0xE2,0xF2,0x00,0xE2,0xF3,0x00,0xE3,0xF2,0x00,0xE3,0xF1,0x00,0xE4,0xF1,0x00,0xE5,0xF1,0x00,0xE6,0xF0,0x00,0xE6,0xF0,0x00,0xE7,0xF0,0x00,0xE7,0xEF,0x00,0xE8,0xEF,0x00,0xE9,0xEE,0x00,0xEA,0xEE,0x00,0xEA,0xEE,0x00,0xEB,0xED,0x00,0xEC,0xED,0x00,0xEC,0xED,0x00,0xED,0xEB,0x00,0xED,0xEC,0x00,0xED,0xEB,0x00,0xEE,0xEA,0x00,0xEF,0xEB,0x00,0xF0,0xE9,0x00,0xF0,0xEA,0x00,0xF1,0xE9,0x00,0xF1,0xE8,0x00,0xF2,0xE7,0x00,0xF2,0xE7,0x00,0xF3,0xE6,0x00,0xF3,0xE6,0x00,0xF4,0xE6,0x00,0xF4,0xE5,0x00,0xF5,0xE5,0x00,0xF6,0xE4,0x00,0xF5,0xE3,0x00,0xF7,0xE3,0x00,0xF6,0xE2,0x00,0xF8,0xE1,0x00,0xF8,0xE1,0x00,0xF8,0xE1,0x00,0xF9,0xDF,0x00,0xF9,0xDF,0x00,0xFA,0xDE,0x00,0xFA,0xDE,0x00,0xFA,0xDE,0x00,0xFA,0xDD,0x00,0xFB,0xDC,0x00,0xFC,0xDB,0x00,0xFC,0xDB,0x00,0xFD,0xDB,0x00,0xFD,0xDA,0x00,0xFD,0xD8,0x00,0xFD,0xD8,0x00,0xFE,0xD8,0x00,0xFE,0xD7,0x00,0xFF,0xD6,0x00,0xFE,0xD5,0x00,0xFF,0xD5,0x00,0xFF,0xD3,0x00,0xFF,0xD3,0x00,0xFF,0xD2,0x00,0xFF,0xD2,0x00,0xFF,0xD2,0x00,0xFF,0xD0,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCF,0x00,0xFF,0xCE,0x00,0xFF,0xCD,0x00,0xFF,0xCC,0x00,0xFF,0xCC,0x00,0xFF,0xCB,0x00,0xFF,0xCA,0x00,0xFF,0xC9,0x00,0xFF,0xC9,0x00,0xFF,0xC8,0x00,0xFF,0xC7,0x00,0xFF,0xC7,0x00,0xFF,0xC6,0x00,0xFF,0xC5,0x00,0xFF,0xC5,0x00,0xFF,0xC4,0x00,0xFF,0xC3,0x00,0xFF,0xC2,0x00,0xFF,0xC2,0x00,0xFF,0xC1,0x00,0xFF,0xC0,0x00,0xFF,0xBF,0x00,0xFF,0xBE,0x00,0xFF,0xBD,0x00,0xFF,0xBC,0x00,0xFF,0xBC,0x00,0xFF,0xBB,0x00,0xFF,0xBA,0x00,0xFF,0xB9,0x00,0xFF,0xB9,0x00,0xFF,0xB8,0x00,0xFF,0xB6,0x00,0xFF,0xB6,0x00,0xFF,0xB5,0x00,0xFF,0xB4,0x00,0xFF,0xB3,0x00,0xFF,0xB2,0x00,0xFF,0xB1,0x00,0xFF,0xB0,0x00,0xFF,0xB0,0x00,0xFF,0xAF,0x00,0xFF,0xAE,0x00,0xFF,0xAD,0x00,0xFF,0xAC,0x00,0xFF,0xAB,0x00,0xFF,0xAA,0x00,0xFF,0xA9,0x00,0xFF,0xA8,0x00,0xFF,0xA8,0x00,0xFF,0xA6,0x00,0xFF,0xA6,0x00,0xFF,0xA5,0x00,0xFF,0xA4,0x00,0xFF,0xA3,0x00,0xFF,0xA2,0x00,0xFF,0xA1,0x00,0xFF,0xA0,0x00,0xFF,0x9F,0x00,0xFF,0x9E,0x00,0xFF,0x9D,0x00,0xFF,0x9D,0x00,0xFF,0x9B,0x00,0xFF,0x9B,0x00,0xFF,0x99,0x00,0xFF,0x98,0x00,0xFF,0x98,0x00,0xFF,0x97,0x00,0xFF,0x95,0x00,0xFF,0x94,0x00,0xFF,0x93,0x00,0xFF,0x93,0x00,0xFF,0x92,0x00,0xFF,0x91,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8E,0x00,0xFF,0x8D,0x00,0xFF,0x8C,0x00,0xFF,0x8B,0x00,0xFF,0x8A,0x00,0xFF,0x89,0x00,0xFF,0x89,0x00,0xFF,0x88,0x00,0xFF,0x87,0x00,0xFF,0x86,0x00,0xFF,0x84,0x00,0xFF,0x84,0x00,0xFF,0x82,0x00,0xFF,0x82,0x00,0xFF,0x81,0x00,0xFF,0x80,0x00,0xFF,0x7F,0x00,0xFF,0x7E,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7B,0x00,0xFF,0x7B,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x78,0x00,0xFF,0x77,0x00,0xFF,0x76,0x00,0xFF,0x74,0x00,0xFF,0x74,0x00,0xFF,0x73,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x70,0x00,0xFF,0x70,0x00,0xFF,0x6E,0x00,0xFF,0x6D,0x00,0xFF,0x6C,0x00,0xFF,0x6C,0x00,0xFF,0x6B,0x00,0xFF,0x6A,0x00,0xFF,0x6A,0x00,0xFF,0x68,0x00,0xFF,0x67,0x00,0xFF,0x66,0x00,0xFF,0x66,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x64,0x00,0xFF,0x62,0x00,0xFF,0x62,0x00,0xFF,0x61,0x00,0xFF,0x60,0x00,0xFF,0x5F,0x00,0xFF,0x5E,0x00,0xFF,0x5D,0x00,0xFF,0x5D,0x00,0xFF,0x5C,0x00,0xFF,0x5A,0x00,0xFF,0x5A,0x00,0xFF,0x59,0x00,0xFF,0x58,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x55,0x00,0xFF,0x54,0x00,0xFF,0x54,0x00,0xFF,0x53,0x00,0xFF,0x52,0x00,0xFF,0x51,0x00,0xFF,0x50,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4D,0x00,0xFF,0x4D,0x00,0xFF,0x4C,0x00,0xFF,0x4A,0x00,0xFF,0x4A,0x00,0xFF,0x48,0x00,0xFF,0x47,0x00,0xFF,0x47,0x00,0xFF,0x45,0x00,0xFF,0x45,0x00,0xFF,0x44,0x00,0xFF,0x43,0x00,0xFF,0x43,0x00,0xFF,0x41,0x00,0xFF,0x40,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3E,0x00,0xFF,0x3C,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x3A,0x00,0xFF,0x38,0x00,0xFF,0x38,0x00,0xFF,0x37,0x00,0xFF,0x36,0x00,0xFF,0x35,0x00,0xFF,0x34,0x00,0xFF,0x34,0x00,0xFF,0x33,0x00,0xFF,0x31,0x00,0xFF,0x31,0x00,0xFF,0x2F,0x00,0xFF,0x2F,0x00,0xFF,0x2E,0x00,0xFF,0x2C,0x00,0xFF,0x2C,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x29,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x26,0x00,0xFF,0x26,0x00,0xFF,0x25,0x00,0xFF,0x25,0x00,0xFF,0x23,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x20,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1D,0x00,0xFF,0x1D,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x17,0x00,0xFF,0x16,0x00,0xFF,0x15,0x00,0xFF,0x15,0x00,0xFF,0x14,0x00,0xFF,0x14,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x10,0x00,0xFF,0x0F,0x00,0xFF,0x0E,0x00,0xFF,0x0E,0x00,0xFF,0x0D,0x00,0xFF,0x0C,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x09,0x00,0xFF,0x09,0x00,0xFF,0x08,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x03,0xFF,0x00,0x03,0xFF,0x00,0x03,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x05,0xFF,0x00,0x05,0xFF,0x00,0x06,0xFF,0x00,0x07,0xFF,0x00,0x06,0xFF,0x00,0x07,0xFF,0x00,0x08,0xFF,0x00,0x09,0xFF,0x00,0x09,0xFF,0x00,0x09,0xFF,0x00,0x0B,0xFF,0x00,0x0B,0xFF,0x00,0x0C,0xFF,0x00,0x0B,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x0D,0xFF,0x00,0x0E,0xFF,0x00,0x0F,0xFF,0x00,0x0F,0xFF,0x00,0x10,0xFF,0x00,0x11,0xFF,0x00,0x11,0xFF,0x00,0x12,0xFF,0x00,0x13,0xFF,0x00,0x14,0xFF,0x00,0x14,0xFF,0x00,0x15,0xFF,0x00,0x16,0xFF,0x00,0x16,0xFF,0x00,0x17,0xFF,0x00,0x17,0xFF,0x00,0x18,0xFF,0x00,0x19,0xFF,0x00,0x1A,0xFF,0x00,0x1A,0xFF,0x00,0x1B,0xFF,0x00,0x1C,0xFF,0x00,0x1D,0xFF,0x00,0x1E,0xFF,0x00,0x1E,0xFF,0x00,0x1F,0xFF,0x00,0x20,0xFF,0x00,0x21,0xFF,0x00,0x22,0xFF,0x00,0x22,0xFF,0x00,0x22,0xFF,0x00,0x24,0xFF,0x00,0x25,0xFF,0x00,0x26,0xFF,0x00,0x26,0xFF,0x00,0x27,0xFF,0x00,0x27,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2A,0xFF,0x00,0x2B,0xFF,0x00,0x2C,0xFF,0x00,0x2C,0xFF,0x00,0x2E,0xFF,0x00,0x2E,0xFF,0x00,0x2F,0xFF,0x00,0x30,0xFF,0x00,0x31,0xFF,0x00,0x31,0xFF,0x00,0x32,0xFF,0x00,0x33,0xFF,0x00,0x34,0xFF,0x00,0x35,0xFF,0x00,0x36,0xFF,0x00,0x37,0xFF,0x00,0x37,0xFF,0x00,0x39,0xFF,0x00,0x3A,0xFF,0x00,0x3A,0xFF,0x00,0x3B,0xFF,0x00,0x3C,0xFF,0x00,0x3D,0xFF,0x00,0x3E,0xFF,0x00,0x3E,0xFF,0x00,0x3F,0xFF,0x00,0x40,0xFF,0x00,0x41,0xFF,0x00,0x42,0xFF,0x00,0x43,0xFF,0x00,0x43,0xFF,0x00,0x45,0xFF,0x00,0x46,0xFF,0x00,0x46,0xFF,0x00,0x47,0xFF,0x00,0x48,0xFF,0x00,0x49,0xFF,0x00,0x4A,0xFF,0x00,0x4B,0xFF,0x00,0x4C,0xFF,0x00,0x4C,0xFF,0x00,0x4D,0xFF,0x00,0x4E,0xFF,0x00,0x4F,0xFF,0x00,0x50,0xFF,0x00,0x51,0xFF,0x00,0x51,0xFF,0x00,0x52,0xFF,0x00,0x53,0xFF,0x00,0x54,0xFF,0x00,0x54,0xFF,0x00,0x56,0xFF,0x00,0x56,0xFF,0x00,0x57,0xFF,0x00,0x59,0xFF,0x00,0x59,0xFF,0x00,0x5A,0xFF,0x00,0x5A,0xFF,0x00,0x5C,0xFF,0x00,0x5D,0xFF,0x00,0x5D,0xFF,0x00,0x5E,0xFF,0x00,0x5F,0xFF,0x00,0x60,0xFF,0x00,0x61,0xFF,0x00,0x61,0xFF,0x00,0x62,0xFF,0x00,0x63,0xFF,0x00,0x64,0xFF,0x00,0x64,0xFF,0x00,0x65,0xFF,0x00,0x66,0xFF,0x00,0x67,0xFF,0x00,0x67,0xFF,0x00,0x68,0xFF,0x00,0x69,0xFF,0x00,0x6A,0xFF,0x00,0x6B,0xFF,0x00,0x6B,0xFF,0x00,0x6C,0xFF,0x00,0x6C,0xFF,0x00,0x6D,0xFF,0x00,0x6E,0xFF,0x00,0x6F,0xFF,0x00,0x6F,0xFF,0x00,0x70,0xFF,0x00,0x71,0xFF,0x00,0x72,0xFF,0x00,0x72,0xFF,0x00,0x73,0xFF,0x00,0x74,0xFF,0x00,0x74,0xFF,0x00,0x75,0xFF,0x00,0x76,0xFF,0x00,0x77,0xFF,0x00,0x78,0xFF,0x00,0x78,0xFF,0x00,0x79,0xFF,0x00,0x7A,0xFF,0x00,0x7A,0xFF,0x00,0x7B,0xFF,0x00,0x7C,0xFF,0x00,0x7D,0xFF,0x00,0x7E,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x80,0xFF,0x00,0x81,0xFF,0x00,0x82,0xFF,0x00,0x82,0xFF,0x00,0x83,0xFF,0x00,0x84,0xFF,0x00,0x85,0xFF,0x00,0x85,0xFF,0x00,0x87,0xFF,0x00,0x87,0xFF,0x00,0x88,0xFF,0x00,0x89,0xFF,0x00,0x8A,0xFF,0x00,0x8A,0xFF,0x00,0x8B,0xFF,0x00,0x8C,0xFF,0x00,0x8D,0xFF,0x00,0x8E,0xFF,0x00,0x8F,0xFF,0x00,0x90,0xFF,0x00,0x90,0xFF,0x00,0x91,0xFF,0x00,0x92,0xFF,0x00,0x92,0xFF,0x00,0x94,0xFF,0x00,0x94,0xFF,0x00,0x95,0xFF,0x00,0x95,0xFF,0x00,0x97,0xFF,0x00,0x98,0xFF,0x00,0x98,0xFF,0x00,0x99,0xFF,0x00,0x9A,0xFF,0x00,0x9B,0xFF,0x00,0x9B,0xFF,0x00,0x9C,0xFF,0x00,0x9D,0xFF,0x00,0x9E,0xFF,0x00,0x9F,0xFF,0x00,0x9F,0xFF,0x00,0xA0,0xFF,0x00,0xA1,0xFF,0x00,0xA2,0xFF,0x00,0xA2,0xFF,0x00,0xA3,0xFF,0x00,0xA4,0xFF,0x00,0xA5,0xFF,0x00,0xA6,0xFF,0x00,0xA6,0xFF,0x00,0xA7,0xFF,0x00,0xA8,0xFF,0x00,0xA9,0xFF,0x00,0xAA,0xFF,0x00,0xAA,0xFF,0x00,0xAB,0xFF,0x00,0xAC,0xFF,0x00,0xAD,0xFF,0x00,0xAE,0xFF,0x00,0xAE,0xFF,0x00,0xAF,0xFF,0x00,0xB0,0xFF,0x00,0xB1,0xFF,0x00,0xB1,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB4,0xFF,0x00,0xB4,0xFF,0x00,0xB5,0xFF,0x00,0xB6,0xFF,0x00,0xB7,0xFF,0x00,0xB7,0xFF,0x00,0xB8,0xFF,0x00,0xB9,0xFF,0x00,0xB9,0xFF,0x00,0xBA,0xFF,0x00,0xBA,0xFF,0x00,0xBC,0xFF,0x00,0xBC,0xFF,0x00,0xBC,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xBE,0xFF,0x00,0xBF,0xFF,0x00,0xC0,0xFF,0x00,0xC1,0xFF,0x00,0xC1,0xFF,0x00,0xC1,0xFF,0x00,0xC2,0xFF,0x00,0xC2,0xFF,0x00,0xC4,0xFF,0x00,0xC4,0xFF,0x00,0xC5,0xFF,0x00,0xC5,0xFF,0x00,0xC6,0xFF,0x00,0xC7,0xFF,0x00,0xC7,0xFF,0x00,0xC7,0xFF,0x00,0xC8,0xFF,0x00,0xC9,0xFF,0x00,0xC9,0xFF,0x00,0xCA,0xFF,0x00,0xCA,0xFF,0x00,0xCB,0xFF,0x00,0xCC,0xFF,0x00,0xCC,0xFF,0x00,0xCC,0xFF,0x00,0xCD,0xFF,0x00,0xCD,0xFF,0x00,0xCE,0xFF,0x00,0xCE,0xFF,0x00,0xCF,0xFF,0x00,0xCF,0xFF,0x00,0xD0,0xFF,0x00,0xD0,0xFF,0x00,0xD1,0xFF,0x00,0xD1,0xFF,0x00,0xD1,0xFF,0x00,0xD2,0xFF,0x00,0xD2,0xFF,0x00,0xD3,0xFF,0x00,0xD3,0xFF,0x00,0xD4,0xFF,0x00,0xD3,0xFF,0x00,0xD4,0xFF,0x00,0xD4}; //1024 Pixels +static char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; //200 Pixels +static char hflm_data[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x01,0x01,0x02,0x02,0x01,0x04,0x02,0x01,0x04,0x02,0x03,0x05,0x03,0x03,0x07,0x04,0x04,0x08,0x04,0x03,0x09,0x04,0x04,0x0B,0x05,0x04,0x0C,0x05,0x05,0x0D,0x06,0x05,0x0E,0x07,0x06,0x10,0x07,0x07,0x11,0x08,0x07,0x12,0x09,0x08,0x14,0x09,0x08,0x15,0x0A,0x09,0x17,0x0A,0x09,0x19,0x0B,0x0A,0x1A,0x0C,0x0A,0x1C,0x0D,0x0B,0x1D,0x0D,0x0B,0x1F,0x0D,0x0C,0x22,0x0F,0x0D,0x23,0x0F,0x0E,0x25,0x10,0x0E,0x26,0x11,0x0F,0x28,0x12,0x10,0x2A,0x13,0x10,0x2C,0x13,0x11,0x2E,0x14,0x12,0x2F,0x15,0x12,0x31,0x15,0x13,0x33,0x16,0x14,0x35,0x17,0x15,0x36,0x18,0x15,0x39,0x19,0x16,0x3B,0x19,0x17,0x3D,0x1B,0x17,0x3E,0x1B,0x18,0x40,0x1C,0x19,0x42,0x1D,0x1A,0x43,0x1D,0x1B,0x45,0x1E,0x1C,0x47,0x1F,0x1C,0x49,0x20,0x1D,0x4B,0x21,0x1F,0x4C,0x21,0x1F,0x4E,0x22,0x20,0x50,0x23,0x21,0x52,0x23,0x22,0x53,0x24,0x23,0x55,0x25,0x23,0x56,0x26,0x24,0x59,0x26,0x25,0x5A,0x27,0x26,0x5B,0x28,0x27,0x5D,0x28,0x28,0x5E,0x29,0x29,0x60,0x29,0x2A,0x62,0x2A,0x2B,0x63,0x2B,0x2C,0x64,0x2C,0x2E,0x65,0x2C,0x2E,0x66,0x2C,0x2F,0x68,0x2D,0x31,0x69,0x2E,0x32,0x6A,0x2F,0x32,0x6B,0x2F,0x34,0x6C,0x30,0x34,0x6D,0x30,0x35,0x6F,0x31,0x37,0x70,0x31,0x38,0x71,0x32,0x39,0x72,0x33,0x3B,0x73,0x33,0x3C,0x74,0x34,0x3D,0x75,0x35,0x3E,0x76,0x35,0x3F,0x78,0x36,0x41,0x78,0x36,0x42,0x79,0x36,0x43,0x7A,0x37,0x44,0x7B,0x37,0x46,0x7C,0x38,0x48,0x7D,0x39,0x48,0x7E,0x3A,0x49,0x7F,0x39,0x4B,0x80,0x3A,0x4C,0x81,0x3B,0x4E,0x82,0x3C,0x4F,0x83,0x3C,0x51,0x84,0x3C,0x52,0x84,0x3D,0x54,0x86,0x3E,0x55,0x87,0x3E,0x56,0x88,0x3F,0x57,0x89,0x40,0x59,0x8A,0x40,0x5A,0x8A,0x41,0x5C,0x8B,0x41,0x5D,0x8C,0x42,0x5F,0x8D,0x41,0x60,0x8E,0x42,0x62,0x8E,0x42,0x62,0x8F,0x44,0x65,0x90,0x43,0x65,0x91,0x45,0x67,0x91,0x44,0x69,0x92,0x45,0x6A,0x93,0x46,0x6B,0x94,0x46,0x6C,0x94,0x46,0x6E,0x96,0x47,0x70,0x96,0x48,0x70,0x97,0x48,0x72,0x98,0x48,0x73,0x99,0x49,0x74,0x99,0x49,0x76,0x9A,0x4A,0x77,0x9A,0x4B,0x78,0x9B,0x4B,0x7A,0x9C,0x4B,0x7B,0x9D,0x4B,0x7C,0x9E,0x4C,0x7D,0x9F,0x4C,0x7E,0x9F,0x4D,0x7F,0xA0,0x4E,0x80,0xA0,0x4E,0x82,0xA1,0x4E,0x83,0xA2,0x4F,0x84,0xA3,0x4F,0x85,0xA3,0x4F,0x86,0xA4,0x4F,0x88,0xA5,0x50,0x89,0xA5,0x50,0x89,0xA6,0x51,0x8B,0xA6,0x51,0x8B,0xA7,0x51,0x8D,0xA8,0x51,0x8E,0xA9,0x52,0x8F,0xAA,0x52,0x90,0xAA,0x53,0x92,0xAB,0x53,0x92,0xAB,0x53,0x93,0xAC,0x54,0x95,0xAD,0x53,0x95,0xAE,0x54,0x96,0xAE,0x55,0x98,0xAE,0x54,0x98,0xAF,0x55,0x9A,0xB0,0x56,0x9B,0xB0,0x56,0x9C,0xB1,0x56,0x9D,0xB1,0x56,0x9E,0xB2,0x56,0xA0,0xB3,0x57,0xA0,0xB3,0x57,0xA1,0xB3,0x57,0xA2,0xB4,0x58,0xA3,0xB4,0x58,0xA4,0xB5,0x57,0xA5,0xB6,0x58,0xA6,0xB6,0x58,0xA7,0xB7,0x58,0xA8,0xB7,0x59,0xA9,0xB8,0x58,0xAA,0xB9,0x5A,0xAB,0xB9,0x59,0xAC,0xBA,0x5A,0xAD,0xBA,0x5A,0xAE,0xBB,0x5A,0xAF,0xBB,0x5A,0xB0,0xBC,0x5B,0xB0,0xBC,0x5A,0xB1,0xBD,0x5B,0xB2,0xBD,0x5B,0xB3,0xBD,0x5B,0xB4,0xBE,0x5C,0xB5,0xBE,0x5B,0xB5,0xBE,0x5B,0xB7,0xBF,0x5C,0xB7,0xBF,0x5C,0xB8,0xBF,0x5C,0xB9,0xC0,0x5C,0xB9,0xC0,0x5C,0xBA,0xC0,0x5C,0xBA,0xC1,0x5D,0xBB,0xC2,0x5D,0xBC,0xC2,0x5D,0xBC,0xC2,0x5D,0xBD,0xC2,0x5E,0xBE,0xC3,0x5E,0xBE,0xC3,0x5E,0xBF,0xC3,0x5E,0xC0,0xC3,0x5E,0xC0,0xC4,0x5E,0xC1,0xC4,}; //200 Pixels +static char flm_data[] = {0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x01,0x01,0x02,0x02,0x01,0x03,0x02,0x01,0x04,0x02,0x01,0x05,0x03,0x02,0x06,0x04,0x02,0x07,0x05,0x03,0x07,0x05,0x03,0x09,0x06,0x04,0x0A,0x06,0x05,0x0B,0x07,0x05,0x0C,0x08,0x06,0x0E,0x08,0x06,0x0E,0x09,0x07,0x0F,0x0A,0x07,0x11,0x0B,0x08,0x12,0x0C,0x09,0x13,0x0C,0x09,0x14,0x0D,0x09,0x16,0x0D,0x0A,0x18,0x0E,0x0B,0x19,0x10,0x0C,0x1B,0x11,0x0C,0x1C,0x11,0x0D,0x1D,0x12,0x0D,0x1F,0x13,0x0E,0x20,0x14,0x0E,0x22,0x15,0x0F,0x23,0x15,0x10,0x25,0x16,0x10,0x26,0x17,0x11,0x28,0x19,0x12,0x29,0x19,0x13,0x2B,0x1A,0x14,0x2C,0x1B,0x14,0x2E,0x1C,0x15,0x30,0x1D,0x16,0x31,0x1F,0x17,0x33,0x1F,0x17,0x35,0x21,0x18,0x36,0x22,0x19,0x38,0x22,0x19,0x39,0x24,0x1A,0x3B,0x25,0x1B,0x3D,0x26,0x1B,0x3F,0x27,0x1D,0x40,0x27,0x1D,0x42,0x29,0x1E,0x44,0x2A,0x1F,0x46,0x2C,0x1F,0x47,0x2D,0x20,0x49,0x2D,0x21,0x4B,0x2F,0x22,0x4C,0x30,0x23,0x4E,0x30,0x23,0x50,0x31,0x24,0x52,0x33,0x25,0x53,0x34,0x26,0x55,0x35,0x27,0x57,0x36,0x27,0x58,0x37,0x28,0x5A,0x38,0x29,0x5C,0x3A,0x2A,0x5D,0x3A,0x2A,0x5F,0x3C,0x2B,0x61,0x3D,0x2C,0x63,0x3E,0x2C,0x64,0x3F,0x2D,0x65,0x41,0x2F,0x67,0x41,0x2F,0x69,0x43,0x30,0x6A,0x43,0x30,0x6C,0x45,0x31,0x6E,0x46,0x32,0x6F,0x47,0x33,0x71,0x48,0x33,0x72,0x49,0x34,0x74,0x4A,0x35,0x76,0x4C,0x35,0x77,0x4D,0x36,0x79,0x4E,0x36,0x7A,0x4E,0x37,0x7B,0x50,0x39,0x7D,0x51,0x39,0x7E,0x51,0x39,0x7F,0x53,0x3A,0x80,0x54,0x3A,0x82,0x55,0x3B,0x83,0x56,0x3C,0x84,0x57,0x3C,0x85,0x58,0x3D,0x87,0x5A,0x3D,0x88,0x5B,0x3E,0x89,0x5B,0x3F,0x8A,0x5C,0x3F,0x8B,0x5E,0x3F,0x8C,0x5F,0x40,0x8D,0x5F,0x41,0x8E,0x60,0x41,0x90,0x61,0x41,0x90,0x63,0x42,0x92,0x63,0x43,0x92,0x64,0x43,0x93,0x65,0x43,0x94,0x66,0x44,0x95,0x67,0x45,0x96,0x68,0x44,0x97,0x69,0x45,0x97,0x6B,0x45,0x99,0x6B,0x46,0x99,0x6D,0x47,0x9A,0x6D,0x47,0x9B,0x6F,0x48,0x9C,0x70,0x48,0x9D,0x71,0x48,0x9D,0x72,0x48,0x9F,0x73,0x48,0x9E,0x74,0x4A,0xA0,0x76,0x49,0xA0,0x77,0x4A,0xA1,0x78,0x4A,0xA1,0x79,0x4B,0xA2,0x7A,0x4B,0xA3,0x7B,0x4B,0xA4,0x7C,0x4C,0xA5,0x7D,0x4D,0xA6,0x7F,0x4D,0xA6,0x80,0x4D,0xA7,0x81,0x4D,0xA7,0x81,0x4E,0xA8,0x83,0x4E,0xA9,0x84,0x4F,0xA9,0x85,0x4F,0xAA,0x86,0x4F,0xAA,0x87,0x4F,0xAB,0x89,0x50,0xAC,0x8A,0x50,0xAC,0x8B,0x50,0xAD,0x8C,0x51,0xAD,0x8D,0x51,0xAE,0x8E,0x52,0xAF,0x8F,0x52,0xB0,0x91,0x52,0xB0,0x92,0x52,0xB0,0x93,0x52,0xB1,0x94,0x53,0xB1,0x95,0x53,0xB1,0x96,0x53,0xB3,0x97,0x53,0xB3,0x99,0x54,0xB3,0x99,0x54,0xB4,0x9A,0x55,0xB4,0x9C,0x55,0xB4,0x9D,0x55,0xB5,0x9E,0x55,0xB6,0x9F,0x56,0xB6,0x9F,0x56,0xB7,0xA0,0x56,0xB7,0xA2,0x57,0xB7,0xA2,0x57,0xB7,0xA4,0x57,0xB8,0xA5,0x58,0xB9,0xA6,0x57,0xB9,0xA7,0x58,0xB9,0xA8,0x58,0xBA,0xA8,0x58,0xBA,0xAA,0x58,0xBA,0xAB,0x58,0xBB,0xAB,0x59,0xBB,0xAD,0x59,0xBB,0xAE,0x59,0xBC,0xAE,0x5A,0xBC,0xAF,0x5A,0xBD,0xB1,0x5A,0xBD,0xB1,0x5A,0xBE,0xB2,0x5A,0xBE,0xB3,0x5B,0xBE,0xB4,0x5B,0xBF,0xB5,0x5B,0xBE,0xB5,0x5B,0xBF,0xB6,0x5B,0xC0,0xB6,0x5B,0xC0,0xB7,0x5C,0xC0,0xB9,0x5C,0xC1,0xB9,0x5C,0xC1,0xB9,0x5C,0xC1,0xBA,0x5C,0xC2,0xBB,0x5C,0xC2,0xBC,0x5D,0xC1,0xBC,0x5D,0xC2,0xBD,0x5D,0xC3,0xBD,0x5D,0xC3,0xBE,0x5D,0xC3,0xBF,0x5E,0xC3,0xC0,0x5E,0xC3,0xC0,0x5E,0xC4,0xC0,0x5E,0xC4,0xC1,0x5E}; //200 Pixels +static char firw_data[] = {0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFC,0x00,0xFF,0xF8,0x00,0xFF,0xF3,0x00,0xFF,0xEE,0x00,0xFF,0xE9,0x00,0xFF,0xE4,0x00,0xFF,0xDD,0x00,0xFF,0xD8,0x00,0xFF,0xD2,0x00,0xFF,0xCB,0x00,0xFF,0xC4,0x00,0xFF,0xBD,0x00,0xFF,0xB5,0x00,0xFF,0xAD,0x00,0xFF,0xA6,0x00,0xFF,0x9E,0x00,0xFF,0x96,0x00,0xFF,0x8E,0x00,0xFF,0x87,0x00,0xFF,0x7E,0x00,0xFF,0x77,0x00,0xFF,0x6E,0x00,0xFF,0x66,0x00,0xFF,0x5E,0x00,0xFF,0x56,0x00,0xFF,0x4F,0x00,0xFF,0x47,0x00,0xFF,0x40,0x00,0xFF,0x39,0x00,0xFF,0x32,0x00,0xFF,0x2B,0x00,0xFF,0x25,0x00,0xFF,0x1E,0x00,0xFF,0x19,0x00,0xFF,0x14,0x00,0xFF,0x0F,0x00,0xFF,0x0A,0x00,0xFF,0x06,0x00,0xFF,0x01,0x00,0xFF,0x00,0x01,0xFF,0x00,0x05,0xFF,0x00,0x09,0xFF,0x00,0x0E,0xFF,0x00,0x13,0xFF,0x00,0x18,0xFF,0x00,0x1E,0xFF,0x00,0x24,0xFF,0x00,0x2A,0xFF,0x00,0x30,0xFF,0x00,0x37,0xFF,0x00,0x3E,0xFF,0x00,0x45,0xFF,0x00,0x4D,0xFF,0x00,0x55,0xFF,0x00,0x5C,0xFF,0x00,0x64,0xFF,0x00,0x6C,0xFF,0x00,0x74,0xFF,0x00,0x7C,0xFF,0x00,0x84,0xFF,0x00,0x8D,0xFF,0x00,0x95,0xFF,0x00,0x9D,0xFF,0x00,0xA4,0xFF,0x00,0xAC,0xFF,0x00,0xB3,0xFF,0x00,0xBB,0xFF,0x00,0xC2,0xFF,0x00,0xC9,0xFF,0x00,0xD0,0xFF,0x00,0xD7,0xFF,0x00,0xDD,0xFF,0x00,0xE3,0xFF,0x00,0xE9,0xFF,0x00,0xED,0xFF,0x00,0xF2,0xFF,0x00,0xF6,0xFF,0x00,0xFB,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFC,0x00,0xFF,0xF8,0x00,0xFF,0xF4,0x00,0xFF,0xF0,0x00,0xFF,0xEA,0x00,0xFF,0xE5,0x00,0xFF,0xDF,0x00,0xFF,0xD9,0x00,0xFF,0xD3,0x00,0xFF,0xCC,0x00,0xFF,0xC5,0x00,0xFF,0xBD,0x00,0xFF,0xB7,0x00,0xFF,0xAF,0x00,0xFF,0xA7,0x00,0xFF,0xA0,0x00,0xFF,0x97,0x00,0xFF,0x8F,0x00,0xFF,0x88,0x00,0xFF,0x80,0x00,0xFF,0x77,0x00,0xFF,0x6F,0x00,0xFF,0x68,0x00,0xFF,0x5F,0x00,0xFF,0x57,0x00,0xFF,0x50,0x00,0xFF,0x48,0x00,0xFF,0x41,0x00,0xFF,0x3A,0x00,0xFF,0x33,0x00,0xFF,0x2D,0x00,0xFF,0x26,0x00,0xFF,0x20,0x00,0xFF,0x1A,0x00,0xFF,0x15,0x00,0xFF,0x10,0x00,0xFF,0x0B,0x00,0xFF,0x07,0x00,0xFF,0x03,0x00,0xFF,0x00,0x04,0xFF,0x00,0x08,0xFF,0x00,0x0D,0xFF,0x00,0x11,0xFF,0x00,0x17,0xFF,0x00,0x1D,0xFF,0x00,0x23,0xFF,0x00,0x28,0xFF,0x00,0x2F,0xFF,0x00,0x36,0xFF,0x00,0x3D,0xFF,0x00,0x44,0xFF,0x00,0x4B,0xFF,0x00,0x53,0xFF,0x00,0x5A,0xFF,0x00,0x62,0xFF,0x00,0x6B,0xFF,0x00,0x72,0xFF,0x00,0x7B,0xFF,0x00,0x82,0xFF,0x00,0x8A,0xFF,0x00,0x92,0xFF,0x00,0x9A,0xFF,0x00,0xA3,0xFF,0x00,0xAA,0xFF,0x00,0xB1,0xFF,0x00,0xBA,0xFF,0x00,0xC1,0xFF,0x00,0xC8,0xFF,0x00,0xCF,0xFF,0x00,0xD5,0xFF,0x00,0xDB,0xFF,0x00,0xE1,0xFF,0x00,0xE7,0xFF,0x00,0xEC,0xFF,0x00,0xF1,0xFF,0x00,0xF6,0xFF,0x00,0xFA,0xFF,0x00,0xFE,0xFF,0x00,0xFF,0xFD,0x00,0xFF,0xF9,0x00,0xFF,0xF5,0x00,0xFF,0xF1,0x00,0xFF,0xEB,0x00,0xFF,0xE6,0x00,0xFF,0xE0,0x00,0xFF,0xDB,0x00,0xFF,0xD4,0x00,0xFF,0xCE,0x00,0xFF,0xC7,0x00,0xFF,0xBF,0x00,0xFF,0xB8,0x00,0xFF,0xB1,0x00,0xFF,0xA9,0x00,0xFF,0xA1,0x00,0xFF,0x99,0x00,0xFF,0x91,0x00,0xFF,0x89,0x00,0xFF,0x82,0x00,0xFF,0x79,0x00,0xFF,0x71,0x00,0xFF,0x6A,0x00,0xFF,0x61,0x00,0xFF,0x59,0x00,0xFF,0x52,0x00,0xFF,0x4A,0x00,0xFF,0x43,0x00,0xFF,0x3C,0x00,0xFF,0x34,0x00,0xFF,0x2E,0x00,0xFF,0x28,0x00,0xFF,0x22,0x00,0xFF,0x1B,0x00,0xFF,0x16,0x00,0xFF,0x10,0x00,0xFF,0x0C,0x00,0xFF,0x08,0x00,0xFF,0x04,0x00,0xFF,0x00,0x00,}; //200 Pixels #endif \ No newline at end of file diff --git a/includes/misc.h b/includes/misc.h index 139468776..9a92a712d 100644 --- a/includes/misc.h +++ b/includes/misc.h @@ -3,7 +3,7 @@ #include #include -#ifdef WIN32 +#if defined(WIN32) && !defined(__GNUC__) #define x86_cpuid(func,af,bf,cf,df) \ do {\ __asm mov eax, func\ diff --git a/src/graphics.c b/src/graphics.c index 08798dc1d..2c9a68649 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1417,10 +1417,23 @@ void draw_parts(pixel *vid) { if(cmode == 3||cmode==4 || cmode==6) { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; + cg = 0; + cb = 0; + cr = 0; + for(x=0; x<12; x++) { + cr += (parts[i].ctype >> (x+18)) & 1; + cb += (parts[i].ctype >> x) & 1; + } + for(x=0; x<14; x++) + cg += (parts[i].ctype >> (x+9)) & 1; + x = 624/(cr+cg+cb+1); + cr *= x; + cg *= x; + cb *= x; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr>255?255:cr,cg>255?255:cg,cb>255?255:cb); + cr >>= 4; + cg >>= 4; + cb >>= 4; x = nx/CELL; y = ny/CELL; cg += fire_g[y][x]; @@ -1828,9 +1841,9 @@ void draw_parts(pixel *vid) blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } - } else if(t==PT_FIRW&&parts[i].tmp==3) + } else if(t==PT_FIRW&&parts[i].tmp>=3) { - float ttemp = (float)parts[i].life; + float ttemp = (float)parts[i].tmp-4; int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); uint8 R = firw_data[caddress]; uint8 G = firw_data[caddress+1]; @@ -1870,7 +1883,45 @@ void draw_parts(pixel *vid) } else if(t==PT_FIRE && parts[i].life) { - if(cmode == 3||cmode==4 || cmode==6) + float ttemp = (float)parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = flm_data[caddress]; + uint8 G = flm_data[caddress+1]; + uint8 B = flm_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + // Older Code + /*if(cmode == 3||cmode==4 || cmode==6) { cr = parts[i].life / 4; cg = parts[i].life / 16; @@ -1907,7 +1958,7 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } + }*/ } else if(t==PT_LAVA && parts[i].life) { @@ -1976,7 +2027,7 @@ void draw_parts(pixel *vid) else { float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/1024) ) *3, 0.0f, (1024.0f*3)-3); uint8 R = color_data[caddress]; uint8 G = color_data[caddress+1]; uint8 B = color_data[caddress+2]; diff --git a/src/powder.c b/src/powder.c index cdad9b09f..0bccf8f64 100644 --- a/src/powder.c +++ b/src/powder.c @@ -35,6 +35,13 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) r = (r&~0xFF) | parts[r>>8].type; if(rr) *rr = r; + + if((r&0xFF)==PT_VOID || (r&0xFF)==PT_BHOL) + return 1; + + if(pt==PT_NEUT && (r&0xFF)==PT_GLAS) + return 2; + if(pt==PT_PHOT&&( (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || @@ -65,6 +72,9 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) return 2; return 1; } + +static void create_cherenkov_photon(int pp); + int try_move(int i, int x, int y, int nx, int ny) { unsigned r, e; @@ -81,16 +91,13 @@ int try_move(int i, int x, int y, int nx, int ny) } return 0; } - if(e == 2) + if(e == 2) { + if(parts[i].type == PT_NEUT && (r&0xFF)==PT_GLAS) { + if(rand() < RAND_MAX/10) + create_cherenkov_photon(i); + } return 1; - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - return 1; - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - return 0; - - if(r && (r>>8)>8) wM) + wM = i; + } + + if(wM-w0 < 5) + return (wM+w0)/2; + + i = rand() % (wM-w0-3); + i += w0; + + *wm &= 0x1F << i; + return i + 2; +} + void set_emap(int x, int y) { int x1, x2; @@ -1692,7 +1762,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR) { parts[i].tmp = 1; - parts[i].life = rand()%50+120; + parts[i].life = rand()%50+60; } } } @@ -1700,7 +1770,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(parts[i].life==0) { parts[i].tmp=2; } else { - float newVel = parts[i].life/50; + float newVel = parts[i].life/25; parts[i].flags = parts[i].flags&0xFFFFFFFE; if((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE) { parts[i].vy = -newVel; @@ -1710,6 +1780,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } else if(parts[i].tmp==2) { + int col = rand()%200+4; for(nx=-2; nx<3; nx++) { for(ny=-2; ny<3; ny++) { if(x+nx>=0 && y+ny>0 && x+nx>8].type==PT_FIRW) { parts[r>>8].vx = (rand()%3-1)*tmul; parts[r>>8].vy = (rand()%3-1)*tmul; - parts[r>>8].tmp = 3; + parts[r>>8].tmp = col; parts[r>>8].life = rand()%100+100; parts[r>>8].temp = 6000.0f; } @@ -1731,7 +1802,7 @@ void update_particles_i(pixel *vid, int start, int inc) } pv[y/CELL][x/CELL] += 20; kill_part(i); - } else if(parts[i].tmp==3) { + } else if(parts[i].tmp>=3) { if(parts[i].life<=0) { kill_part(i); } @@ -2444,17 +2515,25 @@ killed: lt = pmap[y][x] & 0xFF; - if((rt==PT_GLAS && lt!=PT_GLAS) || (rt!=PT_GLAS && lt==PT_GLAS)) { + r = eval_move(PT_PHOT, nx, ny, NULL); + + if(((rt==PT_GLAS && lt!=PT_GLAS) || (rt!=PT_GLAS && lt==PT_GLAS)) && r) { if(!get_normal_interp(REFRACT|parts[i].type, x, y, parts[i].vx, parts[i].vy, &nrx, &nry)) { kill_part(i); continue; } + + r = get_wavelength_bin(&parts[i].ctype); + if(r == -1) { + kill_part(i); + continue; + } + nn = 2.3f - 0.02f*r; + nrx = -nrx; nry = -nry; - if(rt!=PT_GLAS && lt==PT_GLAS) - nn = 2.0; - else - nn = 0.5; + if(rt==PT_GLAS && lt!=PT_GLAS) + nn = 1.0f/nn; ct1 = parts[i].vx*nrx + parts[i].vy*nry; ct2 = 1.0f - (nn*nn)*(1.0f-(ct1*ct1)); if(ct2 < 0.0f) { @@ -2589,6 +2668,27 @@ killed: } else if(t==PT_NEUT || t==PT_PHOT) { + r = pmap[ny][nx]; + + /* this should be replaced with a particle type attribute ("photwl" or something) */ + if((r & 0xFF) == PT_COAL) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_PLEX) parts[i].ctype &= 0x1F00003E; + if((r & 0xFF) == PT_NITR) parts[i].ctype &= 0x0007C000; + if((r & 0xFF) == PT_NBLE) parts[i].ctype &= 0x3FFF8000; + if((r & 0xFF) == PT_LAVA) parts[i].ctype &= 0x3FF00000; + if((r & 0xFF) == PT_ACID) parts[i].ctype &= 0x1FE001FE; + if((r & 0xFF) == PT_DUST) parts[i].ctype &= 0x3FFFFFC0; + if((r & 0xFF) == PT_SNOW) parts[i].ctype &= 0x03FFFFFF; + if((r & 0xFF) == PT_GOO) parts[i].ctype &= 0x3FFAAA00; + if((r & 0xFF) == PT_PLNT) parts[i].ctype &= 0x0007C000; + if((r & 0xFF) == PT_PLUT) parts[i].ctype &= 0x001FCE00; + if((r & 0xFF) == PT_URAN) parts[i].ctype &= 0x003FC000; + + if(!parts[i].ctype) { + kill_part(i); + continue; + } + if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { dp = nrx*parts[i].vx + nry*parts[i].vy; parts[i].vx -= 2.0f*dp*nrx; @@ -2666,8 +2766,10 @@ void update_particles(pixel *vid) t = parts[i].type; x = (int)(parts[i].x+0.5f); y = (int)(parts[i].y+0.5f); - if(x>=0 && y>=0 && x=0 && y>=0 && x Date: Sun, 3 Oct 2010 16:19:03 +0100 Subject: [PATCH 187/237] Dispersion fix, Skylark --- src/powder.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/powder.c b/src/powder.c index 0bccf8f64..03316c9db 100644 --- a/src/powder.c +++ b/src/powder.c @@ -144,6 +144,11 @@ int try_move(int i, int x, int y, int nx, int ny) #define REFRACT 0x80000000 +/* heavy flint glass, for awesome refraction/dispersion + this way you can make roof prisms easily */ +#define GLASS_IOR 1.9 +#define GLASS_DISP 0.07 + static unsigned direction_to_map(float dx, float dy) { return (dx >= 0) | @@ -207,13 +212,6 @@ static int find_next_boundary(int pt, int *x, int *y, int dm, int *em) return 0; } -static int vec_colinear(float nx, float ny, float vx, float vy) -{ - float d = 1.0f/hypot(vx, vy); - d *= nx*vx + ny*vy; - return (d >= 0.99) || (d <= -0.99); -} - int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny) { int ldm, rdm, lm, rm; @@ -257,9 +255,6 @@ int get_normal(int pt, int x, int y, float dx, float dy, float *nx, float *ny) *nx = ey * r; *ny = -ex * r; - if(vec_colinear(*ny, -*nx, dx, dy)) - return 0; - return 1; } @@ -505,7 +500,7 @@ inline int create_part(int p, int x, int y, int t) static void create_cherenkov_photon(int pp) { int i, lr, nx, ny; - float r; + float r, eff_ior; if(pfree == -1) return; @@ -528,7 +523,7 @@ static void create_cherenkov_photon(int pp) parts[i].life = 680; parts[i].x = parts[pp].x; parts[i].y = parts[pp].y; - parts[i].temp = parts[pp].temp; + parts[i].temp = parts[pmap[ny][nx] >> 8].temp; parts[i].tmp = 0; if(lr) { @@ -540,7 +535,7 @@ static void create_cherenkov_photon(int pp) } /* photons have speed of light. no discussion. */ - r = 1.44f / hypotf(parts[i].vx, parts[i].vy); + r = 1.269 / hypotf(parts[i].vx, parts[i].vy); parts[i].vx *= r; parts[i].vy *= r; } @@ -2528,7 +2523,8 @@ killed: kill_part(i); continue; } - nn = 2.3f - 0.02f*r; + nn = GLASS_IOR - GLASS_DISP*(r-15)/15.0f; + nn *= nn; nrx = -nrx; nry = -nry; @@ -2539,6 +2535,10 @@ killed: if(ct2 < 0.0f) { parts[i].vx -= 2.0f*ct1*nrx; parts[i].vy -= 2.0f*ct1*nry; + parts[i].x = lx; + parts[i].y = ly; + nx = (int)(lx + 0.5f); + ny = (int)(ly + 0.5f); } else { ct2 = sqrtf(ct2); ct2 = ct2 - nn*ct1; From 83c752119340947992a90bd628a52ba597be5e5f Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 3 Oct 2010 18:26:20 +0100 Subject: [PATCH 188/237] Photoelectrics - Skylark --- src/powder.c | 51 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/src/powder.c b/src/powder.c index 03316c9db..d8fa1fb15 100644 --- a/src/powder.c +++ b/src/powder.c @@ -22,11 +22,38 @@ int pfree; unsigned pmap[YRES][XRES]; unsigned cb_pmap[YRES][XRES]; +static int pn_junction_sprk(int x, int y, int pt) +{ + unsigned r = pmap[y][x]; + if((r & 0xFF) != pt) + return 0; + r >>= 8; + if(parts[r].type != pt) + return 0; + + parts[r].ctype = pt; + parts[r].type = PT_SPRK; + parts[r].life = 4; + return 1; +} + +static void photoelectric_effect(int nx, int ny) +{ + unsigned r = pmap[ny][nx]; + + if((r&0xFF) == PT_PSCN) { + if((pmap[ny][nx-1] & 0xFF) == PT_NSCN || + (pmap[ny][nx+1] & 0xFF) == PT_NSCN || + (pmap[ny-1][nx] & 0xFF) == PT_NSCN || + (pmap[ny+1][nx] & 0xFF) == PT_NSCN) + pn_junction_sprk(nx, ny, PT_PSCN); + } +} + static int eval_move(int pt, int nx, int ny, unsigned *rr) { unsigned r; - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) return 0; @@ -85,7 +112,9 @@ int try_move(int i, int x, int y, int nx, int ny) e = eval_move(parts[i].type, nx, ny, &r); if(!e) { if(!legacy_enable && parts[i].type==PT_PHOT) { - if((r & 0xFF ) < PT_NUM) + if((r & 0xFF) == PT_COAL || (r & 0xFF) == PT_BCOL) + parts[r>>8].temp = parts[i].temp; + if((r & 0xFF) < PT_NUM) parts[i].temp = parts[r>>8].temp = restrict_flt((parts[r>>8].temp+parts[i].temp)/2, MIN_TEMP, MAX_TEMP); } @@ -171,7 +200,7 @@ static int is_blocking(int t, int x, int y) return 0; } - return eval_move(t, x, y, NULL); + return !eval_move(t, x, y, NULL); } static int is_boundary(int pt, int x, int y) @@ -276,6 +305,9 @@ int get_normal_interp(int pt, float x0, float y0, float dx, float dy, float *nx, if(i >= NORMAL_INTERP) return 0; + if(pt == PT_PHOT) + photoelectric_effect(x, y); + return get_normal(pt, x, y, dx, dy, nx, ny); } @@ -2671,7 +2703,10 @@ killed: r = pmap[ny][nx]; /* this should be replaced with a particle type attribute ("photwl" or something) */ + if((r & 0xFF) == PT_PSCN) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_NSCN) parts[i].ctype = 0x00000000; if((r & 0xFF) == PT_COAL) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_BCOL) parts[i].ctype = 0x00000000; if((r & 0xFF) == PT_PLEX) parts[i].ctype &= 0x1F00003E; if((r & 0xFF) == PT_NITR) parts[i].ctype &= 0x0007C000; if((r & 0xFF) == PT_NBLE) parts[i].ctype &= 0x3FFF8000; @@ -2684,11 +2719,6 @@ killed: if((r & 0xFF) == PT_PLUT) parts[i].ctype &= 0x001FCE00; if((r & 0xFF) == PT_URAN) parts[i].ctype &= 0x003FC000; - if(!parts[i].ctype) { - kill_part(i); - continue; - } - if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { dp = nrx*parts[i].vx + nry*parts[i].vy; parts[i].vx -= 2.0f*dp*nrx; @@ -2706,6 +2736,11 @@ killed: kill_part(i); continue; } + + if(!parts[i].ctype) { + kill_part(i); + continue; + } } else From f2fbd1728fa90a4e42e1f5e4f12de4a16a52b9d1 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 4 Oct 2010 10:52:27 +0100 Subject: [PATCH 189/237] fixes saves for photons & makes GLOW a laser gain medium - Skylark --- src/main.c | 11 +++++- src/powder.c | 102 ++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 94 insertions(+), 19 deletions(-) diff --git a/src/main.c b/src/main.c index d88b9726b..f7ffec97b 100755 --- a/src/main.c +++ b/src/main.c @@ -270,8 +270,11 @@ void *build_save(int *size, int x0, int y0, int w, int h) { x = (int)(parts[i].x+0.5f); y = (int)(parts[i].y+0.5f); - if(x>=x0 && x=y0 && y=x0 && x=y0 && y>8; parts[k].type = j; + if(j == PT_PHOT) + parts[k].ctype = 0x3fffffff; parts[k].x = (float)x; parts[k].y = (float)y; m[(x-x0)+(y-y0)*w] = k+1; @@ -519,6 +524,8 @@ int parse_save(void *save, int size, int replace, int x0, int y0) else if(i < nf) { parts[fp[i]].type = j; + if(j == PT_PHOT) + parts[fp[i]].ctype = 0x3fffffff; parts[fp[i]].x = (float)x; parts[fp[i]].y = (float)y; m[(x-x0)+(y-y0)*w] = fp[i]+1; diff --git a/src/powder.c b/src/powder.c index d8fa1fb15..40150b9ef 100644 --- a/src/powder.c +++ b/src/powder.c @@ -72,6 +72,7 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(pt==PT_PHOT&&( (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || + (r&0xFF)==PT_GLOW || (r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || ((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) return 2; @@ -101,6 +102,7 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) } static void create_cherenkov_photon(int pp); +static void create_gain_photon(int pp); int try_move(int i, int x, int y, int nx, int ny) { @@ -110,6 +112,13 @@ int try_move(int i, int x, int y, int nx, int ny) return 1; e = eval_move(parts[i].type, nx, ny, &r); + + /* half-silvered mirror */ + if(!e && parts[i].type==PT_PHOT && + (((r&0xFF)==PT_BMTL && rand()>8].life) + if(rand() < RAND_MAX/30) { + parts[r>>8].life = 120; + create_gain_photon(i); + } if(parts[i].type == PT_NEUT && (r&0xFF)==PT_GLAS) { if(rand() < RAND_MAX/10) create_cherenkov_photon(i); @@ -154,16 +168,22 @@ int try_move(int i, int x, int y, int nx, int ny) if(r && (r>>8)> 8; + if(r && e>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; - } - return 1; } #define SURF_RANGE 10 @@ -314,14 +334,16 @@ int get_normal_interp(int pt, float x0, float y0, float dx, float dy, float *nx, void kill_part(int i) { int x, y; + + if(parts[i].type != PT_PHOT) { + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=0 && y>=0 && x=XRES || ny>=YRES) + return; + + if((pmap[ny][nx] & 0xFF) != PT_GLOW) + return; + + pfree = parts[i].life; + + parts[i].type = PT_PHOT; + parts[i].life = 680; + parts[i].x = xx; + parts[i].y = yy; + parts[i].vx = parts[pp].vx; + parts[i].vy = parts[pp].vy; + parts[i].temp = parts[pmap[ny][nx] >> 8].temp; + parts[i].tmp = 0; + + temp_bin = (int)((parts[i].temp-273.0f)*0.25f); + if(temp_bin < 0) temp_bin = 0; + if(temp_bin > 25) temp_bin = 25; + parts[i].ctype = 0x1F << temp_bin; +} + static void create_cherenkov_photon(int pp) { int i, lr, nx, ny; @@ -759,7 +826,7 @@ void update_particles_i(pixel *vid, int start, int inc) { if(!(parts[i].life==10&&(parts[i].type==PT_LCRY||parts[i].type==PT_PCLN||parts[i].type==PT_HSWC))) parts[i].life--; - if(parts[i].life<=0 && t!=PT_METL && t!=PT_FIRW && t!=PT_PCLN && t!=PT_HSWC && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) + if(parts[i].life<=0 && t!=PT_METL && t!=PT_FIRW && t!=PT_PCLN && t!=PT_HSWC && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR && t!=PT_GLOW) { kill_part(i); continue; @@ -2705,6 +2772,7 @@ killed: /* this should be replaced with a particle type attribute ("photwl" or something) */ if((r & 0xFF) == PT_PSCN) parts[i].ctype = 0x00000000; if((r & 0xFF) == PT_NSCN) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_SPRK) parts[i].ctype = 0x00000000; if((r & 0xFF) == PT_COAL) parts[i].ctype = 0x00000000; if((r & 0xFF) == PT_BCOL) parts[i].ctype = 0x00000000; if((r & 0xFF) == PT_PLEX) parts[i].ctype &= 0x1F00003E; @@ -2801,8 +2869,8 @@ void update_particles(pixel *vid) t = parts[i].type; x = (int)(parts[i].x+0.5f); y = (int)(parts[i].y+0.5f); - if(x>=0 && y>=0 && x=0 && y>=0 && x Date: Tue, 5 Oct 2010 17:56:09 +0100 Subject: [PATCH 190/237] Some more fire improvements --- src/graphics.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/graphics.c b/src/graphics.c index 2c9a68649..cf0e1e625 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1883,7 +1883,7 @@ void draw_parts(pixel *vid) } else if(t==PT_FIRE && parts[i].life) { - float ttemp = (float)parts[i].life; + float ttemp = (float)((int)(parts[i].life/2)); int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); uint8 R = flm_data[caddress]; uint8 G = flm_data[caddress+1]; @@ -1907,18 +1907,21 @@ void draw_parts(pixel *vid) } else { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); } // Older Code /*if(cmode == 3||cmode==4 || cmode==6) From 6627e418b2fd887c7125537930a4c40731d698af Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 5 Oct 2010 18:00:02 +0100 Subject: [PATCH 191/237] Fix Powered Clone and Photon bug --- src/powder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/powder.c b/src/powder.c index 40150b9ef..12dbe59e2 100644 --- a/src/powder.c +++ b/src/powder.c @@ -1615,7 +1615,7 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].type = PT_FIRE; parts[r>>8].life = 4; } - else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) + else if(((r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) { parts[i].life--; parts[r>>8].type = PT_NONE; @@ -2601,7 +2601,7 @@ killed: if(parts[i].type == PT_PHOT) { rt = pmap[ny][nx] & 0xFF; - if(rt==PT_CLNE) { + if(rt==PT_CLNE || rt==PT_PCLN) { lt = pmap[ny][nx] >> 8; if(!parts[lt].ctype) parts[lt].ctype = PT_PHOT; From 38742f08ba1ea0c5a4f6194bba3949a149825bb2 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 5 Oct 2010 18:48:40 +0100 Subject: [PATCH 192/237] Fixed Powered clone saving and suitibility as a light emitter. Fixed Photons igniting Insulator --- src/main.c | 4 ++-- src/powder.c | 24 +++++++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index f7ffec97b..b91d86dd7 100755 --- a/src/main.c +++ b/src/main.c @@ -322,7 +322,7 @@ void *build_save(int *size, int x0, int y0, int w, int h) for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) + if(i && (ty==PT_CLNE || (ty==PT_PCLN && ver>=43) || (ty==PT_SPRK && ver>=21) || (ty==PT_LAVA && ver>=34))) { if(p >= size) goto corrupt; diff --git a/src/powder.c b/src/powder.c index 12dbe59e2..8cd0f73c4 100644 --- a/src/powder.c +++ b/src/powder.c @@ -500,9 +500,9 @@ inline int create_part(int p, int x, int y, int t) } if(t==PT_PHOT) { - float a = (rand()%8) * 0.78540f; + float a = (rand()%8) * 0.78540f; parts[i].life = 680; - parts[i].ctype = 0x3FFFFFFF; + parts[i].ctype = 0x3FFFFFFF; parts[i].vx = 3.0f*cosf(a); parts[i].vy = 3.0f*sinf(a); } @@ -1968,6 +1968,7 @@ void update_particles_i(pixel *vid, int start, int inc) continue; rt = parts[r>>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && + !(t==PT_PHOT && rt==PT_INSL) && (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { @@ -2547,8 +2548,10 @@ killed: (pmap[y+ny][x+nx]&0xFF)!=0xFF) parts[i].ctype = pmap[y+ny][x+nx]&0xFF; } - else - create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); + else { + create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); + } + } if(parts[i].type==PT_PCLN) { @@ -2567,7 +2570,18 @@ killed: (pmap[y+ny][x+nx]&0xFF)!=0xFF) parts[i].ctype = pmap[y+ny][x+nx]&0xFF; if(parts[i].ctype && parts[i].life==10) - create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); + if(parts[i].ctype==PT_PHOT){ + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++){ + r = create_part(-1, x+nx, y+ny, parts[i].ctype); + if(r!=-1){ + parts[r].vx = nx*3; + parts[r].vy = ny*3; + } + } + } else { + create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); + } } if(t==PT_YEST) { From 5040b80717cf8f86c6703d9d5c12f4e94bfbb932 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 7 Oct 2010 19:12:01 +0100 Subject: [PATCH 193/237] Attempt at fixing fuse crashes --- src/powder.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/powder.c b/src/powder.c index 8cd0f73c4..9b008f7cf 100644 --- a/src/powder.c +++ b/src/powder.c @@ -1352,16 +1352,18 @@ void update_particles_i(pixel *vid, int start, int inc) else if(t==PT_FUSE) { if(parts[i].life<=0) { - t = PT_NONE; + //t = parts[i].life = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; + if(r!=-1) + parts[r].life = 50; + //goto killed; } else if (parts[i].life < 40) { parts[i].life--; if((rand()%100)==0) { r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; + if(r!=-1) + parts[r].life = 50; } } if((pv[y/CELL][x/CELL] > 2.7f)&&parts[i].tmp>40) @@ -1369,10 +1371,10 @@ void update_particles_i(pixel *vid, int start, int inc) else if(parts[i].tmp<40&&parts[i].tmp>0) parts[i].tmp--; else if(parts[i].tmp<=0) { - t = PT_NONE; + //t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_FSEP); - goto killed; + //goto killed; } for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) @@ -1393,16 +1395,18 @@ void update_particles_i(pixel *vid, int start, int inc) else if(t==PT_FSEP) { if(parts[i].life<=0) { - t = PT_NONE; + //t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_PLSM); - parts[r].life = 50; - goto killed; + if(r!=-1) + parts[r].life = 50; + //goto killed; } else if (parts[i].life < 40) { parts[i].life--; if((rand()%10)==0) { r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - parts[r].life = 50; + if(r!=-1) + parts[r].life = 50; } } for(nx=-2; nx<3; nx++) From 640b00c68e27fa6aed27b8652d5b42ca5974b9bf Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Mon, 11 Oct 2010 10:44:09 -0700 Subject: [PATCH 194/237] fix the search memory corruption bug --- src/interface.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/interface.c b/src/interface.c index bdec1114f..4592a7264 100644 --- a/src/interface.c +++ b/src/interface.c @@ -2329,7 +2329,8 @@ int search_ui(pixel *vid_buf) last_date = search_date; last_page = search_page; active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + // TODO: Create a better fix for this bug + uri = malloc(strlen(last)*3+180+strlen(SERVER)+strlen(svf_user)); //Increase "padding" from 80 to 180 to fix the search memory corruption bug if(search_own || svf_admin || svf_mod) tmp = "&ShowVotes=true"; else From 24a3b5919f2d893d0720d32dafaa03e2751f759f Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 12 Oct 2010 16:59:49 +0100 Subject: [PATCH 195/237] IRON --- includes/powder.h | 180 +++++++++++++++++++++++----------------------- src/powder.c | 82 ++++++++++++++++++--- 2 files changed, 165 insertions(+), 97 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index 3b5e2f0d6..d79e83cbb 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -114,7 +114,8 @@ #define PT_BCOL 73 #define PT_PCLN 74 #define PT_HSWC 75 -#define PT_NUM 76 +#define PT_IRON 76 +#define PT_NUM 77 #define R_TEMP 22 #define MAX_TEMP 9999 @@ -264,10 +265,11 @@ static const part_type ptypes[PT_NUM] = {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -342,14 +344,15 @@ static part_state pstates[PT_NUM] = /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE,0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = @@ -358,90 +361,91 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* Water 0 | 1 | Water displaces oil */ /* Oil 0 | 0 | Oil doesn't displace water */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* GLOW */ - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ - /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ - /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ - /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ - /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* FSEP */ - /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ - /* BCOL */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,1,0,1,1,0,1,0,1,0,0,1,0,0,0,0}, /* BCOL */ - /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ - /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0,0,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* GLOW */ + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ + /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ + /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ + /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ + /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* FSEP */ + /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ + /* BCOL */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,1,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* BCOL */ + /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ + /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ + /* IRON */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* IRON */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ }; extern int isplayer; diff --git a/src/powder.c b/src/powder.c index 9b008f7cf..1682deaf5 100644 --- a/src/powder.c +++ b/src/powder.c @@ -420,6 +420,7 @@ inline int create_part(int p, int x, int y, int t) (pmap[y][x]&0xFF)!=PT_ETRD && (pmap[y][x]&0xFF)!=PT_BRMT && (pmap[y][x]&0xFF)!=PT_NBLE && + (pmap[y][x]&0xFF)!=PT_IRON && (pmap[y][x]&0xFF)!=PT_INWR) return -1; parts[pmap[y][x]>>8].type = PT_SPRK; @@ -826,7 +827,7 @@ void update_particles_i(pixel *vid, int start, int inc) { if(!(parts[i].life==10&&(parts[i].type==PT_LCRY||parts[i].type==PT_PCLN||parts[i].type==PT_HSWC))) parts[i].life--; - if(parts[i].life<=0 && t!=PT_METL && t!=PT_FIRW && t!=PT_PCLN && t!=PT_HSWC && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR && t!=PT_GLOW) + if(parts[i].life<=0 && t!=PT_METL && t!=PT_IRON && t!=PT_FIRW && t!=PT_PCLN && t!=PT_HSWC && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR && t!=PT_GLOW) { kill_part(i); continue; @@ -834,7 +835,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(parts[i].life<=0 && t==PT_SPRK) { t = parts[i].ctype; - if(t!=PT_METL&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) + if(t!=PT_METL&&t!=PT_IRON&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) parts[i].temp = R_TEMP + 273.15f; if(!t) t = PT_METL; @@ -1010,6 +1011,8 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = PT_OIL; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; + if(t==PT_BMTL && pv[y/CELL][x/CELL]>1.0f && parts[i].tmp==1) + t = parts[i].type = PT_BRMT; if(t==PT_BRCK && pv[y/CELL][x/CELL]>2.8f) t = parts[i].type = PT_STNE; //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) @@ -1185,7 +1188,7 @@ void update_particles_i(pixel *vid, int start, int inc) pt = parts[i].temp -= 2.5f; } - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_IRON || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) { nx = x % CELL; if(nx == 0) @@ -1203,7 +1206,7 @@ void update_particles_i(pixel *vid, int start, int inc) ny = y/CELL; if(nx>=0 && ny>=0 && nx>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_IRON || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) { t = parts[i].type = PT_NONE; @@ -1284,6 +1287,67 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + else if(t==PT_BMTL){ + if(parts[i].tmp>1){ + parts[i].tmp--; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + rt =parts[r>>8].type; + if((rt==PT_METL || rt==PT_IRON) && 1>(rand()/(RAND_MAX/100))) + { + parts[r>>8].type=PT_BMTL; + parts[r>>8].tmp=(parts[i].tmp<=7)?parts[i].tmp=1:parts[i].tmp-(rand()%5);//rand()/(RAND_MAX/300)+100; + } + } + } else if(parts[i].tmp==1 && 1>rand()%1000){ + parts[i].tmp = 0; + t = parts[i].type = PT_BRMT; + } + } + + else if(t==PT_IRON){ + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((((r&0xFF) == PT_SALT && 15>(rand()/(RAND_MAX/700))) || + ((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/2000))) || + ((r&0xFF) == PT_WATR && 5 >(rand()/(RAND_MAX/6000))) || + ((r&0xFF) == PT_O2 && 2 >(rand()/(RAND_MAX/500))) || + ((r&0xFF) == PT_LO2))&& + (!(parts[i].life)) + ) + { + parts[i].type=PT_BMTL; + parts[i].tmp=(rand()/(RAND_MAX/10))+20; + } + } + } + else if((t==PT_SPRK||parts[i].type==PT_SPRK) && parts[i].ctype==PT_IRON){ + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF) == PT_DSTW && 30>(rand()/(RAND_MAX/1000))) || + ((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/1000))) || + ((r&0xFF) == PT_WATR && 30>(rand()/(RAND_MAX/1000)))) + { + parts[r>>8].type=PT_O2; + //parts[r>>8].tmp=(rand()/(RAND_MAX/10))+20; + } + } + } else if(t==PT_COAL) { if(parts[i].life<=0) { @@ -1920,7 +1984,7 @@ void update_particles_i(pixel *vid, int start, int inc) rt = parts[r>>8].type; if(parts_avg(i,r>>8) != PT_INSL) { - if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + if((rt==PT_METL||rt==PT_IRON||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) { parts[r>>8].life = 4; parts[r>>8].ctype = rt; @@ -1973,7 +2037,7 @@ void update_particles_i(pixel *vid, int start, int inc) rt = parts[r>>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && !(t==PT_PHOT && rt==PT_INSL) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_IRON && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; @@ -1987,7 +2051,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(lpv < 1) lpv = 1; if(legacy_enable) { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_IRON && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && ptypes[rt].meltable*lpv>(rand()%1000)) { if(t!=PT_LAVA || parts[i].life>0) @@ -2059,7 +2123,7 @@ void update_particles_i(pixel *vid, int start, int inc) pavg = parts_avg(i, r>>8); if(pavg != PT_INSL) { - if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + if(t==PT_SPRK && (rt==PT_METL||rt==PT_IRON||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=373.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=373.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) From 5d1bc373d27747c3554fab1f048da8a2680c7532 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 12 Oct 2010 23:44:26 +0100 Subject: [PATCH 196/237] Some IRON stuff and photon rendering --- src/graphics.c | 86 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 27 deletions(-) diff --git a/src/graphics.c b/src/graphics.c index cf0e1e625..8e0bc501f 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1420,20 +1420,20 @@ void draw_parts(pixel *vid) cg = 0; cb = 0; cr = 0; - for(x=0; x<12; x++) { - cr += (parts[i].ctype >> (x+18)) & 1; - cb += (parts[i].ctype >> x) & 1; - } - for(x=0; x<14; x++) - cg += (parts[i].ctype >> (x+9)) & 1; - x = 624/(cr+cg+cb+1); - cr *= x; - cg *= x; - cb *= x; + for(x=0; x<12; x++) { + cr += (parts[i].ctype >> (x+18)) & 1; + cb += (parts[i].ctype >> x) & 1; + } + for(x=0; x<14; x++) + cg += (parts[i].ctype >> (x+9)) & 1; + x = 624/(cr+cg+cb+1); + cr *= x; + cg *= x; + cb *= x; vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr>255?255:cr,cg>255?255:cg,cb>255?255:cb); - cr >>= 4; - cg >>= 4; - cb >>= 4; + cr >>= 4; + cg >>= 4; + cb >>= 4; x = nx/CELL; y = ny/CELL; cg += fire_g[y][x]; @@ -1448,9 +1448,22 @@ void draw_parts(pixel *vid) } else { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; + cg = 0; + cb = 0; + cr = 0; + for(x=0; x<12; x++) { + cr += (parts[i].ctype >> (x+18)) & 1; + cb += (parts[i].ctype >> x) & 1; + } + for(x=0; x<14; x++) + cg += (parts[i].ctype >> (x+9)) & 1; + x = 624/(cr+cg+cb+1); + cr *= x; + cg *= x; + cb *= x; + cr = cr>255?255:cr; + cg = cg>255?255:cg; + cb = cb>255?255:cb; blendpixel(vid, nx, ny, cr, cg, cb, 192); blendpixel(vid, nx+1, ny, cr, cg, cb, 96); blendpixel(vid, nx-1, ny, cr, cg, cb, 96); @@ -2068,23 +2081,42 @@ void draw_parts(pixel *vid) } if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_HFLM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH&&t!=PT_SMKE&&t!=PT_WTRV&&!(t==PT_FIRW&&parts[i].tmp==3)) { - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); + if(t==PT_PHOT){ + cg = 0; + cb = 0; + cr = 0; + for(x=0; x<12; x++) { + cr += (parts[i].ctype >> (x+18)) & 1; + cb += (parts[i].ctype >> x) & 1; + } + for(x=0; x<14; x++) + cg += (parts[i].ctype >> (x+9)) & 1; + x = 624/(cr+cg+cb+1); + cr *= x; + cg *= x; + cb *= x; + cr = cr>255?255:cr; + cg = cg>255?255:cg; + cb = cb>255?255:cb; + } else { + cr = PIXR(ptypes[t].pcolors); + cg = PIXG(ptypes[t].pcolors); + cb = PIXB(ptypes[t].pcolors); + } //if(vid[(ny-1)*YRES+(nx-1)]!=0){ // blendpixel(vid, nx, ny-1, R, G, B, 46); //} - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); } } #endif From 2d6fa4597fefcdc6bfef8701f80817ded0a9b118 Mon Sep 17 00:00:00 2001 From: AntB Date: Wed, 13 Oct 2010 12:41:27 +0100 Subject: [PATCH 197/237] Formatting --- includes/powder.h | 564 +++++++++++++++++++++++----------------------- 1 file changed, 282 insertions(+), 282 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index d79e83cbb..f340892ba 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -140,312 +140,312 @@ static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. struct particle { - int type; - int life, ctype; - float x, y, vx, vy; - float temp; - float pavg[2]; - int flags; - int tmp; + int type; + int life, ctype; + float x, y, vx, vy; + float temp; + float pavg[2]; + int flags; + int tmp; }; typedef struct particle particle; struct part_type { - const char *name; - pixel pcolors; - float advection; - float airdrag; - float airloss; - float loss; - float collision; - float gravity; - float diffusion; - float hotair; - int falldown; - int flammable; - int explosive; - int meltable; - int hardness; - int menu; - int menusection; - float heat; - unsigned char hconduct; - const char *descs; - const unsigned short properties; + const char *name; + pixel pcolors; + float advection; + float airdrag; + float airloss; + float loss; + float collision; + float gravity; + float diffusion; + float hotair; + int falldown; + int flammable; + int explosive; + int meltable; + int hardness; + int menu; + int menusection; + float heat; + unsigned char hconduct; + const char *descs; + const unsigned short properties; }; typedef struct part_type part_type; struct part_state { - char state; - int solid; - float stemp; - int liquid; - float ltemp; - int gas; - float gtemp; - int burn; - float btemp; + char state; + int solid; + float stemp; + int liquid; + float ltemp; + int gas; + float gtemp; + int burn; + float btemp; }; typedef struct part_state part_state; //Should probably be const. static const part_type ptypes[PT_NUM] = { - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f+273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f+273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f+273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f+273.15f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f+273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f+273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f+273.15f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f+273.15f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f+273.15f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f+273.15f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f+273.15f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f+273.15f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f+273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow, Glows under pressure"}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, - {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; static part_state pstates[PT_NUM] = { - // Name Solid Frzp Liquid Mpnt Gas Bpoint - /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, - /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, - /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, - /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, - /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, - /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, - /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, - /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, - /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, - /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, - /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, - /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + // Name Solid Frzp Liquid Mpnt Gas Bpoint + /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, + /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, + /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, + /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, + /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, + /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, + /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, + /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, + /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, + /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = { - /* Water | Oil */ - /* Water 0 | 1 | Water displaces oil */ - /* Oil 0 | 0 | Oil doesn't displace water */ + /* Water | Oil */ + /* Water 0 | 1 | Water displaces oil */ + /* Oil 0 | 0 | Oil doesn't displace water */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0,0,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* GLOW */ - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ - /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ - /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ - /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ - /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* FSEP */ - /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ - /* BCOL */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,1,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* BCOL */ - /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ - /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ - /* IRON */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* IRON */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0,0,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* GLOW */ + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ + /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ + /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ + /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ + /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* FSEP */ + /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ + /* BCOL */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,1,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* BCOL */ + /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ + /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ + /* IRON */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* IRON */ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ }; extern int isplayer; From bb278b323b07144ea3d843e9df5fd5e655d6344a Mon Sep 17 00:00:00 2001 From: AntB Date: Wed, 13 Oct 2010 12:51:45 +0100 Subject: [PATCH 198/237] Solids Set --- includes/powder.h | 166 ++++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 79 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index f340892ba..77880fbf1 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -168,6 +168,7 @@ struct part_type int meltable; int hardness; int menu; + int weight; int menusection; float heat; unsigned char hconduct; @@ -190,87 +191,94 @@ struct part_state }; typedef struct part_state part_state; //Should probably be const. +/* Weight Help + * 0-33 Gas + * 34-66 Liquid + * 67-99 Powder + * 100 Solid + * 101 Neut + Phot + */ static const part_type ptypes[PT_NUM] = { - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, - {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description }; static part_state pstates[PT_NUM] = From 1ef7942119b87ff96b0503b86215aea6c92860aa Mon Sep 17 00:00:00 2001 From: AntB Date: Wed, 13 Oct 2010 23:46:11 +0100 Subject: [PATCH 199/237] Powders Set --- includes/powder.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index 77880fbf1..efd56f93a 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -192,21 +192,21 @@ struct part_state typedef struct part_state part_state; //Should probably be const. /* Weight Help - * 0-33 Gas - * 34-66 Liquid - * 67-99 Powder - * 100 Solid - * 101 Neut + Phot + * 1 = Gas || + * 2 = Light || Powders 0-49 + * 98 = Heavy || Liquids 50-99 + * 100 = Solid || + * 101 = Special (Photons, Neutrons) */ static const part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 25, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, @@ -220,20 +220,20 @@ static const part_type ptypes[PT_NUM] = {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 30, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 15, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 30, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, @@ -245,10 +245,10 @@ static const part_type ptypes[PT_NUM] = {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, @@ -264,17 +264,17 @@ static const part_type ptypes[PT_NUM] = {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 20, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 20, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 15, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, From c9f8f2c8c9bbbf852931659b0db1fc20db9b1689 Mon Sep 17 00:00:00 2001 From: AntB Date: Thu, 14 Oct 2010 00:17:52 +0100 Subject: [PATCH 200/237] Adjusted Powders and set some Misc --- includes/powder.h | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index efd56f93a..86d1dec23 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -193,8 +193,8 @@ typedef struct part_state part_state; //Should probably be const. /* Weight Help * 1 = Gas || - * 2 = Light || Powders 0-49 - * 98 = Heavy || Liquids 50-99 + * 2 = Light || Liquids 0-49 + * 98 = Heavy || Powder 50-99 * 100 = Solid || * 101 = Special (Photons, Neutrons) */ @@ -202,38 +202,38 @@ static const part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 25, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 30, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 15, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 30, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, @@ -245,36 +245,36 @@ static const part_type ptypes[PT_NUM] = {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 20, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 20, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 15, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 30, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, From b3739e34f8a9372dcb0663c599abe349e1f34dad Mon Sep 17 00:00:00 2001 From: AntB Date: Thu, 14 Oct 2010 00:57:27 +0100 Subject: [PATCH 201/237] int weight additions to powder.h complete, removed can_move array. redid a bit of formatting --- includes/powder.h | 159 ++++++++++------------------------------------ 1 file changed, 33 insertions(+), 126 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index 86d1dec23..290e3fb13 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -203,16 +203,16 @@ static const part_type ptypes[PT_NUM] = //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, @@ -222,34 +222,34 @@ static const part_type ptypes[PT_NUM] = {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, @@ -259,18 +259,18 @@ static const part_type ptypes[PT_NUM] = {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, @@ -283,7 +283,7 @@ static const part_type ptypes[PT_NUM] = static part_state pstates[PT_NUM] = { - // Name Solid Frzp Liquid Mpnt Gas Bpoint + // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, @@ -294,7 +294,7 @@ static part_state pstates[PT_NUM] = /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -302,12 +302,12 @@ static part_state pstates[PT_NUM] = /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, - /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -315,7 +315,7 @@ static part_state pstates[PT_NUM] = /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, @@ -336,126 +336,33 @@ static part_state pstates[PT_NUM] = /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, - /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; -static unsigned char can_move[PT_NUM][PT_NUM] = -{ - /* Water | Oil */ - /* Water 0 | 1 | Water displaces oil */ - /* Oil 0 | 0 | Oil doesn't displace water */ - - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* DESL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LO2 */ - /* O2 */ {0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* O2 */ - /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ - /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0.0,0,0,0,0,0}, /* YEST */ - /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ - /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0}, /* THRM */ - /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* GLOW */ - /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BRCK */ - /* HFLM */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HFlm */ - /* FIRW */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FIRW */ - /* FUSE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* FUSE */ - /* FSEP */ {0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* FSEP */ - /* AMTR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* AMTR */ - /* BCOL */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,1,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0}, /* BCOL */ - /* PCLN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* PCLN */ - /* HSWC */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSWC */ - /* IRON */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* IRON */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S D C L O I Y D T G B H F F F A B P H I */ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M e o O 2 N E Y H L R F I U S M C C S R */ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K s a X W S S R O C L R S E T O L W O */ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E l l R T T M W K M W E P R L N C N */ -}; - extern int isplayer; extern float player[27]; From 53ed480afc337abe0182d4869f7de96d649fac1a Mon Sep 17 00:00:00 2001 From: AntB Date: Thu, 14 Oct 2010 01:53:24 +0100 Subject: [PATCH 202/237] First release. it is buggy but stable. --- src/powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index 1682deaf5..4e0b9f8e7 100644 --- a/src/powder.c +++ b/src/powder.c @@ -93,7 +93,7 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) return 0; - if (r && ((r&0xFF) >= PT_NUM || !can_move[pt][(r&0xFF)])) + if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight > ptypes[pt>>8].weight))) return 0; if(pt == PT_PHOT) From 01dcfe5a1a95c7811b9c0871d3e8761f855e5c2d Mon Sep 17 00:00:00 2001 From: AntB Date: Thu, 14 Oct 2010 02:42:37 +0100 Subject: [PATCH 203/237] As good as its gettin for now --- src/powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index 4e0b9f8e7..bd1779ad0 100644 --- a/src/powder.c +++ b/src/powder.c @@ -93,7 +93,7 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) return 0; - if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight > ptypes[pt>>8].weight))) + if (r && ((r&0xFF) >= PT_NUM || !(ptypes[pt].weight = ptypes[(r&0xFF)].weight))) return 0; if(pt == PT_PHOT) From 79767f4ceb36118d17b1b148c4454d556699ef63 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 14 Oct 2010 18:33:47 +0100 Subject: [PATCH 204/237] Client Side 'Favourites' UI stuff --- includes/defines.h | 2 +- includes/interface.h | 1 + src/graphics.c | 8 ++--- src/interface.c | 74 ++++++++++++++++++++++++++++---------------- src/main.c | 6 ++-- 5 files changed, 58 insertions(+), 33 deletions(-) diff --git a/includes/defines.h b/includes/defines.h index a324e9f54..9dbd338ad 100644 --- a/includes/defines.h +++ b/includes/defines.h @@ -23,7 +23,7 @@ #define HTTP_TIMEOUT 10 #define MENUSIZE 40 -#define BARSIZE 14 +#define BARSIZE 17 #define XRES 612 #define YRES 384 #define NPART XRES*YRES diff --git a/includes/interface.h b/includes/interface.h index 7f130649a..00b175a00 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -112,6 +112,7 @@ extern void *search_thumbs[GRID_X*GRID_Y]; extern int search_thsizes[GRID_X*GRID_Y]; extern int search_own; +extern int search_fav; extern int search_date; extern int search_page; extern char search_expr[256]; diff --git a/src/graphics.c b/src/graphics.c index 8e0bc501f..c8e96bf0b 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -745,15 +745,15 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) void draw_menu(pixel *vid_buf, int i, int hover) { - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); if(hover==i) { - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + fillrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); } else { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); } } diff --git a/src/interface.c b/src/interface.c index 4592a7264..decc58040 100644 --- a/src/interface.c +++ b/src/interface.c @@ -46,6 +46,7 @@ void *search_thumbs[GRID_X*GRID_Y]; int search_thsizes[GRID_X*GRID_Y]; int search_own = 0; +int search_fav = 0; int search_date = 0; int search_page = 0; char search_expr[256] = ""; @@ -1759,7 +1760,7 @@ corrupt: int search_ui(pixel *vid_buf) { - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,last_fav=search_fav,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; int thumb_drawn[GRID_X*GRID_Y]; pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); @@ -1851,39 +1852,50 @@ int search_ui(pixel *vid_buf) if(!svf_login) { search_own = 0; - drawrect(vid_buf, XRES-64, 8, 56, 16, 96, 96, 96, 255); - drawtext(vid_buf, XRES-61, 11, "\x94", 96, 80, 16, 255); - drawtext(vid_buf, XRES-61, 11, "\x93", 128, 128, 128, 255); - drawtext(vid_buf, XRES-46, 13, "My Own", 128, 128, 128, 255); + drawrect(vid_buf, XRES-64+16, 8, 56, 16, 96, 96, 96, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x94", 96, 80, 16, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x93", 128, 128, 128, 255); + drawtext(vid_buf, XRES-46+16, 13, "My Own", 128, 128, 128, 255); } else if(search_own) { - fillrect(vid_buf, XRES-65, 7, 58, 18, 255, 255, 255, 255); - drawtext(vid_buf, XRES-61, 11, "\x94", 192, 160, 64, 255); - drawtext(vid_buf, XRES-61, 11, "\x93", 32, 32, 32, 255); - drawtext(vid_buf, XRES-46, 13, "My Own", 0, 0, 0, 255); + fillrect(vid_buf, XRES-65+16, 7, 58, 18, 255, 255, 255, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x94", 192, 160, 64, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x93", 32, 32, 32, 255); + drawtext(vid_buf, XRES-46+16, 13, "My Own", 0, 0, 0, 255); } else { - drawrect(vid_buf, XRES-64, 8, 56, 16, 192, 192, 192, 255); - drawtext(vid_buf, XRES-61, 11, "\x94", 192, 160, 32, 255); - drawtext(vid_buf, XRES-61, 11, "\x93", 255, 255, 255, 255); - drawtext(vid_buf, XRES-46, 13, "My Own", 255, 255, 255, 255); + drawrect(vid_buf, XRES-64+16, 8, 56, 16, 192, 192, 192, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x94", 192, 160, 32, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x93", 255, 255, 255, 255); + drawtext(vid_buf, XRES-46+16, 13, "My Own", 255, 255, 255, 255); + } + + if(search_fav) + { + fillrect(vid_buf, XRES-134, 7, 18, 18, 255, 255, 255, 255); + drawtext(vid_buf, XRES-130, 11, "\xCC", 192, 160, 64, 255); + } + else + { + drawrect(vid_buf, XRES-134, 8, 16, 16, 192, 192, 192, 255); + drawtext(vid_buf, XRES-130, 11, "\xCC", 192, 160, 32, 255); } if(search_date) { - fillrect(vid_buf, XRES-130, 7, 62, 18, 255, 255, 255, 255); - drawtext(vid_buf, XRES-126, 11, "\xA6", 32, 32, 32, 255); - drawtext(vid_buf, XRES-111, 13, "By date", 0, 0, 0, 255); + fillrect(vid_buf, XRES-130+16, 7, 62, 18, 255, 255, 255, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA6", 32, 32, 32, 255); + drawtext(vid_buf, XRES-111+16, 13, "By date", 0, 0, 0, 255); } else { - drawrect(vid_buf, XRES-129, 8, 60, 16, 192, 192, 192, 255); - drawtext(vid_buf, XRES-126, 11, "\xA9", 144, 48, 32, 255); - drawtext(vid_buf, XRES-126, 11, "\xA8", 32, 144, 32, 255); - drawtext(vid_buf, XRES-126, 11, "\xA7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-111, 13, "By votes", 255, 255, 255, 255); + drawrect(vid_buf, XRES-129+16, 8, 60, 16, 192, 192, 192, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA9", 144, 48, 32, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA8", 32, 144, 32, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-111+16, 13, "By votes", 255, 255, 255, 255); } if(search_page) @@ -2133,16 +2145,21 @@ int search_ui(pixel *vid_buf) if(sdl_key==SDLK_ESCAPE) goto finish; - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + if(b && !bq && mx>=XRES-64+16 && mx<=XRES-8+16 && my>=8 && my<=24 && svf_login) { search_own = !search_own; lasttime = TIMEOUT; } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + if(b && !bq && mx>=XRES-129+16 && mx<=XRES-65+16 && my>=8 && my<=24) { search_date = !search_date; lasttime = TIMEOUT; } + if(b && !bq && mx>=XRES-134 && mx<=XRES-134+16 && my>=8 && my<=24) + { + search_fav = !search_fav; + lasttime = TIMEOUT; + } if(b && !bq && dp!=-1) if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) @@ -2307,10 +2324,10 @@ int search_ui(pixel *vid_buf) { search = 1; } - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page || last_fav!=search_fav)) { search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + if(strcmp(last, ed.str) || last_own!=search_own || last_fav!=search_fav || last_date!=search_date) { search_page = 0; page_count = 0; @@ -2328,9 +2345,10 @@ int search_ui(pixel *vid_buf) last_own = search_own; last_date = search_date; last_page = search_page; + last_fav = search_fav; active = 1; // TODO: Create a better fix for this bug - uri = malloc(strlen(last)*3+180+strlen(SERVER)+strlen(svf_user)); //Increase "padding" from 80 to 180 to fix the search memory corruption bug + uri = malloc(strlen(last)*3+180+strlen(SERVER)+strlen(svf_user)+20); //Increase "padding" from 80 to 180 to fix the search memory corruption bug if(search_own || svf_admin || svf_mod) tmp = "&ShowVotes=true"; else @@ -2359,6 +2377,10 @@ int search_ui(pixel *vid_buf) strcaturl(uri, " user:"); strcaturl(uri, svf_user); } + if(search_fav) + { + strcaturl(uri, " cat:favs"); + } if(search_date) strcaturl(uri, " sort:date"); diff --git a/src/main.c b/src/main.c index b91d86dd7..77133f98b 100755 --- a/src/main.c +++ b/src/main.c @@ -507,8 +507,10 @@ int parse_save(void *save, int size, int replace, int x0, int y0) if(p >= size) goto corrupt; j=d[p++]; - if(j >= PT_NUM) - goto corrupt; + if(j >= PT_NUM){ + //TODO: Possibly some server side translation + j = PT_DUST;//goto corrupt; + } if(j)// && !(isplayer == 1 && j==PT_STKM)) { if(pmap[y][x]) From a49f81decb2d082a5fa794d4be4fd288bace247a Mon Sep 17 00:00:00 2001 From: AntB Date: Fri, 15 Oct 2010 00:07:02 +0100 Subject: [PATCH 205/237] Photon fix >.< getting the right weight helps --- includes/powder.h | 4 ++-- src/powder.c | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index 290e3fb13..e82a5ea56 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -196,7 +196,7 @@ typedef struct part_state part_state; * 2 = Light || Liquids 0-49 * 98 = Heavy || Powder 50-99 * 100 = Solid || - * 101 = Special (Photons, Neutrons) + * 101 is Neutrons, -1 = Photons */ static const part_type ptypes[PT_NUM] = { @@ -232,7 +232,7 @@ static const part_type ptypes[PT_NUM] = {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, diff --git a/src/powder.c b/src/powder.c index bd1779ad0..2cc8c3c17 100644 --- a/src/powder.c +++ b/src/powder.c @@ -93,7 +93,9 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) return 0; - if (r && ((r&0xFF) >= PT_NUM || !(ptypes[pt].weight = ptypes[(r&0xFF)].weight))) + if (r && ((r&0xFF) >= PT_NUM || + !(ptypes[pt].weight >= ptypes[(r&0xFF)].weight)) + ) return 0; if(pt == PT_PHOT) From a03b1f7e566839856287d07f62864a4104e4e885 Mon Sep 17 00:00:00 2001 From: AntB Date: Fri, 15 Oct 2010 13:11:27 +0100 Subject: [PATCH 206/237] Physics fix --- src/powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index 2cc8c3c17..d29748949 100644 --- a/src/powder.c +++ b/src/powder.c @@ -94,7 +94,7 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) return 0; if (r && ((r&0xFF) >= PT_NUM || - !(ptypes[pt].weight >= ptypes[(r&0xFF)].weight)) + (ptypes[pt].weight <= ptypes[(r&0xFF)].weight)) ) return 0; From 1d167e10547829067b20b56e355576891053ea5f Mon Sep 17 00:00:00 2001 From: AntB Date: Fri, 15 Oct 2010 17:36:05 +0100 Subject: [PATCH 207/237] Manual merge - UI changes --- includes/defines.h | 4 +-- includes/interface.h | 1 + src/graphics.c | 8 ++--- src/interface.c | 74 ++++++++++++++++++++++++++++---------------- src/main.c | 6 ++-- 5 files changed, 59 insertions(+), 34 deletions(-) diff --git a/includes/defines.h b/includes/defines.h index a324e9f54..eabfbf59f 100644 --- a/includes/defines.h +++ b/includes/defines.h @@ -23,7 +23,7 @@ #define HTTP_TIMEOUT 10 #define MENUSIZE 40 -#define BARSIZE 14 +#define BARSIZE 17 #define XRES 612 #define YRES 384 #define NPART XRES*YRES @@ -115,4 +115,4 @@ void *build_save(int *size, int x0, int y0, int w, int h); int parse_save(void *save, int size, int replace, int x0, int y0); void del_stamp(int d); void sdl_seticon(void); -#endif \ No newline at end of file +#endif diff --git a/includes/interface.h b/includes/interface.h index 7f130649a..00b175a00 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -112,6 +112,7 @@ extern void *search_thumbs[GRID_X*GRID_Y]; extern int search_thsizes[GRID_X*GRID_Y]; extern int search_own; +extern int search_fav; extern int search_date; extern int search_page; extern char search_expr[256]; diff --git a/src/graphics.c b/src/graphics.c index 8e0bc501f..c8e96bf0b 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -745,15 +745,15 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) void draw_menu(pixel *vid_buf, int i, int hover) { - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); if(hover==i) { - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + fillrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); } else { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); } } diff --git a/src/interface.c b/src/interface.c index 4592a7264..c904d5c2a 100644 --- a/src/interface.c +++ b/src/interface.c @@ -46,6 +46,7 @@ void *search_thumbs[GRID_X*GRID_Y]; int search_thsizes[GRID_X*GRID_Y]; int search_own = 0; +int search_fav = 0; int search_date = 0; int search_page = 0; char search_expr[256] = ""; @@ -1759,7 +1760,7 @@ corrupt: int search_ui(pixel *vid_buf) { - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,dap,own,last_own=search_own,last_fav=search_fav,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; int thumb_drawn[GRID_X*GRID_Y]; pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); @@ -1851,39 +1852,50 @@ int search_ui(pixel *vid_buf) if(!svf_login) { search_own = 0; - drawrect(vid_buf, XRES-64, 8, 56, 16, 96, 96, 96, 255); - drawtext(vid_buf, XRES-61, 11, "\x94", 96, 80, 16, 255); - drawtext(vid_buf, XRES-61, 11, "\x93", 128, 128, 128, 255); - drawtext(vid_buf, XRES-46, 13, "My Own", 128, 128, 128, 255); + drawrect(vid_buf, XRES-64+16, 8, 56, 16, 96, 96, 96, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x94", 96, 80, 16, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x93", 128, 128, 128, 255); + drawtext(vid_buf, XRES-46+16, 13, "My Own", 128, 128, 128, 255); } else if(search_own) { - fillrect(vid_buf, XRES-65, 7, 58, 18, 255, 255, 255, 255); - drawtext(vid_buf, XRES-61, 11, "\x94", 192, 160, 64, 255); - drawtext(vid_buf, XRES-61, 11, "\x93", 32, 32, 32, 255); - drawtext(vid_buf, XRES-46, 13, "My Own", 0, 0, 0, 255); + fillrect(vid_buf, XRES-65+16, 7, 58, 18, 255, 255, 255, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x94", 192, 160, 64, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x93", 32, 32, 32, 255); + drawtext(vid_buf, XRES-46+16, 13, "My Own", 0, 0, 0, 255); } else { - drawrect(vid_buf, XRES-64, 8, 56, 16, 192, 192, 192, 255); - drawtext(vid_buf, XRES-61, 11, "\x94", 192, 160, 32, 255); - drawtext(vid_buf, XRES-61, 11, "\x93", 255, 255, 255, 255); - drawtext(vid_buf, XRES-46, 13, "My Own", 255, 255, 255, 255); + drawrect(vid_buf, XRES-64+16, 8, 56, 16, 192, 192, 192, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x94", 192, 160, 32, 255); + drawtext(vid_buf, XRES-61+16, 11, "\x93", 255, 255, 255, 255); + drawtext(vid_buf, XRES-46+16, 13, "My Own", 255, 255, 255, 255); + } + + if(search_fav) + { + fillrect(vid_buf, XRES-134, 7, 18, 18, 255, 255, 255, 255); + drawtext(vid_buf, XRES-130, 11, "\xCC", 192, 160, 64, 255); + } + else + { + drawrect(vid_buf, XRES-134, 8, 16, 16, 192, 192, 192, 255); + drawtext(vid_buf, XRES-130, 11, "\xCC", 192, 160, 32, 255); } if(search_date) { - fillrect(vid_buf, XRES-130, 7, 62, 18, 255, 255, 255, 255); - drawtext(vid_buf, XRES-126, 11, "\xA6", 32, 32, 32, 255); - drawtext(vid_buf, XRES-111, 13, "By date", 0, 0, 0, 255); + fillrect(vid_buf, XRES-130+16, 7, 62, 18, 255, 255, 255, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA6", 32, 32, 32, 255); + drawtext(vid_buf, XRES-111+16, 13, "By date", 0, 0, 0, 255); } else { - drawrect(vid_buf, XRES-129, 8, 60, 16, 192, 192, 192, 255); - drawtext(vid_buf, XRES-126, 11, "\xA9", 144, 48, 32, 255); - drawtext(vid_buf, XRES-126, 11, "\xA8", 32, 144, 32, 255); - drawtext(vid_buf, XRES-126, 11, "\xA7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-111, 13, "By votes", 255, 255, 255, 255); + drawrect(vid_buf, XRES-129+16, 8, 60, 16, 192, 192, 192, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA9", 144, 48, 32, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA8", 32, 144, 32, 255); + drawtext(vid_buf, XRES-126+16, 11, "\xA7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-111+16, 13, "By votes", 255, 255, 255, 255); } if(search_page) @@ -2133,16 +2145,21 @@ int search_ui(pixel *vid_buf) if(sdl_key==SDLK_ESCAPE) goto finish; - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + if(b && !bq && mx>=XRES-64+16 && mx<=XRES-8+16 && my>=8 && my<=24 && svf_login) { search_own = !search_own; lasttime = TIMEOUT; } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + if(b && !bq && mx>=XRES-129+16 && mx<=XRES-65+16 && my>=8 && my<=24) { search_date = !search_date; lasttime = TIMEOUT; } + if(b && !bq && mx>=XRES-134 && mx<=XRES-134+16 && my>=8 && my<=24) + { + search_fav = !search_fav; + lasttime = TIMEOUT; + } if(b && !bq && dp!=-1) if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) @@ -2307,10 +2324,10 @@ int search_ui(pixel *vid_buf) { search = 1; } - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page || last_fav!=search_fav)) { search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + if(strcmp(last, ed.str) || last_own!=search_own || last_fav!=search_fav || last_date!=search_date) { search_page = 0; page_count = 0; @@ -2328,9 +2345,10 @@ int search_ui(pixel *vid_buf) last_own = search_own; last_date = search_date; last_page = search_page; + last_fav = search_fav; active = 1; // TODO: Create a better fix for this bug - uri = malloc(strlen(last)*3+180+strlen(SERVER)+strlen(svf_user)); //Increase "padding" from 80 to 180 to fix the search memory corruption bug + uri = malloc(strlen(last)*3+180+strlen(SERVER)+strlen(svf_user)+20); //Increase "padding" from 80 to 180 to fix the search memory corruption bug if(search_own || svf_admin || svf_mod) tmp = "&ShowVotes=true"; else @@ -2359,6 +2377,10 @@ int search_ui(pixel *vid_buf) strcaturl(uri, " user:"); strcaturl(uri, svf_user); } + if(search_fav) + { + strcaturl(uri, " cat:favs"); + } if(search_date) strcaturl(uri, " sort:date"); diff --git a/src/main.c b/src/main.c index b91d86dd7..744a43f0d 100755 --- a/src/main.c +++ b/src/main.c @@ -507,8 +507,10 @@ int parse_save(void *save, int size, int replace, int x0, int y0) if(p >= size) goto corrupt; j=d[p++]; - if(j >= PT_NUM) - goto corrupt; + if(j >= PT_NUM){ + //TODO: Possibly some server side translation + j = PT_DUST;//goto corrupt; + } if(j)// && !(isplayer == 1 && j==PT_STKM)) { if(pmap[y][x]) From edcd7db073c3372ce246fff1bb33bfea0f5aa686 Mon Sep 17 00:00:00 2001 From: AntB Date: Sat, 16 Oct 2010 14:55:01 +0100 Subject: [PATCH 208/237] Neutron Fix --- includes/powder.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index e82a5ea56..e7ef77111 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -196,7 +196,7 @@ typedef struct part_state part_state; * 2 = Light || Liquids 0-49 * 98 = Heavy || Powder 50-99 * 100 = Solid || - * 101 is Neutrons, -1 = Photons + * -1 is Neutrons and Photons */ static const part_type ptypes[PT_NUM] = { @@ -219,7 +219,7 @@ static const part_type ptypes[PT_NUM] = {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, 101, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, From c4368bf8afc5ab1f1dd66f5aae0f79c841926137 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 16 Oct 2010 23:35:33 +0200 Subject: [PATCH 209/237] moved defines --- includes/defines.h | 12 ++++++++++++ src/powder.c | 11 ----------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/includes/defines.h b/includes/defines.h index eabfbf59f..0f80ab69a 100644 --- a/includes/defines.h +++ b/includes/defines.h @@ -62,6 +62,18 @@ typedef unsigned short pixel; typedef unsigned int pixel; #endif +#define SURF_RANGE 10 +#define NORMAL_MIN_EST 3 +#define NORMAL_INTERP 20 +#define NORMAL_FRAC 16 + +#define REFRACT 0x80000000 + +/* heavy flint glass, for awesome refraction/dispersion + this way you can make roof prisms easily */ +#define GLASS_IOR 1.9 +#define GLASS_DISP 0.07 + typedef unsigned char uint8; extern int amd; diff --git a/src/powder.c b/src/powder.c index d29748949..c86409f81 100644 --- a/src/powder.c +++ b/src/powder.c @@ -188,17 +188,6 @@ int try_move(int i, int x, int y, int nx, int ny) return 1; } -#define SURF_RANGE 10 -#define NORMAL_MIN_EST 3 -#define NORMAL_INTERP 20 -#define NORMAL_FRAC 16 - -#define REFRACT 0x80000000 - -/* heavy flint glass, for awesome refraction/dispersion - this way you can make roof prisms easily */ -#define GLASS_IOR 1.9 -#define GLASS_DISP 0.07 static unsigned direction_to_map(float dx, float dy) { From 3b4d2b9406b87094ebb4f97c61561441fc755323 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sun, 17 Oct 2010 11:46:42 +0100 Subject: [PATCH 210/237] Few fixes for potential problems --- src/powder.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/powder.c b/src/powder.c index c86409f81..dcd56df67 100644 --- a/src/powder.c +++ b/src/powder.c @@ -793,9 +793,6 @@ int nearest_part(int ci, int t) void update_particles_i(pixel *vid, int start, int inc) { int i, j, x, y, t, nx, ny, r, a, s, lt, rt, fe, nt, lpv, nearp, pavg; - uint16_t tempu1, tempu2; - int16_t temps1, temps2; - float tempf1, tempf2; float mv, dx, dy, ix, iy, lx, ly, d, pp, nrx, nry, dp; float nn, ct1, ct2; float pt = R_TEMP; @@ -1228,8 +1225,7 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_IRON || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK) - + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_IRON || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT || (r&0xFF)==PT_NBLE || (r&0xFF)==PT_INWR) && parts[r>>8].ctype!=PT_SPRK) { t = parts[i].type = PT_NONE; parts[r>>8].ctype = parts[r>>8].type; @@ -1472,7 +1468,7 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f)) && 1>(rand()%15)) + if(((r&0xFF)==PT_SPRK || (parts[i].temp>=(273.15+400.0f))) && 1>(rand()%15)) { if(parts[i].life>40) { parts[i].life = 39; @@ -2628,9 +2624,9 @@ killed: (pmap[y+ny][x+nx]&0xFF)!=PT_STKM && (pmap[y+ny][x+nx]&0xFF)!=0xFF) parts[i].ctype = pmap[y+ny][x+nx]&0xFF; - if(parts[i].ctype && parts[i].life==10) + if(parts[i].ctype && parts[i].life==10){ if(parts[i].ctype==PT_PHOT){ - for(nx=-1; nx<2; nx++) + for(nx=-1; nx<2; nx++){ for(ny=-1; ny<2; ny++){ r = create_part(-1, x+nx, y+ny, parts[i].ctype); if(r!=-1){ @@ -2638,9 +2634,11 @@ killed: parts[r].vy = ny*3; } } + } } else { create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); } + } } if(t==PT_YEST) { From af09f466d21baaef2db1d0a0889ee8c5eb9dfef4 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 19 Oct 2010 21:35:22 +0200 Subject: [PATCH 211/237] fixed debug build a bit, probably still broken --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 8a25f401d..74c1a1c00 100755 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ LFLAGS := -lSDL -lm -lbz2 MFLAGS_SSE3 := -march=native -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=native-DX86 -DX86_SSE2 -msse2 MFLAGS_SSE := -march=native -DX86 -DX86_SSE -FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lbz2 +FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lbz2 COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe @@ -14,7 +14,7 @@ WIN32_TARG := powder-sse.exe powder-sse2.exe powder: $(SOURCES) $(COMPILER) -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 powder-debug: $(SOURCES) - $(COMPILER) -m64 -o$@ $(FLAGS_DBUG) -DLIN64 $(SOURCES) + $(COMPILER) -m64 -o$@ $(FLAGS_DBUG) -DLIN64 $(SOURCES) -Iincludes/ -DLIN64 powder-sse3: $(SOURCES) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 From 92b28b7879f55fdf1a496ba9a7c4001585a78cfe Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 20 Oct 2010 22:31:19 +0100 Subject: [PATCH 212/237] New Open UI - Half Complete --- includes/graphics.h | 2 + includes/interface.h | 28 +++ src/graphics.c | 56 ++++++ src/interface.c | 429 ++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 514 insertions(+), 1 deletion(-) diff --git a/includes/graphics.h b/includes/graphics.h index 6a1507e94..260c69b24 100644 --- a/includes/graphics.h +++ b/includes/graphics.h @@ -77,6 +77,8 @@ extern inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a); +int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, int b, int a); + void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); diff --git a/includes/interface.h b/includes/interface.h index 00b175a00..30908a9b2 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -73,6 +73,26 @@ struct ui_edit }; typedef struct ui_edit ui_edit; +struct save_info +{ + char *title; + char *name; + char *author; + char *date; + char *description; + int publish; + int voteup; + int votedown; + int vote; + int myvote; + int myfav; + char *tags; + int comment_count; + char *comments[6]; + char *commentauthors[6]; +}; +typedef struct save_info save_info; + struct ui_checkbox { int x, y; @@ -170,6 +190,10 @@ char *download_ui(pixel *vid_buf, char *uri, int *len); int search_ui(pixel *vid_buf); +int open_ui(pixel *vid_buf, char *save_id); + +int info_parse(void *info_data, save_info *info); + int search_results(char *str, int votes); int execute_tagop(pixel *vid_buf, char *op, char *tag); @@ -178,6 +202,10 @@ void execute_save(pixel *vid_buf); void execute_delete(pixel *vid_buf, char *id); +void execute_report(pixel *vid_buf, char *id); + +void execute_fav(pixel *vid_buf, char *id); + int execute_vote(pixel *vid_buf, char *id, char *action); #endif diff --git a/src/graphics.c b/src/graphics.c index c8e96bf0b..9f45526da 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -844,6 +844,62 @@ int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a #endif return x; } +int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, int b, int a) +{ +#ifdef OpenGL +#else + int sx = x; + int rh = 12; + int rw = 0; + int cw = x; + for(; *s; s++) + { + if(*s == '\n') + { + x = sx; + rw = 0; + y += FONT_H+2; + } + else if(*s == '\b') + { + switch(s[1]) + { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } + else + { + if(x-cw>=w){ + x = sx; + rw = 0; + y+=FONT_H+2; + rh+=FONT_H+2; + } + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + } +#endif + return rh; +} void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) { diff --git a/src/interface.c b/src/interface.c index decc58040..eab027a97 100644 --- a/src/interface.c +++ b/src/interface.c @@ -2197,6 +2197,10 @@ int search_ui(pixel *vid_buf) if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { + if(open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1){ + goto finish; + } + /* fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); info_box(vid_buf, "Loading..."); @@ -2317,7 +2321,7 @@ int search_ui(pixel *vid_buf) if(data) free(data); - goto finish; + goto finish;*/ } if(!last) @@ -2518,6 +2522,361 @@ finish: return 0; } +int open_ui(pixel *vid_buf, char *save_id, char *save_date) +{ + int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawnthumb=0,authoritah=0,queue_open=0,data_size=0,retval=0; + char *uri, *uri_2; + void *data, *info_data; + save_info *info = malloc(sizeof(save_info)); + void *http = NULL, *http_2 = NULL; + int lasttime = TIMEOUT; + int status, status_2, info_ready = 0, data_ready = 0; + time_t http_last_use = HTTP_TIMEOUT, http_last_use_2 = HTTP_TIMEOUT; + pixel *save_pic;// = malloc((XRES/2)*(YRES/2)); + + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + + fillrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 0, 0, 0, 255); + drawrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 255, 255, 255, 255); + drawrect(vid_buf, 50, 50, (XRES/2)+1, (YRES/2)+1, 255, 255, 255, 155); + drawrect(vid_buf, 50+(XRES/2)+1, 50, XRES+BARSIZE-100-((XRES/2)+1), YRES+MENUSIZE-100, 155, 155, 155, 255); + drawtext(vid_buf, 50+(XRES/4)-textwidth("Loading...")/2, 50+(YRES/4), "Loading...", 255, 255, 255, 128); + + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + //Begin Async loading of data + if(save_date) { + // We're loading an historical save + uri = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(SERVER)+71); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, save_id); + strappend(uri, "&Date="); + strcaturl(uri, save_date); + + uri_2 = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(SERVER)+71); + strcpy(uri_2, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri_2, save_id); + strappend(uri_2, "&Date="); + strcaturl(uri_2, save_date); + } else { + //We're loading a normal save + uri = malloc(strlen(save_id)*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, save_id); + + uri_2 = malloc(strlen(save_id)*3+strlen(SERVER)+64); + strcpy(uri_2, "http://" SERVER "/Info.api?ID="); + strcaturl(uri_2, save_id); + } + http = http_async_req_start(http, uri, NULL, 0, 1); + http_2 = http_async_req_start(http_2, uri_2, NULL, 0, 1); + if(svf_login) + { + http_auth_headers(http, svf_user, svf_pass); + http_auth_headers(http_2, svf_user, svf_pass); + } + http_last_use = time(NULL); + http_last_use_2 = time(NULL); + free(uri); + free(uri_2); + active = 1; + active_2 = 1; + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(active && http_async_req_status(http)) + { + int imgh, imgw, nimgh, nimgw; + http_last_use = time(NULL); + data = http_async_req_stop(http, &status, &data_size); + if(status == 200) + { + pixel *full_save = prerender_save(data, data_size, &imgw, &imgh); + save_pic = rescale_img(full_save, imgw, imgh, &thumb_w, &thumb_h, 2); + data_ready = 1; + free(full_save); + } + active = 0; + free(http); + http = NULL; + } + if(active_2 && http_async_req_status(http_2)) + { + http_last_use_2 = time(NULL); + info_data = http_async_req_stop(http_2, &status_2, NULL); + if(status_2 == 200) + { + info_ready = info_parse(info_data, info); + if(info_ready==-1){ + error_ui(vid_buf, 0, "Not found"); + break; + } + } + free(info_data); + active_2 = 0; + free(http_2); + http_2 = NULL; + } + + if(data_ready && !hasdrawnthumb){ + draw_image(vid_buf, save_pic, 51, 51, thumb_w, thumb_h, 255); + hasdrawnthumb = 1; + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + } + if(info_ready && !hasdrawninfo){ + //drawtext(vid_buf, 2, 2, info->name, 255, 255, 255, 255); + cix = drawtext(vid_buf, 60, (YRES/2)+60, info->name, 255, 255, 255, 255); + cix = drawtext(vid_buf, 60, (YRES/2)+72, "Author:", 255, 255, 255, 155); + cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->author, 255, 255, 255, 255); + cix = drawtext(vid_buf, cix+4, (YRES/2)+72, "Date:", 255, 255, 255, 155); + cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->date, 255, 255, 255, 255); + drawtextwrap(vid_buf, 62, (YRES/2)+86, (XRES/2)-24, info->description, 255, 255, 255, 200); + + ccy = 0; + for(cc=0;cccomment_count;cc++){ + drawtext(vid_buf, 60+(XRES/2)+1, ccy+60, info->commentauthors[cc], 255, 255, 255, 255); + ccy += 12; + ccy += drawtextwrap(vid_buf, 60+(XRES/2)+1, ccy+60, XRES+BARSIZE-100-((XRES/2)+1)-20, info->comments[cc], 255, 255, 255, 185); + ccy += 10; + draw_line(vid_buf, 50+(XRES/2)+2, ccy+52, XRES+BARSIZE-50, ccy+52, 100, 100, 100, XRES+BARSIZE); + } + hasdrawninfo = 1; + authoritah = svf_login && (!strcmp(info->author, svf_user) || svf_admin || svf_mod); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + } + + if(queue_open){ + if(info_ready && data_ready){ + // Do Open! + status = parse_save(data, data_size, 1, 0, 0); + if(!status){ + //if(svf_last) + //free(svf_last); + svf_last = data; + svf_lsize = data_size; + + svf_open = 1; + svf_own = svf_login && !strcmp(info->author, svf_user); + svf_publish = info->publish && svf_login && !strcmp(info->author, svf_user); + + strcpy(svf_id, save_id); + strcpy(svf_name, info->name); + if(info->tags) + { + strncpy(svf_tags, info->tags, 255); + svf_tags[255] = 0; + } else { + svf_tags[0] = 0; + } + svf_myvote = info->myvote; + retval = 1; + break; + } else { + queue_open = 0; + + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + error_ui(vid_buf, 0, "An Error Occurred"); + } + } else { + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 190); + drawtext(vid_buf, XRES+BARSIZE/2, XRES+MENUSIZE, "Loading...", 0, 0, 0, 200); + } + } + + //Open Button + if(sdl_key==SDLK_RETURN){ + queue_open = 1; + } + drawrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 93, YRES+MENUSIZE-63, "Open", 255, 255, 255, 255); + drawtext(vid_buf, 78, YRES+MENUSIZE-64, "\x81", 255, 255, 255, 255); + if(mx > 70 && mx < 70+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ + fillrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq){ + queue_open = 1; + } + } + + //Fav Button + if(svf_login){ + drawrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 162, YRES+MENUSIZE-63, "Fav.", 255, 255, 255, 255); + drawtext(vid_buf, 147, YRES+MENUSIZE-64, "\xCC", 255, 255, 255, 255); + if(mx > 140 && mx < 140+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ + fillrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq){ + //Button Clicked + } + } + } + + //Report Button + if(svf_login){ + drawrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 228, YRES+MENUSIZE-63, "Report", 255, 255, 255, 255); + drawtext(vid_buf, 218, YRES+MENUSIZE-63, "!", 255, 255, 255, 255); + if(mx > 210 && mx < 210+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ + fillrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq){ + //Button Clicked + } + } + } + + //Delete Button + if(authoritah){ + drawrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 298, YRES+MENUSIZE-63, "Delete", 255, 255, 255, 255); + drawtext(vid_buf, 286, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, 255); + if(mx > 280 && mx < 280+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ + fillrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq){ + //Button Clicked + } + } + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + if(sdl_key==SDLK_ESCAPE) + break; + + if(lasttimetitle = mystrdup(info_data+6); + j++; + } + else if(!strncmp(info_data, "NAME ", 5)) + { + info->name = mystrdup(info_data+5); + j++; + } + else if(!strncmp(info_data, "AUTHOR ", 7)) + { + info->author = mystrdup(info_data+7); + j++; + } + else if(!strncmp(info_data, "DATE ", 5)) + { + info->date = mystrdup(info_data+5); + j++; + } + else if(!strncmp(info_data, "DESCRIPTION ", 12)) + { + info->description = mystrdup(info_data+12); + j++; + } + else if(!strncmp(info_data, "VOTEUP ", 7)) + { + info->voteup = atoi(info_data+7); + j++; + } + else if(!strncmp(info_data, "VOTEDOWN ", 9)) + { + info->votedown = atoi(info_data+9); + j++; + } + else if(!strncmp(info_data, "VOTE ", 5)) + { + info->vote = atoi(info_data+5); + j++; + } + else if(!strncmp(info_data, "MYVOTE ", 7)) + { + info->myvote = atoi(info_data+7); + j++; + } + else if(!strncmp(info_data, "MYFAV ", 6)) + { + info->myfav = atoi(info_data+6); + j++; + } + else if(!strncmp(info_data, "PUBLISH ", 8)) + { + info->publish = atoi(info_data+8); + j++; + } + else if(!strncmp(info_data, "TAGS ", 5)) + { + info->tags = mystrdup(info_data+5); + j++; + } + else if(!strncmp(info_data, "COMMENT ", 8)) + { + if(info->comment_count>=6){ + info_data = p; + continue; + } else { + q = strchr(info_data+8, ' '); + *(q++) = 0; + info->commentauthors[info->comment_count] = mystrdup(info_data+8); + info->comments[info->comment_count] = mystrdup(q); + info->comment_count++; + } + j++; + } + info_data = p; + } + if(j>=8){ + return 1; + } else { + return -1; + } +} + int search_results(char *str, int votes) { int i,j; @@ -2947,6 +3306,74 @@ void execute_delete(pixel *vid_buf, char *id) free(result); } +void execute_report(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Report.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +void execute_fav(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Favourite.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + int execute_vote(pixel *vid_buf, char *id, char *action) { int status; From e711060cb909ae308efc68ea5c2f21e470f39ceb Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 21 Oct 2010 11:48:21 +0100 Subject: [PATCH 213/237] Neutrons fixed somewhat --- includes/interface.h | 4 +- includes/powder.h | 158 ++++++++++++++++++++++--------------------- src/powder.c | 22 ++++-- 3 files changed, 99 insertions(+), 85 deletions(-) diff --git a/includes/interface.h b/includes/interface.h index 30908a9b2..d3d9210d6 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -190,9 +190,9 @@ char *download_ui(pixel *vid_buf, char *uri, int *len); int search_ui(pixel *vid_buf); -int open_ui(pixel *vid_buf, char *save_id); +int open_ui(pixel *vid_buf, char *save_id, char *save_date); -int info_parse(void *info_data, save_info *info); +int info_parse(char *info_data, save_info *info); int search_results(char *str, int votes); diff --git a/includes/powder.h b/includes/powder.h index e7ef77111..af020ad2e 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -115,7 +115,8 @@ #define PT_PCLN 74 #define PT_HSWC 75 #define PT_IRON 76 -#define PT_NUM 77 +#define PT_MORT 77 +#define PT_NUM 78 #define R_TEMP 22 #define MAX_TEMP 9999 @@ -201,83 +202,84 @@ typedef struct part_state part_state; static const part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, - {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, + {"MORT", PIXPACK(0xE0E0E0), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Steam Train."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description }; diff --git a/src/powder.c b/src/powder.c index dcd56df67..d85d49879 100644 --- a/src/powder.c +++ b/src/powder.c @@ -93,13 +93,18 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) return 0; - if (r && ((r&0xFF) >= PT_NUM || - (ptypes[pt].weight <= ptypes[(r&0xFF)].weight)) - ) - return 0; - if(pt == PT_PHOT) return 2; + + if(pt == PT_NEUT) + return 1; + if((r&0xFF) == PT_NEUT) + return 0; + + if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight <= ptypes[(r&0xFF)].weight))) + return 0; + + return 1; } @@ -490,6 +495,10 @@ inline int create_part(int p, int x, int y, int t) parts[i].vx = r*cosf(a); parts[i].vy = r*sinf(a); } + if(t==PT_MORT) + { + parts[i].vx = 2; + } if(t==PT_PHOT) { float a = (rand()%8) * 0.78540f; @@ -1763,6 +1772,9 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + else if(t==PT_MORT){ + create_part(-1, x, y-1, PT_SMKE); + } else if(t==PT_LCRY) { for(nx=-1; nx<2; nx++) From 24d5ca7d4e28d7996d0866f5ebc081e74d28de5b Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Thu, 21 Oct 2010 17:33:14 +0200 Subject: [PATCH 214/237] added simple description for eval_move --- src/powder.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index d85d49879..2d2e09900 100644 --- a/src/powder.c +++ b/src/powder.c @@ -49,7 +49,12 @@ static void photoelectric_effect(int nx, int ny) pn_junction_sprk(nx, ny, PT_PSCN); } } - +/* + RETURN-value explenation +1 = Swap +0 = No move/Bounce +2 = Both particles occupy the same space. + */ static int eval_move(int pt, int nx, int ny, unsigned *rr) { unsigned r; From fdd3d240316086fdfd37840a828dc2111f5c70e2 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Thu, 21 Oct 2010 18:14:09 +0200 Subject: [PATCH 215/237] some 'fixes', better solution: change to what it was before the neutron fix. --- Makefile | 2 +- includes/interface.h | 30 +-- includes/powder.h | 394 ++++++++++++++++++------------------- src/graphics.c | 180 ++++++++--------- src/interface.c | 454 +++++++++++++++++++++---------------------- src/main.c | 22 +-- src/powder.c | 407 +++++++++++++++++++------------------- 7 files changed, 747 insertions(+), 742 deletions(-) mode change 100755 => 100644 src/main.c diff --git a/Makefile b/Makefile index 74c1a1c00..9e1f41ee4 100755 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ powder-64-sse3-opengl: $(SOURCES) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 -lGL -lGLU -DOpenGL strip $@ powder-64-sse3: $(SOURCES) - $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 -j3 strip $@ mv $@ build powder-64-sse2: $(SOURCES) diff --git a/includes/interface.h b/includes/interface.h index d3d9210d6..a284475ca 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -75,21 +75,21 @@ typedef struct ui_edit ui_edit; struct save_info { - char *title; - char *name; - char *author; - char *date; - char *description; - int publish; - int voteup; - int votedown; - int vote; - int myvote; - int myfav; - char *tags; - int comment_count; - char *comments[6]; - char *commentauthors[6]; + char *title; + char *name; + char *author; + char *date; + char *description; + int publish; + int voteup; + int votedown; + int vote; + int myvote; + int myfav; + char *tags; + int comment_count; + char *comments[6]; + char *commentauthors[6]; }; typedef struct save_info save_info; diff --git a/includes/powder.h b/includes/powder.h index af020ad2e..99d12eea2 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -141,54 +141,54 @@ static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. struct particle { - int type; - int life, ctype; - float x, y, vx, vy; - float temp; - float pavg[2]; - int flags; - int tmp; + int type; + int life, ctype; + float x, y, vx, vy; + float temp; + float pavg[2]; + int flags; + int tmp; }; typedef struct particle particle; struct part_type { - const char *name; - pixel pcolors; - float advection; - float airdrag; - float airloss; - float loss; - float collision; - float gravity; - float diffusion; - float hotair; - int falldown; - int flammable; - int explosive; - int meltable; - int hardness; - int menu; - int weight; - int menusection; - float heat; - unsigned char hconduct; - const char *descs; - const unsigned short properties; + const char *name; + pixel pcolors; + float advection; + float airdrag; + float airloss; + float loss; + float collision; + float gravity; + float diffusion; + float hotair; + int falldown; + int flammable; + int explosive; + int meltable; + int hardness; + int menu; + int weight; + int menusection; + float heat; + unsigned char hconduct; + const char *descs; + const unsigned short properties; }; typedef struct part_type part_type; struct part_state { - char state; - int solid; - float stemp; - int liquid; - float ltemp; - int gas; - float gtemp; - int burn; - float btemp; + char state; + int solid; + float stemp; + int liquid; + float ltemp; + int gas; + float gtemp; + int burn; + float btemp; }; typedef struct part_state part_state; //Should probably be const. @@ -196,173 +196,173 @@ typedef struct part_state part_state; * 1 = Gas || * 2 = Light || Liquids 0-49 * 98 = Heavy || Powder 50-99 - * 100 = Solid || + * 100 = Solid || * -1 is Neutrons and Photons */ static const part_type ptypes[PT_NUM] = { - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, - {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, - {"MORT", PIXPACK(0xE0E0E0), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Steam Train."}, - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, + {"MORT", PIXPACK(0xE0E0E0), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Steam Train."}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description }; static part_state pstates[PT_NUM] = { - // Name Solid Frzp Liquid Mpnt Gas Bpoint - /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, - /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, - /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, - /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, - /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, - /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, - /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, - /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, - /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, - /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, - /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, - /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + // Name Solid Frzp Liquid Mpnt Gas Bpoint + /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, + /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, + /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, + /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, + /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, + /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, + /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, + /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, + /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, + /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; extern int isplayer; diff --git a/src/graphics.c b/src/graphics.c index 9f45526da..b63e3847a 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -849,15 +849,15 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i #ifdef OpenGL #else int sx = x; - int rh = 12; - int rw = 0; - int cw = x; + int rh = 12; + int rw = 0; + int cw = x; for(; *s; s++) { if(*s == '\n') { x = sx; - rw = 0; + rw = 0; y += FONT_H+2; } else if(*s == '\b') @@ -887,15 +887,15 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i s++; } else - { - if(x-cw>=w){ - x = sx; - rw = 0; - y+=FONT_H+2; - rh+=FONT_H+2; - } + { + if(x-cw>=w) { + x = sx; + rw = 0; + y+=FONT_H+2; + rh+=FONT_H+2; + } x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } + } } #endif return rh; @@ -1476,20 +1476,20 @@ void draw_parts(pixel *vid) cg = 0; cb = 0; cr = 0; - for(x=0; x<12; x++) { - cr += (parts[i].ctype >> (x+18)) & 1; - cb += (parts[i].ctype >> x) & 1; - } - for(x=0; x<14; x++) - cg += (parts[i].ctype >> (x+9)) & 1; - x = 624/(cr+cg+cb+1); - cr *= x; - cg *= x; - cb *= x; + for(x=0; x<12; x++) { + cr += (parts[i].ctype >> (x+18)) & 1; + cb += (parts[i].ctype >> x) & 1; + } + for(x=0; x<14; x++) + cg += (parts[i].ctype >> (x+9)) & 1; + x = 624/(cr+cg+cb+1); + cr *= x; + cg *= x; + cb *= x; vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr>255?255:cr,cg>255?255:cg,cb>255?255:cb); - cr >>= 4; - cg >>= 4; - cb >>= 4; + cr >>= 4; + cg >>= 4; + cb >>= 4; x = nx/CELL; y = ny/CELL; cg += fire_g[y][x]; @@ -1504,22 +1504,22 @@ void draw_parts(pixel *vid) } else { - cg = 0; - cb = 0; - cr = 0; - for(x=0; x<12; x++) { - cr += (parts[i].ctype >> (x+18)) & 1; - cb += (parts[i].ctype >> x) & 1; - } - for(x=0; x<14; x++) - cg += (parts[i].ctype >> (x+9)) & 1; - x = 624/(cr+cg+cb+1); - cr *= x; - cg *= x; - cb *= x; - cr = cr>255?255:cr; - cg = cg>255?255:cg; - cb = cb>255?255:cb; + cg = 0; + cb = 0; + cr = 0; + for(x=0; x<12; x++) { + cr += (parts[i].ctype >> (x+18)) & 1; + cb += (parts[i].ctype >> x) & 1; + } + for(x=0; x<14; x++) + cg += (parts[i].ctype >> (x+9)) & 1; + x = 624/(cr+cg+cb+1); + cr *= x; + cg *= x; + cb *= x; + cr = cr>255?255:cr; + cg = cg>255?255:cg; + cb = cb>255?255:cb; blendpixel(vid, nx, ny, cr, cg, cb, 192); blendpixel(vid, nx+1, ny, cr, cg, cb, 96); blendpixel(vid, nx-1, ny, cr, cg, cb, 96); @@ -1952,30 +1952,30 @@ void draw_parts(pixel *vid) } else if(t==PT_FIRE && parts[i].life) { - float ttemp = (float)((int)(parts[i].life/2)); - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = flm_data[caddress]; - uint8 G = flm_data[caddress+1]; - uint8 B = flm_data[caddress+2]; - if(cmode == 3||cmode==4 || cmode==6) - { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { + float ttemp = (float)((int)(parts[i].life/2)); + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = flm_data[caddress]; + uint8 G = flm_data[caddress+1]; + uint8 B = flm_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { cr = parts[i].life * 8; cg = parts[i].life * 2; cb = parts[i].life; @@ -1991,9 +1991,9 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - // Older Code - /*if(cmode == 3||cmode==4 || cmode==6) + } + // Older Code + /*if(cmode == 3||cmode==4 || cmode==6) { cr = parts[i].life / 4; cg = parts[i].life / 16; @@ -2137,28 +2137,28 @@ void draw_parts(pixel *vid) } if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_HFLM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH&&t!=PT_SMKE&&t!=PT_WTRV&&!(t==PT_FIRW&&parts[i].tmp==3)) { - if(t==PT_PHOT){ - cg = 0; - cb = 0; - cr = 0; - for(x=0; x<12; x++) { - cr += (parts[i].ctype >> (x+18)) & 1; - cb += (parts[i].ctype >> x) & 1; - } - for(x=0; x<14; x++) - cg += (parts[i].ctype >> (x+9)) & 1; - x = 624/(cr+cg+cb+1); - cr *= x; - cg *= x; - cb *= x; - cr = cr>255?255:cr; - cg = cg>255?255:cg; - cb = cb>255?255:cb; - } else { - cr = PIXR(ptypes[t].pcolors); - cg = PIXG(ptypes[t].pcolors); - cb = PIXB(ptypes[t].pcolors); - } + if(t==PT_PHOT) { + cg = 0; + cb = 0; + cr = 0; + for(x=0; x<12; x++) { + cr += (parts[i].ctype >> (x+18)) & 1; + cb += (parts[i].ctype >> x) & 1; + } + for(x=0; x<14; x++) + cg += (parts[i].ctype >> (x+9)) & 1; + x = 624/(cr+cg+cb+1); + cr *= x; + cg *= x; + cb *= x; + cr = cr>255?255:cr; + cg = cg>255?255:cg; + cb = cb>255?255:cb; + } else { + cr = PIXR(ptypes[t].pcolors); + cg = PIXG(ptypes[t].pcolors); + cb = PIXB(ptypes[t].pcolors); + } //if(vid[(ny-1)*YRES+(nx-1)]!=0){ // blendpixel(vid, nx, ny-1, R, G, B, 46); diff --git a/src/interface.c b/src/interface.c index eab027a97..3ed4431b4 100644 --- a/src/interface.c +++ b/src/interface.c @@ -1871,8 +1871,8 @@ int search_ui(pixel *vid_buf) drawtext(vid_buf, XRES-61+16, 11, "\x93", 255, 255, 255, 255); drawtext(vid_buf, XRES-46+16, 13, "My Own", 255, 255, 255, 255); } - - if(search_fav) + + if(search_fav) { fillrect(vid_buf, XRES-134, 7, 18, 18, 255, 255, 255, 255); drawtext(vid_buf, XRES-130, 11, "\xCC", 192, 160, 64, 255); @@ -2155,7 +2155,7 @@ int search_ui(pixel *vid_buf) search_date = !search_date; lasttime = TIMEOUT; } - if(b && !bq && mx>=XRES-134 && mx<=XRES-134+16 && my>=8 && my<=24) + if(b && !bq && mx>=XRES-134 && mx<=XRES-134+16 && my>=8 && my<=24) { search_fav = !search_fav; lasttime = TIMEOUT; @@ -2197,10 +2197,10 @@ int search_ui(pixel *vid_buf) if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { - if(open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1){ - goto finish; - } - /* + if(open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1) { + goto finish; + } + /* fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); info_box(vid_buf, "Loading..."); @@ -2349,7 +2349,7 @@ int search_ui(pixel *vid_buf) last_own = search_own; last_date = search_date; last_page = search_page; - last_fav = search_fav; + last_fav = search_fav; active = 1; // TODO: Create a better fix for this bug uri = malloc(strlen(last)*3+180+strlen(SERVER)+strlen(svf_user)+20); //Increase "padding" from 80 to 180 to fix the search memory corruption bug @@ -2381,10 +2381,10 @@ int search_ui(pixel *vid_buf) strcaturl(uri, " user:"); strcaturl(uri, svf_user); } - if(search_fav) - { - strcaturl(uri, " cat:favs"); - } + if(search_fav) + { + strcaturl(uri, " cat:favs"); + } if(search_date) strcaturl(uri, " sort:date"); @@ -2524,71 +2524,71 @@ finish: int open_ui(pixel *vid_buf, char *save_id, char *save_date) { - int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawnthumb=0,authoritah=0,queue_open=0,data_size=0,retval=0; - char *uri, *uri_2; - void *data, *info_data; - save_info *info = malloc(sizeof(save_info)); - void *http = NULL, *http_2 = NULL; + int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawnthumb=0,authoritah=0,queue_open=0,data_size=0,retval=0; + char *uri, *uri_2; + void *data, *info_data; + save_info *info = malloc(sizeof(save_info)); + void *http = NULL, *http_2 = NULL; int lasttime = TIMEOUT; - int status, status_2, info_ready = 0, data_ready = 0; - time_t http_last_use = HTTP_TIMEOUT, http_last_use_2 = HTTP_TIMEOUT; - pixel *save_pic;// = malloc((XRES/2)*(YRES/2)); + int status, status_2, info_ready = 0, data_ready = 0; + time_t http_last_use = HTTP_TIMEOUT, http_last_use_2 = HTTP_TIMEOUT; + pixel *save_pic;// = malloc((XRES/2)*(YRES/2)); - pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); - fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); - fillrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 0, 0, 0, 255); - drawrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 255, 255, 255, 255); - drawrect(vid_buf, 50, 50, (XRES/2)+1, (YRES/2)+1, 255, 255, 255, 155); - drawrect(vid_buf, 50+(XRES/2)+1, 50, XRES+BARSIZE-100-((XRES/2)+1), YRES+MENUSIZE-100, 155, 155, 155, 255); - drawtext(vid_buf, 50+(XRES/4)-textwidth("Loading...")/2, 50+(YRES/4), "Loading...", 255, 255, 255, 128); + fillrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 0, 0, 0, 255); + drawrect(vid_buf, 50, 50, XRES+BARSIZE-100, YRES+MENUSIZE-100, 255, 255, 255, 255); + drawrect(vid_buf, 50, 50, (XRES/2)+1, (YRES/2)+1, 255, 255, 255, 155); + drawrect(vid_buf, 50+(XRES/2)+1, 50, XRES+BARSIZE-100-((XRES/2)+1), YRES+MENUSIZE-100, 155, 155, 155, 255); + drawtext(vid_buf, 50+(XRES/4)-textwidth("Loading...")/2, 50+(YRES/4), "Loading...", 255, 255, 255, 128); memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - - while(!sdl_poll()) + + while(!sdl_poll()) { b = SDL_GetMouseState(&mx, &my); if(!b) break; } - //Begin Async loading of data - if(save_date) { - // We're loading an historical save - uri = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(SERVER)+71); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, save_id); - strappend(uri, "&Date="); - strcaturl(uri, save_date); + //Begin Async loading of data + if(save_date) { + // We're loading an historical save + uri = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(SERVER)+71); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, save_id); + strappend(uri, "&Date="); + strcaturl(uri, save_date); - uri_2 = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(SERVER)+71); - strcpy(uri_2, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri_2, save_id); - strappend(uri_2, "&Date="); - strcaturl(uri_2, save_date); - } else { - //We're loading a normal save + uri_2 = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(SERVER)+71); + strcpy(uri_2, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri_2, save_id); + strappend(uri_2, "&Date="); + strcaturl(uri_2, save_date); + } else { + //We're loading a normal save uri = malloc(strlen(save_id)*3+strlen(SERVER)+64); strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); strcaturl(uri, save_id); - uri_2 = malloc(strlen(save_id)*3+strlen(SERVER)+64); + uri_2 = malloc(strlen(save_id)*3+strlen(SERVER)+64); strcpy(uri_2, "http://" SERVER "/Info.api?ID="); strcaturl(uri_2, save_id); } - http = http_async_req_start(http, uri, NULL, 0, 1); - http_2 = http_async_req_start(http_2, uri_2, NULL, 0, 1); - if(svf_login) + http = http_async_req_start(http, uri, NULL, 0, 1); + http_2 = http_async_req_start(http_2, uri_2, NULL, 0, 1); + if(svf_login) { - http_auth_headers(http, svf_user, svf_pass); - http_auth_headers(http_2, svf_user, svf_pass); + http_auth_headers(http, svf_user, svf_pass); + http_auth_headers(http_2, svf_user, svf_pass); } http_last_use = time(NULL); - http_last_use_2 = time(NULL); + http_last_use_2 = time(NULL); free(uri); - free(uri_2); - active = 1; - active_2 = 1; + free(uri_2); + active = 1; + active_2 = 1; while(!sdl_poll()) { bq = b; @@ -2596,188 +2596,188 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) mx /= sdl_scale; my /= sdl_scale; - if(active && http_async_req_status(http)) + if(active && http_async_req_status(http)) { - int imgh, imgw, nimgh, nimgw; + int imgh, imgw, nimgh, nimgw; http_last_use = time(NULL); data = http_async_req_stop(http, &status, &data_size); if(status == 200) { - pixel *full_save = prerender_save(data, data_size, &imgw, &imgh); - save_pic = rescale_img(full_save, imgw, imgh, &thumb_w, &thumb_h, 2); + pixel *full_save = prerender_save(data, data_size, &imgw, &imgh); + save_pic = rescale_img(full_save, imgw, imgh, &thumb_w, &thumb_h, 2); data_ready = 1; - free(full_save); + free(full_save); } - active = 0; - free(http); - http = NULL; + active = 0; + free(http); + http = NULL; } - if(active_2 && http_async_req_status(http_2)) + if(active_2 && http_async_req_status(http_2)) { http_last_use_2 = time(NULL); info_data = http_async_req_stop(http_2, &status_2, NULL); if(status_2 == 200) { info_ready = info_parse(info_data, info); - if(info_ready==-1){ - error_ui(vid_buf, 0, "Not found"); - break; - } + if(info_ready==-1) { + error_ui(vid_buf, 0, "Not found"); + break; + } } free(info_data); active_2 = 0; - free(http_2); - http_2 = NULL; + free(http_2); + http_2 = NULL; } - if(data_ready && !hasdrawnthumb){ - draw_image(vid_buf, save_pic, 51, 51, thumb_w, thumb_h, 255); - hasdrawnthumb = 1; - memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - } - if(info_ready && !hasdrawninfo){ - //drawtext(vid_buf, 2, 2, info->name, 255, 255, 255, 255); - cix = drawtext(vid_buf, 60, (YRES/2)+60, info->name, 255, 255, 255, 255); - cix = drawtext(vid_buf, 60, (YRES/2)+72, "Author:", 255, 255, 255, 155); - cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->author, 255, 255, 255, 255); - cix = drawtext(vid_buf, cix+4, (YRES/2)+72, "Date:", 255, 255, 255, 155); - cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->date, 255, 255, 255, 255); - drawtextwrap(vid_buf, 62, (YRES/2)+86, (XRES/2)-24, info->description, 255, 255, 255, 200); + if(data_ready && !hasdrawnthumb) { + draw_image(vid_buf, save_pic, 51, 51, thumb_w, thumb_h, 255); + hasdrawnthumb = 1; + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + } + if(info_ready && !hasdrawninfo) { + //drawtext(vid_buf, 2, 2, info->name, 255, 255, 255, 255); + cix = drawtext(vid_buf, 60, (YRES/2)+60, info->name, 255, 255, 255, 255); + cix = drawtext(vid_buf, 60, (YRES/2)+72, "Author:", 255, 255, 255, 155); + cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->author, 255, 255, 255, 255); + cix = drawtext(vid_buf, cix+4, (YRES/2)+72, "Date:", 255, 255, 255, 155); + cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->date, 255, 255, 255, 255); + drawtextwrap(vid_buf, 62, (YRES/2)+86, (XRES/2)-24, info->description, 255, 255, 255, 200); - ccy = 0; - for(cc=0;cccomment_count;cc++){ - drawtext(vid_buf, 60+(XRES/2)+1, ccy+60, info->commentauthors[cc], 255, 255, 255, 255); - ccy += 12; - ccy += drawtextwrap(vid_buf, 60+(XRES/2)+1, ccy+60, XRES+BARSIZE-100-((XRES/2)+1)-20, info->comments[cc], 255, 255, 255, 185); - ccy += 10; - draw_line(vid_buf, 50+(XRES/2)+2, ccy+52, XRES+BARSIZE-50, ccy+52, 100, 100, 100, XRES+BARSIZE); - } - hasdrawninfo = 1; - authoritah = svf_login && (!strcmp(info->author, svf_user) || svf_admin || svf_mod); - memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - } + ccy = 0; + for(cc=0; cccomment_count; cc++) { + drawtext(vid_buf, 60+(XRES/2)+1, ccy+60, info->commentauthors[cc], 255, 255, 255, 255); + ccy += 12; + ccy += drawtextwrap(vid_buf, 60+(XRES/2)+1, ccy+60, XRES+BARSIZE-100-((XRES/2)+1)-20, info->comments[cc], 255, 255, 255, 185); + ccy += 10; + draw_line(vid_buf, 50+(XRES/2)+2, ccy+52, XRES+BARSIZE-50, ccy+52, 100, 100, 100, XRES+BARSIZE); + } + hasdrawninfo = 1; + authoritah = svf_login && (!strcmp(info->author, svf_user) || svf_admin || svf_mod); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + } - if(queue_open){ - if(info_ready && data_ready){ - // Do Open! - status = parse_save(data, data_size, 1, 0, 0); - if(!status){ - //if(svf_last) - //free(svf_last); - svf_last = data; - svf_lsize = data_size; - - svf_open = 1; - svf_own = svf_login && !strcmp(info->author, svf_user); - svf_publish = info->publish && svf_login && !strcmp(info->author, svf_user); - - strcpy(svf_id, save_id); - strcpy(svf_name, info->name); - if(info->tags) - { - strncpy(svf_tags, info->tags, 255); - svf_tags[255] = 0; - } else { - svf_tags[0] = 0; - } - svf_myvote = info->myvote; - retval = 1; - break; - } else { - queue_open = 0; - - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - error_ui(vid_buf, 0, "An Error Occurred"); - } - } else { - fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 190); - drawtext(vid_buf, XRES+BARSIZE/2, XRES+MENUSIZE, "Loading...", 0, 0, 0, 200); - } - } + if(queue_open) { + if(info_ready && data_ready) { + // Do Open! + status = parse_save(data, data_size, 1, 0, 0); + if(!status) { + //if(svf_last) + //free(svf_last); + svf_last = data; + svf_lsize = data_size; - //Open Button - if(sdl_key==SDLK_RETURN){ + svf_open = 1; + svf_own = svf_login && !strcmp(info->author, svf_user); + svf_publish = info->publish && svf_login && !strcmp(info->author, svf_user); + + strcpy(svf_id, save_id); + strcpy(svf_name, info->name); + if(info->tags) + { + strncpy(svf_tags, info->tags, 255); + svf_tags[255] = 0; + } else { + svf_tags[0] = 0; + } + svf_myvote = info->myvote; + retval = 1; + break; + } else { + queue_open = 0; + + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + error_ui(vid_buf, 0, "An Error Occurred"); + } + } else { + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 190); + drawtext(vid_buf, XRES+BARSIZE/2, XRES+MENUSIZE, "Loading...", 0, 0, 0, 200); + } + } + + //Open Button + if(sdl_key==SDLK_RETURN) { queue_open = 1; - } - drawrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 93, YRES+MENUSIZE-63, "Open", 255, 255, 255, 255); - drawtext(vid_buf, 78, YRES+MENUSIZE-64, "\x81", 255, 255, 255, 255); - if(mx > 70 && mx < 70+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ - fillrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq){ - queue_open = 1; - } - } - - //Fav Button - if(svf_login){ - drawrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 162, YRES+MENUSIZE-63, "Fav.", 255, 255, 255, 255); - drawtext(vid_buf, 147, YRES+MENUSIZE-64, "\xCC", 255, 255, 255, 255); - if(mx > 140 && mx < 140+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ - fillrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq){ - //Button Clicked - } - } - } + } + drawrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 93, YRES+MENUSIZE-63, "Open", 255, 255, 255, 255); + drawtext(vid_buf, 78, YRES+MENUSIZE-64, "\x81", 255, 255, 255, 255); + if(mx > 70 && mx < 70+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { + fillrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + queue_open = 1; + } + } - //Report Button - if(svf_login){ - drawrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 228, YRES+MENUSIZE-63, "Report", 255, 255, 255, 255); - drawtext(vid_buf, 218, YRES+MENUSIZE-63, "!", 255, 255, 255, 255); - if(mx > 210 && mx < 210+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ - fillrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq){ - //Button Clicked - } - } - } - - //Delete Button - if(authoritah){ - drawrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 298, YRES+MENUSIZE-63, "Delete", 255, 255, 255, 255); - drawtext(vid_buf, 286, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, 255); - if(mx > 280 && mx < 280+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50){ - fillrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq){ - //Button Clicked - } - } - } + //Fav Button + if(svf_login) { + drawrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 162, YRES+MENUSIZE-63, "Fav.", 255, 255, 255, 255); + drawtext(vid_buf, 147, YRES+MENUSIZE-64, "\xCC", 255, 255, 255, 255); + if(mx > 140 && mx < 140+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { + fillrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + } + } + } + + //Report Button + if(svf_login) { + drawrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 228, YRES+MENUSIZE-63, "Report", 255, 255, 255, 255); + drawtext(vid_buf, 218, YRES+MENUSIZE-63, "!", 255, 255, 255, 255); + if(mx > 210 && mx < 210+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { + fillrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + } + } + } + + //Delete Button + if(authoritah) { + drawrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, 298, YRES+MENUSIZE-63, "Delete", 255, 255, 255, 255); + drawtext(vid_buf, 286, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, 255); + if(mx > 280 && mx < 280+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { + fillrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + } + } + } - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); if(sdl_key==SDLK_ESCAPE) break; - if(lasttimetitle = mystrdup(info_data+6); j++; } - else if(!strncmp(info_data, "NAME ", 5)) + else if(!strncmp(info_data, "NAME ", 5)) { info->name = mystrdup(info_data+5); j++; } - else if(!strncmp(info_data, "AUTHOR ", 7)) + else if(!strncmp(info_data, "AUTHOR ", 7)) { info->author = mystrdup(info_data+7); j++; } - else if(!strncmp(info_data, "DATE ", 5)) + else if(!strncmp(info_data, "DATE ", 5)) { info->date = mystrdup(info_data+5); j++; } - else if(!strncmp(info_data, "DESCRIPTION ", 12)) + else if(!strncmp(info_data, "DESCRIPTION ", 12)) { info->description = mystrdup(info_data+12); j++; } - else if(!strncmp(info_data, "VOTEUP ", 7)) + else if(!strncmp(info_data, "VOTEUP ", 7)) { info->voteup = atoi(info_data+7); j++; } - else if(!strncmp(info_data, "VOTEDOWN ", 9)) + else if(!strncmp(info_data, "VOTEDOWN ", 9)) { info->votedown = atoi(info_data+9); j++; } - else if(!strncmp(info_data, "VOTE ", 5)) + else if(!strncmp(info_data, "VOTE ", 5)) { info->vote = atoi(info_data+5); j++; } - else if(!strncmp(info_data, "MYVOTE ", 7)) + else if(!strncmp(info_data, "MYVOTE ", 7)) { info->myvote = atoi(info_data+7); j++; } - else if(!strncmp(info_data, "MYFAV ", 6)) + else if(!strncmp(info_data, "MYFAV ", 6)) { info->myfav = atoi(info_data+6); j++; } - else if(!strncmp(info_data, "PUBLISH ", 8)) + else if(!strncmp(info_data, "PUBLISH ", 8)) { - info->publish = atoi(info_data+8); + info->publish = atoi(info_data+8); j++; } - else if(!strncmp(info_data, "TAGS ", 5)) + else if(!strncmp(info_data, "TAGS ", 5)) { info->tags = mystrdup(info_data+5); j++; } - else if(!strncmp(info_data, "COMMENT ", 8)) + else if(!strncmp(info_data, "COMMENT ", 8)) { - if(info->comment_count>=6){ - info_data = p; - continue; - } else { - q = strchr(info_data+8, ' '); - *(q++) = 0; - info->commentauthors[info->comment_count] = mystrdup(info_data+8); - info->comments[info->comment_count] = mystrdup(q); - info->comment_count++; - } + if(info->comment_count>=6) { + info_data = p; + continue; + } else { + q = strchr(info_data+8, ' '); + *(q++) = 0; + info->commentauthors[info->comment_count] = mystrdup(info_data+8); + info->comments[info->comment_count] = mystrdup(q); + info->comment_count++; + } j++; } - info_data = p; + info_data = p; + } + if(j>=8) { + return 1; + } else { + return -1; } - if(j>=8){ - return 1; - } else { - return -1; - } } int search_results(char *str, int votes) diff --git a/src/main.c b/src/main.c old mode 100755 new mode 100644 index 77133f98b..5ef9ce304 --- a/src/main.c +++ b/src/main.c @@ -272,9 +272,9 @@ void *build_save(int *size, int x0, int y0, int w, int h) y = (int)(parts[i].y+0.5f); if(x>=x0 && x=y0 && y= size) goto corrupt; j=d[p++]; - if(j >= PT_NUM){ - //TODO: Possibly some server side translation - j = PT_DUST;//goto corrupt; - } + if(j >= PT_NUM) { + //TODO: Possibly some server side translation + j = PT_DUST;//goto corrupt; + } if(j)// && !(isplayer == 1 && j==PT_STKM)) { if(pmap[y][x]) { k = pmap[y][x]>>8; parts[k].type = j; - if(j == PT_PHOT) - parts[k].ctype = 0x3fffffff; + if(j == PT_PHOT) + parts[k].ctype = 0x3fffffff; parts[k].x = (float)x; parts[k].y = (float)y; m[(x-x0)+(y-y0)*w] = k+1; @@ -526,8 +526,8 @@ int parse_save(void *save, int size, int replace, int x0, int y0) else if(i < nf) { parts[fp[i]].type = j; - if(j == PT_PHOT) - parts[fp[i]].ctype = 0x3fffffff; + if(j == PT_PHOT) + parts[fp[i]].ctype = 0x3fffffff; parts[fp[i]].x = (float)x; parts[fp[i]].y = (float)y; m[(x-x0)+(y-y0)*w] = fp[i]+1; diff --git a/src/powder.c b/src/powder.c index 2d2e09900..9dca982fb 100644 --- a/src/powder.c +++ b/src/powder.c @@ -26,10 +26,10 @@ static int pn_junction_sprk(int x, int y, int pt) { unsigned r = pmap[y][x]; if((r & 0xFF) != pt) - return 0; + return 0; r >>= 8; if(parts[r].type != pt) - return 0; + return 0; parts[r].ctype = pt; parts[r].type = PT_SPRK; @@ -42,16 +42,16 @@ static void photoelectric_effect(int nx, int ny) unsigned r = pmap[ny][nx]; if((r&0xFF) == PT_PSCN) { - if((pmap[ny][nx-1] & 0xFF) == PT_NSCN || - (pmap[ny][nx+1] & 0xFF) == PT_NSCN || - (pmap[ny-1][nx] & 0xFF) == PT_NSCN || - (pmap[ny+1][nx] & 0xFF) == PT_NSCN) - pn_junction_sprk(nx, ny, PT_PSCN); + if((pmap[ny][nx-1] & 0xFF) == PT_NSCN || + (pmap[ny][nx+1] & 0xFF) == PT_NSCN || + (pmap[ny-1][nx] & 0xFF) == PT_NSCN || + (pmap[ny+1][nx] & 0xFF) == PT_NSCN) + pn_junction_sprk(nx, ny, PT_PSCN); } } /* RETURN-value explenation -1 = Swap +1 = Swap 0 = No move/Bounce 2 = Both particles occupy the same space. */ @@ -69,16 +69,13 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) *rr = r; if((r&0xFF)==PT_VOID || (r&0xFF)==PT_BHOL) - return 1; - - if(pt==PT_NEUT && (r&0xFF)==PT_GLAS) - return 2; + return 1; if(pt==PT_PHOT&&( (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || - (r&0xFF)==PT_GLOW || - (r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || + (r&0xFF)==PT_GLOW || (r&0xFF)==PT_WATR || + (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || ((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) return 2; @@ -99,17 +96,19 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) return 0; if(pt == PT_PHOT) - return 2; - - if(pt == PT_NEUT) + return 0; + if(pt == PT_NEUT) return 1; - if((r&0xFF) == PT_NEUT) + if(pt == PT_NEUT && (r&0xFF == PT_WATR||r&0xFF == PT_SLTW ||r&0xFF == PT_DSTW)) + return 2; + + if((r&0xFF) == PT_NEUT) return 0; - - if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight <= ptypes[(r&0xFF)].weight))) + + if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight <= ptypes[(r&0xFF)].weight))) return 0; - - + + return 1; } @@ -127,32 +126,38 @@ int try_move(int i, int x, int y, int nx, int ny) /* half-silvered mirror */ if(!e && parts[i].type==PT_PHOT && - (((r&0xFF)==PT_BMTL && rand()>8].temp = parts[i].temp; + if((r & 0xFF) < PT_NUM) - parts[i].temp = parts[r>>8].temp = - restrict_flt((parts[r>>8].temp+parts[i].temp)/2, MIN_TEMP, MAX_TEMP); + parts[i].temp = parts[r>>8].temp = restrict_flt((parts[r>>8].temp+parts[i].temp)/2, MIN_TEMP, MAX_TEMP); } return 0; } - if(e == 2) { - if(parts[i].type == PT_PHOT && (r&0xFF)==PT_GLOW && !parts[r>>8].life) - if(rand() < RAND_MAX/30) { - parts[r>>8].life = 120; - create_gain_photon(i); - } - if(parts[i].type == PT_NEUT && (r&0xFF)==PT_GLAS) { - if(rand() < RAND_MAX/10) - create_cherenkov_photon(i); - } + + if(e == 2) + { + if(parts[i].type == PT_PHOT && (r&0xFF)==PT_GLOW && !parts[r>>8].life) + if(rand() < RAND_MAX/30) + { + parts[r>>8].life = 120; + create_gain_photon(i); + } + + if(parts[i].type == PT_NEUT && (r&0xFF)==PT_GLAS) { + if(rand() < RAND_MAX/10) + create_cherenkov_photon(i); + } return 1; - } + } if((r&0xFF)==PT_VOID) { @@ -181,13 +186,13 @@ int try_move(int i, int x, int y, int nx, int ny) return 0; if(parts[i].type == PT_PHOT) - return 1; + return 1; e = r >> 8; if(r && e=0 && y>=0 && x=0 && y>=0 && x>8].type = PT_SPRK; @@ -500,15 +505,15 @@ inline int create_part(int p, int x, int y, int t) parts[i].vx = r*cosf(a); parts[i].vy = r*sinf(a); } - if(t==PT_MORT) - { - parts[i].vx = 2; - } + if(t==PT_MORT) + { + parts[i].vx = 2; + } if(t==PT_PHOT) { - float a = (rand()%8) * 0.78540f; + float a = (rand()%8) * 0.78540f; parts[i].life = 680; - parts[i].ctype = 0x3FFFFFFF; + parts[i].ctype = 0x3FFFFFFF; parts[i].vx = 3.0f*cosf(a); parts[i].vy = 3.0f*sinf(a); } @@ -569,10 +574,10 @@ static void create_gain_photon(int pp) lr = rand() % 2; if(lr) { - xx = parts[pp].x - 0.3*parts[pp].vy; + xx = parts[pp].x - 0.3*parts[pp].vy; yy = parts[pp].y + 0.3*parts[pp].vx; } else { - xx = parts[pp].x + 0.3*parts[pp].vy; + xx = parts[pp].x + 0.3*parts[pp].vy; yy = parts[pp].y - 0.3*parts[pp].vx; } @@ -580,10 +585,10 @@ static void create_gain_photon(int pp) ny = (int)(yy + 0.5f); if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) - return; + return; if((pmap[ny][nx] & 0xFF) != PT_GLOW) - return; + return; pfree = parts[i].life; @@ -614,10 +619,10 @@ static void create_cherenkov_photon(int pp) nx = (int)(parts[pp].x + 0.5f); ny = (int)(parts[pp].y + 0.5f); if((pmap[ny][nx] & 0xFF) != PT_GLAS) - return; + return; if(hypotf(parts[pp].vx, parts[pp].vy) < 1.44f) - return; + return; pfree = parts[i].life; @@ -632,11 +637,11 @@ static void create_cherenkov_photon(int pp) parts[i].tmp = 0; if(lr) { - parts[i].vx = parts[pp].vx - 2.5f*parts[pp].vy; - parts[i].vy = parts[pp].vy + 2.5f*parts[pp].vx; + parts[i].vx = parts[pp].vx - 2.5f*parts[pp].vy; + parts[i].vy = parts[pp].vy + 2.5f*parts[pp].vx; } else { - parts[i].vx = parts[pp].vx + 2.5f*parts[pp].vy; - parts[i].vy = parts[pp].vy - 2.5f*parts[pp].vx; + parts[i].vx = parts[pp].vx + 2.5f*parts[pp].vy; + parts[i].vy = parts[pp].vy - 2.5f*parts[pp].vx; } /* photons have speed of light. no discussion. */ @@ -686,18 +691,18 @@ int get_wavelength_bin(int *wm) int i, w0=30, wM=0; if(!*wm) - return -1; + return -1; for(i=0; i<30; i++) - if(*wm & (1< wM) - wM = i; - } + if(*wm & (1< wM) + wM = i; + } if(wM-w0 < 5) - return (wM+w0)/2; + return (wM+w0)/2; i = rand() % (wM-w0-3); i += w0; @@ -1288,67 +1293,67 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - else if(t==PT_BMTL){ - if(parts[i].tmp>1){ - parts[i].tmp--; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - rt =parts[r>>8].type; - if((rt==PT_METL || rt==PT_IRON) && 1>(rand()/(RAND_MAX/100))) - { - parts[r>>8].type=PT_BMTL; - parts[r>>8].tmp=(parts[i].tmp<=7)?parts[i].tmp=1:parts[i].tmp-(rand()%5);//rand()/(RAND_MAX/300)+100; - } - } - } else if(parts[i].tmp==1 && 1>rand()%1000){ - parts[i].tmp = 0; - t = parts[i].type = PT_BRMT; - } - } - - else if(t==PT_IRON){ - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((((r&0xFF) == PT_SALT && 15>(rand()/(RAND_MAX/700))) || - ((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/2000))) || - ((r&0xFF) == PT_WATR && 5 >(rand()/(RAND_MAX/6000))) || - ((r&0xFF) == PT_O2 && 2 >(rand()/(RAND_MAX/500))) || - ((r&0xFF) == PT_LO2))&& - (!(parts[i].life)) - ) - { - parts[i].type=PT_BMTL; - parts[i].tmp=(rand()/(RAND_MAX/10))+20; - } - } - } - else if((t==PT_SPRK||parts[i].type==PT_SPRK) && parts[i].ctype==PT_IRON){ - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF) == PT_DSTW && 30>(rand()/(RAND_MAX/1000))) || - ((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/1000))) || - ((r&0xFF) == PT_WATR && 30>(rand()/(RAND_MAX/1000)))) - { - parts[r>>8].type=PT_O2; - //parts[r>>8].tmp=(rand()/(RAND_MAX/10))+20; - } - } - } + else if(t==PT_BMTL) { + if(parts[i].tmp>1) { + parts[i].tmp--; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + rt =parts[r>>8].type; + if((rt==PT_METL || rt==PT_IRON) && 1>(rand()/(RAND_MAX/100))) + { + parts[r>>8].type=PT_BMTL; + parts[r>>8].tmp=(parts[i].tmp<=7)?parts[i].tmp=1:parts[i].tmp-(rand()%5);//rand()/(RAND_MAX/300)+100; + } + } + } else if(parts[i].tmp==1 && 1>rand()%1000) { + parts[i].tmp = 0; + t = parts[i].type = PT_BRMT; + } + } + + else if(t==PT_IRON) { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((((r&0xFF) == PT_SALT && 15>(rand()/(RAND_MAX/700))) || + ((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/2000))) || + ((r&0xFF) == PT_WATR && 5 >(rand()/(RAND_MAX/6000))) || + ((r&0xFF) == PT_O2 && 2 >(rand()/(RAND_MAX/500))) || + ((r&0xFF) == PT_LO2))&& + (!(parts[i].life)) + ) + { + parts[i].type=PT_BMTL; + parts[i].tmp=(rand()/(RAND_MAX/10))+20; + } + } + } + else if((t==PT_SPRK||parts[i].type==PT_SPRK) && parts[i].ctype==PT_IRON) { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF) == PT_DSTW && 30>(rand()/(RAND_MAX/1000))) || + ((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/1000))) || + ((r&0xFF) == PT_WATR && 30>(rand()/(RAND_MAX/1000)))) + { + parts[r>>8].type=PT_O2; + //parts[r>>8].tmp=(rand()/(RAND_MAX/10))+20; + } + } + } else if(t==PT_COAL) { if(parts[i].life<=0) { @@ -1420,15 +1425,15 @@ void update_particles_i(pixel *vid, int start, int inc) //t = parts[i].life = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_PLSM); - if(r!=-1) - parts[r].life = 50; + if(r!=-1) + parts[r].life = 50; //goto killed; } else if (parts[i].life < 40) { parts[i].life--; if((rand()%100)==0) { r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - if(r!=-1) - parts[r].life = 50; + if(r!=-1) + parts[r].life = 50; } } if((pv[y/CELL][x/CELL] > 2.7f)&&parts[i].tmp>40) @@ -1463,15 +1468,15 @@ void update_particles_i(pixel *vid, int start, int inc) //t = PT_NONE; kill_part(i); r = create_part(-1, x, y, PT_PLSM); - if(r!=-1) - parts[r].life = 50; + if(r!=-1) + parts[r].life = 50; //goto killed; } else if (parts[i].life < 40) { parts[i].life--; if((rand()%10)==0) { r = create_part(-1, (nx=x+rand()%3-1), (ny=y+rand()%3-1), PT_PLSM); - if(r!=-1) - parts[r].life = 50; + if(r!=-1) + parts[r].life = 50; } } for(nx=-2; nx<3; nx++) @@ -1777,9 +1782,9 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - else if(t==PT_MORT){ - create_part(-1, x, y-1, PT_SMKE); - } + else if(t==PT_MORT) { + create_part(-1, x, y-1, PT_SMKE); + } else if(t==PT_LCRY) { for(nx=-1; nx<2; nx++) @@ -1946,7 +1951,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } else if(parts[i].tmp==2) { - int col = rand()%200+4; + int col = rand()%200+4; for(nx=-2; nx<3; nx++) { for(ny=-2; ny<3; ny++) { if(x+nx>=0 && y+ny>0 && x+nx>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - !(t==PT_PHOT && rt==PT_INSL) && + !(t==PT_PHOT && rt==PT_INSL) && (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_IRON && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { @@ -2621,8 +2626,8 @@ killed: parts[i].ctype = pmap[y+ny][x+nx]&0xFF; } else { - create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); - } + create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); + } } if(parts[i].type==PT_PCLN) @@ -2641,21 +2646,21 @@ killed: (pmap[y+ny][x+nx]&0xFF)!=PT_STKM && (pmap[y+ny][x+nx]&0xFF)!=0xFF) parts[i].ctype = pmap[y+ny][x+nx]&0xFF; - if(parts[i].ctype && parts[i].life==10){ - if(parts[i].ctype==PT_PHOT){ - for(nx=-1; nx<2; nx++){ - for(ny=-1; ny<2; ny++){ - r = create_part(-1, x+nx, y+ny, parts[i].ctype); - if(r!=-1){ - parts[r].vx = nx*3; - parts[r].vy = ny*3; - } - } - } - } else { - create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); - } - } + if(parts[i].ctype && parts[i].life==10) { + if(parts[i].ctype==PT_PHOT) { + for(nx=-1; nx<2; nx++) { + for(ny=-1; ny<2; ny++) { + r = create_part(-1, x+nx, y+ny, parts[i].ctype); + if(r!=-1) { + parts[r].vx = nx*3; + parts[r].vy = ny*3; + } + } + } + } else { + create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); + } + } } if(t==PT_YEST) { @@ -2697,7 +2702,7 @@ killed: lt = pmap[y][x] & 0xFF; - r = eval_move(PT_PHOT, nx, ny, NULL); + r = eval_move(PT_PHOT, nx, ny, NULL); if(((rt==PT_GLAS && lt!=PT_GLAS) || (rt!=PT_GLAS && lt==PT_GLAS)) && r) { if(!get_normal_interp(REFRACT|parts[i].type, x, y, parts[i].vx, parts[i].vy, &nrx, &nry)) { @@ -2705,13 +2710,13 @@ killed: continue; } - r = get_wavelength_bin(&parts[i].ctype); - if(r == -1) { - kill_part(i); - continue; - } - nn = GLASS_IOR - GLASS_DISP*(r-15)/15.0f; - nn *= nn; + r = get_wavelength_bin(&parts[i].ctype); + if(r == -1) { + kill_part(i); + continue; + } + nn = GLASS_IOR - GLASS_DISP*(r-15)/15.0f; + nn *= nn; nrx = -nrx; nry = -nry; @@ -2722,10 +2727,10 @@ killed: if(ct2 < 0.0f) { parts[i].vx -= 2.0f*ct1*nrx; parts[i].vy -= 2.0f*ct1*nry; - parts[i].x = lx; - parts[i].y = ly; - nx = (int)(lx + 0.5f); - ny = (int)(ly + 0.5f); + parts[i].x = lx; + parts[i].y = ly; + nx = (int)(lx + 0.5f); + ny = (int)(ly + 0.5f); } else { ct2 = sqrtf(ct2); ct2 = ct2 - nn*ct1; @@ -2855,25 +2860,25 @@ killed: } else if(t==PT_NEUT || t==PT_PHOT) { - r = pmap[ny][nx]; + r = pmap[ny][nx]; - /* this should be replaced with a particle type attribute ("photwl" or something) */ - if((r & 0xFF) == PT_PSCN) parts[i].ctype = 0x00000000; - if((r & 0xFF) == PT_NSCN) parts[i].ctype = 0x00000000; - if((r & 0xFF) == PT_SPRK) parts[i].ctype = 0x00000000; - if((r & 0xFF) == PT_COAL) parts[i].ctype = 0x00000000; - if((r & 0xFF) == PT_BCOL) parts[i].ctype = 0x00000000; - if((r & 0xFF) == PT_PLEX) parts[i].ctype &= 0x1F00003E; - if((r & 0xFF) == PT_NITR) parts[i].ctype &= 0x0007C000; - if((r & 0xFF) == PT_NBLE) parts[i].ctype &= 0x3FFF8000; - if((r & 0xFF) == PT_LAVA) parts[i].ctype &= 0x3FF00000; - if((r & 0xFF) == PT_ACID) parts[i].ctype &= 0x1FE001FE; - if((r & 0xFF) == PT_DUST) parts[i].ctype &= 0x3FFFFFC0; - if((r & 0xFF) == PT_SNOW) parts[i].ctype &= 0x03FFFFFF; - if((r & 0xFF) == PT_GOO) parts[i].ctype &= 0x3FFAAA00; - if((r & 0xFF) == PT_PLNT) parts[i].ctype &= 0x0007C000; - if((r & 0xFF) == PT_PLUT) parts[i].ctype &= 0x001FCE00; - if((r & 0xFF) == PT_URAN) parts[i].ctype &= 0x003FC000; + /* this should be replaced with a particle type attribute ("photwl" or something) */ + if((r & 0xFF) == PT_PSCN) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_NSCN) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_SPRK) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_COAL) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_BCOL) parts[i].ctype = 0x00000000; + if((r & 0xFF) == PT_PLEX) parts[i].ctype &= 0x1F00003E; + if((r & 0xFF) == PT_NITR) parts[i].ctype &= 0x0007C000; + if((r & 0xFF) == PT_NBLE) parts[i].ctype &= 0x3FFF8000; + if((r & 0xFF) == PT_LAVA) parts[i].ctype &= 0x3FF00000; + if((r & 0xFF) == PT_ACID) parts[i].ctype &= 0x1FE001FE; + if((r & 0xFF) == PT_DUST) parts[i].ctype &= 0x3FFFFFC0; + if((r & 0xFF) == PT_SNOW) parts[i].ctype &= 0x03FFFFFF; + if((r & 0xFF) == PT_GOO) parts[i].ctype &= 0x3FFAAA00; + if((r & 0xFF) == PT_PLNT) parts[i].ctype &= 0x0007C000; + if((r & 0xFF) == PT_PLUT) parts[i].ctype &= 0x001FCE00; + if((r & 0xFF) == PT_URAN) parts[i].ctype &= 0x003FC000; if(get_normal_interp(t, lx, ly, parts[i].vx, parts[i].vy, &nrx, &nry)) { dp = nrx*parts[i].vx + nry*parts[i].vy; @@ -2893,10 +2898,10 @@ killed: continue; } - if(!parts[i].ctype) { - kill_part(i); - continue; - } + if(!parts[i].ctype) { + kill_part(i); + continue; + } } else @@ -2958,9 +2963,9 @@ void update_particles(pixel *vid) x = (int)(parts[i].x+0.5f); y = (int)(parts[i].y+0.5f); if(x>=0 && y>=0 && x Date: Thu, 21 Oct 2010 18:45:14 +0200 Subject: [PATCH 216/237] I am not sure what to make of this, neutrons still can not pass through plut. --- src/powder.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/src/powder.c b/src/powder.c index 9dca982fb..5031081bb 100644 --- a/src/powder.c +++ b/src/powder.c @@ -59,6 +59,62 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) { unsigned r; + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) + return 0; + + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + if(rr) + *rr = r; + + if((r&0xFF)==PT_VOID || (r&0xFF)==PT_BHOL) + return 1; + + if(pt==PT_PHOT&&( + (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || + (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || + (r&0xFF)==PT_GLOW || (r&0xFF)==PT_WATR || + (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || + ((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + return 2; + if(pt==PT_NEUT&&( + (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || + (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || + (r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW || + (r&0xFF)==PT_SLTW || (r%0xFF)==PT_PLUT)) + return 2; + + if(pt==PT_STKM) //Stick man's head shouldn't collide + return 2; + + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) + return 0; + if(ptypes[pt].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((pt==PT_NEUT ||pt==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + + if(bmap[ny/CELL][nx/CELL]==9) + return 0; + + if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) + return 0; + + if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight <= ptypes[(r&0xFF)].weight))) + return 0; + + if(pt == PT_PHOT) + return 2; + + if(pt==PT_NEUT) + return 2; + return 1; +} +/*static int eval_move(int pt, int nx, int ny, unsigned *rr) +{ + unsigned r; + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) return 0; @@ -111,7 +167,7 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) return 1; } - +*/ static void create_cherenkov_photon(int pp); static void create_gain_photon(int pp); @@ -136,13 +192,13 @@ int try_move(int i, int x, int y, int nx, int ny) { if((r & 0xFF) == PT_COAL || (r & 0xFF) == PT_BCOL) parts[r>>8].temp = parts[i].temp; - + if((r & 0xFF) < PT_NUM) parts[i].temp = parts[r>>8].temp = restrict_flt((parts[r>>8].temp+parts[i].temp)/2, MIN_TEMP, MAX_TEMP); } return 0; } - + if(e == 2) { if(parts[i].type == PT_PHOT && (r&0xFF)==PT_GLOW && !parts[r>>8].life) @@ -151,13 +207,13 @@ int try_move(int i, int x, int y, int nx, int ny) parts[r>>8].life = 120; create_gain_photon(i); } - - if(parts[i].type == PT_NEUT && (r&0xFF)==PT_GLAS) { + + if(parts[i].type == PT_NEUT && (r&0xFF)==PT_GLAS) { if(rand() < RAND_MAX/10) create_cherenkov_photon(i); - } - return 1; } + return 1; + } if((r&0xFF)==PT_VOID) { From f88bb0f246c7c7130b44d8b4b1b63012fadef94e Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 21 Oct 2010 23:49:45 +0100 Subject: [PATCH 217/237] Changes for open_ui --- includes/graphics.h | 4 +- includes/interface.h | 6 +- includes/powder.h | 437 ------------------------------------------- src/graphics.c | 13 ++ src/interface.c | 231 +++++++++++++++++------ 5 files changed, 189 insertions(+), 502 deletions(-) delete mode 100644 includes/powder.h diff --git a/includes/graphics.h b/includes/graphics.h index 260c69b24..ec0d597f0 100644 --- a/includes/graphics.h +++ b/includes/graphics.h @@ -93,12 +93,14 @@ int drawtextmax(pixel *vid, int x, int y, int w, char *s, int r, int g, int b, i int textnwidth(char *s, int n); +int textnheight(char *s, int n, int w); + int textwidthx(char *s, int w); #ifdef WIN32 _inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); #else -inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); #endif void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag); diff --git a/includes/interface.h b/includes/interface.h index a284475ca..f1455430e 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -67,9 +67,9 @@ static menu_section msections[] = struct ui_edit { - int x, y, w, nx; + int x, y, w, nx, h; char str[256],*def; - int focus, cursor, hide; + int focus, cursor, hide, multiline; }; typedef struct ui_edit ui_edit; @@ -208,5 +208,7 @@ void execute_fav(pixel *vid_buf, char *id); int execute_vote(pixel *vid_buf, char *id, char *action); +void open_link(char *uri); + #endif diff --git a/includes/powder.h b/includes/powder.h deleted file mode 100644 index 99d12eea2..000000000 --- a/includes/powder.h +++ /dev/null @@ -1,437 +0,0 @@ -#ifndef POWDER_H -#define POWDER_H - -#include "graphics.h" -#include "defines.h" -#include "interface.h" - -#define CM_COUNT 7 -#define CM_FANCY 6 -#define CM_HEAT 5 -#define CM_BLOB 4 -#define CM_FIRE 3 -#define CM_PERS 2 -#define CM_PRESS 1 -#define CM_VEL 0 - -#define UI_WALLSTART 37 -#define UI_WALLCOUNT 19 - -#define SPC_AIR 136 -#define SPC_HEAT 137 -#define SPC_COOL 138 -#define SPC_VACUUM 139 - -#define WL_WALLELEC 22 -#define WL_EWALL 23 -#define WL_DETECT 24 -#define WL_STREAM 25 -#define WL_SIGN 26 -#define WL_FAN 27 -#define WL_ALLOWLIQUID 28 -#define WL_DESTROYALL 29 -#define WL_ERASE 30 -#define WL_WALL 31 -#define WL_ALLOWAIR 32 -#define WL_ALLOWSOLID 33 -#define WL_ALLOWALLELEC 34 -#define WL_EHOLE 35 -#define WL_ALLOWGAS 40 - -#define PT_NONE 0 -#define PT_DUST 1 -#define PT_WATR 2 -#define PT_OIL 3 -#define PT_FIRE 4 -#define PT_STNE 5 -#define PT_LAVA 6 -#define PT_GUNP 7 -#define PT_NITR 8 -#define PT_CLNE 9 -#define PT_GAS 10 -#define PT_PLEX 11 -#define PT_GOO 12 -#define PT_ICEI 13 -#define PT_METL 14 -#define PT_SPRK 15 -#define PT_SNOW 16 -#define PT_WOOD 17 -#define PT_NEUT 18 -#define PT_PLUT 19 -#define PT_PLNT 20 -#define PT_ACID 21 -#define PT_VOID 22 -#define PT_WTRV 23 -#define PT_CNCT 24 -#define PT_DSTW 25 -#define PT_SALT 26 -#define PT_SLTW 27 -#define PT_DMND 28 -#define PT_BMTL 29 -#define PT_BRMT 30 -#define PT_PHOT 31 -#define PT_URAN 32 -#define PT_WAX 33 -#define PT_MWAX 34 -#define PT_PSCN 35 -#define PT_NSCN 36 -#define PT_LNTG 37 -#define PT_INSL 38 -#define PT_BHOL 39 -#define PT_WHOL 40 -#define PT_RBDM 41 -#define PT_LRBD 42 -#define PT_NTCT 43 -#define PT_SAND 44 -#define PT_GLAS 45 -#define PT_PTCT 46 -#define PT_BGLA 47 -#define PT_THDR 48 -#define PT_PLSM 49 -#define PT_ETRD 50 -#define PT_NICE 51 -#define PT_NBLE 52 -#define PT_BTRY 53 -#define PT_LCRY 54 -#define PT_STKM 55 -#define PT_SWCH 56 -#define PT_SMKE 57 -#define PT_DESL 58 -#define PT_COAL 59 -#define PT_LO2 60 -#define PT_O2 61 -#define PT_INWR 62 -#define PT_YEST 63 -#define PT_DYST 64 -#define PT_THRM 65 -#define PT_GLOW 66 -#define PT_BRCK 67 -#define PT_HFLM 68 -#define PT_FIRW 69 -#define PT_FUSE 70 -#define PT_FSEP 71 -#define PT_AMTR 72 -#define PT_BCOL 73 -#define PT_PCLN 74 -#define PT_HSWC 75 -#define PT_IRON 76 -#define PT_MORT 77 -#define PT_NUM 78 - -#define R_TEMP 22 -#define MAX_TEMP 9999 -#define MIN_TEMP 0 -#define O_MAX_TEMP 3500 -#define O_MIN_TEMP -273 - -#define ST_NONE 0 -#define ST_SOLID 1 -#define ST_LIQUID 2 -#define ST_GAS 3 -/* - We should start to implement these. -*/ -static const unsigned short TYPE_PART = 0x01; //1 -static const unsigned short TYPE_LIQUID = 0x02; //2 -static const unsigned short TYPE_SOLID = 0x04; //4 -static const unsigned short TYPE_GAS = 0x08; //8 -static const unsigned short PROP_CONDUCTS = 0x10; //16 -static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. -#define FLAG_STAGNANT 1 - -struct particle -{ - int type; - int life, ctype; - float x, y, vx, vy; - float temp; - float pavg[2]; - int flags; - int tmp; -}; -typedef struct particle particle; - -struct part_type -{ - const char *name; - pixel pcolors; - float advection; - float airdrag; - float airloss; - float loss; - float collision; - float gravity; - float diffusion; - float hotair; - int falldown; - int flammable; - int explosive; - int meltable; - int hardness; - int menu; - int weight; - int menusection; - float heat; - unsigned char hconduct; - const char *descs; - const unsigned short properties; -}; -typedef struct part_type part_type; - -struct part_state -{ - char state; - int solid; - float stemp; - int liquid; - float ltemp; - int gas; - float gtemp; - int burn; - float btemp; -}; -typedef struct part_state part_state; -//Should probably be const. -/* Weight Help - * 1 = Gas || - * 2 = Light || Liquids 0-49 - * 98 = Heavy || Powder 50-99 - * 100 = Solid || - * -1 is Neutrons and Photons - */ -static const part_type ptypes[PT_NUM] = -{ - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, - {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, - {"MORT", PIXPACK(0xE0E0E0), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Steam Train."}, - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description -}; - -static part_state pstates[PT_NUM] = -{ - // Name Solid Frzp Liquid Mpnt Gas Bpoint - /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, - /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, - /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, - /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, - /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, - /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, - /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, - /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, - /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, - /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, - /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, - /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, - /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, - /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, -}; - -extern int isplayer; -extern float player[27]; - -extern particle *parts; -extern particle *cb_parts; - -extern unsigned char bmap[YRES/CELL][XRES/CELL]; -extern unsigned char emap[YRES/CELL][XRES/CELL]; - -extern unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -extern unsigned char cb_emap[YRES/CELL][XRES/CELL]; - -extern int pfree; - -extern unsigned pmap[YRES][XRES]; -unsigned cb_pmap[YRES][XRES]; - -int try_move(int i, int x, int y, int nx, int ny); - -void kill_part(int i); - -#ifdef WIN32 -extern _inline int create_part(int p, int x, int y, int t); -#else -extern inline int create_part(int p, int x, int y, int t); -#endif - -#ifdef WIN32 -extern _inline void delete_part(int x, int y); -#else -extern inline void delete_part(int x, int y); -#endif - -#ifdef WIN32 -extern _inline int is_wire(int x, int y); -#else -extern inline int is_wire(int x, int y); -#endif - -#ifdef WIN32 -extern _inline int is_wire_off(int x, int y); -#else -extern inline int is_wire_off(int x, int y); -#endif - -void set_emap(int x, int y); - -#ifdef WIN32 -_inline int parts_avg(int ci, int ni); -#else -inline int parts_avg(int ci, int ni); -#endif - -int nearest_part(int ci, int t); - -void update_particles_i(pixel *vid, int start, int inc); - -void update_particles(pixel *vid); - -void clear_area(int area_x, int area_y, int area_w, int area_h); - -void create_box(int x1, int y1, int x2, int y2, int c); - -int flood_parts(int x, int y, int c, int cm, int bm); - -int create_parts(int x, int y, int r, int c); - -void create_line(int x1, int y1, int x2, int y2, int r, int c); - -#endif diff --git a/src/graphics.c b/src/graphics.c index b63e3847a..d6604a3e5 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1002,6 +1002,19 @@ int textnwidth(char *s, int n) } return x-1; } +int textnheight(char *s, int n, int w) +{ + int x = 0; + //TODO: Implement Textnheight for wrapped text + for(; *s; s++) + { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} int textwidthx(char *s, int w) { diff --git a/src/interface.c b/src/interface.c index 3ed4431b4..e072f1610 100644 --- a/src/interface.c +++ b/src/interface.c @@ -1,3 +1,6 @@ +#ifdef MACOSX +#include +#endif #include #include #include @@ -208,7 +211,7 @@ void add_sign_ui(pixel *vid_buf, int mx, int my) strcpy(signs[i].text, ed.str); signs[i].ju = ju; } - +//TODO: Finish text wrapping in text edits void ui_edit_draw(pixel *vid_buf, ui_edit *ed) { int cx, i; @@ -226,8 +229,13 @@ void ui_edit_draw(pixel *vid_buf, ui_edit *ed) if(ed->str[0]) { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + if(ed->multiline){ + drawtextwrap(vid_buf, ed->x, ed->y, ed->h, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } else { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } } else if(!ed->focus) drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); @@ -259,19 +267,35 @@ void ui_edit_process(int mx, int my, int mb, ui_edit *ed) else str = ed->str; - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } - else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } - else - ed->focus = 0; + if(ed->multiline){ + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+ed->h) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; + } else { + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; + } } if(ed->focus && sdl_key) { @@ -1122,6 +1146,7 @@ int save_name_ui(pixel *vid_buf) ed.focus = 1; ed.hide = 0; ed.cursor = strlen(svf_name); + ed.multiline = 0; strcpy(ed.str, svf_name); cb.x = x0+10; @@ -1818,6 +1843,7 @@ int search_ui(pixel *vid_buf) ed.focus = 1; ed.hide = 0; ed.cursor = strlen(search_expr); + ed.multiline = 0; strcpy(ed.str, search_expr); sdl_wheel = 0; @@ -2524,8 +2550,8 @@ finish: int open_ui(pixel *vid_buf, char *save_id, char *save_date) { - int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawnthumb=0,authoritah=0,queue_open=0,data_size=0,retval=0; - char *uri, *uri_2; + int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawnthumb=0,authoritah=0,myown=0,queue_open=0,data_size=0,retval=0,bc=255,openable=1; + char *uri, *uri_2, *o_uri; void *data, *info_data; save_info *info = malloc(sizeof(save_info)); void *http = NULL, *http_2 = NULL; @@ -2533,6 +2559,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) int status, status_2, info_ready = 0, data_ready = 0; time_t http_last_use = HTTP_TIMEOUT, http_last_use_2 = HTTP_TIMEOUT; pixel *save_pic;// = malloc((XRES/2)*(YRES/2)); + ui_edit ed; pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); @@ -2543,6 +2570,18 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) drawrect(vid_buf, 50+(XRES/2)+1, 50, XRES+BARSIZE-100-((XRES/2)+1), YRES+MENUSIZE-100, 155, 155, 155, 255); drawtext(vid_buf, 50+(XRES/4)-textwidth("Loading...")/2, 50+(YRES/4), "Loading...", 255, 255, 255, 128); + ed.x = 57+(XRES/2)+1; + ed.y = YRES+MENUSIZE-118; + ed.w = XRES+BARSIZE-114-((XRES/2)+1); + ed.h = 48; + ed.nx = 1; + ed.def = "Add comment"; + ed.focus = 1; + ed.hide = 0; + ed.multiline = 1; + ed.cursor = 0; + strcpy(ed.str, ""); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); while(!sdl_poll()) @@ -2629,7 +2668,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) free(http_2); http_2 = NULL; } - + if(data_ready && !hasdrawnthumb) { draw_image(vid_buf, save_pic, 51, 51, thumb_w, thumb_h, 255); hasdrawnthumb = 1; @@ -2653,9 +2692,22 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) draw_line(vid_buf, 50+(XRES/2)+2, ccy+52, XRES+BARSIZE-50, ccy+52, 100, 100, 100, XRES+BARSIZE); } hasdrawninfo = 1; - authoritah = svf_login && (!strcmp(info->author, svf_user) || svf_admin || svf_mod); + myown = svf_login && !strcmp(info->author, svf_user); + authoritah = svf_login && (!strcmp(info->author, svf_user) || svf_admin || svf_mod); memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); } + if(info_ready && svf_login){ + + fillrect(vid_buf, 50+(XRES/2)+1, YRES+MENUSIZE-125, XRES+BARSIZE-100-((XRES/2)+1), 75, 0, 0, 0, 255); + drawrect(vid_buf, 50+(XRES/2)+1, YRES+MENUSIZE-125, XRES+BARSIZE-100-((XRES/2)+1), 75, 200, 200, 200, 255); + + drawrect(vid_buf, 54+(XRES/2)+1, YRES+MENUSIZE-121, XRES+BARSIZE-108-((XRES/2)+1), 48, 255, 255, 255, 200); + + ui_edit_draw(vid_buf, &ed); + + drawrect(vid_buf, XRES+BARSIZE-100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); + drawtext(vid_buf, XRES+BARSIZE-90, YRES+MENUSIZE-63, "Submit", 255, 255, 255, 255); + } if(queue_open) { if(info_ready && data_ready) { @@ -2705,61 +2757,103 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } //Open Button - if(sdl_key==SDLK_RETURN) { + bc = openable?255:150; + drawrect(vid_buf, 50, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); + drawtext(vid_buf, 73, YRES+MENUSIZE-63, "Open", 255, 255, 255, bc); + drawtext(vid_buf, 58, YRES+MENUSIZE-64, "\x81", 255, 255, 255, bc); + //Fav Button + bc = svf_login?255:150; + drawrect(vid_buf, 100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); + drawtext(vid_buf, 122, YRES+MENUSIZE-63, "Fav.", 255, 255, 255, bc); + drawtext(vid_buf, 107, YRES+MENUSIZE-64, "\xCC", 255, 255, 255, bc); + //Report Button + bc = (svf_login && info_ready)?255:150; + drawrect(vid_buf, 150, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); + drawtext(vid_buf, 168, YRES+MENUSIZE-63, "Report", 255, 255, 255, bc); + drawtext(vid_buf, 158, YRES+MENUSIZE-63, "!", 255, 255, 255, bc); + //Delete Button + bc = authoritah?255:150; + drawrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); + drawtext(vid_buf, 218, YRES+MENUSIZE-63, "Delete", 255, 255, 255, bc); + drawtext(vid_buf, 206, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, bc); + //Open in browser button + bc = 255; + drawrect(vid_buf, 250, YRES+MENUSIZE-68, 107, 18, 255, 255, 255, bc); + drawtext(vid_buf, 273, YRES+MENUSIZE-63, "Open in Browser", 255, 255, 255, bc); + drawtext(vid_buf, 258, YRES+MENUSIZE-64, "\x81", 255, 255, 255, bc); + + //Open Button + if(sdl_key==SDLK_RETURN && openable) { queue_open = 1; } - drawrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 93, YRES+MENUSIZE-63, "Open", 255, 255, 255, 255); - drawtext(vid_buf, 78, YRES+MENUSIZE-64, "\x81", 255, 255, 255, 255); - if(mx > 70 && mx < 70+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { - fillrect(vid_buf, 70, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(mx > 50 && mx < 50+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && openable) { + fillrect(vid_buf, 50, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); if(b && !bq) { + //Button Clicked queue_open = 1; } } - - //Fav Button - if(svf_login) { - drawrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 162, YRES+MENUSIZE-63, "Fav.", 255, 255, 255, 255); - drawtext(vid_buf, 147, YRES+MENUSIZE-64, "\xCC", 255, 255, 255, 255); - if(mx > 140 && mx < 140+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { - fillrect(vid_buf, 140, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq) { - //Button Clicked - } + //Fav Button + if(mx > 100 && mx < 100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login) { + fillrect(vid_buf, 100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + info_box(vid_buf, "Adding to favourites..."); + execute_fav(vid_buf, save_id); + } + } + //Report Button + if(mx > 150 && mx < 150+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready) { + fillrect(vid_buf, 150, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + if(confirm_ui(vid_buf, "Are you sure?", "Are you sure you wish to report this save?", "Report")){ + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + info_box(vid_buf, "Reporting..."); + execute_report(vid_buf, save_id); + } } } - - //Report Button - if(svf_login) { - drawrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 228, YRES+MENUSIZE-63, "Report", 255, 255, 255, 255); - drawtext(vid_buf, 218, YRES+MENUSIZE-63, "!", 255, 255, 255, 255); - if(mx > 210 && mx < 210+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { - fillrect(vid_buf, 210, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq) { - //Button Clicked - } + //Delete Button + if(mx > 200 && mx < 200+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && authoritah) { + fillrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + if(myown || !info->publish){ + if(confirm_ui(vid_buf, "Are you sure you wish to delete this?", "This you will not be able recover it.", "Delete")){ + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + info_box(vid_buf, "Deleting..."); + execute_delete(vid_buf, save_id); + } + } else if(authoritah){ + if(confirm_ui(vid_buf, "Are you sure?", "This save will be removed from the search index.", "Remove")){ + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + info_box(vid_buf, "Removing..."); + execute_delete(vid_buf, save_id); + } + } + } + } + //Open in browser button + if(mx > 250 && mx < 250+107 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { + fillrect(vid_buf, 250, YRES+MENUSIZE-68, 107, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + //TODO: Open link + o_uri = malloc(7+strlen(SERVER)+41+strlen(save_id)*3); + strcpy(o_uri, "http://" SERVER "/Browse/View.html?ID="); + strcaturl(o_uri, save_id); + open_link(o_uri); + free(o_uri); } } - //Delete Button - if(authoritah) { - drawrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 255); - drawtext(vid_buf, 298, YRES+MENUSIZE-63, "Delete", 255, 255, 255, 255); - drawtext(vid_buf, 286, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, 255); - if(mx > 280 && mx < 280+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { - fillrect(vid_buf, 280, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq) { - //Button Clicked - } - } - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(info_ready && svf_login){ + ui_edit_process(mx, my, b, &ed); + } if(sdl_key==SDLK_ESCAPE) break; @@ -3409,3 +3503,16 @@ int execute_vote(pixel *vid_buf, char *id, char *action) free(result); return 1; } +void open_link(char *uri){ +#ifdef WIN32 + ShellExecute(0, "OPEN", uri, NULL, NULL, 0) +#elif MACOSX + //LSOpenCFURLRef(CFURLCreateWithString(NULL, CFStringCreateWithCString(NULL, uri, 0) ,NULL), NULL); //TODO: Get this crap working +#elif LIN32 + execvp("xdg-open", uri); +#elif LIN64 + execvp("xdg-open", uri); +#else + printf("Cannot open browser\n"); +#endif +} From 1bc0afc2bfd276c576b9267c4bc30707143c4790 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 22 Oct 2010 00:04:45 +0100 Subject: [PATCH 218/237] Whoops --- includes/powder.h | 437 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 includes/powder.h diff --git a/includes/powder.h b/includes/powder.h new file mode 100644 index 000000000..cf9848a16 --- /dev/null +++ b/includes/powder.h @@ -0,0 +1,437 @@ +#ifndef POWDER_H +#define POWDER_H + +#include "graphics.h" +#include "defines.h" +#include "interface.h" + +#define CM_COUNT 7 +#define CM_FANCY 6 +#define CM_HEAT 5 +#define CM_BLOB 4 +#define CM_FIRE 3 +#define CM_PERS 2 +#define CM_PRESS 1 +#define CM_VEL 0 + +#define UI_WALLSTART 37 +#define UI_WALLCOUNT 19 + +#define SPC_AIR 136 +#define SPC_HEAT 137 +#define SPC_COOL 138 +#define SPC_VACUUM 139 + +#define WL_WALLELEC 22 +#define WL_EWALL 23 +#define WL_DETECT 24 +#define WL_STREAM 25 +#define WL_SIGN 26 +#define WL_FAN 27 +#define WL_ALLOWLIQUID 28 +#define WL_DESTROYALL 29 +#define WL_ERASE 30 +#define WL_WALL 31 +#define WL_ALLOWAIR 32 +#define WL_ALLOWSOLID 33 +#define WL_ALLOWALLELEC 34 +#define WL_EHOLE 35 +#define WL_ALLOWGAS 40 + +#define PT_NONE 0 +#define PT_DUST 1 +#define PT_WATR 2 +#define PT_OIL 3 +#define PT_FIRE 4 +#define PT_STNE 5 +#define PT_LAVA 6 +#define PT_GUNP 7 +#define PT_NITR 8 +#define PT_CLNE 9 +#define PT_GAS 10 +#define PT_PLEX 11 +#define PT_GOO 12 +#define PT_ICEI 13 +#define PT_METL 14 +#define PT_SPRK 15 +#define PT_SNOW 16 +#define PT_WOOD 17 +#define PT_NEUT 18 +#define PT_PLUT 19 +#define PT_PLNT 20 +#define PT_ACID 21 +#define PT_VOID 22 +#define PT_WTRV 23 +#define PT_CNCT 24 +#define PT_DSTW 25 +#define PT_SALT 26 +#define PT_SLTW 27 +#define PT_DMND 28 +#define PT_BMTL 29 +#define PT_BRMT 30 +#define PT_PHOT 31 +#define PT_URAN 32 +#define PT_WAX 33 +#define PT_MWAX 34 +#define PT_PSCN 35 +#define PT_NSCN 36 +#define PT_LNTG 37 +#define PT_INSL 38 +#define PT_BHOL 39 +#define PT_WHOL 40 +#define PT_RBDM 41 +#define PT_LRBD 42 +#define PT_NTCT 43 +#define PT_SAND 44 +#define PT_GLAS 45 +#define PT_PTCT 46 +#define PT_BGLA 47 +#define PT_THDR 48 +#define PT_PLSM 49 +#define PT_ETRD 50 +#define PT_NICE 51 +#define PT_NBLE 52 +#define PT_BTRY 53 +#define PT_LCRY 54 +#define PT_STKM 55 +#define PT_SWCH 56 +#define PT_SMKE 57 +#define PT_DESL 58 +#define PT_COAL 59 +#define PT_LO2 60 +#define PT_O2 61 +#define PT_INWR 62 +#define PT_YEST 63 +#define PT_DYST 64 +#define PT_THRM 65 +#define PT_GLOW 66 +#define PT_BRCK 67 +#define PT_HFLM 68 +#define PT_FIRW 69 +#define PT_FUSE 70 +#define PT_FSEP 71 +#define PT_AMTR 72 +#define PT_BCOL 73 +#define PT_PCLN 74 +#define PT_HSWC 75 +#define PT_IRON 76 +#define PT_MORT 77 +#define PT_NUM 78 + +#define R_TEMP 22 +#define MAX_TEMP 9999 +#define MIN_TEMP 0 +#define O_MAX_TEMP 3500 +#define O_MIN_TEMP -273 + +#define ST_NONE 0 +#define ST_SOLID 1 +#define ST_LIQUID 2 +#define ST_GAS 3 +/* + We should start to implement these. +*/ +static const unsigned short TYPE_PART = 0x01; //1 +static const unsigned short TYPE_LIQUID = 0x02; //2 +static const unsigned short TYPE_SOLID = 0x04; //4 +static const unsigned short TYPE_GAS = 0x08; //8 +static const unsigned short PROP_CONDUCTS = 0x10; //16 +static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. +#define FLAG_STAGNANT 1 + +struct particle +{ + int type; + int life, ctype; + float x, y, vx, vy; + float temp; + float pavg[2]; + int flags; + int tmp; +}; +typedef struct particle particle; + +struct part_type +{ + const char *name; + pixel pcolors; + float advection; + float airdrag; + float airloss; + float loss; + float collision; + float gravity; + float diffusion; + float hotair; + int falldown; + int flammable; + int explosive; + int meltable; + int hardness; + int menu; + int weight; + int menusection; + float heat; + unsigned char hconduct; + const char *descs; + const unsigned short properties; +}; +typedef struct part_type part_type; + +struct part_state +{ + char state; + int solid; + float stemp; + int liquid; + float ltemp; + int gas; + float gtemp; + int burn; + float btemp; +}; +typedef struct part_state part_state; +//Should probably be const. +/* Weight Help + * 1 = Gas || + * 2 = Light || Liquids 0-49 + * 98 = Heavy || Powder 50-99 + * 100 = Solid || + * -1 is Neutrons and Photons + */ +static const part_type ptypes[PT_NUM] = +{ + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, + {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, + {"MORT", PIXPACK(0xE0E0E0), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Steam Train."}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description +}; + +static part_state pstates[PT_NUM] = +{ + // Name Solid Frzp Liquid Mpnt Gas Bpoint + /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, + /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, + /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, + /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, + /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, + /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 273.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, + /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, + /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, 63.0f, PT_NONE, 0.0f, PT_NONE, 77.0f, PT_NONE, 0.0f}, + /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 63.1f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, + /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 625.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 90.1f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 90.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HFLM */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRW */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FUSE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FSEP */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* AMtr */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BCOL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HSWC */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* IRON */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, +}; + +extern int isplayer; +extern float player[27]; + +extern particle *parts; +extern particle *cb_parts; + +extern unsigned char bmap[YRES/CELL][XRES/CELL]; +extern unsigned char emap[YRES/CELL][XRES/CELL]; + +extern unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +extern unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +extern int pfree; + +extern unsigned pmap[YRES][XRES]; +unsigned cb_pmap[YRES][XRES]; + +int try_move(int i, int x, int y, int nx, int ny); + +void kill_part(int i); + +#ifdef WIN32 +extern _inline int create_part(int p, int x, int y, int t); +#else +extern inline int create_part(int p, int x, int y, int t); +#endif + +#ifdef WIN32 +extern _inline void delete_part(int x, int y); +#else +extern inline void delete_part(int x, int y); +#endif + +#ifdef WIN32 +extern _inline int is_wire(int x, int y); +#else +extern inline int is_wire(int x, int y); +#endif + +#ifdef WIN32 +extern _inline int is_wire_off(int x, int y); +#else +extern inline int is_wire_off(int x, int y); +#endif + +void set_emap(int x, int y); + +#ifdef WIN32 +_inline int parts_avg(int ci, int ni); +#else +int parts_avg(int ci, int ni); +#endif + +int nearest_part(int ci, int t); + +void update_particles_i(pixel *vid, int start, int inc); + +void update_particles(pixel *vid); + +void clear_area(int area_x, int area_y, int area_w, int area_h); + +void create_box(int x1, int y1, int x2, int y2, int c); + +int flood_parts(int x, int y, int c, int cm, int bm); + +int create_parts(int x, int y, int r, int c); + +void create_line(int x1, int y1, int x2, int y2, int r, int c); + +#endif From 1b03d85d0931f84e10f3cbe4d92ebb6c4dea3723 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 22 Oct 2010 13:33:56 +0100 Subject: [PATCH 219/237] Fix neutrons, add properties, fix photons --- includes/powder.h | 174 ++++++++++++++++++++++++---------------------- src/powder.c | 78 +++------------------ 2 files changed, 100 insertions(+), 152 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index cf9848a16..fbf79fc05 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -129,14 +129,18 @@ #define ST_LIQUID 2 #define ST_GAS 3 /* - We should start to implement these. + TODO: We should start to implement these. */ -static const unsigned short TYPE_PART = 0x01; //1 -static const unsigned short TYPE_LIQUID = 0x02; //2 -static const unsigned short TYPE_SOLID = 0x04; //4 -static const unsigned short TYPE_GAS = 0x08; //8 -static const unsigned short PROP_CONDUCTS = 0x10; //16 -static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. +#define TYPE_PART 0x0001 //1 Powders +#define TYPE_LIQUID 0x0002 //2 Liquids +#define TYPE_SOLID 0x0004 //4 Solids +#define TYPE_GAS 0x0008 //8 Gasses (Includes plasma) +#define TYPE_ENERGY 0x0018 //16 Energy (Thunder, Light, Neutrons etc.) +#define PROP_CONDUCTS 0x0020 //32 Conducts electricity (Currently Unused) +#define PROP_BLACK 0x0040 //64 Absorbs Photons +#define PROP_NEUTPENETRATE 0x0080 //128 Penetrated by neutrons +#define PROP_NEUTABSORB 0x0100 //256 Absorbs neutrons, reflect is default +#define PROP_DEADLY 0x0200 //512 Is deadly for stickman. #define FLAG_STAGNANT 1 struct particle @@ -202,84 +206,84 @@ typedef struct part_state part_state; static const part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weight Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable."}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f +273.15f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f +273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f +273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f +273.15f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f +273.15f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f +273.15f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f +273.15f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f +273.15f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f +273.15f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f +273.15f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f +273.15f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f +273.15f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f +273.15f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f +273.15f, 44, "Glow, Glows under pressure"}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame."}, - {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!"}, - {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity."}, - {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE."}, - {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles"}, - {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL"}, - {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches."}, - {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated"}, - {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR"}, - {"MORT", PIXPACK(0xE0E0E0), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Steam Train."}, + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles.", 0}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable.", TYPE_PART}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires.", TYPE_LIQUID|PROP_CONDUCTS|PROP_NEUTPENETRATE}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, 20, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable.", TYPE_LIQUID}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_EXPLOSIVE, R_TEMP+400.0f+273.15f, 88, "Ignites flammable materials. Heats air.", TYPE_GAS}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable.", TYPE_PART}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, 45, SC_LIQUID, R_TEMP+1500.0f+273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold.", TYPE_LIQUID}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, 85, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive.", TYPE_PART}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive.", TYPE_LIQUID}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches.", TYPE_SOLID}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure.", TYPE_GAS}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive.", TYPE_SOLID}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure.", TYPE_SOLID}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f+273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air.", TYPE_SOLID}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable.", TYPE_SOLID|PROP_CONDUCTS}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water.", TYPE_SOLID}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, R_TEMP-30.0f+273.15f, 46, "Light particles.", TYPE_PART}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable.", TYPE_SOLID}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways.", TYPE_ENERGY}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure.", TYPE_PART|PROP_NEUTPENETRATE}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows.", TYPE_SOLID}, + {"ACID", PIXPACK(0xED55FF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, 10, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything.", TYPE_LIQUID}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles.", TYPE_SOLID}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, 1, SC_GAS, R_TEMP+100.0f+273.15f, 48, "Steam, heats up air, produced from hot water.", TYPE_GAS}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone.", TYPE_PART}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP-2.0f +273.15f, 23, "Distilled water, does not conduct electricity.", TYPE_LIQUID|PROP_NEUTPENETRATE}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 75, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water.", TYPE_PART}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 35, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze.", TYPE_LIQUID|PROP_CONDUCTS|PROP_NEUTPENETRATE}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable.", TYPE_SOLID}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal.", TYPE_SOLID|PROP_CONDUCTS}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal.", TYPE_PART|PROP_CONDUCTS}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, -1, SC_ELEC, R_TEMP+900.0f+273.15f, 251, "Photons. Travel in straight lines.", TYPE_ENERGY}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, 90, SC_NUCLEAR, R_TEMP+30.0f+273.15f, 251, "Heavy particles. Generates heat under pressure.", TYPE_PART}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures.", TYPE_SOLID}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, 25, SC_LIQUID, R_TEMP+28.0f+273.15f, 44, "Liquid Wax.", TYPE_LIQUID}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor.", TYPE_SOLID}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon.", TYPE_SOLID}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, 30, SC_LIQUID, 70.15f, 70, "Liquid Nitrogen. Very cold.", TYPE_LIQUID}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity.", TYPE_SOLID}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP+70.0f+273.15f, 255, "Black hole, sucks in other particles and heats up.", TYPE_SOLID}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_SPECIAL, R_TEMP-16.0f+273.15f, 255, "White hole, pushes other particles away.", TYPE_SOLID}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point", TYPE_SOLID|PROP_CONDUCTS}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f+273.15f, 170, "Liquid Rubidium.", TYPE_LIQUID|PROP_CONDUCTS}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)", TYPE_SOLID}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable.", TYPE_PART}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure", TYPE_SOLID}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)", TYPE_SOLID}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels.", TYPE_PART}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals.", TYPE_ENERGY}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot.", TYPE_GAS}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)", TYPE_SOLID}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice.", TYPE_SOLID}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity", TYPE_GAS}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity.", TYPE_SOLID}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)", TYPE_SOLID}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 50, SC_SPECIAL, R_TEMP+14.6f+273.15f, 0, "Stickman. Don't kill him!", 0}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)", TYPE_SOLID}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+320.0f+273.15f, 88, "Smoke", TYPE_GAS}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, 15, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Explodes under high pressure and temperatures", TYPE_LIQUID}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly.", TYPE_SOLID}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, 30, SC_LIQUID, 80.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire", TYPE_LIQUID}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily.", TYPE_GAS}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors.", TYPE_SOLID}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C).", TYPE_PART}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, 80, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Dead Yeast.", TYPE_PART}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 90, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 211, "Thermite. Burns at extremly high temperature.", TYPE_PART}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, 40, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow, Glows under pressure", TYPE_LIQUID}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material.", TYPE_SOLID}, + {"CFLM", PIXPACK(0x8080FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.0005f * CFDS, 1, 0, 0, 0, 1, 1, 2, SC_SPECIAL, 0.0f, 88, "Sub-zero flame.", TYPE_GAS}, + {"FIRW", PIXPACK(0xFFA040), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, -0.99f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 55, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 70, "Fireworks!", TYPE_PART}, + {"FUSE", PIXPACK(0x0A5706), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly. Ignites at somewhat high temperatures and electricity.", TYPE_SOLID}, + {"FSEP", PIXPACK(0x63AD5F), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 30, 1, 70, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Fuse Powder. See FUSE.", TYPE_PART}, + {"AMTR", PIXPACK(0x808080), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.00f, 0.10f, 1.00f, 0.0000f * CFDS, 0, 0, 0, 0, 0, 1, 100, SC_NUCLEAR, R_TEMP+0.0f +273.15f, 70, "Anti-Matter, Destroys a majority of particles", TYPE_PART}, //Maybe TYPE_ENERGY? + {"BCOL", PIXPACK(0x333333), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Coal. Heavy particles. See COAL", TYPE_PART}, + {"PCLN", PIXPACK(0x3B3B10), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. When actived, duplicates any particles it touches.", TYPE_SOLID}, + {"HSWC", PIXPACK(0x3B1010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Heat switch. Conducts Heat only when activated", TYPE_SOLID}, + {"IRON", PIXPACK(0x707070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 50, 0, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Rusts with salt, can be used for electrlosis of WATR", TYPE_SOLID}, + {"MORT", PIXPACK(0xE0E0E0), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 0, -1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Steam Train.", TYPE_PART}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description }; diff --git a/src/powder.c b/src/powder.c index 5031081bb..a445cff0c 100644 --- a/src/powder.c +++ b/src/powder.c @@ -59,62 +59,6 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) { unsigned r; - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) - return 0; - - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; - if(rr) - *rr = r; - - if((r&0xFF)==PT_VOID || (r&0xFF)==PT_BHOL) - return 1; - - if(pt==PT_PHOT&&( - (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || - (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || - (r&0xFF)==PT_GLOW || (r&0xFF)==PT_WATR || - (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || - ((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) - return 2; - if(pt==PT_NEUT&&( - (r&0xFF)==PT_GLAS || (r&0xFF)==PT_PHOT || - (r&0xFF)==PT_CLNE || (r&0xFF)==PT_PCLN || - (r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW || - (r&0xFF)==PT_SLTW || (r%0xFF)==PT_PLUT)) - return 2; - - if(pt==PT_STKM) //Stick man's head shouldn't collide - return 2; - - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[pt].falldown!=0 && pt!=PT_FIRE && pt!=PT_SMKE) - return 0; - if(ptypes[pt].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((pt==PT_NEUT ||pt==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - - if(bmap[ny/CELL][nx/CELL]==9) - return 0; - - if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) - return 0; - - if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight <= ptypes[(r&0xFF)].weight))) - return 0; - - if(pt == PT_PHOT) - return 2; - - if(pt==PT_NEUT) - return 2; - return 1; -} -/*static int eval_move(int pt, int nx, int ny, unsigned *rr) -{ - unsigned r; - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) return 0; @@ -151,23 +95,23 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) return 0; - if(pt == PT_PHOT) - return 0; - if(pt == PT_NEUT) - return 1; - if(pt == PT_NEUT && (r&0xFF == PT_WATR||r&0xFF == PT_SLTW ||r&0xFF == PT_DSTW)) - return 2; - - if((r&0xFF) == PT_NEUT) - return 0; - + if(ptypes[pt].properties&TYPE_ENERGY && (r && ((r&0xFF) >= PT_NUM || (ptypes[(r&0xFF)].properties&TYPE_ENERGY)))) + return 2; + + if(pt==PT_NEUT && (r && ((r&0xFF) >= PT_NUM || (ptypes[(r&0xFF)].properties&PROP_NEUTPENETRATE)))) + return 1; + if((r&0xFF)==PT_NEUT && ptypes[pt].properties&PROP_NEUTPENETRATE) + return 0; + if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight <= ptypes[(r&0xFF)].weight))) return 0; + if(pt == PT_PHOT) + return 2; return 1; } -*/ + static void create_cherenkov_photon(int pp); static void create_gain_photon(int pp); From a2491b03486097f7265708ecce5303d2b6eecae1 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 23 Oct 2010 10:14:49 +0200 Subject: [PATCH 220/237] removed LOLOLOLOLOLOL comment.. what the ...? --- src/powder.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index a445cff0c..fc645a5e5 100644 --- a/src/powder.c +++ b/src/powder.c @@ -3595,7 +3595,6 @@ int create_parts(int x, int y, int r, int c) bmap[j][i] = 5; return 1; } - //LOLOLOLOLLOLOLOLO if(c == 127) { b = 4; From ba1b9f7584e28ef4201ed8a4a7af679ec34585ed Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Mon, 25 Oct 2010 12:13:34 +0100 Subject: [PATCH 221/237] More functionality and improvements to open_ui --- includes/interface.h | 6 ++- src/interface.c | 87 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 76 insertions(+), 17 deletions(-) diff --git a/includes/interface.h b/includes/interface.h index f1455430e..0f4dd3fd6 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -200,9 +200,11 @@ int execute_tagop(pixel *vid_buf, char *op, char *tag); void execute_save(pixel *vid_buf); -void execute_delete(pixel *vid_buf, char *id); +int execute_delete(pixel *vid_buf, char *id); -void execute_report(pixel *vid_buf, char *id); +int execute_report(pixel *vid_buf, char *id); + +void execute_submit(pixel *vid_buf, char *id, char *message); void execute_fav(pixel *vid_buf, char *id); diff --git a/src/interface.c b/src/interface.c index e072f1610..4ab7bf4ac 100644 --- a/src/interface.c +++ b/src/interface.c @@ -230,7 +230,7 @@ void ui_edit_draw(pixel *vid_buf, ui_edit *ed) if(ed->str[0]) { if(ed->multiline){ - drawtextwrap(vid_buf, ed->x, ed->y, ed->h, str, 255, 255, 255, 255); + drawtextwrap(vid_buf, ed->x, ed->y, ed->w-14, str, 255, 255, 255, 255); drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); } else { drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); @@ -360,19 +360,19 @@ void ui_edit_process(int mx, int my, int mb, ui_edit *ed) } ts[0]=ed->hide?0x8D:ch; ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) + if((textwidth(str)+textwidth(ts) > ed->w-14 && !ed->multiline) || (float)(((textwidth(str)+textwidth(ts))/(ed->w-14)*12) > ed->h && ed->multiline)) break; memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); ed->str[ed->cursor] = ch; ed->cursor++; } #else - if(sdl_ascii>=' ' && sdl_ascii<127) + if(sdl_ascii>=' ' && sdl_ascii<127 && l<255) { ch = sdl_ascii; ts[0]=ed->hide?0x8D:ch; ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) + if((textwidth(str)+textwidth(ts) > ed->w-14 && !ed->multiline) || (float)(((textwidth(str)+textwidth(ts))/(ed->w-14)*12) > ed->h && ed->multiline)) break; memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); ed->str[ed->cursor] = ch; @@ -2601,7 +2601,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) strcaturl(uri, save_date); uri_2 = malloc(strlen(save_id)*3+strlen(save_date)*3+strlen(SERVER)+71); - strcpy(uri_2, "http://" SERVER "/Get.api?Op=save&ID="); + strcpy(uri_2, "http://" SERVER "/Info.api?ID="); strcaturl(uri_2, save_id); strappend(uri_2, "&Date="); strcaturl(uri_2, save_date); @@ -2811,26 +2811,36 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) if(confirm_ui(vid_buf, "Are you sure?", "Are you sure you wish to report this save?", "Report")){ fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); info_box(vid_buf, "Reporting..."); - execute_report(vid_buf, save_id); + if(execute_report(vid_buf, save_id)){ + info_ui(vid_buf, "Success", "This save has been reported"); + retval = 0; + break; + } } } } //Delete Button - if(mx > 200 && mx < 200+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && authoritah) { + if(mx > 200 && mx < 200+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && (authoritah || myown)) { fillrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); if(b && !bq) { //Button Clicked if(myown || !info->publish){ - if(confirm_ui(vid_buf, "Are you sure you wish to delete this?", "This you will not be able recover it.", "Delete")){ + if(confirm_ui(vid_buf, "Are you sure you wish to delete this?", "You will not be able recover it.", "Delete")){ fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); info_box(vid_buf, "Deleting..."); - execute_delete(vid_buf, save_id); + if(execute_delete(vid_buf, save_id)){ + retval = 0; + break; + } } - } else if(authoritah){ + } else { if(confirm_ui(vid_buf, "Are you sure?", "This save will be removed from the search index.", "Remove")){ fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); info_box(vid_buf, "Removing..."); - execute_delete(vid_buf, save_id); + if(execute_delete(vid_buf, save_id)){ + retval = 0; + break; + } } } } @@ -2848,6 +2858,16 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) free(o_uri); } } + //Submit Button + if(mx > XRES+BARSIZE-100 && mx < XRES+BARSIZE-100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready) { + fillrect(vid_buf, XRES+BARSIZE-100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + if(b && !bq) { + //Button Clicked + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + info_box(vid_buf, "Submitting Comment..."); + execute_submit(vid_buf, save_id, ed.str); + } + } sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); @@ -3366,7 +3386,7 @@ void execute_save(pixel *vid_buf) free(result); } -void execute_delete(pixel *vid_buf, char *id) +int execute_delete(pixel *vid_buf, char *id) { int status; char *result; @@ -3382,6 +3402,42 @@ void execute_delete(pixel *vid_buf, char *id) svf_user, svf_pass, &status, NULL); + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} + +void execute_submit(pixel *vid_buf, char *id, char *message) +{ + int status; + char *result; + + char *names[] = {"ID", "Message", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = message; + + result = http_multipart_post( + "http://" SERVER "/Comment.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + if(status!=200) { error_ui(vid_buf, status, http_ret_text(status)); @@ -3400,7 +3456,7 @@ void execute_delete(pixel *vid_buf, char *id) free(result); } -void execute_report(pixel *vid_buf, char *id) +int execute_report(pixel *vid_buf, char *id) { int status; char *result; @@ -3421,17 +3477,18 @@ void execute_report(pixel *vid_buf, char *id) error_ui(vid_buf, status, http_ret_text(status)); if(result) free(result); - return; + return 0; } if(result && strncmp(result, "OK", 2)) { error_ui(vid_buf, 0, result); free(result); - return; + return 0; } if(result) free(result); + return 1; } void execute_fav(pixel *vid_buf, char *id) From b902572251e093b4d00b5fbae835152269e1d269 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sat, 30 Oct 2010 12:33:33 +0100 Subject: [PATCH 222/237] open_ui imrovements, almost ready --- src/interface.c | 52 ++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/interface.c b/src/interface.c index 4ab7bf4ac..94b0e8a7c 100644 --- a/src/interface.c +++ b/src/interface.c @@ -2757,7 +2757,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } //Open Button - bc = openable?255:150; + bc = openable?255:150; drawrect(vid_buf, 50, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); drawtext(vid_buf, 73, YRES+MENUSIZE-63, "Open", 255, 255, 255, bc); drawtext(vid_buf, 58, YRES+MENUSIZE-64, "\x81", 255, 255, 255, bc); @@ -2772,40 +2772,40 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) drawtext(vid_buf, 168, YRES+MENUSIZE-63, "Report", 255, 255, 255, bc); drawtext(vid_buf, 158, YRES+MENUSIZE-63, "!", 255, 255, 255, bc); //Delete Button - bc = authoritah?255:150; - drawrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); - drawtext(vid_buf, 218, YRES+MENUSIZE-63, "Delete", 255, 255, 255, bc); - drawtext(vid_buf, 206, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, bc); - //Open in browser button - bc = 255; + bc = authoritah?255:150; + drawrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); + drawtext(vid_buf, 218, YRES+MENUSIZE-63, "Delete", 255, 255, 255, bc); + drawtext(vid_buf, 206, YRES+MENUSIZE-64, "\xAA", 255, 255, 255, bc); + //Open in browser button + bc = 255; drawrect(vid_buf, 250, YRES+MENUSIZE-68, 107, 18, 255, 255, 255, bc); drawtext(vid_buf, 273, YRES+MENUSIZE-63, "Open in Browser", 255, 255, 255, bc); drawtext(vid_buf, 258, YRES+MENUSIZE-64, "\x81", 255, 255, 255, bc); - //Open Button - if(sdl_key==SDLK_RETURN && openable) { + //Open Button + if(sdl_key==SDLK_RETURN && openable) { queue_open = 1; } - if(mx > 50 && mx < 50+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && openable) { + if(mx > 50 && mx < 50+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && openable && !queue_open) { fillrect(vid_buf, 50, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); if(b && !bq) { - //Button Clicked + //Button Clicked queue_open = 1; } } - //Fav Button - if(mx > 100 && mx < 100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login) { + //Fav Button + if(mx > 100 && mx < 100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && !queue_open) { fillrect(vid_buf, 100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); - if(b && !bq) { + if(b && !bq) { //Button Clicked - fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); - info_box(vid_buf, "Adding to favourites..."); - execute_fav(vid_buf, save_id); + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); + info_box(vid_buf, "Adding to favourites..."); + execute_fav(vid_buf, save_id); } - } - //Report Button - if(mx > 150 && mx < 150+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready) { - fillrect(vid_buf, 150, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); + } + //Report Button + if(mx > 150 && mx < 150+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready && !queue_open) { + fillrect(vid_buf, 150, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); if(b && !bq) { //Button Clicked if(confirm_ui(vid_buf, "Are you sure?", "Are you sure you wish to report this save?", "Report")){ @@ -2820,7 +2820,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } } //Delete Button - if(mx > 200 && mx < 200+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && (authoritah || myown)) { + if(mx > 200 && mx < 200+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && (authoritah || myown) && !queue_open) { fillrect(vid_buf, 200, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); if(b && !bq) { //Button Clicked @@ -2846,7 +2846,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } } //Open in browser button - if(mx > 250 && mx < 250+107 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50) { + if(mx > 250 && mx < 250+107 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && !queue_open) { fillrect(vid_buf, 250, YRES+MENUSIZE-68, 107, 18, 255, 255, 255, 40); if(b && !bq) { //Button Clicked @@ -2859,7 +2859,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } } //Submit Button - if(mx > XRES+BARSIZE-100 && mx < XRES+BARSIZE-100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready) { + if(mx > XRES+BARSIZE-100 && mx < XRES+BARSIZE-100+50 && my > YRES+MENUSIZE-68 && my < YRES+MENUSIZE-50 && svf_login && info_ready && !queue_open) { fillrect(vid_buf, XRES+BARSIZE-100, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); if(b && !bq) { //Button Clicked @@ -2869,6 +2869,10 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } } + if(!(mx>50 && my>50 && mx Date: Sat, 30 Oct 2010 13:39:05 +0100 Subject: [PATCH 223/237] Increased nuke heat, and fixed gas bug caused by overlapping flags --- src/powder.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/powder.c b/src/powder.c index fc645a5e5..e9be0f3ca 100644 --- a/src/powder.c +++ b/src/powder.c @@ -1115,6 +1115,11 @@ void update_particles_i(pixel *vid, int start, int inc) parts[i].tmp = 0; parts[i].ctype = PT_BMTL; } + if(parts[i].ctype==PT_PLUT) + { + parts[i].tmp = 0; + parts[i].ctype = PT_LAVA; + } t = parts[i].type = parts[i].ctype; parts[i].ctype = PT_NONE; } @@ -1182,6 +1187,11 @@ void update_particles_i(pixel *vid, int start, int inc) parts[i].tmp--; parts[i].temp = 3500; } + if(parts[i].ctype==PT_PLUT&&parts[i].tmp>0) + { + parts[i].tmp--; + parts[i].temp = MAX_TEMP; + } } pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); } @@ -1722,7 +1732,12 @@ void update_particles_i(pixel *vid, int start, int inc) { if(33>rand()%100) { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + create_part(r>>8, x+nx, y+ny, rand()%3 ? PT_LAVA : PT_URAN); + parts[r>>8].temp = MAX_TEMP; + if(parts[r>>8].type==PT_LAVA){ + parts[r>>8].tmp = 100; + parts[r>>8].ctype = PT_PLUT; + } } else { From de9171c1eb5b9e130b8bf0607d509cbefe042730 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sat, 30 Oct 2010 14:36:13 +0100 Subject: [PATCH 224/237] FINALLY NEUTRONS ARE FIXED --- src/powder.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/powder.c b/src/powder.c index e9be0f3ca..9db1fbfcf 100644 --- a/src/powder.c +++ b/src/powder.c @@ -95,13 +95,19 @@ static int eval_move(int pt, int nx, int ny, unsigned *rr) if(ptypes[pt].falldown!=1 && bmap[ny/CELL][nx/CELL]==10) return 0; - if(ptypes[pt].properties&TYPE_ENERGY && (r && ((r&0xFF) >= PT_NUM || (ptypes[(r&0xFF)].properties&TYPE_ENERGY)))) + if(r && (r&0xFF) < PT_NUM){ + //if(ptypes[pt].properties&TYPE_ENERGY && (r && ((r&0xFF) >= PT_NUM || (ptypes[(r&0xFF)].properties&TYPE_ENERGY)))) + if(ptypes[pt].properties&TYPE_ENERGY && ptypes[(r&0xFF)].properties&TYPE_ENERGY) return 2; - if(pt==PT_NEUT && (r && ((r&0xFF) >= PT_NUM || (ptypes[(r&0xFF)].properties&PROP_NEUTPENETRATE)))) + //if(pt==PT_NEUT && (r && ((r&0xFF) >= PT_NUM || (ptypes[(r&0xFF)].properties&PROP_NEUTPENETRATE)))) + if(pt==PT_NEUT && ptypes[(r&0xFF)].properties&PROP_NEUTPASS) + return 2; + if(pt==PT_NEUT && ptypes[(r&0xFF)].properties&PROP_NEUTPENETRATE) return 1; if((r&0xFF)==PT_NEUT && ptypes[pt].properties&PROP_NEUTPENETRATE) return 0; + } if (r && ((r&0xFF) >= PT_NUM || (ptypes[pt].weight <= ptypes[(r&0xFF)].weight))) return 0; @@ -2873,7 +2879,7 @@ killed: kill_part(i); continue; } - else if(t==PT_NEUT || t==PT_PHOT) + else if(t==PT_NEUT || t==PT_PHOT) //Seems to break neutrons, sorry Skylark { r = pmap[ny][nx]; @@ -2909,12 +2915,14 @@ killed: continue; } } else { - kill_part(i); + if(t!=PT_NEUT) + kill_part(i); continue; } if(!parts[i].ctype) { - kill_part(i); + if(t!=PT_NEUT) + kill_part(i); continue; } } From 457c049f955431c3d0d906b7580e93d629d116dd Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sat, 30 Oct 2010 20:50:36 +0100 Subject: [PATCH 225/237] Functionality finished, tweeks needed --- includes/interface.h | 4 +- src/interface.c | 242 +++++++++++++++++++++++++++++-------------- 2 files changed, 168 insertions(+), 78 deletions(-) diff --git a/includes/interface.h b/includes/interface.h index 0f4dd3fd6..f12d25bff 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -202,7 +202,7 @@ void execute_save(pixel *vid_buf); int execute_delete(pixel *vid_buf, char *id); -int execute_report(pixel *vid_buf, char *id); +int execute_report(pixel *vid_buf, char *id, char *reason); void execute_submit(pixel *vid_buf, char *id, char *message); @@ -212,5 +212,7 @@ int execute_vote(pixel *vid_buf, char *id, char *action); void open_link(char *uri); +int report_ui(pixel *vid_buf, char *save_id); + #endif diff --git a/src/interface.c b/src/interface.c index 94b0e8a7c..10e272cf3 100644 --- a/src/interface.c +++ b/src/interface.c @@ -33,6 +33,7 @@ int svf_myvote = 0; int svf_publish = 0; char svf_id[16] = ""; char svf_name[64] = ""; +char svf_description[255] = ""; char svf_tags[256] = ""; void *svf_last = NULL; int svf_lsize; @@ -1124,9 +1125,10 @@ finish: int save_name_ui(pixel *vid_buf) { - int x0=(XRES-192)/2,y0=(YRES-68-YRES/4)/2,b=1,bq,mx,my,ths,nd=0; + int x0=(XRES-400)/2,y0=(YRES-68-YRES/4)/2,b=1,bq,mx,my,ths,nd=0; void *th; ui_edit ed; + ui_edit ed2; ui_checkbox cb; th = build_thumb(&ths, 0); @@ -1148,6 +1150,18 @@ int save_name_ui(pixel *vid_buf) ed.cursor = strlen(svf_name); ed.multiline = 0; strcpy(ed.str, svf_name); + + ed2.x = x0+13; + ed2.y = y0+45; + ed2.w = 166; + ed2.h = 85; + ed2.nx = 1; + ed2.def = "[simulation description]"; + ed2.focus = 0; + ed2.hide = 0; + ed2.cursor = strlen(svf_description); + ed2.multiline = 1; + strcpy(ed2.str, svf_description); cb.x = x0+10; cb.y = y0+53+YRES/4; @@ -1162,16 +1176,19 @@ int save_name_ui(pixel *vid_buf) mx /= sdl_scale; my /= sdl_scale; - drawrect(vid_buf, x0, y0, 192, 90+YRES/4, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 90+YRES/4); + drawrect(vid_buf, x0, y0, 400, 90+YRES/4, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 400, 90+YRES/4); drawtext(vid_buf, x0+8, y0+8, "New simulation name:", 255, 255, 255, 255); drawtext(vid_buf, x0+10, y0+23, "\x82", 192, 192, 192, 255); drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + + drawrect(vid_buf, x0+8, y0+40, 176, 95, 192, 192, 192, 255); ui_edit_draw(vid_buf, &ed); + ui_edit_draw(vid_buf, &ed2); - drawrect(vid_buf, x0+(192-XRES/4)/2-2, y0+42, XRES/4+3, YRES/4+3, 128, 128, 128, 255); - render_thumb(th, ths, 0, vid_buf, x0+(192-XRES/4)/2, y0+44, 4); + drawrect(vid_buf, x0+(192-XRES/3)/2-2+200, y0+34, XRES/3+3, YRES/3+3, 128, 128, 128, 255); + render_thumb(th, ths, 0, vid_buf, x0+(200-XRES/3)/2+200, y0+36, 3); ui_checkbox_draw(vid_buf, &cb); drawtext(vid_buf, x0+34, y0+50+YRES/4, "Publish? (Do not publish others'\nworks without permission)", 192, 192, 192, 255); @@ -1182,6 +1199,7 @@ int save_name_ui(pixel *vid_buf) sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); ui_edit_process(mx, my, b, &ed); + ui_edit_process(mx, my, b, &ed2); ui_checkbox_process(mx, my, b, bq, &cb); if(b && !bq && ((mx>=x0+9 && mx=y0+22 && my(XRES+BARSIZE-400)+150 && my>(YRES+MENUSIZE-150)-18 && mx<(XRES+BARSIZE-400)+200 && my<(YRES+MENUSIZE-150)){ + fillrect(vid_buf, (XRES+BARSIZE-400)+150, (YRES+MENUSIZE-150)-18, 50, 18, 255, 255, 255, 40); + if(b){ + if(execute_report(vid_buf, save_id, ed.str)){ + info_ui(vid_buf, "Success", "This save has been reported"); + return 1; + } else { + return 0; + } + } + } + if(mx>200 && my>(YRES+MENUSIZE-150)-18 && mx<250 && my<(YRES+MENUSIZE-150)){ + fillrect(vid_buf, 200, (YRES+MENUSIZE-150)-18, 50, 18, 255, 255, 255, 40); + if(b) + return 0; + } + ui_edit_draw(vid_buf, &ed); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + ui_edit_process(mx, my, b, &ed); + } + return 0; +} + int open_ui(pixel *vid_buf, char *save_id, char *save_date) { int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawnthumb=0,authoritah=0,myown=0,queue_open=0,data_size=0,retval=0,bc=255,openable=1; @@ -2709,53 +2794,6 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) drawtext(vid_buf, XRES+BARSIZE-90, YRES+MENUSIZE-63, "Submit", 255, 255, 255, 255); } - if(queue_open) { - if(info_ready && data_ready) { - // Do Open! - status = parse_save(data, data_size, 1, 0, 0); - if(!status) { - //if(svf_last) - //free(svf_last); - svf_last = data; - svf_lsize = data_size; - - svf_open = 1; - svf_own = svf_login && !strcmp(info->author, svf_user); - svf_publish = info->publish && svf_login && !strcmp(info->author, svf_user); - - strcpy(svf_id, save_id); - strcpy(svf_name, info->name); - if(info->tags) - { - strncpy(svf_tags, info->tags, 255); - svf_tags[255] = 0; - } else { - svf_tags[0] = 0; - } - svf_myvote = info->myvote; - retval = 1; - break; - } else { - queue_open = 0; - - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - error_ui(vid_buf, 0, "An Error Occurred"); - } - } else { - fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 190); - drawtext(vid_buf, XRES+BARSIZE/2, XRES+MENUSIZE, "Loading...", 0, 0, 0, 200); - } - } - //Open Button bc = openable?255:150; drawrect(vid_buf, 50, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, bc); @@ -2808,14 +2846,9 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) fillrect(vid_buf, 150, YRES+MENUSIZE-68, 50, 18, 255, 255, 255, 40); if(b && !bq) { //Button Clicked - if(confirm_ui(vid_buf, "Are you sure?", "Are you sure you wish to report this save?", "Report")){ - fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 192); - info_box(vid_buf, "Reporting..."); - if(execute_report(vid_buf, save_id)){ - info_ui(vid_buf, "Success", "This save has been reported"); - retval = 0; - break; - } + if(report_ui(vid_buf, save_id)){ + retval = 0; + break; } } } @@ -2870,17 +2903,69 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } if(!(mx>50 && my>50 && mxauthor, svf_user); + svf_publish = info->publish && svf_login && !strcmp(info->author, svf_user); + + strcpy(svf_id, save_id); + strcpy(svf_name, info->name); + strcpy(svf_description, info->description); + if(info->tags) + { + strncpy(svf_tags, info->tags, 255); + svf_tags[255] = 0; + } else { + svf_tags[0] = 0; + } + svf_myvote = info->myvote; + retval = 1; + break; + } else { + queue_open = 0; + + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_description[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + error_ui(vid_buf, 0, "An Error Occurred"); + } + } else { + fillrect(vid_buf, -1, -1, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 190); + drawtext(vid_buf, 50+(XRES/4)-textwidth("Loading...")/2, 50+(YRES/4), "Loading...", 255, 255, 255, 128); + } + } + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); if(info_ready && svf_login){ ui_edit_process(mx, my, b, &ed); } - if(sdl_key==SDLK_ESCAPE) + if(sdl_key==SDLK_ESCAPE){ + retval = 0; break; + } if(lasttime Date: Sun, 31 Oct 2010 10:26:32 +0000 Subject: [PATCH 226/237] Inlude missing header file for neutron fix --- includes/powder.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index fbf79fc05..4f1f2ff14 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -129,18 +129,19 @@ #define ST_LIQUID 2 #define ST_GAS 3 /* - TODO: We should start to implement these. + TODO: We should start to implement these. (Almost done) */ #define TYPE_PART 0x0001 //1 Powders #define TYPE_LIQUID 0x0002 //2 Liquids #define TYPE_SOLID 0x0004 //4 Solids #define TYPE_GAS 0x0008 //8 Gasses (Includes plasma) -#define TYPE_ENERGY 0x0018 //16 Energy (Thunder, Light, Neutrons etc.) +#define TYPE_ENERGY 0x0010 //16 Energy (Thunder, Light, Neutrons etc.) #define PROP_CONDUCTS 0x0020 //32 Conducts electricity (Currently Unused) #define PROP_BLACK 0x0040 //64 Absorbs Photons #define PROP_NEUTPENETRATE 0x0080 //128 Penetrated by neutrons #define PROP_NEUTABSORB 0x0100 //256 Absorbs neutrons, reflect is default -#define PROP_DEADLY 0x0200 //512 Is deadly for stickman. +#define PROP_NEUTPASS 0x0200 //512 Neutrons pass through, such as with glass +#define PROP_DEADLY 0x0400 //1024 Is deadly for stickman. #define FLAG_STAGNANT 1 struct particle @@ -217,8 +218,8 @@ static const part_type ptypes[PT_NUM] = {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, 23, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive.", TYPE_LIQUID}, {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches.", TYPE_SOLID}, {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure.", TYPE_GAS}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive.", TYPE_SOLID}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure.", TYPE_SOLID}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, 100, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive.", TYPE_SOLID | PROP_NEUTPENETRATE}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure.", TYPE_SOLID | PROP_NEUTPENETRATE}, {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, 100, SC_SOLIDS, R_TEMP-50.0f+273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air.", TYPE_SOLID}, {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable.", TYPE_SOLID|PROP_CONDUCTS}, {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water.", TYPE_SOLID}, @@ -251,7 +252,7 @@ static const part_type ptypes[PT_NUM] = {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, 45, SC_EXPLOSIVE, R_TEMP+45.0f+273.15f, 170, "Liquid Rubidium.", TYPE_LIQUID|PROP_CONDUCTS}, {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)", TYPE_SOLID}, {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable.", TYPE_PART}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure", TYPE_SOLID}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 100, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure", TYPE_SOLID | PROP_NEUTPASS}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)", TYPE_SOLID}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels.", TYPE_PART}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals.", TYPE_ENERGY}, From 103af8d5446409ff0207be795ebb75c9aa309184 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sun, 31 Oct 2010 10:50:43 +0000 Subject: [PATCH 227/237] Browser opening working --- src/interface.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/interface.c b/src/interface.c index 10e272cf3..f108efcdb 100644 --- a/src/interface.c +++ b/src/interface.c @@ -3654,13 +3654,27 @@ int execute_vote(pixel *vid_buf, char *id, char *action) } void open_link(char *uri){ #ifdef WIN32 - ShellExecute(0, "OPEN", uri, NULL, NULL, 0) + ShellExecute(0, "OPEN", uri, NULL, NULL, 0); #elif MACOSX + //char *cmd[] = { "open", uri, (char *)0 }; + //execvp("open", cmd); //LSOpenCFURLRef(CFURLCreateWithString(NULL, CFStringCreateWithCString(NULL, uri, 0) ,NULL), NULL); //TODO: Get this crap working + char *cmd = malloc(7+strlen(uri)); + strcpy(cmd, "open "); + strappend(cmd, uri); + system(cmd); #elif LIN32 - execvp("xdg-open", uri); + //execlp("xdg-open", "xdg-open", uri, (char *)0); + char *cmd = malloc(11+strlen(uri)); + strcpy(cmd, "xdg-open "); + strappend(cmd, uri); + system(cmd); #elif LIN64 - execvp("xdg-open", uri); + //execlp("xdg-open", "xdg-open", uri, (char *)0); + char *cmd = malloc(11+strlen(uri)); + strcpy(cmd, "xdg-open "); + strappend(cmd, uri); + system(cmd); #else printf("Cannot open browser\n"); #endif From 401000098a1dae5e42747e86aa9bfff228ae652f Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Mon, 1 Nov 2010 11:52:26 +0100 Subject: [PATCH 228/237] removed -j3 option.. put it in the wrong place --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9e1f41ee4..88e57114f 100755 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ powder-64-sse3-opengl: $(SOURCES) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 -lGL -lGLU -DOpenGL strip $@ powder-64-sse3: $(SOURCES) - $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 -j3 + $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 strip $@ mv $@ build powder-64-sse2: $(SOURCES) From 79a36b526d4e5365727aff5c2bcda225a53bf5d6 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 2 Nov 2010 16:44:55 +0100 Subject: [PATCH 229/237] OHNOES powder-debug didn't work on 32bit systems.. for obvious reasons --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 88e57114f..b2412ca49 100755 --- a/Makefile +++ b/Makefile @@ -13,9 +13,10 @@ WIN32_TARG := powder-sse.exe powder-sse2.exe powder: $(SOURCES) $(COMPILER) -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 +powder-debug-64: $(SOURCES) + $(COMPILER) -m64 -o$@ $(FLAGS_DBUG) -DLIN64 $(SOURCES) -Iincludes/ powder-debug: $(SOURCES) - $(COMPILER) -m64 -o$@ $(FLAGS_DBUG) -DLIN64 $(SOURCES) -Iincludes/ -DLIN64 - + $(COMPILER) -m32 -o$@ $(FLAGS_DBUG) -DLIN32 $(SOURCES) -Iincludes/ powder-sse3: $(SOURCES) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 strip $@ From 175b37d23944be2c4c5928476e67d380d5920461 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Wed, 3 Nov 2010 11:50:48 +0100 Subject: [PATCH 230/237] added debug flag --- Makefile | 2 +- src/main.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index b2412ca49..eca90db96 100755 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ LFLAGS := -lSDL -lm -lbz2 MFLAGS_SSE3 := -march=native -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=native-DX86 -DX86_SSE2 -msse2 MFLAGS_SSE := -march=native -DX86 -DX86_SSE -FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lbz2 +FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lbz2 -g COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe diff --git a/src/main.c b/src/main.c index 5ef9ce304..dd6a02a1c 100644 --- a/src/main.c +++ b/src/main.c @@ -21,7 +21,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ - #include #include #include @@ -29,7 +28,7 @@ #include #include #include - +#include #ifdef WIN32 #include #else From c3a0a9262c0d00056857af18d93252c87410bad1 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Wed, 3 Nov 2010 11:51:53 +0100 Subject: [PATCH 231/237] how did that get in there? --- src/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.c b/src/main.c index dd6a02a1c..9260abf30 100644 --- a/src/main.c +++ b/src/main.c @@ -28,7 +28,6 @@ #include #include #include -#include #ifdef WIN32 #include #else From d1ce8e55dfd07faa3eb8029ea47a1db6a30f6988 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 3 Nov 2010 14:29:01 +0000 Subject: [PATCH 232/237] A Comment --- src/air.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/air.c b/src/air.c index dd98a124c..385abef86 100644 --- a/src/air.c +++ b/src/air.c @@ -124,6 +124,7 @@ void update_air(void) dy += fvy[y][x]; } + //Pressure Caps, remove for lulz if(dp > 256.0f) dp = 256.0f; if(dp < -256.0f) dp = -256.0f; if(dx > 256.0f) dx = 256.0f; From 9a40e4924e99af80a50b2c5f409d8463f993c4da Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 3 Nov 2010 15:51:02 +0000 Subject: [PATCH 233/237] Major improvements to text wrapping, acceptible but still character based --- includes/graphics.h | 4 +++- src/graphics.c | 30 +++++++++++++++++++++++++++--- src/interface.c | 14 ++++++++++---- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/includes/graphics.h b/includes/graphics.h index ec0d597f0..701935184 100644 --- a/includes/graphics.h +++ b/includes/graphics.h @@ -93,10 +93,12 @@ int drawtextmax(pixel *vid, int x, int y, int w, char *s, int r, int g, int b, i int textnwidth(char *s, int n); -int textnheight(char *s, int n, int w); +void textnpos(char *s, int n, int w, int *cx, int *cy); int textwidthx(char *s, int w); +int textposxy(char *s, int width, int w, int h); + #ifdef WIN32 _inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); #else diff --git a/src/graphics.c b/src/graphics.c index d6604a3e5..83b11416b 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1002,18 +1002,25 @@ int textnwidth(char *s, int n) } return x-1; } -int textnheight(char *s, int n, int w) +void textnpos(char *s, int n, int w, int *cx, int *cy) { int x = 0; + int y = 0; //TODO: Implement Textnheight for wrapped text for(; *s; s++) { - if(!n) + if(!n){ break; + } x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x>=w) { + x = 0; + y += FONT_H+2; + } n--; } - return x-1; + *cx = x-1; + *cy = y; } int textwidthx(char *s, int w) @@ -1029,6 +1036,23 @@ int textwidthx(char *s, int w) } return n; } +int textposxy(char *s, int width, int w, int h) +{ + int x=0,y=0,n=0,cw; + for(; *s; s++) + { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w && y+6 >= h) + break; + x += cw; + if(x>=width) { + x = 0; + y += FONT_H+2; + } + n++; + } + return n; +} #ifdef WIN32 _inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) diff --git a/src/interface.c b/src/interface.c index f108efcdb..3a58ba4f4 100644 --- a/src/interface.c +++ b/src/interface.c @@ -215,7 +215,7 @@ void add_sign_ui(pixel *vid_buf, int mx, int my) //TODO: Finish text wrapping in text edits void ui_edit_draw(pixel *vid_buf, ui_edit *ed) { - int cx, i; + int cx, i, cy; char echo[256], *str; if(ed->hide) @@ -242,9 +242,15 @@ void ui_edit_draw(pixel *vid_buf, ui_edit *ed) drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); if(ed->focus) { - cx = textnwidth(str, ed->cursor); + if(ed->multiline){ + textnpos(str, ed->cursor, ed->w-14, &cx, &cy); + } else { + cx = textnwidth(str, ed->cursor); + cy = 0; + } + for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + drawpixel(vid_buf, ed->x+cx, ed->y+i+cy, 255, 255, 255, 255); } } @@ -278,7 +284,7 @@ void ui_edit_process(int mx, int my, int mb, ui_edit *ed) else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+ed->h) { ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); + ed->cursor = textposxy(str, ed->w-14, mx-ed->x, my-ed->y); } else ed->focus = 0; From 9067564650343042b7a5d1ebdaec1faaec481afd Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 3 Nov 2010 16:13:00 +0000 Subject: [PATCH 234/237] 2 bug fixes --- src/interface.c | 136 +++++------------------------------------------- 1 file changed, 13 insertions(+), 123 deletions(-) diff --git a/src/interface.c b/src/interface.c index 3a58ba4f4..4a2699828 100644 --- a/src/interface.c +++ b/src/interface.c @@ -2251,131 +2251,14 @@ int search_ui(pixel *vid_buf) if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { + //Cancel any ongoing requests, they cause a bug when open_ui is finished. At the moment I cannot be 100% sure this will solve the issue. + if(http){ + http_async_req_close(http); + http = NULL; + } if(open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1) { goto finish; } - /* - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); - - if(search_dates[mp]) { - uri = malloc(strlen(search_ids[mp])*3+strlen(search_dates[mp])*3+strlen(SERVER)+71); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - strappend(uri, "&Date="); - strcaturl(uri, search_dates[mp]); - } else { - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - } - data = http_simple_get(uri, &status, &dlen); - free(uri); - - if(status == 200) - { - status = parse_save(data, dlen, 1, 0, 0); - switch(status) - { - case 1: - error_ui(vid_buf, 0, "Simulation corrupted"); - break; - case 2: - error_ui(vid_buf, 0, "Simulation from a newer version"); - break; - case 3: - error_ui(vid_buf, 0, "Simulation on a too large grid"); - break; - } - if(!status) - { - char *tnames[] = {"ID", NULL}; - char *tparts[1]; - int tplens[1]; - if(svf_last) - free(svf_last); - svf_last = data; - svf_lsize = dlen; - - tparts[0] = search_ids[mp]; - tplens[0] = strlen(search_ids[mp]); - data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); - - svf_open = 1; - svf_own = svf_login && !strcmp(search_owners[mp], svf_user); - svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); - - strcpy(svf_id, search_ids[mp]); - strcpy(svf_name, search_names[mp]); - if(status == 200) - { - if(data) - { - strncpy(svf_tags, data, 255); - svf_tags[255] = 0; - } - else - svf_tags[0] = 0; - } - else - { - svf_tags[0] = 0; - } - - if(svf_login) - { - char *names[] = {"ID", NULL}; - char *parts[1]; - parts[0] = search_ids[mp]; - data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); - if(status == 200) - { - if(data) - { - if(!strcmp(data, "Up")) - { - svf_myvote = 1; - } - else if(!strcmp(data, "Down")) - { - svf_myvote = -1; - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - } - else - { - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - } - } - else - error_ui(vid_buf, status, http_ret_text(status)); - - if(data) - free(data); - goto finish;*/ } if(!last) @@ -2908,7 +2791,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) } } - if(!(mx>50 && my>50 && mx50 && my>50 && mx Date: Wed, 3 Nov 2010 18:10:59 +0000 Subject: [PATCH 235/237] Dem vote bars --- src/interface.c | 56 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/src/interface.c b/src/interface.c index 4a2699828..9c6491eb8 100644 --- a/src/interface.c +++ b/src/interface.c @@ -1131,7 +1131,7 @@ finish: int save_name_ui(pixel *vid_buf) { - int x0=(XRES-400)/2,y0=(YRES-68-YRES/4)/2,b=1,bq,mx,my,ths,nd=0; + int x0=(XRES-420)/2,y0=(YRES-68-YRES/4)/2,b=1,bq,mx,my,ths,nd=0; void *th; ui_edit ed; ui_edit ed2; @@ -1182,8 +1182,8 @@ int save_name_ui(pixel *vid_buf) mx /= sdl_scale; my /= sdl_scale; - drawrect(vid_buf, x0, y0, 400, 90+YRES/4, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 400, 90+YRES/4); + drawrect(vid_buf, x0, y0, 420, 90+YRES/4, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 420, 90+YRES/4); drawtext(vid_buf, x0+8, y0+8, "New simulation name:", 255, 255, 255, 255); drawtext(vid_buf, x0+10, y0+23, "\x82", 192, 192, 192, 255); drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); @@ -1193,14 +1193,16 @@ int save_name_ui(pixel *vid_buf) ui_edit_draw(vid_buf, &ed); ui_edit_draw(vid_buf, &ed2); - drawrect(vid_buf, x0+(192-XRES/3)/2-2+200, y0+34, XRES/3+3, YRES/3+3, 128, 128, 128, 255); - render_thumb(th, ths, 0, vid_buf, x0+(200-XRES/3)/2+200, y0+36, 3); + drawrect(vid_buf, x0+(205-XRES/3)/2-2+205, y0+30, XRES/3+3, YRES/3+3, 128, 128, 128, 255); + render_thumb(th, ths, 0, vid_buf, x0+(205-XRES/3)/2+205, y0+32, 3); ui_checkbox_draw(vid_buf, &cb); drawtext(vid_buf, x0+34, y0+50+YRES/4, "Publish? (Do not publish others'\nworks without permission)", 192, 192, 192, 255); drawtext(vid_buf, x0+5, y0+79+YRES/4, "Save simulation", 255, 255, 255, 255); drawrect(vid_buf, x0, y0+74+YRES/4, 192, 16, 192, 192, 192, 255); + + draw_line(vid_buf, x0+192, y0, x0+192, y0+90+YRES/4, 150, 150, 150, XRES+BARSIZE); sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); @@ -2251,11 +2253,6 @@ int search_ui(pixel *vid_buf) if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { - //Cancel any ongoing requests, they cause a bug when open_ui is finished. At the moment I cannot be 100% sure this will solve the issue. - if(http){ - http_async_req_close(http); - http = NULL; - } if(open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1) { goto finish; } @@ -2525,7 +2522,9 @@ int report_ui(pixel* vid_buf, char *save_id) int open_ui(pixel *vid_buf, char *save_id, char *save_date) { int b=1,bq,mx,my,ca=0,thumb_w,thumb_h,active=0,active_2=0,cc=0,ccy=0,cix=0,hasdrawninfo=0,hasdrawnthumb=0,authoritah=0,myown=0,queue_open=0,data_size=0,retval=0,bc=255,openable=1; - char *uri, *uri_2, *o_uri; + int nyd,nyu,ry,lv; + + char *uri, *uri_2, *o_uri; void *data, *info_data; save_info *info = malloc(sizeof(save_info)); void *http = NULL, *http_2 = NULL; @@ -2649,13 +2648,44 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); } if(info_ready && !hasdrawninfo) { - //drawtext(vid_buf, 2, 2, info->name, 255, 255, 255, 255); + //Render all the save information cix = drawtext(vid_buf, 60, (YRES/2)+60, info->name, 255, 255, 255, 255); cix = drawtext(vid_buf, 60, (YRES/2)+72, "Author:", 255, 255, 255, 155); cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->author, 255, 255, 255, 255); cix = drawtext(vid_buf, cix+4, (YRES/2)+72, "Date:", 255, 255, 255, 155); cix = drawtext(vid_buf, cix+4, (YRES/2)+72, info->date, 255, 255, 255, 255); drawtextwrap(vid_buf, 62, (YRES/2)+86, (XRES/2)-24, info->description, 255, 255, 255, 200); + + //Draw the score bars + if(info->voteup>0||info->votedown>0) + { + lv = (info->voteup>info->votedown?info->voteup:info->votedown); + + if(50>lv) + { + ry = ((float)(50)/(float)lv); + if(lv<8) + { + ry = ry/(8-lv); + } + nyu = info->voteup*ry; + nyd = info->votedown*ry; + } + else + { + ry = ((float)lv/(float)(50)); + nyu = info->voteup/ry; + nyd = info->votedown/ry; + } + + fillrect(vid_buf, 46+(XRES/2)-51, (YRES/2)+53, 54, 6, 0, 107, 10, 255); + fillrect(vid_buf, 46+(XRES/2)-51, (YRES/2)+59, 54, 6, 107, 10, 0, 255); + drawrect(vid_buf, 46+(XRES/2)-51, (YRES/2)+53, 54, 6, 128, 128, 128, 255); + drawrect(vid_buf, 46+(XRES/2)-51, (YRES/2)+59, 54, 6, 128, 128, 128, 255); + + fillrect(vid_buf, 48+(XRES/2)-nyu, (YRES/2)+54, nyu, 4, 57, 187, 57, 255); + fillrect(vid_buf, 48+(XRES/2)-nyd, (YRES/2)+60, nyd, 4, 187, 57, 57, 255); + } ccy = 0; for(cc=0; cccomment_count; cc++) { @@ -2671,7 +2701,7 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); } if(info_ready && svf_login){ - + //Render the comment box. fillrect(vid_buf, 50+(XRES/2)+1, YRES+MENUSIZE-125, XRES+BARSIZE-100-((XRES/2)+1), 75, 0, 0, 0, 255); drawrect(vid_buf, 50+(XRES/2)+1, YRES+MENUSIZE-125, XRES+BARSIZE-100-((XRES/2)+1), 75, 200, 200, 200, 255); From 53eaaec77af41cecf5180a5e3f7e4fd48fbcdbb2 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 3 Nov 2010 18:18:53 +0000 Subject: [PATCH 236/237] Another possible fix for the search bug --- src/interface.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/interface.c b/src/interface.c index 9c6491eb8..defed5e58 100644 --- a/src/interface.c +++ b/src/interface.c @@ -2253,6 +2253,7 @@ int search_ui(pixel *vid_buf) if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { + active = 0; if(open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1) { goto finish; } From 6124922b9f47003e4935580d792b7ba3b8ba1ede Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 3 Nov 2010 18:40:57 +0000 Subject: [PATCH 237/237] Gah, another attempt --- src/interface.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/interface.c b/src/interface.c index defed5e58..994b8c4ad 100644 --- a/src/interface.c +++ b/src/interface.c @@ -2253,7 +2253,6 @@ int search_ui(pixel *vid_buf) if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { - active = 0; if(open_ui(vid_buf, search_ids[mp], search_dates[mp]?search_dates[mp]:NULL)==1) { goto finish; } @@ -2897,6 +2896,11 @@ int open_ui(pixel *vid_buf, char *save_id, char *save_date) if(!b) break; } + //Close open connections + if(http) + http_async_req_close(http); + if(http_2) + http_async_req_close(http_2); return retval; }

D&-|DEf%Kspn4!Eqr2|wAK#bgT>Q}+9GkSSU( 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 50) it = 50; } @@ -10508,9 +10528,9 @@ int main(int argc, char *argv[]) if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 6); + set_cmode((cmode+1) % 7); if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+5) % 6); + set_cmode((cmode+6) % 7); save_presets(0); } if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) @@ -10601,7 +10621,6 @@ int main(int argc, char *argv[]) //Something } } - //create_parts(x, y, bs, SPC_AIR); lx = x; ly = y; lb = 0; @@ -10609,7 +10628,7 @@ int main(int argc, char *argv[]) } else { - //Copy state before drawing any particles (for undo) + //Copy state before drawing any particles (for undo)7 int cbx, cby, cbi; for(cbi=0; cbi12?64:it*5); drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); } @@ -10777,9 +10794,6 @@ int main(int argc, char *argv[]) #endif drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); } - /*#ifdef MT - pthread_join(pth2,NULL); - #endif*/ if(hud_enable) { From 08f98b5f6ace23e8ab2110b04fa4297806c15d76 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Aug 2010 18:55:50 +0100 Subject: [PATCH 085/237] Version 41.3, bug fixes for Insl and Swch --- powder.c | 58 ++++++++++++++++++++++++++++++++----------------------- version.h | 2 +- 2 files changed, 35 insertions(+), 25 deletions(-) mode change 100644 => 100755 powder.c diff --git a/powder.c b/powder.c old mode 100644 new mode 100755 index 7fe78be43..e78b7e11d --- a/powder.c +++ b/powder.c @@ -2086,7 +2086,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -2102,14 +2102,38 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10)) || t ==PT_SWCH) + }else if(t==PT_SWCH) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && @@ -2121,8 +2145,8 @@ void update_particles_i(pixel *vid, int start, int inc) if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) continue; rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; @@ -2191,20 +2215,6 @@ void update_particles_i(pixel *vid, int start, int inc) } } pavg = parts_avg(i, r>>8); - if(t==PT_SWCH&&pavg!= PT_INSL) - { - if(parts[r>>8].type == PT_SWCH) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } if(rt==PT_SWCH && t==PT_SPRK) { pavg = parts_avg(r>>8, i); diff --git a/version.h b/version.h index c306999c7..83066d0d7 100755 --- a/version.h +++ b/version.h @@ -21,7 +21,7 @@ #define VERSION_H #define SAVE_VERSION 41 -#define MINOR_VERSION 0 +#define MINOR_VERSION 3 #define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. #define MENUV3 From 580a76a79f55876961b2bc12908288c915580963 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 19 Aug 2010 10:50:05 +0100 Subject: [PATCH 086/237] Fix typing error that broke autoupdate --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index e78b7e11d..8e73c0fa6 100755 --- a/powder.c +++ b/powder.c @@ -9645,7 +9645,7 @@ char my_uri[] = "http://" SERVER "/Update.api?Action=Download&Architecture=" #else "Unknown" #endif - "&InstrctionSet=" + "&InstructionSet=" #if defined X86_SSE3 "SSE3" #elif defined X86_SSE2 From 392bf0c8947a583ed2e7c57528652985bc70a5dc Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 19 Aug 2010 12:28:26 -0400 Subject: [PATCH 087/237] changed PT_METL to PT_STNE and PT_WIRE to PT_METL so it makes sense --- powder.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/powder.c b/powder.c index 8e73c0fa6..acbef392c 100755 --- a/powder.c +++ b/powder.c @@ -545,7 +545,7 @@ struct menu_section msections[] = #define PT_WATR 2 #define PT_OILL 3 #define PT_FIRE 4 -#define PT_METL 5 +#define PT_STNE 5 #define PT_LAVA 6 #define PT_GUNP 7 #define PT_NITR 8 @@ -554,7 +554,7 @@ struct menu_section msections[] = #define PT_PLEX 11 #define PT_DFRM 12 #define PT_ICEI 13 -#define PT_WIRE 14 +#define PT_METL 14 #define PT_SPRK 15 #define PT_SNOW 16 #define PT_WOOD 17 @@ -686,7 +686,7 @@ const struct part_state pstates[] = /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GASS, 50.0f, PT_NONE, 0.0f}, /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2500.0f}, /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 710.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LAVA */ {ST_LIQUID, PT_METL, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_STNE, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -1002,7 +1002,7 @@ inline int create_part(int p, int x, int y, int t) if(t==PT_SPRK) { - if((pmap[y][x]&0xFF)!=PT_WIRE && + if((pmap[y][x]&0xFF)!=PT_METL && (pmap[y][x]&0xFF)!=PT_PSCN && (pmap[y][x]&0xFF)!=PT_NSCN && (pmap[y][x]&0xFF)!=PT_HSCN && @@ -1386,7 +1386,7 @@ void update_particles_i(pixel *vid, int start, int inc) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; - if(parts[i].life<=0 && t!=PT_WIRE && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY) + if(parts[i].life<=0 && t!=PT_METL && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY) { kill_part(i); continue; @@ -1394,10 +1394,10 @@ void update_particles_i(pixel *vid, int start, int inc) if(parts[i].life<=0 && t==PT_SPRK) { t = parts[i].ctype; - if(t!=PT_WIRE&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) + if(t!=PT_METL&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) parts[i].temp = R_TEMP; if(!t) - t = PT_WIRE; + t = PT_METL; parts[i].type = t; parts[i].life = 4; if(t == PT_WATR) @@ -1424,7 +1424,7 @@ void update_particles_i(pixel *vid, int start, int inc) (bmap[y/CELL][x/CELL]==2) || (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) { kill_part(i); @@ -1720,7 +1720,7 @@ void update_particles_i(pixel *vid, int start, int inc) pt = parts[i].temp -= 2.5f; } - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) { nx = x % CELL; if(nx == 0) @@ -1738,7 +1738,7 @@ void update_particles_i(pixel *vid, int start, int inc) ny = y/CELL; if(nx>=0 && ny>=0 && nx>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) { t = parts[i].type = PT_NONE; parts[r>>8].ctype = parts[r>>8].type; @@ -1828,7 +1828,7 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL) { parts[i].temp = 200.0f; } @@ -2094,7 +2094,7 @@ void update_particles_i(pixel *vid, int start, int inc) rt = parts[r>>8].type; if(parts_avg(i,r>>8) != PT_INSL) { - if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) { parts[r>>8].life = 4; parts[r>>8].ctype = rt; @@ -2146,7 +2146,7 @@ void update_particles_i(pixel *vid, int start, int inc) continue; rt = parts[r>>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH)) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; @@ -2160,7 +2160,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(lpv < 1) lpv = 1; if(legacy_enable) { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && ptypes[rt].meltable*lpv>(rand()%1000)) { if(t!=PT_LAVA || parts[i].life>0) @@ -2173,7 +2173,7 @@ void update_particles_i(pixel *vid, int start, int inc) else { parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; parts[i].ctype = PT_NONE;//rt; goto killed; } @@ -2191,7 +2191,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_LAVA) { parts[i].life = 0; - t = parts[i].type = PT_METL; + t = parts[i].type = PT_STNE; goto killed; } } @@ -2208,7 +2208,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_LAVA) { parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; parts[i].ctype = PT_NONE; goto killed; } @@ -2232,7 +2232,7 @@ void update_particles_i(pixel *vid, int start, int inc) pavg = parts_avg(i, r>>8); if(pavg != PT_INSL) { - if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) @@ -2280,7 +2280,7 @@ void update_particles_i(pixel *vid, int start, int inc) } if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) { - if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) + if(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) { t = parts[i].type = PT_ETRD; parts[i].ctype = PT_NONE; From e2744b1d4d091618abffbc393f88634b31a1234e Mon Sep 17 00:00:00 2001 From: Ant Date: Fri, 20 Aug 2010 02:04:07 +0100 Subject: [PATCH 088/237] Added PLAStic, removed the relationship between OIL and GAS, Plastic is created from pressurised OIL and melts back into OIL. May need values tweeking on lines 1493, 1576 and 1579 --- powder.c | 161 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 91 insertions(+), 70 deletions(-) diff --git a/powder.c b/powder.c index acbef392c..d5dc2c14b 100755 --- a/powder.c +++ b/powder.c @@ -598,7 +598,8 @@ struct menu_section msections[] = #define PT_STKM 55 #define PT_SWCH 56 #define PT_SMKE 57 -#define PT_NUM 58 +#define PT_PLAS 58 +#define PT_NUM 59 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -616,7 +617,7 @@ const struct part_type ptypes[] = {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Very light dust. Flammable."}, {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Flammable."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Flammable. Solidifies under pressure"}, {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f, 88, "Ignites flammable materials. Heats air."}, {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Heavy particles. Meltable."}, {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, @@ -671,6 +672,7 @@ const struct part_type ptypes[] = {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, + {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, }; #define ST_NONE 0 @@ -683,14 +685,14 @@ const struct part_state pstates[] = /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GASS, 50.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2500.0f}, /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 710.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* LAVA */ {ST_LIQUID, PT_STNE, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_OILL, -40.0f, PT_NONE, 50.0f, PT_FIRE, 300.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 300.0f}, /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -738,6 +740,7 @@ const struct part_state pstates[] = /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -745,68 +748,69 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S P*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M l*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K a*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E s*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, + /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0}, + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, + /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; #define FLAG_STAGNANT 1 @@ -943,7 +947,7 @@ void kill_part(int i) pfree = i; } -#ifdef WIN32 +#ifdef WIN32/ _inline int create_part(int p, int x, int y, int t) #else inline int create_part(int p, int x, int y, int t) @@ -1094,7 +1098,7 @@ inline int create_part(int p, int x, int y, int t) //} else { // parts[i].life = 0; // parts[i].type = PT_NONE; - //} + //}/ } if(t!=PT_STKM) @@ -1484,8 +1488,19 @@ void update_particles_i(pixel *vid, int start, int inc) } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + if(t==PT_PLAS && !parts[i].life) + { + if(pv[y/CELL][x/CELL]>75.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + } + } + else + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } } if(ptypes[t].diffusion) @@ -1558,7 +1573,11 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = PT_OILL; if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) t = parts[i].type = PT_GASS; + if(t==PT_OILL && pv[y/CELL][x/CELL]>15.0f) + t = parts[i].type = PT_PLAS; } + if(t==PT_OILL && pv[y/CELL][x/CELL]>40.0f) + t = parts[i].type = PT_PLAS; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) @@ -2025,6 +2044,8 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].type = PT_GASS; if((r&0xFF)==PT_PLNT && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; + if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) + parts[r>>8].type = PT_OILL; } } else if(t==PT_PHOT) From 68e09b72bb9cacf4ec12ee38c660314659a5dadd Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Fri, 20 Aug 2010 05:25:27 -0700 Subject: [PATCH 089/237] Stickman bottom edge fix (savask) --- powder.c | 661 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 338 insertions(+), 323 deletions(-) mode change 100755 => 100644 powder.c diff --git a/powder.c b/powder.c old mode 100755 new mode 100644 index acbef392c..0191eab11 --- a/powder.c +++ b/powder.c @@ -1111,8 +1111,10 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 100; parts[i].ctype = 0; parts[i].temp = ptypes[t].heat; - player[2] = PT_DUST; - player[3] = x-1; //Setting legs positions + + + + player[3] = x-1; //Setting legs positions player[4] = y+6; player[5] = x-1; player[6] = y+6; @@ -2311,369 +2313,376 @@ killed: continue; } - if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } - } - } + } + } - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if(((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID || ptypes[pmap[ny+y][nx+x]&0xFF].falldown > 0) && + (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) - { - int random = abs(rand()%3-1)*3; - if (random==0) - { - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - } - else - { - parts[r>>8].vy = 0; - parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; - } - } + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = -(player[1] == 0)*random; + parts[r>>8].vx = (player[1]!=0)*(((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } - } - } - } + } + } + } - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } - } + } - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + if ((int)(ny+player[8])>=YRES) + continue; - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } + if ((int)(ny+player[16])>=YRES) + continue; - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - } + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } + } - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } - isplayer = 1; - } + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } if(t==PT_CLNE) { @@ -10845,7 +10854,13 @@ int main(int argc, char *argv[]) fillrect(vid_buf, 12, 12, textwidth(uitext)+8, 15, 0, 0, 0, 140); drawtext(vid_buf, 16, 16, uitext, 32, 216, 255, 200); } - sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); + sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); + + //Setting an element for the stick man + if(ptypes[sr].falldown>0) + player[2] = sr; + else + player[2] = PT_DUST; } http_done(); From dbba90eb018286e1edc870b67437d4973b680a96 Mon Sep 17 00:00:00 2001 From: Ant Date: Fri, 20 Aug 2010 16:56:52 +0100 Subject: [PATCH 090/237] Tweaked values of plasic and removed GAS-> OIL assosiations I missed, Reason for removeal is PLAS melts at 250, OIL vaporised at a much lower temp meaning PLAS would "melt" into GAS. --- powder.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/powder.c b/powder.c index d5dc2c14b..ab30878a0 100755 --- a/powder.c +++ b/powder.c @@ -672,7 +672,7 @@ const struct part_type ptypes[] = {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, - {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, + {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, }; #define ST_NONE 0 @@ -740,7 +740,7 @@ const struct part_state pstates[] = /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -1488,13 +1488,10 @@ void update_particles_i(pixel *vid, int start, int inc) } else { - if(t==PT_PLAS && !parts[i].life) + if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) { - if(pv[y/CELL][x/CELL]>75.0f) - { parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - } } else { @@ -1569,14 +1566,10 @@ void update_particles_i(pixel *vid, int start, int inc) { if(t==PT_WTRV && pv[y/CELL][x/CELL]>4.0f) t = parts[i].type = PT_DSTW; - if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) - t = parts[i].type = PT_OILL; - if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) - t = parts[i].type = PT_GASS; - if(t==PT_OILL && pv[y/CELL][x/CELL]>15.0f) + if(t==PT_OILL && pv[y/CELL][x/CELL]>8.0f) t = parts[i].type = PT_PLAS; } - if(t==PT_OILL && pv[y/CELL][x/CELL]>40.0f) + if(t==PT_OILL && pv[y/CELL][x/CELL]>20.0f) t = parts[i].type = PT_PLAS; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; From 873dfea74daed5ab3ae8dd0ee99aa1c770a885ab Mon Sep 17 00:00:00 2001 From: Ant Date: Fri, 20 Aug 2010 20:33:41 +0100 Subject: [PATCH 091/237] Added Diesel [DESL] to replace OILs relationship with GAS. --- powder.c | 157 +++++++++++++++++++++++++++++++----------------------- version.h | 2 +- 2 files changed, 91 insertions(+), 68 deletions(-) diff --git a/powder.c b/powder.c index ab30878a0..cf93345f6 100755 --- a/powder.c +++ b/powder.c @@ -599,7 +599,8 @@ struct menu_section msections[] = #define PT_SWCH 56 #define PT_SMKE 57 #define PT_PLAS 58 -#define PT_NUM 59 +#define PT_DESL 59 +#define PT_NUM 60 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -672,7 +673,8 @@ const struct part_type ptypes[] = {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, - {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, + {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, + {"DESL", PIXPACK(0x440000), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, }; #define ST_NONE 0 @@ -741,6 +743,7 @@ const struct part_state pstates[] = /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -748,69 +751,75 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S P*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M l*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K a*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E s*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, - /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S P D*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M l e*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K a s*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E s l*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0}, + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1}, + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S P D*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M l e*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K a s*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E s l*/ + }; #define FLAG_STAGNANT 1 @@ -1568,9 +1577,21 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = PT_DSTW; if(t==PT_OILL && pv[y/CELL][x/CELL]>8.0f) t = parts[i].type = PT_PLAS; + if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) + t = parts[i].type = PT_GASS; + if(t==PT_GASS && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_DESL; + if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) + t = parts[i].type = PT_FIRE; } if(t==PT_OILL && pv[y/CELL][x/CELL]>20.0f) t = parts[i].type = PT_PLAS; + if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) + t = parts[i].type = PT_GASS; + if(t==PT_DESL && pv[y/CELL][x/CELL]>60.0f) // Only way I know to make it + t = parts[i].type = PT_FIRE; // combust under pressure. + if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) + t = parts[i].type = PT_DESL; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) @@ -2032,13 +2053,15 @@ void update_particles_i(pixel *vid, int start, int inc) if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) parts[r>>8].type = PT_DFRM; if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_OILL; + parts[r>>8].type = PT_DESL; if((r&0xFF)==PT_OILL && 5>(rand()%1000)) - parts[r>>8].type = PT_GASS; + parts[r>>8].type = PT_PLAS; if((r&0xFF)==PT_PLNT && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_DESL && 15>(rand()%1000)) + parts[r>>8].type = PT_GASS; } } else if(t==PT_PHOT) diff --git a/version.h b/version.h index 83066d0d7..6e0874253 100755 --- a/version.h +++ b/version.h @@ -22,7 +22,7 @@ #define SAVE_VERSION 41 #define MINOR_VERSION 3 -#define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. +#define IDENT_VERSION "A" //Change this if you're not Simon! It should be a single letter. #define MENUV3 #define BETA From ce36e304bbc87daaeddac0c2157e5234f392e6b8 Mon Sep 17 00:00:00 2001 From: Ant Date: Fri, 20 Aug 2010 20:50:53 +0100 Subject: [PATCH 092/237] Added Diesel [DESL] to replace OILs relationship with GAS. Recommit to undo merge with FacialTurd's --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index cf93345f6..489061324 100755 --- a/powder.c +++ b/powder.c @@ -1588,7 +1588,7 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = PT_PLAS; if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) t = parts[i].type = PT_GASS; - if(t==PT_DESL && pv[y/CELL][x/CELL]>60.0f) // Only way I know to make it + if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it t = parts[i].type = PT_FIRE; // combust under pressure. if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) t = parts[i].type = PT_DESL; From 8768223f4681f0450701df3792a0a3e98b16e1a9 Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Fri, 20 Aug 2010 20:25:27 +0800 Subject: [PATCH 093/237] Stickman bottom edge fix (savask) --- powder.c | 661 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 338 insertions(+), 323 deletions(-) mode change 100755 => 100644 powder.c diff --git a/powder.c b/powder.c old mode 100755 new mode 100644 index ab30878a0..570f68eed --- a/powder.c +++ b/powder.c @@ -1115,8 +1115,10 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 100; parts[i].ctype = 0; parts[i].temp = ptypes[t].heat; - player[2] = PT_DUST; - player[3] = x-1; //Setting legs positions + + + + player[3] = x-1; //Setting legs positions player[4] = y+6; player[5] = x-1; player[6] = y+6; @@ -2325,369 +2327,376 @@ killed: continue; } - if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } - } - } + } + } - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if(((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID || ptypes[pmap[ny+y][nx+x]&0xFF].falldown > 0) && + (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) - { - int random = abs(rand()%3-1)*3; - if (random==0) - { - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - } - else - { - parts[r>>8].vy = 0; - parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; - } - } + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = -(player[1] == 0)*random; + parts[r>>8].vx = (player[1]!=0)*(((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } - } - } - } + } + } + } - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } - } + } - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + if ((int)(ny+player[8])>=YRES) + continue; - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } + if ((int)(ny+player[16])>=YRES) + continue; - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - } + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } + } - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } - isplayer = 1; - } + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } if(t==PT_CLNE) { @@ -10859,7 +10868,13 @@ int main(int argc, char *argv[]) fillrect(vid_buf, 12, 12, textwidth(uitext)+8, 15, 0, 0, 0, 140); drawtext(vid_buf, 16, 16, uitext, 32, 216, 255, 200); } - sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); + sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); + + //Setting an element for the stick man + if(ptypes[sr].falldown>0) + player[2] = sr; + else + player[2] = PT_DUST; } http_done(); From 22c6a67595f9914e7411882f25dcb6e21b80e17a Mon Sep 17 00:00:00 2001 From: Ant Date: Sat, 21 Aug 2010 06:57:49 +0100 Subject: [PATCH 094/237] Think I fixed DESL/STNE bug, Changed some FOAM leftovers to INSU, Added Coal (Slow burning solid fuel), Made DESL burn a bit slower too. TODO: Tweak Values a bit more for pressurising WOOD to COAL. --- powder.c | 156 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 84 insertions(+), 72 deletions(-) diff --git a/powder.c b/powder.c index 994f4737f..16c3c4fa9 100644 --- a/powder.c +++ b/powder.c @@ -600,7 +600,8 @@ struct menu_section msections[] = #define PT_SMKE 57 #define PT_PLAS 58 #define PT_DESL 59 -#define PT_NUM 60 +#define PT_COAL 60 +#define PT_NUM 61 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -632,7 +633,7 @@ const struct part_type ptypes[] = {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Conducts electricity. Meltable."}, {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electricity. Conducted by metal and water."}, {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f, 164, "Solid. Flammable."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f, 164, "Solid. Flammable. Can be pressurised into COAL"}, {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 60, "Neutrons. Interact with matter in odd ways."}, {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 65, "Plant, drinks water and grows."}, @@ -673,8 +674,10 @@ const struct part_type ptypes[] = {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, - {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, - {"DESL", PIXPACK(0x440000), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.0f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, + {"DESL", PIXPACK(0x440000), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; #define ST_NONE 0 @@ -744,6 +747,7 @@ const struct part_state pstates[] = /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 250.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -751,74 +755,75 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S P D*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M l e*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K a s*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E s l*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S P D*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M l e*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K a s*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E s l*/ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C*/ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o*/ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a*/ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ + /* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l*/ }; @@ -1585,6 +1590,8 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = PT_DESL; if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) t = parts[i].type = PT_FIRE; + if(t==PT_WOOD && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_COAL; } if(t==PT_OILL && pv[y/CELL][x/CELL]>20.0f) t = parts[i].type = PT_PLAS; @@ -1594,6 +1601,8 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = PT_FIRE; // combust under pressure. if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) t = parts[i].type = PT_DESL; + if(t==PT_WOOD && pv[y/CELL][x/CELL]>30.0f) + t = parts[i].type = PT_COAL; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) @@ -2064,6 +2073,8 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].type = PT_OILL; if((r&0xFF)==PT_DESL && 15>(rand()%1000)) parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_COAL && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; } } else if(t==PT_PHOT) @@ -2206,6 +2217,7 @@ void update_particles_i(pixel *vid, int start, int inc) { parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].ctype = (parts[r>>8].type==PT_DESL)?PT_SMKE:parts[r>>8].ctype; //Stop DESL making STNE when burnt? parts[r>>8].type = PT_LAVA; parts[r>>8].life = rand()%120+240; } From 858918b201d8dc21d50e61a65e03a07da18137b5 Mon Sep 17 00:00:00 2001 From: Ant Date: Sat, 21 Aug 2010 16:29:16 +0100 Subject: [PATCH 095/237] Added Liquid Oxygen, Oxygen, Tweaked some more values. --- Makefile | 4 +- powder.c | 156 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 84 insertions(+), 76 deletions(-) diff --git a/Makefile b/Makefile index e5b5f9eae..c02fb2eb5 100755 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ LFLAGS_MTW32 := -lpthreadGC2 LFLAGS_MT := $(LFLAGS) -lpthread MFLAGS_MT := -march=k8 -DX86 -DX86_SSE3 -DMT -msse3 MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 -MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 +MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 -msse2 MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lpthread -lbz2 COMPILER := gcc @@ -88,4 +88,4 @@ release: $(LINUX_TARG) $(WIN32_TARG) powder-src.tar.bz2 cp powder-sse release/powder gzip release/powder cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. - rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe \ No newline at end of file + rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe diff --git a/powder.c b/powder.c index 16c3c4fa9..b28ffa67c 100644 --- a/powder.c +++ b/powder.c @@ -601,7 +601,9 @@ struct menu_section msections[] = #define PT_PLAS 58 #define PT_DESL 59 #define PT_COAL 60 -#define PT_NUM 61 +#define PT_LOX 61 +#define PT_O2 62 +#define PT_NUM 63 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -675,8 +677,10 @@ const struct part_type ptypes[] = {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.0f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, - {"DESL", PIXPACK(0x440000), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0.01f, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, + {"LOX", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 5.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -704,7 +708,7 @@ const struct part_state pstates[] = /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 500.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_COAL, 300.0f, PT_FIRE, 600.0f}, /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 300.0f}, @@ -747,7 +751,9 @@ const struct part_state pstates[] = /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 250.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, + /* LOX */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LOX, -190.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -755,75 +761,78 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C*/ - /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o*/ - /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a*/ - /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Dust */ - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, /* Watr */ - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ - /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Stne */ - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Lava */ - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Gunp */ - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Icei */ - /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Snow */ - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0}, /* Neut */ - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Plut */ - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Cnct */ - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, /* Dstw */ - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Salt */ - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0}, /* Sltw */ - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* Dmnd */ - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Brml */ - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Uran */ - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* MWax */ - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* LN2 */ - /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* LRbd */ - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Sand */ - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* BGla */ - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, /* NIce */ - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ - /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ - /* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ - /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l*/ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O*/ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2*/ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X */ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l */ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ + /* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LOX */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1}, /* LOX */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0}, /* O2 */ + + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X */ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l */ }; @@ -2217,7 +2226,6 @@ void update_particles_i(pixel *vid, int start, int inc) { parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].ctype = (parts[r>>8].type==PT_DESL)?PT_SMKE:parts[r>>8].ctype; //Stop DESL making STNE when burnt? parts[r>>8].type = PT_LAVA; parts[r>>8].life = rand()%120+240; } From c1045170272538a862f2bc0cc0220221799f1104 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 22 Aug 2010 11:53:43 -0400 Subject: [PATCH 096/237] work please --- powder.c | 10949 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 10949 insertions(+) create mode 100644 powder.c diff --git a/powder.c b/powder.c new file mode 100644 index 000000000..b5e85d2a9 --- /dev/null +++ b/powder.c @@ -0,0 +1,10949 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * Copyright (c) 2010 Skresanov Savely + * Copyright (c) 2010 Bryan Hoyle + * Copyright (c) 2010 Nathan Cousins + * + * 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 02111-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif + + +#include "version.h" +#include "http.h" +#include "md5.h" +#include "update.h" +#include "hmap.h" + +#define SERVER "powdertoy.co.uk" + +#undef PLOSS + +#ifdef MENUV3 +#define MENUSIZE 40 +#else +#define MENUSIZE 20 +#endif +#define BARSIZE 14 +#define XRES 612 +#define YRES 384 +#define NPART XRES*YRES + +#define ZSIZE_D 16 +#define ZFACTOR_D 8 +unsigned char ZFACTOR = 256/ZSIZE_D; +unsigned char ZSIZE = ZSIZE_D; + +#define CELL 4 +#define ISTP (CELL/2) +#define CFDS (4.0f/CELL) + +typedef unsigned char uint8; + +#ifdef PIX16 +#define PIXELSIZE 2 +typedef unsigned short pixel; +#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) +#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) +#define PIXR(x) (((x)>>8)&0xF8) +#define PIXG(x) (((x)>>3)&0xFC) +#define PIXB(x) (((x)<<3)&0xF8) +#else +#define PIXELSIZE 4 +typedef unsigned int pixel; +#ifdef PIX32BGR +#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) +#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) +#define PIXR(x) ((x)&0xFF) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)>>16) +#else +#ifdef PIX32BGRA +#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) +#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) +#define PIXR(x) (((x)>>8)&0xFF) +#define PIXG(x) (((x)>>16)&0xFF) +#define PIXB(x) (((x)>>24)) +#else +#define PIXPACK(x) (x) +#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) +#define PIXR(x) ((x)>>16) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)&0xFF) +#endif +#endif +#endif + +char *it_msg = + "\brThe Powder Toy\n" + "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" + "\n" + "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" + "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" + "\bgPick your material from the menu using mouse left/right buttons.\n" + "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" + "Shift+drag will create straight lines of particles.\n" + "Ctrl+drag will result in filled rectangles.\n" + "Ctrl+Shift+click will flood-fill a closed area.\n" + "Ctrl+Z will act as Undo.\n" + "Middle click or Alt+Click to \"sample\" the particles.\n" + "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" + "Use 'S' to save parts of the window as 'stamps'.\n" + "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" + "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" + "Use the mouse scroll wheel to change the tool size for particles.\n" + "'Q' will quit the application.\n" + "The spacebar can be used to pause physics.\n" + "'P' will take a screenshot and save it into the current directory.\n" + "\n" + "\brhttp://powdertoy.co.uk/\n" + "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" + "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" + "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" + "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" + "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" + "\n" + "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" + "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" + ; + +typedef struct +{ + int start, inc; + pixel *vid; +} upstruc; + +#ifdef BETA +char *old_ver_msg_beta = "A new beta is available - click here!"; +#endif +char *old_ver_msg = "A new version is available - click here!"; +float mheat = 0.0f; + +int do_open = 0; +int sys_pause = 0; +int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. +int death = 1, gravityd = 2, framerender = 0; +int amd = 1; + +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + +#define MAXSIGNS 16 + +struct sign +{ + int x,y,ju; + char text[256]; +} signs[MAXSIGNS]; + +/*********************************************************** + * AIR FLOW SIMULATOR * + ***********************************************************/ + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; + +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +unsigned cmode = 3; + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; +#define TSTEPP 0.3f +#define TSTEPV 0.4f +#define VADV 0.3f +#define VLOSS 0.999f +#define PLOSS 0.9999f +int numCores = 4; +float kernel[9]; +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} + +int core_count() +{ + int numCPU = 1; +#ifdef MT +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; +#else +#ifdef MACOSX + numCPU = 4; +#else + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); +#endif +#endif + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); +#endif + return numCPU; +} + +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} + +void *update_air_th(void *arg) +{ + update_air(); + return NULL; +} + +#ifdef WIN32 +_inline unsigned clamp_flt(float f, float min, float max) +#else +inline unsigned clamp_flt(float f, float min, float max) +#endif +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +#ifdef WIN32 +_inline float restrict_flt(float f, float min, float max) +#else +inline float restrict_flt(float f, float min, float max) +#endif +{ + if(fmax) + return max; + return f; +} + +void draw_air(pixel *vid) +{ + int x, y, i, j; + pixel c; + + if(cmode == 2) + return; + + for(y=0; y 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } + else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; j=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + { + return 1; + } + + if((r&0xFF)==PT_VOID) + { + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL) + { + parts[i].type=PT_NONE; + if(!legacy_enable) + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } + return 0; + } + + if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide + { + return 1; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) + { + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) + { + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + { + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + + if(t==SPC_HEAT||t==SPC_COOL) + { + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) + { + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } + else + { + return -1; + } + } + if(t==SPC_AIR) + { + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) + { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } + else + i = p; + + if(t==PT_GLAS) + { + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + } + if(t!=PT_STKM) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + } + if(t==PT_ACID) + { + parts[i].life = 75; + } + /*Testing + if(t==PT_WOOD){ + parts[i].life = 150; + } + End Testing*/ + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NBLE) + parts[i].life = 0; + if(t==PT_NEUT) + { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) + { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f) + { + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } + else + { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //} + } + + if(t!=PT_STKM) + pmap[y][x] = t|(i<<8); + else + { + if(isplayer==0) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = PT_STKM; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 100; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + player[2] = PT_DUST; + player[3] = x-1; //Setting legs positions + player[4] = y+6; + player[5] = x-1; + player[6] = y+6; + + player[7] = x-3; + player[8] = y+12; + player[9] = x-3; + player[10] = y+12; + + player[11] = x+1; + player[12] = y+6; + player[13] = x+1; + player[14] = y+6; + + player[15] = x+3; + player[16] = y+12; + player[17] = x+3; + player[18] = y+12; + + isplayer = 1; + } + } + + return i; +} + +#ifdef WIN32 +_inline void delete_part(int x, int y) +#else +inline void delete_part(int x, int y) +#endif +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +#ifdef WIN32 +_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#else +inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#endif +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +//Signum function +#ifdef WIN32 +_inline int sign(float i) +#else +inline int sign(float i) +#endif +{ + if (i<0) + return -1; + if (i>0) + return 1; + return 0; +} + +void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line +{ + int dx, dy, i, sx, sy, check, e, x, y; + + dx = abs(x1-x2); + dy = abs(y1-y2); + sx = sign(x2-x1); + sy = sign(y2-y1); + x = x1; + y = y1; + check = 0; + + if (dy>dx) + { + dx = dx+dy; + dy = dx-dy; + dx = dx-dy; + check = 1; + } + + e = (dy<<2)-dx; + for (i=0; i<=dx; i++) + { + vid[x+y*a] =PIXRGB(r, g, b); + if (e>=0) + { + if (check==1) + x = x+sx; + else + y = y+sy; + e = e-(dx<<2); + } + if (check==1) + y = y+sy; + else + x = x+sx; + e = e+(dy<<2); + } +} + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + 255*PIXR(t)) >> 8; + g = (a*g + 255*PIXG(t)) >> 8; + b = (a*b + 255*PIXB(t)) >> 8; + if(r>255) + r = 255; + if(g>255) + g = 255; + if(b>255) + b = 255; + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); + +#ifdef WIN32 +_inline int is_wire(int x, int y) +#else +inline int is_wire(int x, int y) +#endif +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} + +#ifdef WIN32 +_inline int is_wire_off(int x, int y) +#else +inline int is_wire_off(int x, int y) +#endif +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) + { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) + { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y>8) < NPART && (pmr>>8) >= 0) + { + return parts[pmr>>8].type; + } + else + { + return PT_NONE; + } +} +int nearest_part(int ci, int t) +{ + int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); + int ndistance = 0; + int id = -1; + int i = 0; + int cx = (int)parts[ci].x; + int cy = (int)parts[ci].y; + for(i=0; i=XRES || y>=YRES || + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS||t==PT_NBLE) + { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) + { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) + { + if(pv[y/CELL][x/CELL]>1.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } + else + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + if(gravityd == 1) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 2) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + if(gravityd == 3) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; + } + if(gravityd == 4) + { + parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 5) + { + parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL]; + } + if(gravityd == 6) + { + parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + if(gravityd == 7) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 8) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 9) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; + } + } + + if(ptypes[t].diffusion) + { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) + { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } + else + { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) + { + mv -= ISTP; + if(mv <= 0.0f) + { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) + { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_OILL; + if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) + t = parts[i].type = PT_GASS; + } + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + // t = parts[i].type = PT_BGLA; + if(t==PT_GLAS) + { + parts[i].pavg[0] = parts[i].pavg[1]; + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) + { + parts[i].type = PT_BGLA; + } + } + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) + { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) + { + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1) + { + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + + if(!legacy_enable) + { + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)) + { + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) + { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE||t==PT_PLSM) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) + { + if(t==PT_LAVA&&parts[i].ctype) + { + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) + { + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } + else + { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } + else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) + { + if(pstates[t].liquid==PT_LAVA) + { + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } + else if(t==PT_ICEI&&parts[i].ctype) + { + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else + { + t = parts[i].type = pstates[t].liquid; + } + } + else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) + { + t = parts[i].type = pstates[t].liquid; + } + else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) + { + if(t==PT_SLTW&&1>rand()%6) + { + t = parts[i].type = PT_SALT; + } + else + { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) + { + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA) + { + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_CSCN&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + if(t==PT_HSCN&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) + { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) + { + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } + else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) + { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)) + { + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } + else + { + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_ICEI || t==PT_SNOW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if(legacy_enable) + { + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } + } + } + else if(t==PT_HSCN||t==PT_CSCN) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) + { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) + { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } + else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%250)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_SLTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) + { + parts[r>>8].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_WTRV) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } + + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } + } + } + else if(t==PT_ACID) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID) + { + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) + { + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } + else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) + { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } + else if (parts[i].life==50) + { + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_NEUT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) + { + if(33>rand()%100) + { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } + else + { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + } + } + else if(t==PT_LCRY) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_LCRY) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_BTRY) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts_avg(i,r>>8) != PT_INSL) + { + if((rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + parts[r>>8].type = PT_SPRK; + } + } + } + }else if(t==PT_SWCH) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + { + parts[r>>8].type = PT_FIRE; + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; + if(legacy_enable) + { + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) + { + if(t!=PT_LAVA || parts[i].life>0) + { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } + else + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) + { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) + { + kill_part(r>>8); + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE; + goto killed; + } + } + } + pavg = parts_avg(i, r>>8); + if(rt==PT_SWCH && t==PT_SPRK) + { + pavg = parts_avg(r>>8, i); + if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) + parts[r>>8].life = 10; + if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) + parts[r>>8].life = 9; + if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].ctype = PT_SWCH; + parts[r>>8].life = 4; + } + } + pavg = parts_avg(i, r>>8); + if(pavg != PT_INSL) + { + if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; + } + } + if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) + { + if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) + { + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { + parts[i].life = rand()%150+50; + parts[i].type = PT_PLSM; + parts[i].ctype = PT_NBLE; + parts[i].temp = 3500; + pv[y/CELL][x/CELL] += 1; + } + if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) + { + parts[i].type = PT_SWCH; + parts[i].life = 11; + } + } + } +killed: + if(parts[i].type == PT_NONE) + continue; + } + + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; + + //Death + if(parts[i].life<0 && (death == 1)) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } + + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; + + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; + + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; + + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; + + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } + + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } + + } + } + + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } + + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } + + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); + + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = 0; + parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } + + } + } + } + + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } + + } + + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; + + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; + + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; + + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; + + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; + + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } + + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } + + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } + + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } + + } + + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } + + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } + + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } + + if(t==PT_CLNE) + { + if(!parts[i].ctype) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx=XRES-CELL || + ny=YRES-CELL) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) + { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) + { + if(nx!=x && try_move(i, x, y, nx, y)) + { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x, ny)) + { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else + { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) + { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x-r, ny)) + { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y+r)) + { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y-r)) + { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) + { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) + { + kill_part(i); + continue; + } + else if(try_move(i, x, y, 2*x-nx, ny)) + { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } + else if(try_move(i, x, y, nx, 2*y-ny)) + { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } + else + { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + +justdraw: + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) + { + kill_part(i); + continue; + } + if(cmode!=CM_HEAT) + { + if(t==PT_STKM) //Just draw head here + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; + vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; + vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; + vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; + } + draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); + draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); + draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); + draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + + isplayer = 1; //It's a secret. Tssss... + } + if(t==PT_MWAX&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,224,224,170,255); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,224,224,170,20); + else + blendpixel(vid,x+nx,y+ny,224,224,170,40); + } + } + + } + else if(t==PT_ACID) + { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28)); + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + if(cmode==6){ + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); + } + } + } else { + blendpixel(vid, x, y, cr, cg, cb, 255); + } + + if(cmode==4) + { + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + } + else if(t==PT_OILL&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,64,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,64,16,40); + } + } + } + else if(t==PT_NEUT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLUT&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_SLTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,80,240,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,80,240,50); + } + } + } + else if(t==PT_PHOT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_SWCH && parts[i].life == 10) + { + x = nx; + y = ny; + blendpixel(vid,x,y,17,217,24,255); + } + else if(t==PT_LNTG&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,128,160,223,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,128,160,223,50); + } + } + } + else if(t==PT_SMKE) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = 10; + cb = 10; + cr = 10; + cg += fire_g[y][x]; + if(cg > 50) cg = 50; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 50) cb = 50; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 50) cr = 50; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,100,100,100,30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,100,100,100,10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,100,100,100,20); + } + } + } + } + else if(t==PT_WATR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + + } else if(t==PT_DSTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + } + else if(t==PT_NITR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,224,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,224,16,50); + } + } + + } + else if(t==PT_LRBD&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,170,170,170,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,170,170,170,50); + } + } + + } + + else if(t==PT_NBLE&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,235,73,23,100); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,235,73,23,30); + else + blendpixel(vid,x+nx,y+ny,235,73,23,50); + } + } + + } + else if(t==PT_GASS&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,255,255,0,180); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,255,255,0,50); + else + blendpixel(vid,x+nx,y+ny,255,255,0,80); + } + } + + } + else if(t==PT_WTRV) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = PIXG(ptypes[t].pcolors)/3; + cb = PIXB(ptypes[t].pcolors)/3; + cr = PIXR(ptypes[t].pcolors)/3; + cg += fire_g[y][x]; + if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); + } + } + } + } + else if(t==PT_THDR) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LCRY) + { + if(cmode == 3||cmode==4 || cmode==6) + { + //cr = R/8; + //cg = G/8; + //cb = B/8; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); + //x = nx/CELL; + //y = ny/CELL; + //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } + else + { + cr = 0x50+(parts[i].life*10); + cg = 0x50+(parts[i].life*10); + cb = 0x50+(parts[i].life*10); + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLSM) + { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_FIRE && parts[i].life) + { + if(cmode == 3||cmode==4 || cmode==6) + { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LAVA && parts[i].life) + { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4 || cmode==6) + { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else if(t==PT_LAVA || t==PT_SPRK) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4 || cmode==6) + { + if(t == PT_LAVA) + { + cr = 3; + cg = i%2; + cb = 0; + } + else + { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + } + else + { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + + if(t==PT_STKM) //Stick man should be visible in heat mode + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); + vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); + vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); + vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); + } + draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); + draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); + draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); + draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + } + else + { + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } + } + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) + { + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + + } + if(framerender == 1) + { + sys_pause = 1; + framerender= 0; + } + +} + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) +{ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +} + +void update_particles_i_th(void *arg) +{ + upstruc *newup = (upstruc*)arg; + update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); + return; +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + isplayer = 0; //Needed for player spawning + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + else + { + for(y=0; y>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + +#ifdef MT + if(numCores > 1) + { + InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); + for(pc = 0; pc=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} + +void update_particles_th(void *arg) +{ + update_particles((pixel*)arg); + return; +} + +/*********************************************************** + * SDL OUTPUT * + ***********************************************************/ + +int sdl_scale = 1; +SDL_Surface *sdl_scrn; +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +#include "icon.h" +void sdl_seticon(void) +{ +#ifdef WIN32 + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else +#ifdef MACOSX + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#endif +#endif +} + +void sdl_open(void) +{ + if(SDL_Init(SDL_INIT_VIDEO)<0) + { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); +#ifdef PIX16 + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); +#else + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); +#endif + if(!sdl_scrn) + { + fprintf(stderr, "Creating window: %s\n", SDL_GetError()); + exit(1); + } + SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); + sdl_seticon(); + SDL_EnableUNICODE(1); + //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +} + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + int i,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + } + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) +{ + if(sdl_scale == 2) + sdl_blit_2(x, y, w, h, src, pitch); + else + sdl_blit_1(x, y, w, h, src, pitch); +} + +int frame_idx=0; +void dump_frame(pixel *src, int w, int h, int pitch) +{ + char frame_name[32]; + int j,i; + unsigned char c[3]; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"wb"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0; j=0 && x=0 && yPT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } + else + d = c; + + if(size < XRES*YRES) + { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0; y+scl<=YRES; y+=scl) + { + sx = 0; + for(x=0; x+scl<=XRES; x+=scl) + { + a = 0; + r = g = b = 0; + for(j=0; j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) + { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +static char *mystrdup(char *s) +{ + char *x; + if(s) + { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +void *build_save(int *size, int x0, int y0, int w, int h) +{ + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; + int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); + int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + // save the required air state + for(y=by0; y255) i=255; + d[p++] = i; + } + for(y=by0; y255) i=255; + d[p++] = i; + } + + // save the particle map + for(i=0; i=x0 && x=y0 && y255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } + } + for(j=0; j255) tttemp=255; + d[p++] = tttemp; + } + } + for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + + i = (p*101+99)/100 + 612; + c = malloc(i); + c[0] = 0x66; + c[1] = 0x75; + c[2] = 0x43; + c[3] = legacy_enable; + c[4] = SAVE_VERSION; + c[5] = CELL; + c[6] = bw; + c[7] = bh; + c[8] = p; + c[9] = p >> 8; + c[10] = p >> 16; + c[11] = p >> 24; + + i -= 12; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) + { + free(d); + free(c); + return NULL; + } + free(d); + + *size = i+12; + return c; +} + +int parse_save(void *save, int size, int replace, int x0, int y0) +{ + unsigned char *d,*c=save; + int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; + int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; + int fp[NPART], nf=0; + + if(size<16) + return 1; + if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) + return 1; + if(c[4]>SAVE_VERSION) + return 2; + ver = c[4]; + + if(ver<34) + { + legacy_enable = 1; + } + else + { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } + + bw = c[6]; + bh = c[7]; + if(bx0+bw > XRES/CELL) + bx0 = XRES/CELL - bw; + if(by0+bh > YRES/CELL) + by0 = YRES/CELL - bh; + if(bx0 < 0) + bx0 = 0; + if(by0 < 0) + by0 = 0; + + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) + return 3; + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + return 1; + size = i; + + if(size < bw*bh) + return 1; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + if(replace) + { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); + } + + // make a catalog of free parts + memset(pmap, 0, sizeof(pmap)); + for(i=0; i= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } + for(y=by0; y= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + + // load the particle map + i = 0; + pty = p; + for(y=y0; y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j && !(isplayer == 1 && j==PT_STKM)) + { + if(pmap[y][x]) + { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } + else if(i < nf) + { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } + else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + + // load particle properties + for(j=0; j= size) + goto corrupt; + if(i < NPART) + { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + if(parts[i].type == PT_STKM) + { + player[2] = PT_DUST; + + player[3] = parts[i].x-1; //Setting legs positions + player[4] = parts[i].y+6; + player[5] = parts[i].x-1; + player[6] = parts[i].y+6; + + player[7] = parts[i].x-3; + player[8] = parts[i].y+12; + player[9] = parts[i].x-3; + player[10] = parts[i].y+12; + + player[11] = parts[i].x+1; + player[12] = parts[i].y+6; + player[13] = parts[i].x+1; + player[14] = parts[i].y+6; + + player[15] = parts[i].x+3; + player[16] = parts[i].y+12; + player[17] = parts[i].x+3; + player[18] = parts[i].y+12; + + } + } + else + p += 2; + } + } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } + } + for(j=0; j=34&&legacy_beta==0) + { + if(p >= size) + { + goto corrupt; + } + if(i <= NPART) + { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } + else + { + p++; + } + } + else + { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } + } + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) + { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + + if(p >= size) + goto version1; + j = d[p++]; + for(i=0; i size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) + { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0; y= size) + goto corrupt; + j=d[p++]; + if(j0) + { + if(j==PT_STKM) //Stickman should be drawed another way + { + //Stickman drawing + for(k=-2; k<=1; k++) + { + fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); + fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); + fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); + fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); + } + draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); + draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); + draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); + draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); + } + else + fb[y*w+x] = ptypes[j].pcolors; + } + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +/* NO, I DON'T THINK SO + #include "fbi.h" + + pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) + { + unsigned char *tmp; + pixel *res; + int i; + + tmp = malloc(width*height*3); + if(!tmp) + return NULL; + res = malloc(width*height*PIXELSIZE); + if(!res) { + free(tmp); + return NULL; + } + + i = width*height*3; + if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { + free(res); + free(tmp); + return NULL; + } + + for(i=0; i1) + { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } + *qw = w; + *qh = h; + return q; +} + +#define GRID_X 5 +#define GRID_Y 4 +#define GRID_P 3 +#define GRID_S 6 +#define GRID_Z 3 + +void stamp_gen_thumb(int i) +{ + char fn[64]; + void *data; + int size, factor_x, factor_y; + pixel *tmp; + + if(stamps[i].thumb) + { + free(stamps[i].thumb); + stamps[i].thumb = NULL; + } + + sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); + data = file_load(fn, &size); + + if(data) + { + stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); + if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) + { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } + } + + free(data); +} + +int clipboard_ready = 0; +void *clipboard_data = 0; +int clipboard_length = 0; + +void stamp_save(int x, int y, int w, int h) +{ + FILE *f; + int n; + char fn[64], sn[16]; + void *s=build_save(&n, x, y, w, h); + +#ifdef WIN32 + _mkdir("stamps"); +#else + mkdir("stamps", 0755); +#endif + + stamp_gen_name(sn); + sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); + + f = fopen(fn, "wb"); + if(!f) + return; + fwrite(s, n, 1, f); + fclose(f); + + free(s); + + if(stamps[STAMP_MAX-1].thumb) + free(stamps[STAMP_MAX-1].thumb); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); + memset(stamps, 0, sizeof(struct stamp_info)); + if(stamp_count0) + { + memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); + memcpy(stamps, &tmp, sizeof(struct stamp_info)); + + stamp_update(); + } + + return data; +} + +void stamp_init(void) +{ + int i; + FILE *f; + + memset(stamps, 0, sizeof(stamps)); + + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); + if(!f) + return; + for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +#ifdef WIN32 +_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#else +inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#endif +{ + int i, j, w, bn = 0, ba = 0; + char *rp = font_data + font_ptrs[c]; + w = *(rp++); + for(j=0; j>= 2; + bn -= 2; + } + return x + w; +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +{ + int sx = x; + for(; *s; s++) + { + if(*s == '\n') + { + x = sx; + y += FONT_H+2; + } + else if(*s == '\b') + { + switch(s[1]) + { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } + else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + return x; +} + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +{ + int i; + for(i=0; i<=w; i++) + { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); + } + for(i=1; i=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + if(*s) + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); + return x; +} + +int textnwidth(char *s, int n) +{ + int x = 0; + for(; *s; s++) + { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} +int textwidthx(char *s, int w) +{ + int x=0,n=0,cw; + for(; *s; s++) + { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; + } + return n; +} + +/*********************************************************** + * MAIN PROGRAM * + ***********************************************************/ + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) +{ + int x, y, i, j, c; + int bo = b; + if(iswall==1) + { + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) + { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) + { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } +} + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) +{ + int i, j, c; + if(b>=121) + { + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; +} + +void draw_menu(pixel *vid_buf, int i, int hover) +{ + + //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); +#ifdef MENUV3 + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i) + { + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } +#else + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); +#endif +} + +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr) +{ + int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + rows = ceil((float)msections[i].itemcount/16.0f); + height = (ceil((float)msections[i].itemcount/16.0f)*18); + width = restrict_flt(msections[i].itemcount*31, 0, 16*31); + //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); + h = -1; + x = XRES-BARSIZE-26; + y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; + sy = y; + //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); + fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); + fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); + drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); + if(i==SC_WALL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=20) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1) + { + *sl = h; + } + if(b==4&&h!=-1) + { + *sr = h; + } +} + +int create_parts(int x, int y, int r, int c) +{ + int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; + + if(c == 125) + { + i = x / CELL; + j = y / CELL; + for(v=-1; v<2; v++) + for(u=-1; u<2; u++) + if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) + { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } +} + +void create_box(int x1, int y1, int x2, int y2, int c) +{ + int i, j; + if(x1>x2) + { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) + { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) + { + c = c-100; + } + if(cm==-1) + { + if(c==0) + { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } + else + cm = 0; + } + if(bm==-1) + { + if(c==30) + { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } + else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) + { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(y=XRES || y>=YRES) + return; + c = vid[y*(XRES+BARSIZE)+x]; + c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); + if(c<512) + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + else + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); +} + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + e -= 1.0f; + } + } +} + +void draw_svf_ui(pixel *vid_buf) +{ + int c; + + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); + drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + c = svf_open ? 255 : 128; + drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); + drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); + + c = svf_login ? 255 : 128; + drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); + if(svf_open) + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + else + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); + if(svf_open && svf_own) + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } + else if(svf_myvote==-1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); + if(svf_tags[0]) + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + else + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); + + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); + drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); + if(svf_login) + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + else + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); + + if(sys_pause) + { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + if(!legacy_enable) + { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + switch(cmode) + { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; + case 6: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xC4", 100, 150, 255, 255); + break; + } + drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(svf_admin) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } + else if(svf_mod) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? +} + +typedef struct ui_edit +{ + int x, y, w, nx; + char str[256],*def; + int focus, cursor, hide; +} ui_edit; +void ui_edit_draw(pixel *vid_buf, ui_edit *ed) +{ + int cx, i; + char echo[256], *str; + + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(ed->str[0]) + { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } + else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) + { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; + } + if(ed->focus && sdl_key) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) + { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } + else if(ed->cursor > 0) + { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) + { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) + { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) + { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} +typedef struct ui_checkbox +{ + int x, y; + int focus, checked; +} ui_checkbox; +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) +{ + int w = 12; + if(ed->checked) + { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus) + { + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } + else + { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } +} +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) +{ + int w = 12; + + if(mb && !mbq) + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->checked = (ed->checked)?0:1; + } + } + else + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->focus = 1; + } + else + { + ed->focus = 0; + } + } +} + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) + { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) + { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +struct strlist +{ + char *str; + struct strlist *next; +}; +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list; item; item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) + { + item = *list; + *list = (*list)->next; + free(item); + } +} + +void tag_list_ui(pixel *vid_buf) +{ + int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; + char *p,*q,s; + char *tag=NULL, *op=NULL; + ui_edit ed; + struct strlist *vote=NULL,*down=NULL; + + ed.x = x0+25; + ed.y = y0+221; + ed.w = 158; + ed.nx = 1; + ed.def = "[new tag]"; + ed.focus = 0; + ed.hide = 0; + ed.cursor = 0; + strcpy(ed.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + op = tag = NULL; + + drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 256); + drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); + p = svf_tags; + s = svf_tags[0] ? ' ' : 0; + y = 36 + y0; + while(s) + { + q = strchr(p, ' '); + if(!q) + q = p+strlen(p); + s = *q; + *q = 0; + if(svf_own || svf_admin || svf_mod) + { + drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); + d = 14; + if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) + { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) + { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) + { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) + { + if(!strcmp(res, "OK ADMIN")) + { + svf_admin = 1; + svf_mod = 0; + } + else if(!strcmp(res, "OK MOD")) + { + svf_admin = 0; + svf_mod = 1; + } + else + { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} + +static char hex[] = "0123456789ABCDEF"; +void strcaturl(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) + { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else + { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +#define THUMB_CACHE_SIZE 256 + +char *thumb_cache_id[THUMB_CACHE_SIZE]; +void *thumb_cache_data[THUMB_CACHE_SIZE]; +int thumb_cache_size[THUMB_CACHE_SIZE]; +int thumb_cache_lru[THUMB_CACHE_SIZE]; + +void thumb_cache_inval(char *id) +{ + int i,j; + for(i=0; i= THUMB_CACHE_SIZE) + return; + free(thumb_cache_id[i]); + free(thumb_cache_data[i]); + thumb_cache_id[i] = NULL; + for(j=0; j thumb_cache_lru[i]) + thumb_cache_lru[j]--; +} +void thumb_cache_add(char *id, void *thumb, int size) +{ + int i,m=-1,j=-1; + thumb_cache_inval(id); + for(i=0; i m) + { + m = thumb_cache_lru[i]; + j = i; + } + } + if(i >= THUMB_CACHE_SIZE) + { + thumb_cache_inval(thumb_cache_id[j]); + i = j; + } + for(j=0; j= THUMB_CACHE_SIZE) + return 0; + for(j=0; j=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + else if(!strncmp(str, "TAG ", 4)) + { + if(j >= TAG_MAX) + { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) + { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } + else + { + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + int thumb_drawn[GRID_X*GRID_Y]; + pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + + do_open = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) + { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) + { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) + { + if(search_page) + { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) + { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) + { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) + for(gi=0; giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) + { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) + { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]&&thumb_drawn[pos]==0) + { + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); + thumb_drawn[pos] = 1; + } + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) + { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) + { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) + { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]) + { + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) + { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0) + { + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv) + { + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8) + { + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } + else + { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) + { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) + { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) + { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) + { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) + { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) + { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) + { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1) + { + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) + { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) + { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) + { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) + { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) + { + if(data) + { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } + else + svf_tags[0] = 0; + } + else + { + svf_tags[0] = 0; + } + + if(svf_login) + { + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200) + { + if(data) + { + if(!strcmp(data, "Up")) + { + svf_myvote = 1; + } + else if(!strcmp(data, "Down")) + { + svf_myvote = -1; + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + } + else + { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } + else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + { + search = 1; + } + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } + else + search = 0; + + if(search && lasttime>=TIMEOUT) + { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) + { + if(search_page) + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } + else + { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } + else + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) + { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login) + { + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) + { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + { + page_count = search_results(results, last_own||svf_admin||svf_mod); + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + } + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) + { + http_async_req_close(http); + http = NULL; + } + + for(i=0; i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) + { + if(stamp_page) + { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; +} + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) +{ + char t[2]; + t[0] = ch; + t[1] = 0; + if(flag) + { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } + else + { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + } +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + char buff[30]; //Buffer + for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature + else + sprintf(buff, "Temp: 0.00"); //...tempirature + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + //Usual text + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); + x = signs[i].x; + y = signs[i].y; + dx = 1 - signs[i].ju; + dy = (signs[i].y > 18) ? -1 : 1; + for(j=0; j<4; j++) + { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) + { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) + { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) + { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) + { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +/*********************************************************** + * CONFIG FILE * + ***********************************************************/ + +char http_proxy[256] = ""; + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) + { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; +} + +unsigned char last_major=0, last_minor=0, update_flag=0; + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) + { + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) + { + if(fseek(f, -3, SEEK_END)) + { + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3) + { + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + cmode = tmp%7; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void dim_copy(pixel *dst, pixel *src) +{ + int i,r,g,b; + for(i=0; i0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +unsigned int fire_alpha[CELL*3][CELL*3]; +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) + { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } + else + { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i2) + { + pthread_t pth; + pthread_create(&pth,NULL,update_air_th,""); + } + else + { + update_air(); + } +#else + update_air(); +#endif + } + if(cmode==0 || cmode==1) + { + draw_air(vid_buf); + } + else if(cmode==2) + { + memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); + memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); + } + else + { + memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); + } + update_particles(vid_buf); + + if(cmode==2) + { + if(!fire_fc) + { + dim_copy(fire_bg, vid_buf); + } + else + { + memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); + } + fire_fc = (fire_fc+1) % 3; + } + if(cmode==3||cmode==4||cmode==6) + render_fire(vid_buf); + + render_signs(vid_buf); + + memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); + clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); + + draw_svf_ui(vid_buf); + + if(http_ver_check) + { + if(!do_check && http_async_req_status(http_ver_check)) + { + ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); + if(http_ret==200 && ver_data) + { +#ifdef BETA + if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; +#else + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; +#endif + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + { + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) + { + break; + } + } + if(sdl_key=='d') + { + death = !(death); + } + if(sdl_key=='f') + { + framerender = 1; + } + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) + { + if(load_mode) + { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) + { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } + else + load_data = stamp_load(0, &load_size); + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') + { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1') + { + set_cmode(0); + } + if(sdl_key=='2') + { + set_cmode(1); + } + if(sdl_key=='3') + { + set_cmode(2); + } + if(sdl_key=='4') + { + set_cmode(3); + } + if(sdl_key=='5') + { + set_cmode(4); + } + if(sdl_key=='6') + { + set_cmode(5); + } + if(sdl_key=='7') + { + set_cmode(6); + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='h') + hud_enable = !hud_enable; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + if(clipboard_ready==1) + { + load_data = malloc(clipboard_length); + memcpy(load_data, clipboard_data, clipboard_length); + load_size = clipboard_length; + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + } + if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 2; + } + if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 1; + } + else if(sdl_key=='c') + { + set_cmode((cmode+1) % 7); + if(it > 50) + it = 50; + } + if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo + { + int cbx, cby, cbi; + + for(cbi=0; cbi32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } + else + { + bs += sdl_wheel; + if(bs>1224) + bs = 1224; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)) + { +#ifdef BETA + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); +#else + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); +#endif + } + else + { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } + mx = x; + my = y; + if(update_flag) + { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) + { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } + + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) + { + tmp = malloc(64); +#ifdef BETA + if(is_beta) + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } + else + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } +#else + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); +#endif + if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) + { + free(tmp); + tmp = download_ui(vid_buf, my_uri, &i); + if(tmp) + { + save_presets(1); + if(update_start(tmp, i)) + { + update_cleanup(); + save_presets(0); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + return 0; + } + } + else + free(tmp); + } + if(y>=sdl_scale*(YRES+(MENUSIZE-20))) + { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) + { + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) + { + db = svf_own ? 257 : 256; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) + { + db = 270; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) + { + db = 266; + if(da < 51) + da ++; + } + else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) + { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) + { + db = svf_login ? 261 : 260; + if(svf_admin) + { + db = 268; + } + else if(svf_mod) + { + db = 271; + } + if(da < 51) + da ++; + } + else if(x>=sdl_scale && x<=17*sdl_scale) + { + db = 262; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) + { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) + { + db = 267; + if(da < 51) + da ++; + } + else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) + { + db = 265; + if(da < 51) + da ++; + } + else if(da > 0) + da --; + } + else if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) + { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) + { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } + else if(bq==4 && !b) + { + free(load_data); + free(load_img); + load_mode = 0; + } + } + else if(save_mode==1) + { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1) + { + save_mode = 2; + } + else if(b==4) + { + save_mode = 0; + copy_mode = 0; + } + } + else if(save_mode==2) + { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) + { + if(copy_mode==1) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + } + else if(copy_mode==2) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + } + else + { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } + } + else if(sdl_zoom_trig && zoom_en<2) + { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) + { + if(!lb) + { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Up")) + { + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Down")) + { + svf_myvote = -1; + } + } + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) + tag_list_ui(vid_buf); + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) + { + legacy_enable = !legacy_enable; + } + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) + { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) + { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) + { + if(!svf_open || !svf_own || x>51) + { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } + else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) + { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) + { + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 7); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+6) % 7); + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } + else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) + { + c = sl = cr&0xFF; + } + else + { + //Something + } + } + lx = x; + ly = y; + lb = 0; + lm = 0; + } + else + { + //Copy state before drawing any particles (for undo)7 + int cbx, cby, cbi; + + for(cbi=0; cbi=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } + else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) + { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) + { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + { + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + mousex = mx/sdl_scale; + mousey = my/sdl_scale; + } + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) + { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) + { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) + { + it--; + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) + { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta) + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } + else + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + + if(hud_enable) + { + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) + { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) + { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } + if(sdl_zoom_trig||zoom_en) + { + if(zoom_x Date: Sun, 22 Aug 2010 16:55:07 -0400 Subject: [PATCH 097/237] Added new element PT_INWR --- powder.c | 165 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 90 insertions(+), 75 deletions(-) diff --git a/powder.c b/powder.c index 0191eab11..f4161daa5 100644 --- a/powder.c +++ b/powder.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include @@ -598,7 +598,8 @@ struct menu_section msections[] = #define PT_STKM 55 #define PT_SWCH 56 #define PT_SMKE 57 -#define PT_NUM 58 +#define PT_INWR 58 +#define PT_NUM 59 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -671,6 +672,7 @@ const struct part_type ptypes[] = {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, }; #define ST_NONE 0 @@ -738,6 +740,7 @@ const struct part_state pstates[] = /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -745,68 +748,69 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ - /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S*/ - /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M*/ - /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K*/ - /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E*/ - /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0}, - /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1}, - /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, - /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, - /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, - /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L F B W R L H S G C B T P E N N B L S S S I*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N o H H b R S a l s G h l t i B t C T W M N*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 a o o d b C n a c l d s r c L r r K C K W*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n m l l m d N d s n a r m d e E y y M H E R*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, + /* METL */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* WIRE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0}, + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* FOAM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0}, + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}, + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, }; #define FLAG_STAGNANT 1 @@ -1014,7 +1018,8 @@ inline int create_part(int p, int x, int y, int t) (pmap[y][x]&0xFF)!=PT_LRBD && (pmap[y][x]&0xFF)!=PT_ETRD && (pmap[y][x]&0xFF)!=PT_BRMT && - (pmap[y][x]&0xFF)!=PT_NBLE) + (pmap[y][x]&0xFF)!=PT_NBLE && + (pmap[y][x]&0xFF)!=PT_INWR) return -1; parts[pmap[y][x]>>8].type = PT_SPRK; parts[pmap[y][x]>>8].life = 4; @@ -1388,7 +1393,7 @@ void update_particles_i(pixel *vid, int start, int inc) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; - if(parts[i].life<=0 && t!=PT_METL && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY) + if(parts[i].life<=0 && t!=PT_METL && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) { kill_part(i); continue; @@ -1722,7 +1727,7 @@ void update_particles_i(pixel *vid, int start, int inc) pt = parts[i].temp -= 2.5f; } - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE) + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) { nx = x % CELL; if(nx == 0) @@ -1740,7 +1745,7 @@ void update_particles_i(pixel *vid, int start, int inc) ny = y/CELL; if(nx>=0 && ny>=0 && nx>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) && parts[r>>8].ctype!=PT_SPRK ) + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) { t = parts[i].type = PT_NONE; parts[r>>8].ctype = parts[r>>8].type; @@ -1820,7 +1825,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - else if(t==PT_HSCN||t==PT_CSCN) + else if(t==PT_HSCN||t==PT_CSCN||t==PT_INWR) { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) @@ -2148,7 +2153,7 @@ void update_particles_i(pixel *vid, int start, int inc) continue; rt = parts[r>>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH)) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; @@ -2162,7 +2167,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(lpv < 1) lpv = 1; if(legacy_enable) { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && ptypes[rt].meltable*lpv>(rand()%1000)) { if(t!=PT_LAVA || parts[i].life>0) @@ -2237,12 +2242,12 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + if(!(rt==PT_PSCN&&parts[i].ctype==PT_NSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp>=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) { parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN||rt==PT_INWR)) parts[r>>8].temp = parts[r>>8].temp+10.0f; } } @@ -2266,7 +2271,17 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].ctype = rt; } } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; From 98835f22596f6455e546cd400b12cc928cd7550a Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 23 Aug 2010 17:40:31 -0400 Subject: [PATCH 098/237] fix gravity --- powder.c | 83 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/powder.c b/powder.c index 6db7f0f56..6e49a4947 100644 --- a/powder.c +++ b/powder.c @@ -1531,47 +1531,48 @@ void update_particles_i(pixel *vid, int start, int inc) parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; } else { parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - if(gravityd == 1) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 2) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - if(gravityd == 3) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; - } - if(gravityd == 4) - { - parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 5) - { - parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL]; - } - if(gravityd == 6) - { - parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - if(gravityd == 7) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 8) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 9) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; - } - } + if(gravityd == 1) //gravity control stuff + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 2) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + if(gravityd == 3) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; + } + if(gravityd == 4) + { + parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 5) + { + parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + } + if(gravityd == 6) + { + parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + if(gravityd == 7) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 8) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + } + if(gravityd == 9) + { + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; + } + } if(ptypes[t].diffusion) { From eb063c8e079cef33dad927a3581af7252c593a7f Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 23 Aug 2010 17:55:17 -0400 Subject: [PATCH 099/237] made PT_HSCN and PT_CSCN PT_NTCT and PT_PTCT respectfully --- powder.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/powder.c b/powder.c index 6e49a4947..5ecf8e667 100644 --- a/powder.c +++ b/powder.c @@ -583,10 +583,10 @@ struct menu_section msections[] = #define PT_WHOL 40 #define PT_RBDM 41 #define PT_LRBD 42 -#define PT_HSCN 43 +#define PT_NTCT 43 #define PT_SAND 44 #define PT_GLAS 45 -#define PT_CSCN 46 +#define PT_PTCT 46 #define PT_BGLA 47 #define PT_THDR 48 #define PT_PLSM 49 @@ -1034,8 +1034,8 @@ inline int create_part(int p, int x, int y, int t) if((pmap[y][x]&0xFF)!=PT_METL && (pmap[y][x]&0xFF)!=PT_PSCN && (pmap[y][x]&0xFF)!=PT_NSCN && - (pmap[y][x]&0xFF)!=PT_HSCN && - (pmap[y][x]&0xFF)!=PT_CSCN && + (pmap[y][x]&0xFF)!=PT_NTCT && + (pmap[y][x]&0xFF)!=PT_PTCT && (pmap[y][x]&0xFF)!=PT_WATR && (pmap[y][x]&0xFF)!=PT_SLTW && (pmap[y][x]&0xFF)!=PT_BMTL && @@ -1427,7 +1427,7 @@ void update_particles_i(pixel *vid, int start, int inc) { if(!(parts[i].life==10&&parts[i].type==PT_LCRY)) parts[i].life--; - if(parts[i].life<=0 && t!=PT_METL && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_HSCN && t!=PT_CSCN && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) + if(parts[i].life<=0 && t!=PT_METL && t!=PT_WATR && t!=PT_RBDM && t!=PT_LRBD && t!=PT_SLTW && t!=PT_BRMT && t!=PT_PSCN && t!=PT_NSCN && t!=PT_NTCT && t!=PT_PTCT && t!=PT_BMTL && t!=PT_SPRK && t!=PT_LAVA && t!=PT_ETRD&&t!=PT_LCRY && t!=PT_INWR) { kill_part(i); continue; @@ -1813,16 +1813,16 @@ void update_particles_i(pixel *vid, int start, int inc) pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); } } - if(t==PT_CSCN&&parts[i].temp>24.0f) + if(t==PT_PTCT&&parts[i].temp>24.0f) { pt = parts[i].temp -= 2.5f; } - if(t==PT_HSCN&&parts[i].temp>24.0f) + if(t==PT_NTCT&&parts[i].temp>24.0f) { pt = parts[i].temp -= 2.5f; } - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) { nx = x % CELL; if(nx == 0) @@ -1840,7 +1840,7 @@ void update_particles_i(pixel *vid, int start, int inc) ny = y/CELL; if(nx>=0 && ny>=0 && nx>8)>=NPART || !r) continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) { t = parts[i].type = PT_NONE; parts[r>>8].ctype = parts[r>>8].type; @@ -1920,7 +1920,7 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - else if(t==PT_HSCN||t==PT_CSCN||t==PT_INWR) + else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) @@ -2254,7 +2254,7 @@ void update_particles_i(pixel *vid, int start, int inc) continue; rt = parts[r>>8].type; if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { parts[r>>8].type = PT_FIRE; @@ -2268,7 +2268,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(lpv < 1) lpv = 1; if(legacy_enable) { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && ptypes[rt].meltable*lpv>(rand()%1000)) { if(t!=PT_LAVA || parts[i].life>0) @@ -2343,29 +2343,29 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + if(!(rt==PT_PSCN&&parts[i].ctype==PT_NSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp>=100.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) { parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN||rt==PT_INWR)) + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) parts[r>>8].temp = parts[r>>8].temp+10.0f; } } - if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && + if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) + if((parts[i].ctype==PT_NSCN||parts[i].ctype==PT_NTCT||(parts[i].ctype==PT_PSCN&&parts[r>>8].temp>100.0f))&&pavg != PT_INSL) { parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; parts[r>>8].ctype = rt; } } - if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && + if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) + if((parts[i].ctype==PT_NSCN||parts[i].ctype==PT_PTCT||(parts[i].ctype==PT_PSCN&&parts[r>>8].temp<100.0f))&&pavg != PT_INSL) { parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; From 26c7944d64010f18eded8eef2a922de98271bb99 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 24 Aug 2010 12:32:37 -0400 Subject: [PATCH 100/237] changed LOX to LO2 --- powder.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/powder.c b/powder.c index 5ecf8e667..db9dcae15 100644 --- a/powder.c +++ b/powder.c @@ -601,7 +601,7 @@ struct menu_section msections[] = #define PT_PLAS 58 #define PT_DESL 59 #define PT_COAL 60 -#define PT_LOX 61 +#define PT_LO2 61 #define PT_O2 62 #define PT_INWR 63 #define PT_NUM 64 @@ -680,7 +680,7 @@ const struct part_type ptypes[] = {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.0f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0.01f, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, - {"LOX", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 5.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description @@ -754,8 +754,8 @@ const struct part_state pstates[] = /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, - /* LOX */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LOX, -190.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, -190.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = @@ -829,7 +829,7 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ /* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ -/* LOX */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0}, /* LOX */ +/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0}, /* LO2 */ /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0}, /* O2 */ /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O*/ From 5e032885a247a6a0141e3ea725fa78bb6c07f1a3 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 Aug 2010 19:58:17 +0100 Subject: [PATCH 101/237] Fix everything --- powder.c | 130 +++++++----------------------------------------------- version.h | 4 +- 2 files changed, 19 insertions(+), 115 deletions(-) diff --git a/powder.c b/powder.c index db9dcae15..abc9404f0 100644 --- a/powder.c +++ b/powder.c @@ -151,7 +151,7 @@ float mheat = 0.0f; int do_open = 0; int sys_pause = 0; int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. -int death = 1, gravityd = 2, framerender = 0; +int death = 1, framerender = 0; int amd = 1; unsigned char fire_r[YRES/CELL][XRES/CELL]; @@ -710,7 +710,7 @@ const struct part_state pstates[] = /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_COAL, 300.0f, PT_FIRE, 600.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 300.0f}, @@ -1411,17 +1411,8 @@ void update_particles_i(pixel *vid, int start, int inc) ly = parts[i].y; t = parts[i].type; - if(sys_pause) - { - if(framerender) - { - sys_pause = 0; - } - else - { - goto justdraw; - } - } + if(sys_pause&&!framerender) + goto justdraw; if(parts[i].life && t!=PT_ACID && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM) { @@ -1525,52 +1516,13 @@ void update_particles_i(pixel *vid, int start, int inc) } else { - if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - if(gravityd == 1) //gravity control stuff + if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 2) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - if(gravityd == 3) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; - } - if(gravityd == 4) - { - parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 5) - { - parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - } - if(gravityd == 6) - { - parts[i].vx += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - if(gravityd == 7) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 8) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - } - if(gravityd == 9) - { - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] - ptypes[t].gravity; - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL] + ptypes[t].gravity; + } else { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; } } @@ -1640,27 +1592,19 @@ void update_particles_i(pixel *vid, int start, int inc) { if(t==PT_WTRV && pv[y/CELL][x/CELL]>4.0f) t = parts[i].type = PT_DSTW; - if(t==PT_OILL && pv[y/CELL][x/CELL]>8.0f) - t = parts[i].type = PT_PLAS; if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) t = parts[i].type = PT_GASS; if(t==PT_GASS && pv[y/CELL][x/CELL]>6.0f) t = parts[i].type = PT_DESL; if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) t = parts[i].type = PT_FIRE; - if(t==PT_WOOD && pv[y/CELL][x/CELL]>6.0f) - t = parts[i].type = PT_COAL; } - if(t==PT_OILL && pv[y/CELL][x/CELL]>20.0f) - t = parts[i].type = PT_PLAS; if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) t = parts[i].type = PT_GASS; if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it t = parts[i].type = PT_FIRE; // combust under pressure. if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) t = parts[i].type = PT_DESL; - if(t==PT_WOOD && pv[y/CELL][x/CELL]>30.0f) - t = parts[i].type = PT_COAL; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) @@ -3048,7 +2992,7 @@ justdraw: } } } else { - blendpixel(vid, x, y, cr, cg, cb, 255); + blendpixel(vid, nx, ny, cr, cg, cb, 255); } if(cmode==4) @@ -3640,15 +3584,11 @@ justdraw: blendpixel(vid, nx+1, ny+1, R, G, B, 112); blendpixel(vid, nx-1, ny+1, R, G, B, 112); } - } - if(framerender == 1) - { - sys_pause = 1; - framerender= 0; - } - - } + if(framerender){ + framerender = 0; + sys_pause = 1; + } } void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) @@ -3949,7 +3889,7 @@ void update_particles(pixel *vid) fire_b[y][x] = cb; } } - if(emap[y][x] && !sys_pause) + if(emap[y][x] && (!sys_pause||framerender)) emap[y][x] --; } } @@ -4168,7 +4108,7 @@ void update_particles(pixel *vid) fire_b[y][x] = cb; } } - if(emap[y][x] && !sys_pause) + if(emap[y][x] && (!sys_pause||framerender)) emap[y][x] --; } } @@ -4401,42 +4341,6 @@ int sdl_poll(void) { player[0] = (int)(player[0])|0x08; //Go left command } - if(event.key.keysym.sym == SDLK_KP1) //gravity direction commands - { - gravityd = 1; - } - if(event.key.keysym.sym == SDLK_KP2) - { - gravityd = 2; - } - if(event.key.keysym.sym == SDLK_KP3) - { - gravityd = 3; - } - if(event.key.keysym.sym == SDLK_KP4) - { - gravityd = 4; - } - if(event.key.keysym.sym == SDLK_KP5) - { - gravityd = 5; - } - if(event.key.keysym.sym == SDLK_KP6) - { - gravityd = 6; - } - if(event.key.keysym.sym == SDLK_KP7) - { - gravityd = 7; - } - if(event.key.keysym.sym == SDLK_KP8) - { - gravityd = 8; - } - if(event.key.keysym.sym == SDLK_KP9) - { - gravityd = 9; - } if(event.key.keysym.sym == SDLK_UP && ((int)(player[0])&0x04)!=0x04) { player[0] = (int)(player[0])|0x04; //Jump command @@ -10066,7 +9970,7 @@ int main(int argc, char *argv[]) } } - if(!sys_pause) + if(!sys_pause||framerender) { #ifdef MT if(numCores>2) diff --git a/version.h b/version.h index 6e0874253..0acf9d024 100755 --- a/version.h +++ b/version.h @@ -22,10 +22,10 @@ #define SAVE_VERSION 41 #define MINOR_VERSION 3 -#define IDENT_VERSION "A" //Change this if you're not Simon! It should be a single letter. +#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. #define MENUV3 -#define BETA +//#define BETA #define HEAT_ENABLE #endif From 8d089bba50937b572df918c849afc28181f852c6 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 Aug 2010 21:01:04 +0100 Subject: [PATCH 102/237] Yeast --- powder.c | 189 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 114 insertions(+), 75 deletions(-) diff --git a/powder.c b/powder.c index abc9404f0..3bb3b060a 100644 --- a/powder.c +++ b/powder.c @@ -604,7 +604,9 @@ struct menu_section msections[] = #define PT_LO2 61 #define PT_O2 62 #define PT_INWR 63 -#define PT_NUM 64 +#define PT_YEST 64 +#define PT_DYST 65 +#define PT_NUM 66 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -616,7 +618,7 @@ static unsigned char TYPE_SOLID = 0x04; //4 static unsigned char TYPE_GAS = 0x08; //8 static unsigned char PROP_CONDUCTS = 0x10; //16 -const struct part_type ptypes[] = +const struct part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, @@ -683,6 +685,8 @@ const struct part_type ptypes[] = {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 5.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f, 70, "Deat Yeast."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -690,7 +694,7 @@ const struct part_type ptypes[] = #define ST_SOLID 1 #define ST_LIQUID 2 #define ST_GAS 3 -const struct part_state pstates[] = +const struct part_state pstates[PT_NUM] = { // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -757,6 +761,8 @@ const struct part_state pstates[] = /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, -190.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 60.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static const unsigned char can_move[PT_NUM][PT_NUM] = { @@ -764,78 +770,80 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ -/* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I*/ -/* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N*/ -/* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W*/ -/* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R*/ -/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ -/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Dust */ -/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0}, /* Watr */ -/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ -/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ -/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Stne */ -/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Lava */ -/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Gunp */ -/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ -/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ -/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ -/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ -/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ -/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Icei */ -/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ -/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ -/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Snow */ -/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ -/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0}, /* Neut */ -/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Plut */ -/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ -/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ -/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ -/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ -/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Cnct */ -/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0}, /* Dstw */ -/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Salt */ -/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0}, /* Sltw */ -/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Dmnd */ -/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ -/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Brml */ -/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ -/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Uran */ -/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ -/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* MWax */ -/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ -/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ -/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* LN2 */ -/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ -/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ -/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ -/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ -/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* LRbd */ -/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ -/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Sand */ -/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ -/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ -/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* BGla */ -/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ -/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ -/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ -/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* NIce */ -/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ -/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ -/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ -/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ -/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ -/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ -/* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ -/* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ -/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ -/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0}, /* LO2 */ -/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0}, /* O2 */ -/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ -/* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O*/ -/* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2*/ -/* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X */ -/* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l */ +/* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y */ +/* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ +/* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ +/* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ +/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ +/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ +/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Watr */ +/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ +/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ +/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Stne */ +/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* Lava */ +/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ +/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ +/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ +/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ +/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ +/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ +/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Icei */ +/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ +/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ +/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Snow */ +/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ +/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,1}, /* Neut */ +/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Plut */ +/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ +/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ +/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ +/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ +/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Cnct */ +/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Dstw */ +/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Salt */ +/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* Sltw */ +/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dmnd */ +/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ +/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* Brml */ +/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ +/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Uran */ +/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ +/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1}, /* MWax */ +/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ +/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ +/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ +/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ +/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ +/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ +/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ +/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* LRbd */ +/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ +/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Sand */ +/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ +/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ +/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* BGla */ +/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ +/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ +/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ +/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ +/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ +/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ +/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ +/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ +/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ +/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ +/* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ +/* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ +/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ +/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0}, /* LO2 */ +/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0}, /* O2 */ +/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ +/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* YEST */ +/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ +/* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ +/* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ +/* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ +/* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ }; #define FLAG_STAGNANT 1 @@ -1997,6 +2005,22 @@ void update_particles_i(pixel *vid, int start, int inc) } } } + else if(t==PT_YEST) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_DYST && 1>(rand()%30) && !legacy_enable) + { + t = parts[i].type = PT_DYST; + } + } + } else if(t==PT_ACID) { for(nx=-2; nx<3; nx++) @@ -2061,6 +2085,15 @@ void update_particles_i(pixel *vid, int start, int inc) } if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_DYST && 15>(rand()%1000)) + parts[r>>8].type = PT_YEST; + if((r&0xFF)==PT_YEST){ + if(15>(rand()%100000)&&isplayer==0) + parts[r>>8].type = PT_STKM; + else + parts[r>>8].type = PT_DYST; + } + if((r&0xFF)==PT_WATR && 15>(rand()%100)) parts[r>>8].type = PT_DSTW; if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) @@ -2752,6 +2785,12 @@ killed: else create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); } + if(t==PT_YEST) + { + if(parts[i].temp>30&&parts[i].temp<44){ + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); + } + } if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) { parts[i].type = PT_NBLE; From 470519c92ed917b41c6ccae2e193eb59bdfe2ece Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 25 Aug 2010 12:22:41 +0100 Subject: [PATCH 103/237] Seperation WIP --- air.h | 14 + defines.h | 35 ++ font.h | 5 +- graphics.c | 1098 ++++++++++++++++++++++++++++++++++ graphics.h | 109 ++++ interface.h | 63 ++ powder.c | 1642 +-------------------------------------------------- powder.h | 397 +++++++++++++ 8 files changed, 1737 insertions(+), 1626 deletions(-) create mode 100644 air.h create mode 100644 defines.h create mode 100644 graphics.c create mode 100644 graphics.h create mode 100644 interface.h create mode 100644 powder.h diff --git a/air.h b/air.h new file mode 100644 index 000000000..add56b015 --- /dev/null +++ b/air.h @@ -0,0 +1,14 @@ +#ifndef AIR_H +#define AIR_H + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; + +#endif \ No newline at end of file diff --git a/defines.h b/defines.h new file mode 100644 index 000000000..b08407f5c --- /dev/null +++ b/defines.h @@ -0,0 +1,35 @@ +#ifndef DEFINE_H +#define DEFINE_H + +#define SERVER "powdertoy.co.uk" + +#undef PLOSS + +#ifdef MENUV3 +#define MENUSIZE 40 +#else +#define MENUSIZE 20 +#endif +#define BARSIZE 14 +#define XRES 612 +#define YRES 384 +#define NPART XRES*YRES + +#define ZSIZE_D 16 +#define ZFACTOR_D 8 +static unsigned char ZFACTOR = 256/ZSIZE_D; +static unsigned char ZSIZE = ZSIZE_D; + +#define CELL 4 +#define ISTP (CELL/2) +#define CFDS (4.0f/CELL) + +#define TSTEPP 0.3f +#define TSTEPV 0.4f +#define VADV 0.3f +#define VLOSS 0.999f +#define PLOSS 0.9999f + +typedef unsigned char uint8; + +#endif \ No newline at end of file diff --git a/font.h b/font.h index ffed99506..018e4746b 100644 --- a/font.h +++ b/font.h @@ -18,6 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#ifndef FONT_H_CHECK +#define FONT_H_CHECK #define FONT_H 10 char font_data[] = { @@ -26,4 +28,5 @@ char font_data[] = short font_ptrs[] = { 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, -}; \ No newline at end of file +}; +#endif \ No newline at end of file diff --git a/graphics.c b/graphics.c new file mode 100644 index 000000000..4282e5c49 --- /dev/null +++ b/graphics.c @@ -0,0 +1,1098 @@ +#include "defines.h" +#include "air.h" +#include "powder.h" +#include "graphics.h" +#include "font.h" +#include + +pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) +{ + int i,j,x,y,w,h,r,g,b,c; + pixel p, *q; + w = (sw+f-1)/f; + h = (sh+f-1)/f; + q = malloc(w*h*PIXELSIZE); + for(y=0; y1) + { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } + *qw = w; + *qh = h; + return q; +} + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + int i,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0; jpitch/PIXELSIZE; + } + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) +{ + if(sdl_scale == 2) + sdl_blit_2(x, y, w, h, src, pitch); + else + sdl_blit_1(x, y, w, h, src, pitch); +} + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) +{ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +} + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) +{ + int x, y, i, j, c; + int bo = b; + if(iswall==1) + { + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) + { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) + { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } +} + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) +{ + int i, j, c; + if(b>=121) + { + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b) + { + case WL_WALLELEC: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + else + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) + { + for(i=1; i<6+j; i++) + { + if(!(i&j&1)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) + { + if(i&j&1) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) + { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<13; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) + { + for(i=14; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + if(!(i%2) && !(j%2)) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) + { + for(i=1+(1&(j>>1)); i<27; i+=2) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } + else + { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); + for(j=1; j<15; j++) + { + for(i=1; i<27; i++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) + { + for(j=4; j<12; j++) + { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) + { + c = 255; + } + else + { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; +} + +void draw_menu(pixel *vid_buf, int i, int hover) +{ + + //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); +#ifdef MENUV3 + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i) + { + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } +#else + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); +#endif +} + +#ifdef WIN32 +_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#else +inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#endif +{ + pixel t; + if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +#ifdef WIN32 +_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#else +inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +#endif +{ + int i, j, w, bn = 0, ba = 0; + char *rp = font_data + font_ptrs[c]; + w = *(rp++); + for(j=0; j>= 2; + bn -= 2; + } + return x + w; +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +{ + int sx = x; + for(; *s; s++) + { + if(*s == '\n') + { + x = sx; + y += FONT_H+2; + } + else if(*s == '\b') + { + switch(s[1]) + { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } + else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + return x; +} + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +{ + int i; + for(i=0; i<=w; i++) + { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); + } + for(i=1; i=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + if(*s) + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); + return x; +} + +int textnwidth(char *s, int n) +{ + int x = 0; + for(; *s; s++) + { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} + +int textwidthx(char *s, int w) +{ + int x=0,n=0,cw; + for(; *s; s++) + { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; + } + return n; +} + +#ifdef WIN32 +_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#else +inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +#endif +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) + { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) +{ + char t[2]; + t[0] = ch; + t[1] = 0; + if(flag) + { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } + else + { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + } +} + +void draw_air(pixel *vid) +{ + int x, y, i, j; + pixel c; + + if(cmode == 2) + return; + + for(y=0; y 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } + else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; jdx) + { + dx = dx+dy; + dy = dx-dy; + dx = dx-dy; + check = 1; + } + + e = (dy<<2)-dx; + for (i=0; i<=dx; i++) + { + vid[x+y*a] =PIXRGB(r, g, b); + if (e>=0) + { + if (check==1) + x = x+sx; + else + y = y+sy; + e = e-(dx<<2); + } + if (check==1) + y = y+sy; + else + x = x+sx; + e = e+(dy<<2); + } +} + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + 255*PIXR(t)) >> 8; + g = (a*g + 255*PIXG(t)) >> 8; + b = (a*b + 255*PIXB(t)) >> 8; + if(r>255) + r = 255; + if(g>255) + g = 255; + if(b>255) + b = 255; + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +void xor_pixel(int x, int y, pixel *vid) +{ + int c; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + c = vid[y*(XRES+BARSIZE)+x]; + c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); + if(c<512) + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + else + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); +} + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + e -= 1.0f; + } + } +} + +void xor_rect(pixel *vid, int x, int y, int w, int h) +{ + int i; + for(i=0; i + +#ifdef PIX16 +#define PIXELSIZE 2 +typedef unsigned short pixel; +#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) +#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) +#define PIXR(x) (((x)>>8)&0xF8) +#define PIXG(x) (((x)>>3)&0xFC) +#define PIXB(x) (((x)<<3)&0xF8) +#else +#define PIXELSIZE 4 +typedef unsigned int pixel; +#ifdef PIX32BGR +#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) +#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) +#define PIXR(x) ((x)&0xFF) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)>>16) +#else +#ifdef PIX32BGRA +#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) +#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) +#define PIXR(x) (((x)>>8)&0xFF) +#define PIXG(x) (((x)>>16)&0xFF) +#define PIXB(x) (((x)>>24)) +#else +#define PIXPACK(x) (x) +#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) +#define PIXR(x) ((x)>>16) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)&0xFF) +#endif +#endif +#endif + +unsigned cmode = 3; +SDL_Surface *sdl_scrn; +int sdl_scale = 1; + +pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch); + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch); + +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch); + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb); + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall); + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc); + +void draw_menu(pixel *vid_buf, int i, int hover); + +#ifdef WIN32 +_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#else +inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#endif + +#ifdef WIN32 +_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); +#else +inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); +#endif + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); + +void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); + +void clearrect(pixel *vid, int x, int y, int w, int h); + +void drawdots(pixel *vid, int x, int y, int h, int r, int g, int b, int a); + +int textwidth(char *s); + +int drawtextmax(pixel *vid, int x, int y, int w, char *s, int r, int g, int b, int a); + +int textnwidth(char *s, int n); + +int textwidthx(char *s, int w); + +#ifdef WIN32 +_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#else +inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +#endif + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag); + +void draw_air(pixel *vid); + +void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a); + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a); + +void xor_pixel(int x, int y, pixel *vid); + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid); + +void xor_rect(pixel *vid, int x, int y, int w, int h); + +#endif \ No newline at end of file diff --git a/interface.h b/interface.h new file mode 100644 index 000000000..dfa0ba666 --- /dev/null +++ b/interface.h @@ -0,0 +1,63 @@ +#ifndef INTERFACE_H +#define INTERFACE_H + +struct menu_section +{ + char *icon; + const char *name; + int itemcount; +}; +struct menu_wall +{ + pixel colour; + const char *descs; +}; + +const struct menu_wall mwalls[] = +{ + {PIXPACK(0xC0C0C0), "Wall. Indestructible. Blocks everything. Conductive."}, + {PIXPACK(0x808080), "E-Wall. Becomes transparent when electricity is connected."}, + {PIXPACK(0xFF8080), "Detector. Generates electricity when a particle is inside."}, + {PIXPACK(0x808080), "Streamline. Set start point of a streamline."}, + {PIXPACK(0x808080), "Sign. Click on a sign to edit it or anywhere else to place a new one."}, + {PIXPACK(0x8080FF), "Fan. Accelerates air. Use line tool to set direction and strength."}, + {PIXPACK(0xC0C0C0), "Wall. Blocks most particles but lets liquids through. Conductive."}, + {PIXPACK(0x808080), "Wall. Absorbs particles but lets air currents through."}, + {PIXPACK(0x808080), "Erases walls."}, + {PIXPACK(0x808080), "Wall. Indestructible. Blocks everything."}, + {PIXPACK(0x3C3C3C), "Wall. Indestructible. Blocks particles, allows air"}, + {PIXPACK(0x575757), "Wall. Indestructible. Blocks liquids and gasses, allows solids"}, + {PIXPACK(0xFFFF22), "Conductor, allows particles, conducts electricity"}, + {PIXPACK(0x242424), "E-Hole, absorbs particles, release them when powered"}, + {PIXPACK(0xFFFFFF), "Air, creates airflow and pressure"}, + {PIXPACK(0xFFBB00), "Heats the targetted element."}, + {PIXPACK(0x00BBFF), "Cools the targetted element."}, + {PIXPACK(0x303030), "Vacuum, reduces air pressure."}, + {PIXPACK(0x579777), "Wall. Indestructible. Blocks liquids and solids, allows gasses"}, +}; + +#define SC_WALL 0 +#define SC_SPECIAL 8 +#define SC_POWDERS 5 +#define SC_SOLIDS 6 +#define SC_ELEC 1 +#define SC_EXPLOSIVE 2 +#define SC_GAS 3 +#define SC_LIQUID 4 +#define SC_NUCLEAR 7 +#define SC_TOTAL 9 + +struct menu_section msections[] = +{ + {"\xC1", "Walls", 0}, + {"\xC2", "Electronics", 0}, + {"\xC3", "Explosives", 0}, + {"\xC5", "Gasses", 0}, + {"\xC4", "Liquids", 0}, + {"\xD0", "Powders", 0}, + {"\xD1", "Solids", 0}, + {"\xC6", "Radioactive", 0}, + {"\xCC", "Special", 0}, +}; + +#endif \ No newline at end of file diff --git a/powder.c b/powder.c index 3bb3b060a..63d67ea74 100644 --- a/powder.c +++ b/powder.c @@ -37,71 +37,16 @@ #include #endif - +#include "font.h" +#include "defines.h" +#include "powder.h" +#include "graphics.h" #include "version.h" #include "http.h" #include "md5.h" #include "update.h" #include "hmap.h" - -#define SERVER "powdertoy.co.uk" - -#undef PLOSS - -#ifdef MENUV3 -#define MENUSIZE 40 -#else -#define MENUSIZE 20 -#endif -#define BARSIZE 14 -#define XRES 612 -#define YRES 384 -#define NPART XRES*YRES - -#define ZSIZE_D 16 -#define ZFACTOR_D 8 -unsigned char ZFACTOR = 256/ZSIZE_D; -unsigned char ZSIZE = ZSIZE_D; - -#define CELL 4 -#define ISTP (CELL/2) -#define CFDS (4.0f/CELL) - -typedef unsigned char uint8; - -#ifdef PIX16 -#define PIXELSIZE 2 -typedef unsigned short pixel; -#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) -#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) -#define PIXR(x) (((x)>>8)&0xF8) -#define PIXG(x) (((x)>>3)&0xFC) -#define PIXB(x) (((x)<<3)&0xF8) -#else -#define PIXELSIZE 4 -typedef unsigned int pixel; -#ifdef PIX32BGR -#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) -#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) -#define PIXR(x) ((x)&0xFF) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)>>16) -#else -#ifdef PIX32BGRA -#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) -#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) -#define PIXR(x) (((x)>>8)&0xFF) -#define PIXG(x) (((x)>>16)&0xFF) -#define PIXB(x) (((x)>>24)) -#else -#define PIXPACK(x) (x) -#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) -#define PIXR(x) ((x)>>16) -#define PIXG(x) (((x)>>8)&0xFF) -#define PIXB(x) ((x)&0xFF) -#endif -#endif -#endif +#include "air.h" char *it_msg = "\brThe Powder Toy\n" @@ -176,22 +121,6 @@ unsigned char emap[YRES/CELL][XRES/CELL]; unsigned char cb_bmap[YRES/CELL][XRES/CELL]; unsigned char cb_emap[YRES/CELL][XRES/CELL]; -unsigned cmode = 3; - -float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; - -float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; - -float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; -#define TSTEPP 0.3f -#define TSTEPV 0.4f -#define VADV 0.3f -#define VLOSS 0.999f -#define PLOSS 0.9999f int numCores = 4; float kernel[9]; void make_kernel(void) @@ -378,485 +307,9 @@ inline float restrict_flt(float f, float min, float max) return f; } -void draw_air(pixel *vid) -{ - int x, y, i, j; - pixel c; - - if(cmode == 2) - return; - - for(y=0; y 0.0f) - c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); - else - c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); - } - else - c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), - clamp_flt(pv[y][x], 0.0f, 8.0f), - clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); - for(j=0; j=XRES || y>=YRES) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - //Signum function #ifdef WIN32 _inline int sign(float i) @@ -1230,64 +664,6 @@ inline int sign(float i) return 0; } -void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line -{ - int dx, dy, i, sx, sy, check, e, x, y; - - dx = abs(x1-x2); - dy = abs(y1-y2); - sx = sign(x2-x1); - sy = sign(y2-y1); - x = x1; - y = y1; - check = 0; - - if (dy>dx) - { - dx = dx+dy; - dy = dx-dy; - dx = dx-dy; - check = 1; - } - - e = (dy<<2)-dx; - for (i=0; i<=dx; i++) - { - vid[x+y*a] =PIXRGB(r, g, b); - if (e>=0) - { - if (check==1) - x = x+sx; - else - y = y+sy; - e = e-(dx<<2); - } - if (check==1) - y = y+sy; - else - x = x+sx; - e = e+(dy<<2); - } -} - -void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -{ - pixel t; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + 255*PIXR(t)) >> 8; - g = (a*g + 255*PIXG(t)) >> 8; - b = (a*b + 255*PIXB(t)) >> 8; - if(r>255) - r = 255; - if(g>255) - g = 255; - if(b>255) - b = 255; - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); #ifdef WIN32 @@ -3630,19 +3006,6 @@ justdraw: } } -void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) -{ - blendpixel(vid, x+1, y, cr, cg, cb, 112); - blendpixel(vid, x-1, y, cr, cg, cb, 112); - blendpixel(vid, x, y+1, cr, cg, cb, 112); - blendpixel(vid, x, y-1, cr, cg, cb, 112); - - blendpixel(vid, x+1, y-1, cr, cg, cb, 64); - blendpixel(vid, x-1, y-1, cr, cg, cb, 64); - blendpixel(vid, x+1, y+1, cr, cg, cb, 64); - blendpixel(vid, x-1, y+1, cr, cg, cb, 64); -} - void update_particles_i_th(void *arg) { upstruc *newup = (upstruc*)arg; @@ -4215,8 +3578,6 @@ void update_particles_th(void *arg) * SDL OUTPUT * ***********************************************************/ -int sdl_scale = 1; -SDL_Surface *sdl_scrn; SDLMod sdl_mod; int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; @@ -4261,59 +3622,6 @@ void sdl_open(void) //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); } -void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} - -void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) -{ - pixel *dst; - int j; - int i,k; - if(SDL_MUSTLOCK(sdl_scrn)) - if(SDL_LockSurface(sdl_scrn)<0) - return; - dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; - for(j=0; jpitch/PIXELSIZE; - } - src+=pitch; - } - if(SDL_MUSTLOCK(sdl_scrn)) - SDL_UnlockSurface(sdl_scrn); - SDL_UpdateRect(sdl_scrn,0,0,0,0); -} -void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) -{ - if(sdl_scale == 2) - sdl_blit_2(x, y, w, h, src, pitch); - else - sdl_blit_1(x, y, w, h, src, pitch); -} - int frame_idx=0; void dump_frame(pixel *src, int w, int h, int pitch) { @@ -4490,7 +3798,6 @@ void *build_thumb(int *size, int bzip2) return d; } -void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) { unsigned char *d,*c=thumb; @@ -5201,6 +4508,7 @@ corrupt: #define STAMP_X 4 #define STAMP_Y 4 #define STAMP_MAX 120 + struct stamp_info { char name[11]; @@ -5272,43 +4580,6 @@ void stamp_update(void) fclose(f); } -pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) -{ - int i,j,x,y,w,h,r,g,b,c; - pixel p, *q; - w = (sw+f-1)/f; - h = (sh+f-1)/f; - q = malloc(w*h*PIXELSIZE); - for(y=0; y1) - { - r = (r+c/2)/c; - g = (g+c/2)/c; - b = (b+c/2)/c; - } - q[y*w+x] = PIXRGB(r, g, b); - } - *qw = w; - *qh = h; - return q; -} - #define GRID_X 5 #define GRID_Y 4 #define GRID_P 3 @@ -5444,805 +4715,6 @@ void del_stamp(int d) stamp_count = 0; stamp_init(); } -/*********************************************************** - * FONT DRAWING * - ***********************************************************/ - -#include "font.h" - -#ifdef WIN32 -_inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#else -inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#endif -{ - pixel t; - if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) - return; - if(a!=255) - { - t = vid[y*(XRES+BARSIZE)+x]; - r = (a*r + (255-a)*PIXR(t)) >> 8; - g = (a*g + (255-a)*PIXG(t)) >> 8; - b = (a*b + (255-a)*PIXB(t)) >> 8; - } - vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); -} - -#ifdef WIN32 -_inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) -#else -inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) -#endif -{ - int i, j, w, bn = 0, ba = 0; - char *rp = font_data + font_ptrs[c]; - w = *(rp++); - for(j=0; j>= 2; - bn -= 2; - } - return x + w; -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) -{ - int sx = x; - for(; *s; s++) - { - if(*s == '\n') - { - x = sx; - y += FONT_H+2; - } - else if(*s == '\b') - { - switch(s[1]) - { - case 'w': - r = g = b = 255; - break; - case 'g': - r = g = b = 192; - break; - case 'o': - r = 255; - g = 216; - b = 32; - break; - case 'r': - r = 255; - g = b = 0; - break; - case 'b': - r = g = 0; - b = 255; - break; - } - s++; - } - else - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - return x; -} - -void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) -{ - int i; - for(i=0; i<=w; i++) - { - drawpixel(vid, x+i, y, r, g, b, a); - drawpixel(vid, x+i, y+h, r, g, b, a); - } - for(i=1; i=w && x+textwidth(s)>=w+5) - break; - x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); - } - if(*s) - for(i=0; i<3; i++) - x = drawchar(vid, x, y, '.', r, g, b, a); - return x; -} - -int textnwidth(char *s, int n) -{ - int x = 0; - for(; *s; s++) - { - if(!n) - break; - x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - n--; - } - return x-1; -} -int textwidthx(char *s, int w) -{ - int x=0,n=0,cw; - for(; *s; s++) - { - cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; - if(x+(cw/2) >= w) - break; - x += cw; - n++; - } - return n; -} - -/*********************************************************** - * MAIN PROGRAM * - ***********************************************************/ - -void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) -{ - int x, y, i, j, c; - int bo = b; - if(iswall==1) - { - b = b-100; - x = (2+32*((b-22)/1)); - y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - x = 2+32*(b/2); - y = YRES+2+20*(b%2); - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - if(bo==sl || bo==sr) - { - c = 0; - if(bo==sl) - c |= PIXPACK(0xFF0000); - if(bo==sr) - c |= PIXPACK(0x0000FF); - for(i=0; i<30; i++) - { - vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; - } - for(j=0; j<18; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; - vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; - } - } -} - -int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) -{ - int i, j, c; - if(b>=121) - { - b = b-100; - //x = (2+32*((b-22)/1)); - //y = YRES+2+40; - switch(b) - { - case WL_WALLELEC: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - else - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); - } - } - } - break; - case 23: - for(j=1; j<15; j++) - { - for(i=1; i<6+j; i++) - { - if(!(i&j&1)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(; i<27; i++) - { - if(i&j&1) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 24: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 25: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); - } - } - for(i=9; i<27; i++) - { - drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); - } - break; - case 26: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); - } - } - drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); - break; - case 27: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 28: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 29: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 30: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<13; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - for(j=1; j<15; j++) - { - for(i=14; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 32: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 33: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - case 34: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - if(!(i%2) && !(j%2)) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - break; - case 36: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); - break; - case 37: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); - break; - case 38: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); - break; - case 39: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); - break; - case 40: - for(j=1; j<15; j+=2) - { - for(i=1+(1&(j>>1)); i<27; i+=2) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - break; - default: - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - } - if(b==30) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - } - else - { - //x = 2+32*(b/2); - //y = YRES+2+20*(b%2); - for(j=1; j<15; j++) - { - for(i=1; i<27; i++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; - } - } - if(b==0) - { - for(j=4; j<12; j++) - { - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); - vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); - } - } - c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); - if(c<544) - { - c = 255; - } - else - { - c = 0; - } - drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); - } - return 26; -} - -void draw_menu(pixel *vid_buf, int i, int hover) -{ - - //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); -#ifdef MENUV3 - drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - if(hover==i) - { - fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); - } -#else - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); -#endif -} void menu_ui(pixel *vid_buf, int i, int *sl, int *sr) { @@ -6875,65 +5347,6 @@ int flood_parts(int x, int y, int c, int cm, int bm) return 1; } -static void xor_pixel(int x, int y, pixel *vid) -{ - int c; - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - c = vid[y*(XRES+BARSIZE)+x]; - c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); - if(c<512) - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); - else - vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); -} - -void xor_line(int x1, int y1, int x2, int y2, pixel *vid) -{ - int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - e -= 1.0f; - } - } -} - void draw_svf_ui(pixel *vid_buf) { int c; @@ -7061,6 +5474,7 @@ typedef struct ui_edit char str[256],*def; int focus, cursor, hide; } ui_edit; + void ui_edit_draw(pixel *vid_buf, ui_edit *ed) { int cx, i; @@ -7090,8 +5504,10 @@ void ui_edit_draw(pixel *vid_buf, ui_edit *ed) drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); } } + char *shift_0="`1234567890-=[]\\;',./"; char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; + void ui_edit_process(int mx, int my, int mb, ui_edit *ed) { char ch, ts[2], echo[256], *str; @@ -7212,11 +5628,13 @@ void ui_edit_process(int mx, int my, int mb, ui_edit *ed) } } } + typedef struct ui_checkbox { int x, y; int focus, checked; } ui_checkbox; + void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) { int w = 12; @@ -7233,6 +5651,7 @@ void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); } } + void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) { int w = 12; @@ -7475,6 +5894,7 @@ struct strlist char *str; struct strlist *next; }; + void strlist_add(struct strlist **list, char *str) { struct strlist *item = malloc(sizeof(struct strlist)); @@ -7482,6 +5902,7 @@ void strlist_add(struct strlist **list, char *str) item->next = *list; *list = item; } + int strlist_find(struct strlist **list, char *str) { struct strlist *item; @@ -7490,6 +5911,7 @@ int strlist_find(struct strlist **list, char *str) return 1; return 0; } + void strlist_free(struct strlist **list) { struct strlist *item; @@ -7758,6 +6180,7 @@ int save_name_ui(pixel *vid_buf) } void thumb_cache_inval(char *id); + void execute_save(pixel *vid_buf) { int status; @@ -8031,6 +6454,7 @@ int execute_vote(pixel *vid_buf, char *id, char *action) } static char hex[] = "0123456789ABCDEF"; + void strcaturl(char *dst, char *src) { char *d; @@ -9034,21 +7458,6 @@ void draw_image(pixel *vid, pixel *img, int x, int y, int w, int h, int a) } } -void xor_rect(pixel *vid, int x, int y, int w, int h) -{ - int i; - for(i=0; i 18) ? signs[i].y - 18 : signs[i].y + 4; } -void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) -{ - char t[2]; - t[0] = ch; - t[1] = 0; - if(flag) - { - fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); - } - else - { - drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); - drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); - } -} - void render_signs(pixel *vid_buf) { int i, j, x, y, w, h, dx, dy; diff --git a/powder.h b/powder.h new file mode 100644 index 000000000..cef0fbfaf --- /dev/null +++ b/powder.h @@ -0,0 +1,397 @@ +#ifndef POWDER_H +#define POWDER_H + +#include "graphics.h" +#include "defines.h" +#include "interface.h" + +#define CM_COUNT 7 +#define CM_FANCY 6 +#define CM_HEAT 5 +#define CM_BLOB 4 +#define CM_FIRE 3 +#define CM_PERS 2 +#define CM_PRESS 1 +#define CM_VEL 0 + +#define UI_WALLSTART 37 +#define UI_WALLCOUNT 19 + +#define SPC_AIR 136 +#define SPC_HEAT 137 +#define SPC_COOL 138 +#define SPC_VACUUM 139 + +#define WL_WALLELEC 22 +#define WL_EWALL 23 +#define WL_DETECT 24 +#define WL_STREAM 25 +#define WL_SIGN 26 +#define WL_FAN 27 +#define WL_ALLOWLIQUID 28 +#define WL_DESTROYALL 29 +#define WL_ERASE 30 +#define WL_WALL 31 +#define WL_ALLOWAIR 32 +#define WL_ALLOWSOLID 33 +#define WL_ALLOWALLELEC 34 +#define WL_EHOLE 35 +#define WL_ALLOWGAS 40 + +#define PT_NONE 0 +#define PT_DUST 1 +#define PT_WATR 2 +#define PT_OILL 3 +#define PT_FIRE 4 +#define PT_STNE 5 +#define PT_LAVA 6 +#define PT_GUNP 7 +#define PT_NITR 8 +#define PT_CLNE 9 +#define PT_GASS 10 +#define PT_PLEX 11 +#define PT_DFRM 12 +#define PT_ICEI 13 +#define PT_METL 14 +#define PT_SPRK 15 +#define PT_SNOW 16 +#define PT_WOOD 17 +#define PT_NEUT 18 +#define PT_PLUT 19 +#define PT_PLNT 20 +#define PT_ACID 21 +#define PT_VOID 22 +#define PT_WTRV 23 +#define PT_CNCT 24 +#define PT_DSTW 25 +#define PT_SALT 26 +#define PT_SLTW 27 +#define PT_DMND 28 +#define PT_BMTL 29 +#define PT_BRMT 30 +#define PT_PHOT 31 +#define PT_URAN 32 +#define PT_WAX 33 +#define PT_MWAX 34 +#define PT_PSCN 35 +#define PT_NSCN 36 +#define PT_LNTG 37 +#define PT_INSL 38 +#define PT_BHOL 39 +#define PT_WHOL 40 +#define PT_RBDM 41 +#define PT_LRBD 42 +#define PT_NTCT 43 +#define PT_SAND 44 +#define PT_GLAS 45 +#define PT_PTCT 46 +#define PT_BGLA 47 +#define PT_THDR 48 +#define PT_PLSM 49 +#define PT_ETRD 50 +#define PT_NICE 51 +#define PT_NBLE 52 +#define PT_BTRY 53 +#define PT_LCRY 54 +#define PT_STKM 55 +#define PT_SWCH 56 +#define PT_SMKE 57 +#define PT_PLAS 58 +#define PT_DESL 59 +#define PT_COAL 60 +#define PT_LO2 61 +#define PT_O2 62 +#define PT_INWR 63 +#define PT_YEST 64 +#define PT_DYST 65 +#define PT_NUM 66 + +#define R_TEMP 22 +#define MAX_TEMP 3500 +#define MIN_TEMP -273 + +#define ST_NONE 0 +#define ST_SOLID 1 +#define ST_LIQUID 2 +#define ST_GAS 3 + +static unsigned char TYPE_PART = 0x01; //1 +static unsigned char TYPE_LIQUID = 0x02; //2 +static unsigned char TYPE_SOLID = 0x04; //4 +static unsigned char TYPE_GAS = 0x08; //8 +static unsigned char PROP_CONDUCTS = 0x10; //16 +#define FLAG_STAGNANT 1 + +typedef struct +{ + int type; + int life, ctype; + float x, y, vx, vy; + float temp; + float pavg[2]; + int flags; +} particle; + +struct part_type +{ + const char *name; + pixel pcolors; + float advection; + float airdrag; + float airloss; + float loss; + float collision; + float gravity; + float diffusion; + float hotair; + int falldown; + int flammable; + int explosive; + int meltable; + int hardness; + int menu; + int menusection; + float heat; + unsigned char hconduct; + const char *descs; + unsigned char properties; +}; + +struct part_state +{ + char state; + int solid; + float stemp; + int liquid; + float ltemp; + int gas; + float gtemp; + int burn; + float btemp; +}; + +const struct part_type ptypes[PT_NUM] = +{ + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Flammable. Solidifies under pressure"}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, + {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.0f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0.01f, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 5.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f, 70, "Deat Yeast."}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description +}; + +const struct part_state pstates[PT_NUM] = +{ + // Name Solid Frzp Liquid Mpnt Gas Bpoint + /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2500.0f}, + /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 710.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_STNE, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 300.0f}, + /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, + /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 300.0f}, + /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 0.0f, PT_DSTW, 98.0f, PT_NONE, 100.0f, PT_NONE, 0.0f}, + /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 850.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, + /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 900.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SLTW */ {ST_LIQUID, PT_ICEI, -40.0f, PT_NONE, 0.0f, PT_WTRV, 110.0f, PT_NONE, 0.0f}, + /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2100.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 46.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* MWAX */ {ST_LIQUID, PT_WAX, 45.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, -210.0f, PT_NONE, 0.0f, PT_NONE, -195.8f, PT_NONE, 0.0f}, + /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 39.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, + /* LRBD */ {ST_LIQUID, PT_RBDM, 38.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, + /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, -209.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2000.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, -190.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 60.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, +}; +static const unsigned char can_move[PT_NUM][PT_NUM] = +{ + /* A B */ + /* A 0 1 | B ligher than A */ + /* B 1 0 | A heavier than B */ + +/* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y */ +/* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ +/* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ +/* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ +/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ +/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ +/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Watr */ +/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ +/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ +/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Stne */ +/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* Lava */ +/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ +/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ +/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ +/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ +/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ +/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ +/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Icei */ +/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ +/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ +/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Snow */ +/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ +/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,1}, /* Neut */ +/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Plut */ +/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ +/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ +/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ +/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ +/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Cnct */ +/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Dstw */ +/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Salt */ +/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* Sltw */ +/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dmnd */ +/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ +/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* Brml */ +/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ +/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Uran */ +/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ +/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1}, /* MWax */ +/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ +/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ +/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ +/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ +/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ +/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ +/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ +/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* LRbd */ +/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ +/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Sand */ +/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ +/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ +/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* BGla */ +/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ +/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ +/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ +/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ +/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ +/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ +/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ +/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ +/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ +/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ +/* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ +/* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ +/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ +/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0}, /* LO2 */ +/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0}, /* O2 */ +/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ +/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* YEST */ +/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ +/* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ +/* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ +/* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ +/* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ +}; + +#endif \ No newline at end of file From 5751fea35f31640fddfaea1459503e366ae39729 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 26 Aug 2010 10:53:15 +0100 Subject: [PATCH 104/237] More work --- font.h | 4 ++-- graphics.c | 6 ++++++ graphics.h | 6 +++--- interface.h | 7 +++++-- powder.c | 43 +------------------------------------------ powder.h | 13 ++++++++----- utils.c | 41 +++++++++++++++++++++++++++++++++++++++++ utils.h | 23 +++++++++++++++++++++++ 8 files changed, 89 insertions(+), 54 deletions(-) create mode 100644 utils.c create mode 100644 utils.h diff --git a/font.h b/font.h index 018e4746b..f8f9a58c5 100644 --- a/font.h +++ b/font.h @@ -21,11 +21,11 @@ #ifndef FONT_H_CHECK #define FONT_H_CHECK #define FONT_H 10 -char font_data[] = +static char font_data[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xcc, 0x00, 0x00, 0x0a, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xff, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x80, 0xff, 0x2f, 0xfc, 0xff, 0xc3, 0x07, 0x3d, 0x3c, 0xc0, 0xc3, 0x03, 0x3c, 0x7c, 0xd0, 0xc3, 0xff, 0x3f, 0xf8, 0xff, 0x02, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, }; -short font_ptrs[] = +static short font_ptrs[] = { 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e60, 0x0e7a, 0x0e8a, 0x0e9a, 0x0eaa, 0x0eba, 0x0eca, 0x0eda, 0x0eea, 0x0efa, 0x0f0a, 0x0f1a, 0x0f2a, 0x0f3a, 0x0f4a, 0x0f5a, 0x0f6a, 0x0f7a, 0x0f8a, 0x0f9a, 0x0faa, 0x0fba, 0x0fca, 0x0fda, 0x0fea, 0x0ffa, 0x100a, 0x101a, 0x102a, 0x103a, 0x104a, 0x105a, 0x106a, 0x107a, 0x108a, 0x109a, 0x10aa, 0x10ba, 0x10ca, 0x10da, 0x10ea, 0x10fa, 0x110a, 0x111a, 0x112a, 0x113a, 0x114a, }; diff --git a/graphics.c b/graphics.c index 4282e5c49..58741166b 100644 --- a/graphics.c +++ b/graphics.c @@ -3,8 +3,14 @@ #include "powder.h" #include "graphics.h" #include "font.h" +#include "utils.h" +#include #include +unsigned cmode = 3; +SDL_Surface *sdl_scrn; +int sdl_scale = 1; + pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) { int i,j,x,y,w,h,r,g,b,c; diff --git a/graphics.h b/graphics.h index 935dd43ff..7779b0949 100644 --- a/graphics.h +++ b/graphics.h @@ -36,9 +36,9 @@ typedef unsigned int pixel; #endif #endif -unsigned cmode = 3; -SDL_Surface *sdl_scrn; -int sdl_scale = 1; +extern unsigned cmode; +extern SDL_Surface *sdl_scrn; +extern int sdl_scale; pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); diff --git a/interface.h b/interface.h index dfa0ba666..581689757 100644 --- a/interface.h +++ b/interface.h @@ -7,13 +7,16 @@ struct menu_section const char *name; int itemcount; }; +typedef struct menu_section menu_section; + struct menu_wall { pixel colour; const char *descs; }; +typedef struct menu_wall menu_wall; -const struct menu_wall mwalls[] = +static menu_wall mwalls[] = { {PIXPACK(0xC0C0C0), "Wall. Indestructible. Blocks everything. Conductive."}, {PIXPACK(0x808080), "E-Wall. Becomes transparent when electricity is connected."}, @@ -47,7 +50,7 @@ const struct menu_wall mwalls[] = #define SC_NUCLEAR 7 #define SC_TOTAL 9 -struct menu_section msections[] = +static menu_section msections[] = { {"\xC1", "Walls", 0}, {"\xC2", "Electronics", 0}, diff --git a/powder.c b/powder.c index 63d67ea74..c0ff76dd4 100644 --- a/powder.c +++ b/powder.c @@ -37,6 +37,7 @@ #include #endif +#include "utils.h" #include "font.h" #include "defines.h" #include "powder.h" @@ -281,32 +282,6 @@ void *update_air_th(void *arg) return NULL; } -#ifdef WIN32 -_inline unsigned clamp_flt(float f, float min, float max) -#else -inline unsigned clamp_flt(float f, float min, float max) -#endif -{ - if(fmax) - return 255; - return (int)(255.0f*(f-min)/(max-min)); -} - -#ifdef WIN32 -_inline float restrict_flt(float f, float min, float max) -#else -inline float restrict_flt(float f, float min, float max) -#endif -{ - if(fmax) - return max; - return f; -} - /*********************************************************** * PARTICLE SIMULATOR * ***********************************************************/ @@ -650,22 +625,6 @@ inline void delete_part(int x, int y) pmap[y][x] = 0; // just in case } -//Signum function -#ifdef WIN32 -_inline int sign(float i) -#else -inline int sign(float i) -#endif -{ - if (i<0) - return -1; - if (i>0) - return 1; - return 0; -} - -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); - #ifdef WIN32 _inline int is_wire(int x, int y) #else diff --git a/powder.h b/powder.h index cef0fbfaf..5f0ca7172 100644 --- a/powder.h +++ b/powder.h @@ -122,7 +122,7 @@ static unsigned char TYPE_GAS = 0x08; //8 static unsigned char PROP_CONDUCTS = 0x10; //16 #define FLAG_STAGNANT 1 -typedef struct +struct particle { int type; int life, ctype; @@ -130,7 +130,8 @@ typedef struct float temp; float pavg[2]; int flags; -} particle; +}; +typedef struct particle particle; struct part_type { @@ -156,6 +157,7 @@ struct part_type const char *descs; unsigned char properties; }; +typedef struct part_type part_type; struct part_state { @@ -169,8 +171,9 @@ struct part_state int burn; float btemp; }; +typedef struct part_state part_state; -const struct part_type ptypes[PT_NUM] = +static part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, @@ -242,7 +245,7 @@ const struct part_type ptypes[PT_NUM] = //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; -const struct part_state pstates[PT_NUM] = +static part_state pstates[PT_NUM] = { // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -312,7 +315,7 @@ const struct part_state pstates[PT_NUM] = /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 60.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; -static const unsigned char can_move[PT_NUM][PT_NUM] = +static unsigned char can_move[PT_NUM][PT_NUM] = { /* A B */ /* A 0 1 | B ligher than A */ diff --git a/utils.c b/utils.c new file mode 100644 index 000000000..dfa9a3b5f --- /dev/null +++ b/utils.c @@ -0,0 +1,41 @@ +#include "utils.h" + +//Signum function +#ifdef WIN32 +_inline int sign(float i) +#else +inline int sign(float i) +#endif +{ + if (i<0) + return -1; + if (i>0) + return 1; + return 0; +} + +#ifdef WIN32 +_inline unsigned clamp_flt(float f, float min, float max) +#else +inline unsigned clamp_flt(float f, float min, float max) +#endif +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +#ifdef WIN32 +_inline float restrict_flt(float f, float min, float max) +#else +inline float restrict_flt(float f, float min, float max) +#endif +{ + if(fmax) + return max; + return f; +} \ No newline at end of file diff --git a/utils.h b/utils.h new file mode 100644 index 000000000..71c1df0bc --- /dev/null +++ b/utils.h @@ -0,0 +1,23 @@ +#ifndef UTILS_H +#define UTILS_H + +//Signum function +#ifdef WIN32 +_inline int sign(float i); +#else +inline int sign(float i); +#endif + +#ifdef WIN32 +_inline unsigned clamp_flt(float f, float min, float max); +#else +inline unsigned clamp_flt(float f, float min, float max); +#endif + +#ifdef WIN32 +_inline float restrict_flt(float f, float min, float max); +#else +inline float restrict_flt(float f, float min, float max); +#endif + +#endif \ No newline at end of file From 72a1d17fe42ccc74ac25328dcd272b7a2bf6856c Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 26 Aug 2010 12:20:16 +0100 Subject: [PATCH 105/237] This build works, but still a work in progress --- defines.h | 4 ---- graphics.c | 8 +------- misc.c | 41 +++++++++++++++++++++++++++++++++++++++++ misc.h | 23 +++++++++++++++++++++++ powder.c | 13 ++----------- version.h | 4 ---- 6 files changed, 67 insertions(+), 26 deletions(-) create mode 100644 misc.c create mode 100644 misc.h diff --git a/defines.h b/defines.h index b08407f5c..5b5daaaf3 100644 --- a/defines.h +++ b/defines.h @@ -5,11 +5,7 @@ #undef PLOSS -#ifdef MENUV3 #define MENUSIZE 40 -#else -#define MENUSIZE 20 -#endif #define BARSIZE 14 #define XRES 612 #define YRES 384 diff --git a/graphics.c b/graphics.c index 58741166b..15f50c631 100644 --- a/graphics.c +++ b/graphics.c @@ -3,7 +3,7 @@ #include "powder.h" #include "graphics.h" #include "font.h" -#include "utils.h" +#include "misc.h" #include #include @@ -716,9 +716,6 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) void draw_menu(pixel *vid_buf, int i, int hover) { - - //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); -#ifdef MENUV3 drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); if(hover==i) { @@ -729,9 +726,6 @@ void draw_menu(pixel *vid_buf, int i, int hover) { drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); } -#else - drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); -#endif } #ifdef WIN32 diff --git a/misc.c b/misc.c new file mode 100644 index 000000000..fe50b329f --- /dev/null +++ b/misc.c @@ -0,0 +1,41 @@ +#include "misc.h" + +//Signum function +#ifdef WIN32 +_inline int sign(float i) +#else +inline int sign(float i) +#endif +{ + if (i<0) + return -1; + if (i>0) + return 1; + return 0; +} + +#ifdef WIN32 +_inline unsigned clamp_flt(float f, float min, float max) +#else +inline unsigned clamp_flt(float f, float min, float max) +#endif +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +#ifdef WIN32 +_inline float restrict_flt(float f, float min, float max) +#else +inline float restrict_flt(float f, float min, float max) +#endif +{ + if(fmax) + return max; + return f; +} \ No newline at end of file diff --git a/misc.h b/misc.h new file mode 100644 index 000000000..a42396dcd --- /dev/null +++ b/misc.h @@ -0,0 +1,23 @@ +#ifndef UTILS_H +#define UTILS_H + +//Signum function +#ifdef WIN32 +extern _inline int sign(float i); +#else +extern inline int sign(float i); +#endif + +#ifdef WIN32 +extern _inline unsigned clamp_flt(float f, float min, float max); +#else +extern inline unsigned clamp_flt(float f, float min, float max); +#endif + +#ifdef WIN32 +extern _inline float restrict_flt(float f, float min, float max); +#else +extern inline float restrict_flt(float f, float min, float max); +#endif + +#endif \ No newline at end of file diff --git a/powder.c b/powder.c index c0ff76dd4..b1665354f 100644 --- a/powder.c +++ b/powder.c @@ -37,7 +37,7 @@ #include #endif -#include "utils.h" +#include "misc.h" #include "font.h" #include "defines.h" #include "powder.h" @@ -8619,15 +8619,7 @@ int main(int argc, char *argv[]) { draw_menu(vid_buf, i, active_menu); } -#ifndef MENUV3 - for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy && x Date: Thu, 26 Aug 2010 12:20:39 +0100 Subject: [PATCH 106/237] Remove utils.c --- utils.c | 41 ----------------------------------------- utils.h | 23 ----------------------- 2 files changed, 64 deletions(-) delete mode 100644 utils.c delete mode 100644 utils.h diff --git a/utils.c b/utils.c deleted file mode 100644 index dfa9a3b5f..000000000 --- a/utils.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "utils.h" - -//Signum function -#ifdef WIN32 -_inline int sign(float i) -#else -inline int sign(float i) -#endif -{ - if (i<0) - return -1; - if (i>0) - return 1; - return 0; -} - -#ifdef WIN32 -_inline unsigned clamp_flt(float f, float min, float max) -#else -inline unsigned clamp_flt(float f, float min, float max) -#endif -{ - if(fmax) - return 255; - return (int)(255.0f*(f-min)/(max-min)); -} - -#ifdef WIN32 -_inline float restrict_flt(float f, float min, float max) -#else -inline float restrict_flt(float f, float min, float max) -#endif -{ - if(fmax) - return max; - return f; -} \ No newline at end of file diff --git a/utils.h b/utils.h deleted file mode 100644 index 71c1df0bc..000000000 --- a/utils.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H - -//Signum function -#ifdef WIN32 -_inline int sign(float i); -#else -inline int sign(float i); -#endif - -#ifdef WIN32 -_inline unsigned clamp_flt(float f, float min, float max); -#else -inline unsigned clamp_flt(float f, float min, float max); -#endif - -#ifdef WIN32 -_inline float restrict_flt(float f, float min, float max); -#else -inline float restrict_flt(float f, float min, float max); -#endif - -#endif \ No newline at end of file From f426ee42e7170260088b78a1091bba43713822fe Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 26 Aug 2010 12:38:24 +0100 Subject: [PATCH 107/237] More re-arranging --- main.c | 9309 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ powder.c | 9309 ------------------------------------------------------ 2 files changed, 9309 insertions(+), 9309 deletions(-) create mode 100644 main.c diff --git a/main.c b/main.c new file mode 100644 index 000000000..b1665354f --- /dev/null +++ b/main.c @@ -0,0 +1,9309 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * Copyright (c) 2010 Skresanov Savely + * Copyright (c) 2010 Bryan Hoyle + * Copyright (c) 2010 Nathan Cousins + * + * 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 02111-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include "misc.h" +#include "font.h" +#include "defines.h" +#include "powder.h" +#include "graphics.h" +#include "version.h" +#include "http.h" +#include "md5.h" +#include "update.h" +#include "hmap.h" +#include "air.h" + +char *it_msg = + "\brThe Powder Toy\n" + "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" + "\n" + "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" + "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" + "\bgPick your material from the menu using mouse left/right buttons.\n" + "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" + "Shift+drag will create straight lines of particles.\n" + "Ctrl+drag will result in filled rectangles.\n" + "Ctrl+Shift+click will flood-fill a closed area.\n" + "Ctrl+Z will act as Undo.\n" + "Middle click or Alt+Click to \"sample\" the particles.\n" + "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" + "Use 'S' to save parts of the window as 'stamps'.\n" + "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" + "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" + "Use the mouse scroll wheel to change the tool size for particles.\n" + "'Q' will quit the application.\n" + "The spacebar can be used to pause physics.\n" + "'P' will take a screenshot and save it into the current directory.\n" + "\n" + "\brhttp://powdertoy.co.uk/\n" + "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" + "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" + "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" + "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" + "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" + "\n" + "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" + "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" + ; + +typedef struct +{ + int start, inc; + pixel *vid; +} upstruc; + +#ifdef BETA +char *old_ver_msg_beta = "A new beta is available - click here!"; +#endif +char *old_ver_msg = "A new version is available - click here!"; +float mheat = 0.0f; + +int do_open = 0; +int sys_pause = 0; +int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. +int death = 1, framerender = 0; +int amd = 1; + +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + +#define MAXSIGNS 16 + +struct sign +{ + int x,y,ju; + char text[256]; +} signs[MAXSIGNS]; + +/*********************************************************** + * AIR FLOW SIMULATOR * + ***********************************************************/ + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; + +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +int numCores = 4; +float kernel[9]; +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} + +int core_count() +{ + int numCPU = 1; +#ifdef MT +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; +#else +#ifdef MACOSX + numCPU = 4; +#else + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); +#endif +#endif + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); +#endif + return numCPU; +} + +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} + +void *update_air_th(void *arg) +{ + update_air(); + return NULL; +} + +/*********************************************************** + * PARTICLE SIMULATOR * + ***********************************************************/ +particle *parts; +particle *cb_parts; + +float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index +int isplayer = 0; //It shows is player spawned or not +int mousex, mousey = 0; //They contain mouse position + +void menu_count(void) +{ + int i=0; + msections[SC_WALL].itemcount = UI_WALLCOUNT-4; + msections[SC_SPECIAL].itemcount = 4; + for(i=0; i=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + { + return 1; + } + + if((r&0xFF)==PT_VOID) + { + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL) + { + parts[i].type=PT_NONE; + if(!legacy_enable) + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } + return 0; + } + + if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide + { + return 1; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) + { + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) + { + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + { + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + + if(t==SPC_HEAT||t==SPC_COOL) + { + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) + { + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } + else + { + return -1; + } + } + if(t==SPC_AIR) + { + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) + { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } + else + i = p; + + if(t==PT_GLAS) + { + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + } + if(t!=PT_STKM) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + } + if(t==PT_ACID) + { + parts[i].life = 75; + } + /*Testing + if(t==PT_WOOD){ + parts[i].life = 150; + } + End Testing*/ + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NBLE) + parts[i].life = 0; + if(t==PT_NEUT) + { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) + { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f) + { + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } + else + { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //}/ + } + + if(t!=PT_STKM) + pmap[y][x] = t|(i<<8); + else + { + if(isplayer==0) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = PT_STKM; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 100; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + + + + player[3] = x-1; //Setting legs positions + player[4] = y+6; + player[5] = x-1; + player[6] = y+6; + + player[7] = x-3; + player[8] = y+12; + player[9] = x-3; + player[10] = y+12; + + player[11] = x+1; + player[12] = y+6; + player[13] = x+1; + player[14] = y+6; + + player[15] = x+3; + player[16] = y+12; + player[17] = x+3; + player[18] = y+12; + + isplayer = 1; + } + } + + return i; +} + +#ifdef WIN32 +_inline void delete_part(int x, int y) +#else +inline void delete_part(int x, int y) +#endif +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +#ifdef WIN32 +_inline int is_wire(int x, int y) +#else +inline int is_wire(int x, int y) +#endif +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} + +#ifdef WIN32 +_inline int is_wire_off(int x, int y) +#else +inline int is_wire_off(int x, int y) +#endif +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) + { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) + { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y>8) < NPART && (pmr>>8) >= 0) + { + return parts[pmr>>8].type; + } + else + { + return PT_NONE; + } +} +int nearest_part(int ci, int t) +{ + int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); + int ndistance = 0; + int id = -1; + int i = 0; + int cx = (int)parts[ci].x; + int cy = (int)parts[ci].y; + for(i=0; i=XRES || y>=YRES || + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS||t==PT_NBLE) + { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) + { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) + { + if(pv[y/CELL][x/CELL]>1.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } + else + { + if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + } else { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + } + + if(ptypes[t].diffusion) + { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) + { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } + else + { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) + { + mv -= ISTP; + if(mv <= 0.0f) + { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) + { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) + t = parts[i].type = PT_GASS; + if(t==PT_GASS && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_DESL; + if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) + t = parts[i].type = PT_FIRE; + } + if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) + t = parts[i].type = PT_GASS; + if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it + t = parts[i].type = PT_FIRE; // combust under pressure. + if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) + t = parts[i].type = PT_DESL; + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + // t = parts[i].type = PT_BGLA; + if(t==PT_GLAS) + { + parts[i].pavg[0] = parts[i].pavg[1]; + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) + { + parts[i].type = PT_BGLA; + } + } + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) + { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) + { + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1) + { + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + + if(!legacy_enable) + { + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)) + { + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) + { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE||t==PT_PLSM) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) + { + if(t==PT_LAVA&&parts[i].ctype) + { + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) + { + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } + else + { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } + else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) + { + if(pstates[t].liquid==PT_LAVA) + { + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } + else if(t==PT_ICEI&&parts[i].ctype) + { + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else + { + t = parts[i].type = pstates[t].liquid; + } + } + else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) + { + t = parts[i].type = pstates[t].liquid; + } + else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) + { + if(t==PT_SLTW&&1>rand()%6) + { + t = parts[i].type = PT_SALT; + } + else + { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) + { + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA) + { + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_PTCT&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + if(t==PT_NTCT&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) + { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) + { + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } + else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) + { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)) + { + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } + else + { + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_ICEI || t==PT_SNOW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if(legacy_enable) + { + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } + } + } + else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL) + { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) + { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } + else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%250)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_SLTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) + { + parts[r>>8].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_WTRV) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } + + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } + } + } + else if(t==PT_YEST) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_DYST && 1>(rand()%30) && !legacy_enable) + { + t = parts[i].type = PT_DYST; + } + } + } + else if(t==PT_ACID) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID) + { + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) + { + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } + else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) + { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } + else if (parts[i].life==50) + { + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_NEUT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) + { + if(33>rand()%100) + { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } + else + { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_DYST && 15>(rand()%1000)) + parts[r>>8].type = PT_YEST; + if((r&0xFF)==PT_YEST){ + if(15>(rand()%100000)&&isplayer==0) + parts[r>>8].type = PT_STKM; + else + parts[r>>8].type = PT_DYST; + } + + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_DESL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_PLAS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_DESL && 15>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_COAL && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + } + } + else if(t==PT_LCRY) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_LCRY) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_BTRY) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts_avg(i,r>>8) != PT_INSL) + { + if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + parts[r>>8].type = PT_SPRK; + } + } + } + }else if(t==PT_SWCH) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + { + parts[r>>8].type = PT_FIRE; + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; + if(legacy_enable) + { + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && + ptypes[rt].meltable*lpv>(rand()%1000)) + { + if(t!=PT_LAVA || parts[i].life>0) + { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } + else + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) + { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = PT_STNE; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) + { + kill_part(r>>8); + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; + parts[i].ctype = PT_NONE; + goto killed; + } + } + } + pavg = parts_avg(i, r>>8); + if(rt==PT_SWCH && t==PT_SPRK) + { + pavg = parts_avg(r>>8, i); + if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) + parts[r>>8].life = 10; + if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) + parts[r>>8].life = 9; + if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].ctype = PT_SWCH; + parts[r>>8].life = 4; + } + } + pavg = parts_avg(i, r>>8); + if(pavg != PT_INSL) + { + if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; + } + } + if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) + { + if(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) + { + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { + parts[i].life = rand()%150+50; + parts[i].type = PT_PLSM; + parts[i].ctype = PT_NBLE; + parts[i].temp = 3500; + pv[y/CELL][x/CELL] += 1; + } + if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) + { + parts[i].type = PT_SWCH; + parts[i].life = 11; + } + } + } +killed: + if(parts[i].type == PT_NONE) + continue; + } + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; + + //Death + if(parts[i].life<0 && (death == 1)) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } + + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; + + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; + + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; + + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; + + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } + + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } + + } + } + + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } + + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } + + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); + + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = 0; + parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } + + } + } + } + + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } + + } + + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; + + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; + + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; + + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; + + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; + + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } + + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } + + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } + + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } + + } + + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } + + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } + + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } + if(t==PT_CLNE) + { + if(!parts[i].ctype) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx30&&parts[i].temp<44){ + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); + } + } + if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) + { + parts[i].type = PT_NBLE; + parts[i].life = 0; + } + if (t==PT_FIRE && parts[i].life <=1) + { + t = parts[i].type = PT_SMKE; + parts[i].life = rand()%20+250; + } + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) + { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) + { + if(nx!=x && try_move(i, x, y, nx, y)) + { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x, ny)) + { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else + { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) + { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x-r, ny)) + { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y+r)) + { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y-r)) + { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) + { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) + { + kill_part(i); + continue; + } + else if(try_move(i, x, y, 2*x-nx, ny)) + { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } + else if(try_move(i, x, y, nx, 2*y-ny)) + { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } + else + { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + +justdraw: + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) + { + kill_part(i); + continue; + } + if(cmode!=CM_HEAT) + { + if(t==PT_STKM) //Just draw head here + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; + vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; + vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; + vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; + } + draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); + draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); + draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); + draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + + isplayer = 1; //It's a secret. Tssss... + } + if(t==PT_MWAX&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,224,224,170,255); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,224,224,170,20); + else + blendpixel(vid,x+nx,y+ny,224,224,170,40); + } + } + + } + else if(t==PT_ACID) + { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28)); + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + if(cmode==6){ + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); + } + } + } else { + blendpixel(vid, nx, ny, cr, cg, cb, 255); + } + + if(cmode==4) + { + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + } + else if(t==PT_OILL&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,64,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,64,16,40); + } + } + } + else if(t==PT_NEUT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLUT&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_SLTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,80,240,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,80,240,50); + } + } + } + else if(t==PT_PHOT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_SWCH && parts[i].life == 10) + { + x = nx; + y = ny; + blendpixel(vid,x,y,17,217,24,255); + } + else if(t==PT_LNTG&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,128,160,223,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,128,160,223,50); + } + } + } + else if(t==PT_SMKE) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = 10; + cb = 10; + cr = 10; + cg += fire_g[y][x]; + if(cg > 50) cg = 50; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 50) cb = 50; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 50) cr = 50; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,100,100,100,30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,100,100,100,10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,100,100,100,20); + } + } + } + } + else if(t==PT_WATR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + + } else if(t==PT_DSTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + } + else if(t==PT_NITR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,224,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,224,16,50); + } + } + + } + else if(t==PT_LRBD&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,170,170,170,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,170,170,170,50); + } + } + + } + + else if(t==PT_NBLE&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,235,73,23,100); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,235,73,23,30); + else + blendpixel(vid,x+nx,y+ny,235,73,23,50); + } + } + + } + else if(t==PT_GASS&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,255,255,0,180); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,255,255,0,50); + else + blendpixel(vid,x+nx,y+ny,255,255,0,80); + } + } + + } + else if(t==PT_WTRV) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = PIXG(ptypes[t].pcolors)/3; + cb = PIXB(ptypes[t].pcolors)/3; + cr = PIXR(ptypes[t].pcolors)/3; + cg += fire_g[y][x]; + if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); + } + } + } + } + else if(t==PT_THDR) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LCRY) + { + if(cmode == 3||cmode==4 || cmode==6) + { + //cr = R/8; + //cg = G/8; + //cb = B/8; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); + //x = nx/CELL; + //y = ny/CELL; + //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } + else + { + cr = 0x50+(parts[i].life*10); + cg = 0x50+(parts[i].life*10); + cb = 0x50+(parts[i].life*10); + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLSM) + { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_FIRE && parts[i].life) + { + if(cmode == 3||cmode==4 || cmode==6) + { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LAVA && parts[i].life) + { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4 || cmode==6) + { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else if(t==PT_LAVA || t==PT_SPRK) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4 || cmode==6) + { + if(t == PT_LAVA) + { + cr = 3; + cg = i%2; + cb = 0; + } + else + { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + } + else + { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + + if(t==PT_STKM) //Stick man should be visible in heat mode + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); + vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); + vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); + vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); + } + draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); + draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); + draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); + draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + } + else + { + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } + } + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) + { + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + } + if(framerender){ + framerender = 0; + sys_pause = 1; + } +} + +void update_particles_i_th(void *arg) +{ + upstruc *newup = (upstruc*)arg; + update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); + return; +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + isplayer = 0; //Needed for player spawning + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && (!sys_pause||framerender)) + emap[y][x] --; + } + } + } + else + { + for(y=0; y>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && (!sys_pause||framerender)) + emap[y][x] --; + } + } + } + +#ifdef MT + if(numCores > 1) + { + InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); + for(pc = 0; pc=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} + +void update_particles_th(void *arg) +{ + update_particles((pixel*)arg); + return; +} + +/*********************************************************** + * SDL OUTPUT * + ***********************************************************/ + +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +#include "icon.h" +void sdl_seticon(void) +{ +#ifdef WIN32 + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else +#ifdef MACOSX + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#endif +#endif +} + +void sdl_open(void) +{ + if(SDL_Init(SDL_INIT_VIDEO)<0) + { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); +#ifdef PIX16 + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); +#else + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); +#endif + if(!sdl_scrn) + { + fprintf(stderr, "Creating window: %s\n", SDL_GetError()); + exit(1); + } + SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); + sdl_seticon(); + SDL_EnableUNICODE(1); + //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +} + +int frame_idx=0; +void dump_frame(pixel *src, int w, int h, int pitch) +{ + char frame_name[32]; + int j,i; + unsigned char c[3]; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"wb"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0; j=0 && x=0 && yPT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } + else + d = c; + + if(size < XRES*YRES) + { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0; y+scl<=YRES; y+=scl) + { + sx = 0; + for(x=0; x+scl<=XRES; x+=scl) + { + a = 0; + r = g = b = 0; + for(j=0; j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) + { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +static char *mystrdup(char *s) +{ + char *x; + if(s) + { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +void *build_save(int *size, int x0, int y0, int w, int h) +{ + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; + int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); + int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + // save the required air state + for(y=by0; y255) i=255; + d[p++] = i; + } + for(y=by0; y255) i=255; + d[p++] = i; + } + + // save the particle map + for(i=0; i=x0 && x=y0 && y255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } + } + for(j=0; j255) tttemp=255; + d[p++] = tttemp; + } + } + for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + + i = (p*101+99)/100 + 612; + c = malloc(i); + c[0] = 0x66; + c[1] = 0x75; + c[2] = 0x43; + c[3] = legacy_enable; + c[4] = SAVE_VERSION; + c[5] = CELL; + c[6] = bw; + c[7] = bh; + c[8] = p; + c[9] = p >> 8; + c[10] = p >> 16; + c[11] = p >> 24; + + i -= 12; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) + { + free(d); + free(c); + return NULL; + } + free(d); + + *size = i+12; + return c; +} + +int parse_save(void *save, int size, int replace, int x0, int y0) +{ + unsigned char *d,*c=save; + int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; + int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; + int fp[NPART], nf=0; + + if(size<16) + return 1; + if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) + return 1; + if(c[4]>SAVE_VERSION) + return 2; + ver = c[4]; + + if(ver<34) + { + legacy_enable = 1; + } + else + { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } + + bw = c[6]; + bh = c[7]; + if(bx0+bw > XRES/CELL) + bx0 = XRES/CELL - bw; + if(by0+bh > YRES/CELL) + by0 = YRES/CELL - bh; + if(bx0 < 0) + bx0 = 0; + if(by0 < 0) + by0 = 0; + + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) + return 3; + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + return 1; + size = i; + + if(size < bw*bh) + return 1; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + if(replace) + { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); + } + + // make a catalog of free parts + memset(pmap, 0, sizeof(pmap)); + for(i=0; i= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } + for(y=by0; y= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + + // load the particle map + i = 0; + pty = p; + for(y=y0; y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j && !(isplayer == 1 && j==PT_STKM)) + { + if(pmap[y][x]) + { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } + else if(i < nf) + { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } + else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + + // load particle properties + for(j=0; j= size) + goto corrupt; + if(i < NPART) + { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + if(parts[i].type == PT_STKM) + { + player[2] = PT_DUST; + + player[3] = parts[i].x-1; //Setting legs positions + player[4] = parts[i].y+6; + player[5] = parts[i].x-1; + player[6] = parts[i].y+6; + + player[7] = parts[i].x-3; + player[8] = parts[i].y+12; + player[9] = parts[i].x-3; + player[10] = parts[i].y+12; + + player[11] = parts[i].x+1; + player[12] = parts[i].y+6; + player[13] = parts[i].x+1; + player[14] = parts[i].y+6; + + player[15] = parts[i].x+3; + player[16] = parts[i].y+12; + player[17] = parts[i].x+3; + player[18] = parts[i].y+12; + + } + } + else + p += 2; + } + } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } + } + for(j=0; j=34&&legacy_beta==0) + { + if(p >= size) + { + goto corrupt; + } + if(i <= NPART) + { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } + else + { + p++; + } + } + else + { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } + } + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) + { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + + if(p >= size) + goto version1; + j = d[p++]; + for(i=0; i size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) + { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0; y= size) + goto corrupt; + j=d[p++]; + if(j0) + { + if(j==PT_STKM) //Stickman should be drawed another way + { + //Stickman drawing + for(k=-2; k<=1; k++) + { + fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); + fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); + fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); + fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); + } + draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); + draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); + draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); + draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); + } + else + fb[y*w+x] = ptypes[j].pcolors; + } + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +/* NO, I DON'T THINK SO + #include "fbi.h" + + pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) + { + unsigned char *tmp; + pixel *res; + int i; + + tmp = malloc(width*height*3); + if(!tmp) + return NULL; + res = malloc(width*height*PIXELSIZE); + if(!res) { + free(tmp); + return NULL; + } + + i = width*height*3; + if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { + free(res); + free(tmp); + return NULL; + } + + for(i=0; iXRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) + { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } + } + + free(data); +} + +int clipboard_ready = 0; +void *clipboard_data = 0; +int clipboard_length = 0; + +void stamp_save(int x, int y, int w, int h) +{ + FILE *f; + int n; + char fn[64], sn[16]; + void *s=build_save(&n, x, y, w, h); + +#ifdef WIN32 + _mkdir("stamps"); +#else + mkdir("stamps", 0755); +#endif + + stamp_gen_name(sn); + sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); + + f = fopen(fn, "wb"); + if(!f) + return; + fwrite(s, n, 1, f); + fclose(f); + + free(s); + + if(stamps[STAMP_MAX-1].thumb) + free(stamps[STAMP_MAX-1].thumb); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); + memset(stamps, 0, sizeof(struct stamp_info)); + if(stamp_count0) + { + memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); + memcpy(stamps, &tmp, sizeof(struct stamp_info)); + + stamp_update(); + } + + return data; +} + +void stamp_init(void) +{ + int i; + FILE *f; + + memset(stamps, 0, sizeof(stamps)); + + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); + if(!f) + return; + for(i=0; i=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=20) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1) + { + *sl = h; + } + if(b==4&&h!=-1) + { + *sr = h; + } +} + +int create_parts(int x, int y, int r, int c) +{ + int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; + + if(c == 125) + { + i = x / CELL; + j = y / CELL; + for(v=-1; v<2; v++) + for(u=-1; u<2; u++) + if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) + { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } +} + +void create_box(int x1, int y1, int x2, int y2, int c) +{ + int i, j; + if(x1>x2) + { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) + { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) + { + c = c-100; + } + if(cm==-1) + { + if(c==0) + { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } + else + cm = 0; + } + if(bm==-1) + { + if(c==30) + { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } + else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) + { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(yhide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(ed->str[0]) + { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } + else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) + { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} + +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; + +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; + } + if(ed->focus && sdl_key) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) + { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } + else if(ed->cursor > 0) + { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) + { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) + { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) + { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} + +typedef struct ui_checkbox +{ + int x, y; + int focus, checked; +} ui_checkbox; + +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) +{ + int w = 12; + if(ed->checked) + { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus) + { + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } + else + { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } +} + +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) +{ + int w = 12; + + if(mb && !mbq) + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->checked = (ed->checked)?0:1; + } + } + else + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->focus = 1; + } + else + { + ed->focus = 0; + } + } +} + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) + { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) + { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +struct strlist +{ + char *str; + struct strlist *next; +}; + +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} + +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list; item; item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} + +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) + { + item = *list; + *list = (*list)->next; + free(item); + } +} + +void tag_list_ui(pixel *vid_buf) +{ + int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; + char *p,*q,s; + char *tag=NULL, *op=NULL; + ui_edit ed; + struct strlist *vote=NULL,*down=NULL; + + ed.x = x0+25; + ed.y = y0+221; + ed.w = 158; + ed.nx = 1; + ed.def = "[new tag]"; + ed.focus = 0; + ed.hide = 0; + ed.cursor = 0; + strcpy(ed.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + op = tag = NULL; + + drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 256); + drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); + p = svf_tags; + s = svf_tags[0] ? ' ' : 0; + y = 36 + y0; + while(s) + { + q = strchr(p, ' '); + if(!q) + q = p+strlen(p); + s = *q; + *q = 0; + if(svf_own || svf_admin || svf_mod) + { + drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); + d = 14; + if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) + { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) + { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) + { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) + { + if(!strcmp(res, "OK ADMIN")) + { + svf_admin = 1; + svf_mod = 0; + } + else if(!strcmp(res, "OK MOD")) + { + svf_admin = 0; + svf_mod = 1; + } + else + { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} + +static char hex[] = "0123456789ABCDEF"; + +void strcaturl(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) + { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else + { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +#define THUMB_CACHE_SIZE 256 + +char *thumb_cache_id[THUMB_CACHE_SIZE]; +void *thumb_cache_data[THUMB_CACHE_SIZE]; +int thumb_cache_size[THUMB_CACHE_SIZE]; +int thumb_cache_lru[THUMB_CACHE_SIZE]; + +void thumb_cache_inval(char *id) +{ + int i,j; + for(i=0; i= THUMB_CACHE_SIZE) + return; + free(thumb_cache_id[i]); + free(thumb_cache_data[i]); + thumb_cache_id[i] = NULL; + for(j=0; j thumb_cache_lru[i]) + thumb_cache_lru[j]--; +} +void thumb_cache_add(char *id, void *thumb, int size) +{ + int i,m=-1,j=-1; + thumb_cache_inval(id); + for(i=0; i m) + { + m = thumb_cache_lru[i]; + j = i; + } + } + if(i >= THUMB_CACHE_SIZE) + { + thumb_cache_inval(thumb_cache_id[j]); + i = j; + } + for(j=0; j= THUMB_CACHE_SIZE) + return 0; + for(j=0; j=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + else if(!strncmp(str, "TAG ", 4)) + { + if(j >= TAG_MAX) + { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) + { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } + else + { + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + int thumb_drawn[GRID_X*GRID_Y]; + pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + + do_open = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) + { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) + { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) + { + if(search_page) + { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) + { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) + { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) + for(gi=0; giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) + { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) + { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]&&thumb_drawn[pos]==0) + { + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); + thumb_drawn[pos] = 1; + } + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) + { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) + { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) + { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]) + { + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) + { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0) + { + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv) + { + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8) + { + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } + else + { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) + { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) + { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) + { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) + { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) + { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) + { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) + { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1) + { + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) + { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) + { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) + { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) + { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) + { + if(data) + { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } + else + svf_tags[0] = 0; + } + else + { + svf_tags[0] = 0; + } + + if(svf_login) + { + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200) + { + if(data) + { + if(!strcmp(data, "Up")) + { + svf_myvote = 1; + } + else if(!strcmp(data, "Down")) + { + svf_myvote = -1; + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + } + else + { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } + else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + { + search = 1; + } + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } + else + search = 0; + + if(search && lasttime>=TIMEOUT) + { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) + { + if(search_page) + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } + else + { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } + else + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) + { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login) + { + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) + { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + { + page_count = search_results(results, last_own||svf_admin||svf_mod); + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + } + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) + { + http_async_req_close(http); + http = NULL; + } + + for(i=0; i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) + { + if(stamp_page) + { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + char buff[30]; //Buffer + for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature + else + sprintf(buff, "Temp: 0.00"); //...tempirature + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + //Usual text + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); + x = signs[i].x; + y = signs[i].y; + dx = 1 - signs[i].ju; + dy = (signs[i].y > 18) ? -1 : 1; + for(j=0; j<4; j++) + { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) + { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) + { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) + { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) + { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +/*********************************************************** + * CONFIG FILE * + ***********************************************************/ + +char http_proxy[256] = ""; + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) + { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; +} + +unsigned char last_major=0, last_minor=0, update_flag=0; + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) + { + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) + { + if(fseek(f, -3, SEEK_END)) + { + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3) + { + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + cmode = tmp%7; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void dim_copy(pixel *dst, pixel *src) +{ + int i,r,g,b; + for(i=0; i0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +unsigned int fire_alpha[CELL*3][CELL*3]; +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) + { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } + else + { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i2) + { + pthread_t pth; + pthread_create(&pth,NULL,update_air_th,""); + } + else + { + update_air(); + } +#else + update_air(); +#endif + } + if(cmode==0 || cmode==1) + { + draw_air(vid_buf); + } + else if(cmode==2) + { + memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); + memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); + } + else + { + memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); + } + update_particles(vid_buf); + + if(cmode==2) + { + if(!fire_fc) + { + dim_copy(fire_bg, vid_buf); + } + else + { + memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); + } + fire_fc = (fire_fc+1) % 3; + } + if(cmode==3||cmode==4||cmode==6) + render_fire(vid_buf); + + render_signs(vid_buf); + + memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); + clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); + + draw_svf_ui(vid_buf); + + if(http_ver_check) + { + if(!do_check && http_async_req_status(http_ver_check)) + { + ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); + if(http_ret==200 && ver_data) + { +#ifdef BETA + if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; +#else + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; +#endif + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + { + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) + { + break; + } + } + if(sdl_key=='d') + { + death = !(death); + } + if(sdl_key=='f') + { + framerender = 1; + } + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) + { + if(load_mode) + { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) + { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } + else + load_data = stamp_load(0, &load_size); + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') + { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1') + { + set_cmode(0); + } + if(sdl_key=='2') + { + set_cmode(1); + } + if(sdl_key=='3') + { + set_cmode(2); + } + if(sdl_key=='4') + { + set_cmode(3); + } + if(sdl_key=='5') + { + set_cmode(4); + } + if(sdl_key=='6') + { + set_cmode(5); + } + if(sdl_key=='7') + { + set_cmode(6); + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='h') + hud_enable = !hud_enable; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + if(clipboard_ready==1) + { + load_data = malloc(clipboard_length); + memcpy(load_data, clipboard_data, clipboard_length); + load_size = clipboard_length; + if(load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + } + if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 2; + } + if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) + { + save_mode = 1; + copy_mode = 1; + } + else if(sdl_key=='c') + { + set_cmode((cmode+1) % 7); + if(it > 50) + it = 50; + } + if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo + { + int cbx, cby, cbi; + + for(cbi=0; cbi32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } + else + { + bs += sdl_wheel; + if(bs>1224) + bs = 1224; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)) + { +#ifdef BETA + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); +#else + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); +#endif + } + else + { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } + mx = x; + my = y; + if(update_flag) + { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) + { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } + + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) + { + tmp = malloc(64); +#ifdef BETA + if(is_beta) + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } + else + { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } +#else + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); +#endif + if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) + { + free(tmp); + tmp = download_ui(vid_buf, my_uri, &i); + if(tmp) + { + save_presets(1); + if(update_start(tmp, i)) + { + update_cleanup(); + save_presets(0); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } + else + return 0; + } + } + else + free(tmp); + } + if(y>=sdl_scale*(YRES+(MENUSIZE-20))) + { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) + { + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } + else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) + { + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) + { + db = svf_own ? 257 : 256; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) + { + db = 270; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) + { + db = 266; + if(da < 51) + da ++; + } + else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) + { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) + { + db = svf_login ? 261 : 260; + if(svf_admin) + { + db = 268; + } + else if(svf_mod) + { + db = 271; + } + if(da < 51) + da ++; + } + else if(x>=sdl_scale && x<=17*sdl_scale) + { + db = 262; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) + { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } + else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) + { + db = 267; + if(da < 51) + da ++; + } + else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) + { + db = 265; + if(da < 51) + da ++; + } + else if(da > 0) + da --; + } + else if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) + { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) + { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } + else if(bq==4 && !b) + { + free(load_data); + free(load_img); + load_mode = 0; + } + } + else if(save_mode==1) + { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1) + { + save_mode = 2; + } + else if(b==4) + { + save_mode = 0; + copy_mode = 0; + } + } + else if(save_mode==2) + { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) + { + if(copy_mode==1) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + } + else if(copy_mode==2) + { + clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + clipboard_ready = 1; + save_mode = 0; + copy_mode = 0; + clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + } + else + { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } + } + else if(sdl_zoom_trig && zoom_en<2) + { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) + { + if(!lb) + { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Up")) + { + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) + { + if(execute_vote(vid_buf, svf_id, "Down")) + { + svf_myvote = -1; + } + } + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) + tag_list_ui(vid_buf); + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) + { + legacy_enable = !legacy_enable; + } + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) + { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) + { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) + { + if(!svf_open || !svf_own || x>51) + { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } + else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) + { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) + { + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 7); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+6) % 7); + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } + else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) + { + c = sl = cr&0xFF; + } + else + { + //Something + } + } + lx = x; + ly = y; + lb = 0; + lm = 0; + } + else + { + //Copy state before drawing any particles (for undo)7 + int cbx, cby, cbi; + + for(cbi=0; cbi=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } + else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) + { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) + { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + { + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + mousex = mx/sdl_scale; + mousey = my/sdl_scale; + } + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) + { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) + { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) + { + it--; + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) + { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta) + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } + else + { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + + if(hud_enable) + { + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) + { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) + { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } + if(sdl_zoom_trig||zoom_en) + { + if(zoom_x0) + player[2] = sr; + else + player[2] = PT_DUST; + } + + http_done(); + return 0; +} diff --git a/powder.c b/powder.c index b1665354f..e69de29bb 100644 --- a/powder.c +++ b/powder.c @@ -1,9309 +0,0 @@ -/** - * Powder Toy - Main source - * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * Copyright (c) 2010 Skresanov Savely - * Copyright (c) 2010 Bryan Hoyle - * Copyright (c) 2010 Nathan Cousins - * - * 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 02111-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef WIN32 -#include -#else -#include -#include -#endif - -#include "misc.h" -#include "font.h" -#include "defines.h" -#include "powder.h" -#include "graphics.h" -#include "version.h" -#include "http.h" -#include "md5.h" -#include "update.h" -#include "hmap.h" -#include "air.h" - -char *it_msg = - "\brThe Powder Toy\n" - "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" - "\n" - "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" - "\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" - "\bgPick your material from the menu using mouse left/right buttons.\n" - "Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" - "Shift+drag will create straight lines of particles.\n" - "Ctrl+drag will result in filled rectangles.\n" - "Ctrl+Shift+click will flood-fill a closed area.\n" - "Ctrl+Z will act as Undo.\n" - "Middle click or Alt+Click to \"sample\" the particles.\n" - "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" - "Use 'S' to save parts of the window as 'stamps'.\n" - "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" - "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" - "Use the mouse scroll wheel to change the tool size for particles.\n" - "'Q' will quit the application.\n" - "The spacebar can be used to pause physics.\n" - "'P' will take a screenshot and save it into the current directory.\n" - "\n" - "\brhttp://powdertoy.co.uk/\n" - "\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" - "\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powdertoy.co.uk\bg, \bbirc.freenode.net #powder\bg)\n" - "\bgCopyright (c) 2010 Skresanov Savely (Stickman)\n" - "\bgCopyright (c) 2010 Bryan Hoyle (New elements)\n" - "\bgCopyright (c) 2010 Nathan Cousins (New elements, small engine mods.)\n" - "\n" - "\bgSpecial thanks to Brian Ledbetter for maintaining ports.\n" - "\bgTo use online features such as saving, you need to register at: \brhttp://powdertoy.co.uk/Register.html" - ; - -typedef struct -{ - int start, inc; - pixel *vid; -} upstruc; - -#ifdef BETA -char *old_ver_msg_beta = "A new beta is available - click here!"; -#endif -char *old_ver_msg = "A new version is available - click here!"; -float mheat = 0.0f; - -int do_open = 0; -int sys_pause = 0; -int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. -int death = 1, framerender = 0; -int amd = 1; - -unsigned char fire_r[YRES/CELL][XRES/CELL]; -unsigned char fire_g[YRES/CELL][XRES/CELL]; -unsigned char fire_b[YRES/CELL][XRES/CELL]; - -#define MAXSIGNS 16 - -struct sign -{ - int x,y,ju; - char text[256]; -} signs[MAXSIGNS]; - -/*********************************************************** - * AIR FLOW SIMULATOR * - ***********************************************************/ - -unsigned char bmap[YRES/CELL][XRES/CELL]; -unsigned char emap[YRES/CELL][XRES/CELL]; - -unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -unsigned char cb_emap[YRES/CELL][XRES/CELL]; - -int numCores = 4; -float kernel[9]; -void make_kernel(void) -{ - int i, j; - float s = 0.0f; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - { - kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); - s += kernel[(i+1)+3*(j+1)]; - } - s = 1.0f / s; - for(j=-1; j<2; j++) - for(i=-1; i<2; i++) - kernel[(i+1)+3*(j+1)] *= s; -} - -int core_count() -{ - int numCPU = 1; -#ifdef MT -#ifdef WIN32 - SYSTEM_INFO sysinfo; - GetSystemInfo( &sysinfo ); - numCPU = sysinfo.dwNumberOfProcessors; -#else -#ifdef MACOSX - numCPU = 4; -#else - numCPU = sysconf( _SC_NPROCESSORS_ONLN ); -#endif -#endif - - printf("Cpus: %d\n", numCPU); - if(numCPU>1) - printf("Multithreading enabled\n"); - else - printf("Multithreading disabled\n"); -#endif - return numCPU; -} - -void update_air(void) -{ - int x, y, i, j; - float dp, dx, dy, f, tx, ty; - - for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; - if(dp < -256.0f) dp = -256.0f; - if(dx > 256.0f) dx = 256.0f; - if(dx < -256.0f) dx = -256.0f; - if(dy > 256.0f) dy = 256.0f; - if(dy < -256.0f) dy = -256.0f; - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); -} - -void *update_air_th(void *arg) -{ - update_air(); - return NULL; -} - -/*********************************************************** - * PARTICLE SIMULATOR * - ***********************************************************/ -particle *parts; -particle *cb_parts; - -float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index -int isplayer = 0; //It shows is player spawned or not -int mousex, mousey = 0; //They contain mouse position - -void menu_count(void) -{ - int i=0; - msections[SC_WALL].itemcount = UI_WALLCOUNT-4; - msections[SC_SPECIAL].itemcount = 4; - for(i=0; i=XRES || ny>=YRES) - return 0; - if(x==nx && y==ny) - return 1; - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; - - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) - { - return 1; - } - - if((r&0xFF)==PT_VOID) - { - parts[i].type=PT_NONE; - return 0; - } - if((r&0xFF)==PT_BHOL) - { - parts[i].type=PT_NONE; - if(!legacy_enable) - { - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; - } - return 0; - } - - if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide - { - return 1; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - { - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) - { - return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - { - return 0; - } - - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - - if(parts[i].type==PT_CNCT && y>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; - } - - return 1; -} - -void kill_part(int i) -{ - int x, y; - parts[i].type = PT_NONE; - - x = (int)(parts[i].x+0.5f); - y = (int)(parts[i].y+0.5f); - - if(x>=0 && y>=0 && x=XRES || y>=YRES) - return -1; - - if(t==SPC_HEAT||t==SPC_COOL) - { - if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); - } - if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) - { - parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); - } - return pmap[y][x]>>8; - } - else - { - return -1; - } - } - if(t==SPC_AIR) - { - pv[y/CELL][x/CELL] += 0.03f; - if(y+CELL>8].type = PT_SPRK; - parts[pmap[y][x]>>8].life = 4; - parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; - pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; - return pmap[y][x]>>8; - } - - if(p==-1) - { - if(pmap[y][x]) - return -1; - if(pfree == -1) - return -1; - i = pfree; - pfree = parts[i].life; - } - else - i = p; - - if(t==PT_GLAS) - { - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - } - if(t!=PT_STKM) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - } - if(t==PT_ACID) - { - parts[i].life = 75; - } - /*Testing - if(t==PT_WOOD){ - parts[i].life = 150; - } - End Testing*/ - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_PLSM) - parts[i].life = rand()%150+50; - if(t==PT_LAVA) - parts[i].life = rand()%120+240; - if(t==PT_NBLE) - parts[i].life = 0; - if(t==PT_NEUT) - { - float r = (rand()%128+128)/127.0f; - float a = (rand()%360)*3.14159f/180.0f; - parts[i].life = rand()%480+480; - parts[i].vx = r*cosf(a); - parts[i].vy = r*sinf(a); - } - if(t==PT_PHOT) - { - float r = (rand()%3-1)*3; - float a = (rand()%3-1)*3; - parts[i].life = 680; - if(a==0.0f&&r==0.0f) - { - parts[i].life = 0; - parts[i].type = PT_NONE; - return -1; - } - else - { - parts[i].vx = a; - parts[i].vy = r; - } - //} else { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - //}/ - } - - if(t!=PT_STKM) - pmap[y][x] = t|(i<<8); - else - { - if(isplayer==0) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = PT_STKM; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 100; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - - - - player[3] = x-1; //Setting legs positions - player[4] = y+6; - player[5] = x-1; - player[6] = y+6; - - player[7] = x-3; - player[8] = y+12; - player[9] = x-3; - player[10] = y+12; - - player[11] = x+1; - player[12] = y+6; - player[13] = x+1; - player[14] = y+6; - - player[15] = x+3; - player[16] = y+12; - player[17] = x+3; - player[18] = y+12; - - isplayer = 1; - } - } - - return i; -} - -#ifdef WIN32 -_inline void delete_part(int x, int y) -#else -inline void delete_part(int x, int y) -#endif -{ - unsigned i; - - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - i = pmap[y][x]; - if(!i || (i>>8)>=NPART) - return; - - kill_part(i>>8); - pmap[y][x] = 0; // just in case -} - -#ifdef WIN32 -_inline int is_wire(int x, int y) -#else -inline int is_wire(int x, int y) -#endif -{ - return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; -} - -#ifdef WIN32 -_inline int is_wire_off(int x, int y) -#else -inline int is_wire_off(int x, int y) -#endif -{ - return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; -} - -void set_emap(int x, int y) -{ - int x1, x2; - - if(!is_wire_off(x, y)) - return; - - // go left as far as possible - x1 = x2 = x; - while(x1>0) - { - if(!is_wire_off(x1-1, y)) - break; - x1--; - } - while(x21 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) - set_emap(x1, y-2); - else if(y>0) - for(x=x1; x<=x2; x++) - if(is_wire_off(x, y-1)) - { - if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) - set_emap(x, y-1); - } - - if(y>8) < NPART && (pmr>>8) >= 0) - { - return parts[pmr>>8].type; - } - else - { - return PT_NONE; - } -} -int nearest_part(int ci, int t) -{ - int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); - int ndistance = 0; - int id = -1; - int i = 0; - int cx = (int)parts[ci].x; - int cy = (int)parts[ci].y; - for(i=0; i=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) - { - kill_part(i); - continue; - } - - vx[y/CELL][x/CELL] *= ptypes[t].airloss; - vy[y/CELL][x/CELL] *= ptypes[t].airloss; - vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; - vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS||t==PT_NBLE) - { - if(pv[y/CELL][x/CELL]<3.5f) - pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); - if(y+CELL2.5f) - { - parts[i].life = rand()%80+180; - rt = parts[i].type = PT_FIRE; - parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - pv[y/CELL][x/CELL] += 0.25f * CFDS; - t = PT_FIRE; - } - - parts[i].vx *= ptypes[t].loss; - parts[i].vy *= ptypes[t].loss; - - if(t==PT_DFRM && !parts[i].life) - { - if(pv[y/CELL][x/CELL]>1.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - parts[i].life = rand()%80+300; - } - } - else - { - if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - } - - if(ptypes[t].diffusion) - { - parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - } - - // interpolator -#ifdef WIN32 - mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#else - mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#endif - if(mv < ISTP) - { - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - } - else - { - dx = parts[i].vx*ISTP/mv; - dy = parts[i].vy*ISTP/mv; - ix = parts[i].x; - iy = parts[i].y; - while(1) - { - mv -= ISTP; - if(mv <= 0.0f) - { - // nothing found - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - break; - } - ix += dx; - iy += dy; - nx = (int)(ix+0.5f); - ny = (int)(iy+0.5f); - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) - { - parts[i].x = ix; - parts[i].y = iy; - break; - } - } - } - - a = nt = 0; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx4.0f) - t = parts[i].type = PT_DSTW; - if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) - t = parts[i].type = PT_GASS; - if(t==PT_GASS && pv[y/CELL][x/CELL]>6.0f) - t = parts[i].type = PT_DESL; - if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) - t = parts[i].type = PT_FIRE; - } - if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) - t = parts[i].type = PT_GASS; - if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it - t = parts[i].type = PT_FIRE; // combust under pressure. - if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) - t = parts[i].type = PT_DESL; - if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - // t = parts[i].type = PT_BGLA; - if(t==PT_GLAS) - { - parts[i].pavg[0] = parts[i].pavg[1]; - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) - { - parts[i].type = PT_BGLA; - } - } - if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) - t = parts[i].type = PT_SNOW; - if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) - { - t = PT_NEUT; - create_part(i, x, y, t); - } - - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) - { - nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1) - { - create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[nearp].type = PT_SPRK; - parts[nearp].life = 9; - parts[nearp].ctype = PT_ETRD; - } - } - - if(!legacy_enable) - { - int ctemp = pv[y/CELL][x/CELL]*2; - c_heat = 0.0f; - h_count = 0; - if(ptypes[t].hconduct>(rand()%250)) - { - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - h_count++; - c_heat += parts[r>>8].temp; - } - } - } - } - pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - parts[r>>8].temp = parts[i].temp; - } - } - } - } - if(pt>=pstates[t].btemp&&pstates[t].burn) - { - t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE||t==PT_PLSM) - parts[i].life = rand()%50+120; - } - else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) - { - if(t==PT_LAVA&&parts[i].ctype) - { - parts[i].life = 0; - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) - { - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } - else - { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } - else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) - { - if(pstates[t].liquid==PT_LAVA) - { - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } - else if(t==PT_ICEI&&parts[i].ctype) - { - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else - { - t = parts[i].type = pstates[t].liquid; - } - } - else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) - { - t = parts[i].type = pstates[t].liquid; - } - else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) - { - if(t==PT_SLTW&&1>rand()%6) - { - t = parts[i].type = PT_SALT; - } - else - { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - } - } - if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) - { - float atemp = parts[i].temp + (-MIN_TEMP); - pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; - } - if(t==PT_LAVA) - { - parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - } - pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); - } - } - if(t==PT_PTCT&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - if(t==PT_NTCT&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) - { - nx = x % CELL; - if(nx == 0) - nx = x/CELL - 1; - else if(nx == CELL-1) - nx = x/CELL + 1; - else - nx = x/CELL; - ny = y % CELL; - if(ny == 0) - ny = y/CELL - 1; - else if(ny == CELL-1) - ny = y/CELL + 1; - else - ny = y/CELL; - if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) - { - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - } - else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) - { - pv[y/CELL][x/CELL] += 100.0f; - if(legacy_enable&&1>(rand()%200)) - { - parts[i].life = rand()%50+120; - t = parts[i].type = PT_FIRE; - } - else - { - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_ICEI || t==PT_SNOW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if(legacy_enable) - { - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; - } - } - } - else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL) - { - parts[i].temp = 200.0f; - } - } - } - //PLANT - else if(t==PT_PLNT) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR && 1>(rand()%250)) - { - t = parts[i].type = PT_PLNT; - parts[r>>8].type = PT_PLNT; - } - else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WATR||t==PT_DSTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%250)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_WATR; - } - if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_SLTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) - { - parts[r>>8].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_WTRV) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - parts[r>>8].type = PT_WATR; - } - - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } - } - } - else if(t==PT_YEST) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_DYST && 1>(rand()%30) && !legacy_enable) - { - t = parts[i].type = PT_DYST; - } - } - } - else if(t==PT_ACID) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)!=PT_ACID) - { - if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) - { - t = parts[i].type = PT_FIRE; - parts[i].life = 4; - parts[r>>8].type = PT_FIRE; - parts[r>>8].life = 4; - } - else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) - { - parts[i].life--; - parts[r>>8].type = PT_NONE; - } - else if (parts[i].life==50) - { - parts[i].life = 0; - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_NEUT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) - { - if(33>rand()%100) - { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); - } - else - { - create_part(r>>8, x+nx, y+ny, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - fe ++; - } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) - parts[r>>8].type = PT_DUST; - if((r&0xFF)==PT_DYST && 15>(rand()%1000)) - parts[r>>8].type = PT_YEST; - if((r&0xFF)==PT_YEST){ - if(15>(rand()%100000)&&isplayer==0) - parts[r>>8].type = PT_STKM; - else - parts[r>>8].type = PT_DYST; - } - - if((r&0xFF)==PT_WATR && 15>(rand()%100)) - parts[r>>8].type = PT_DSTW; - if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_DFRM; - if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_DESL; - if((r&0xFF)==PT_OILL && 5>(rand()%1000)) - parts[r>>8].type = PT_PLAS; - if((r&0xFF)==PT_PLNT && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) - parts[r>>8].type = PT_OILL; - if((r&0xFF)==PT_DESL && 15>(rand()%1000)) - parts[r>>8].type = PT_GASS; - if((r&0xFF)==PT_COAL && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - } - } - else if(t==PT_PHOT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=0; nx<1; nx++) - for(ny=0; ny<1; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - } - } - else if(t==PT_LCRY) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_LCRY) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_BTRY) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts_avg(i,r>>8) != PT_INSL) - { - if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) - { - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - parts[r>>8].type = PT_SPRK; - } - } - } - }else if(t==PT_SWCH) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) - continue; - rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) - { - parts[r>>8].type = PT_FIRE; - parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - parts[r>>8].life = rand()%80+180; - if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; - continue; - } - lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; - if(lpv < 1) lpv = 1; - if(legacy_enable) - { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && - ptypes[rt].meltable*lpv>(rand()%1000)) - { - if(t!=PT_LAVA || parts[i].life>0) - { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } - else - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) - { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = PT_STNE; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) - { - kill_part(r>>8); - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; - parts[i].ctype = PT_NONE; - goto killed; - } - } - } - pavg = parts_avg(i, r>>8); - if(rt==PT_SWCH && t==PT_SPRK) - { - pavg = parts_avg(r>>8, i); - if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) - parts[r>>8].life = 10; - if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) - parts[r>>8].life = 9; - if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].ctype = PT_SWCH; - parts[r>>8].life = 4; - } - } - pavg = parts_avg(i, r>>8); - if(pavg != PT_INSL) - { - if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; - } - } - if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 6; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) - { - if(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) - { - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) - { - parts[i].life = rand()%150+50; - parts[i].type = PT_PLSM; - parts[i].ctype = PT_NBLE; - parts[i].temp = 3500; - pv[y/CELL][x/CELL] += 1; - } - if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) - { - parts[i].type = PT_SWCH; - parts[i].life = 11; - } - } - } -killed: - if(parts[i].type == PT_NONE) - continue; - } - if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; - - //Death - if(parts[i].life<0 && (death == 1)) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } - - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; - - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; - - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; - - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; - - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } - - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } - - } - } - - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } - - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } - - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); - - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) - { - int random = abs(rand()%3-1)*3; - if (random==0) - { - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - } - else - { - parts[r>>8].vy = 0; - parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; - } - } - - } - } - } - - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } - - } - - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; - - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; - - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; - - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; - - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; - - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } - - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } - - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } - - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } - - } - - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } - - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } - - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - isplayer = 1; - } - if(t==PT_CLNE) - { - if(!parts[i].ctype) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx30&&parts[i].temp<44){ - create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); - } - } - if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) - { - parts[i].type = PT_NBLE; - parts[i].life = 0; - } - if (t==PT_FIRE && parts[i].life <=1) - { - t = parts[i].type = PT_SMKE; - parts[i].life = rand()%20+250; - } - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - continue; - } - - rt = parts[i].flags & FLAG_STAGNANT; - parts[i].flags &= ~FLAG_STAGNANT; - if(!try_move(i, x, y, nx, ny)) - { - parts[i].x = lx; - parts[i].y = ly; - if(ptypes[t].falldown) - { - if(nx!=x && try_move(i, x, y, nx, y)) - { - parts[i].x = ix; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x, ny)) - { - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else - { - r = (rand()%2)*2-1; - if(ny!=y && try_move(i, x, y, x+r, ny)) - { - parts[i].x += r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x-r, ny)) - { - parts[i].x -= r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y+r)) - { - parts[i].x = ix; - parts[i].y += r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y-r)) - { - parts[i].x = ix; - parts[i].y -= r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) - { - s = 0; - if(!rt || nt) - rt = 50; - else - rt = 10; - for(j=x+r; j>=0 && j>=x-rt && j0) - r = 1; - else - r = -1; - if(s) - for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) - { - kill_part(i); - continue; - } - else if(try_move(i, x, y, 2*x-nx, ny)) - { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } - else if(try_move(i, x, y, nx, 2*y-ny)) - { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } - else - { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } - } - -justdraw: - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) - { - kill_part(i); - continue; - } - if(cmode!=CM_HEAT) - { - if(t==PT_STKM) //Just draw head here - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; - vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; - vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; - vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; - } - draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); - draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); - draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); - draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); - - isplayer = 1; //It's a secret. Tssss... - } - if(t==PT_MWAX&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,224,170,255); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,224,170,20); - else - blendpixel(vid,x+nx,y+ny,224,224,170,40); - } - } - - } - else if(t==PT_ACID) - { - if(parts[i].life>255) parts[i].life = 255; - if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28)); - if(s==0) s = 1; - cr = PIXR(ptypes[t].pcolors)/s; - cg = PIXG(ptypes[t].pcolors)/s; - cb = PIXB(ptypes[t].pcolors)/s; - if(cmode==6){ - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); - } - } - } else { - blendpixel(vid, nx, ny, cr, cg, cb, 255); - } - - if(cmode==4) - { - blendpixel(vid, nx+1, ny, cr, cg, cb, 223); - blendpixel(vid, nx-1, ny, cr, cg, cb, 223); - blendpixel(vid, nx, ny+1, cr, cg, cb, 223); - blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); - } - } - else if(t==PT_OILL&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,64,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,64,16,40); - } - } - } - else if(t==PT_NEUT) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 8; - cb = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = 0x20; - cg = 0xE0; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLUT&&cmode == 6) - { - int tempx; - int tempy; - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(tempx = 2; tempx < 10; tempx++) { - for(tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_URAN&&cmode == 6) - { - int tempx; - int tempy; - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(tempx = 2; tempx < 10; tempx++) { - for(tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_SLTW&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,80,240,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,80,240,50); - } - } - } - else if(t==PT_PHOT) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_SWCH && parts[i].life == 10) - { - x = nx; - y = ny; - blendpixel(vid,x,y,17,217,24,255); - } - else if(t==PT_LNTG&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,128,160,223,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,128,160,223,50); - } - } - } - else if(t==PT_SMKE) - { - if(cmode == 3||cmode==4 || cmode==6) - { - x = nx/CELL; - y = ny/CELL; - cg = 10; - cb = 10; - cr = 10; - cg += fire_g[y][x]; - if(cg > 50) cg = 50; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 50) cb = 50; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 50) cr = 50; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny,100,100,100,30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,100,100,100,10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,100,100,100,20); - } - } - } - } - else if(t==PT_WATR&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - - } else if(t==PT_DSTW&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - } - else if(t==PT_NITR&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,224,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,224,16,50); - } - } - - } - else if(t==PT_LRBD&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,170,170,170,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,170,170,170,50); - } - } - - } - - else if(t==PT_NBLE&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,235,73,23,100); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,235,73,23,30); - else - blendpixel(vid,x+nx,y+ny,235,73,23,50); - } - } - - } - else if(t==PT_GASS&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,255,255,0,180); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,255,255,0,50); - else - blendpixel(vid,x+nx,y+ny,255,255,0,80); - } - } - - } - else if(t==PT_WTRV) - { - if(cmode == 3||cmode==4 || cmode==6) - { - x = nx/CELL; - y = ny/CELL; - cg = PIXG(ptypes[t].pcolors)/3; - cb = PIXB(ptypes[t].pcolors)/3; - cr = PIXR(ptypes[t].pcolors)/3; - cg += fire_g[y][x]; - if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); - } - } - } - } - else if(t==PT_THDR) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 16; - cb = 20; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xA0; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LCRY) - { - if(cmode == 3||cmode==4 || cmode==6) - { - //cr = R/8; - //cg = G/8; - //cb = B/8; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); - //x = nx/CELL; - //y = ny/CELL; - //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } - else - { - cr = 0x50+(parts[i].life*10); - cg = 0x50+(parts[i].life*10); - cb = 0x50+(parts[i].life*10); - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLSM) - { - float ttemp = parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = plasma_data[caddress]; - uint8 G = plasma_data[caddress+1]; - uint8 B = plasma_data[caddress+2]; - if(cmode == 3||cmode==4 || cmode==6) - { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_FIRE && parts[i].life) - { - if(cmode == 3||cmode==4 || cmode==6) - { - cr = parts[i].life / 4; - cg = parts[i].life / 16; - cb = parts[i].life / 32; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = parts[i].life * 8; - cg = parts[i].life * 2; - cb = parts[i].life; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LAVA && parts[i].life) - { - cr = parts[i].life * 2 + 0xE0; - cg = parts[i].life * 1 + 0x50; - cb = parts[i].life/2 + 0x10; - if(cr>255) cr = 255; - if(cg>192) cg = 192; - if(cb>128) cb = 128; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 64); - blendpixel(vid, nx-1, ny, cr, cg, cb, 64); - blendpixel(vid, nx, ny+1, cr, cg, cb, 64); - blendpixel(vid, nx, ny-1, cr, cg, cb, 64); - if(cmode == 3||cmode==4 || cmode==6) - { - cr /= 32; - cg /= 32; - cb /= 32; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else if(t==PT_LAVA || t==PT_SPRK) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - if(cmode == 3 || cmode==4 || cmode==6) - { - if(t == PT_LAVA) - { - cr = 3; - cg = i%2; - cb = 0; - } - else - { - cr = 8; - cg = 12; - cb = 16; - } - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - } - else - { - float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); - uint8 R = color_data[caddress]; - uint8 G = color_data[caddress+1]; - uint8 B = color_data[caddress+2]; - - if(t==PT_STKM) //Stick man should be visible in heat mode - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); - vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); - vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); - vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); - } - draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); - draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); - draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); - draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); - } - else - { - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); - } - } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) - { - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); - - //if(vid[(ny-1)*YRES+(nx-1)]!=0){ - // blendpixel(vid, nx, ny-1, R, G, B, 46); - //} - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - } - if(framerender){ - framerender = 0; - sys_pause = 1; - } -} - -void update_particles_i_th(void *arg) -{ - upstruc *newup = (upstruc*)arg; - update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); - return; -} - -void update_particles(pixel *vid) -{ - int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; - float lx, ly; -#ifdef MT - int pt = 0, pc = 0; - pthread_t *InterThreads; -#endif - - isplayer = 0; //Needed for player spawning - memset(pmap, 0, sizeof(pmap)); - r = rand()%2; - for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==13) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && (!sys_pause||framerender)) - emap[y][x] --; - } - } - } - else - { - for(y=0; y>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==9) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && (!sys_pause||framerender)) - emap[y][x] --; - } - } - } - -#ifdef MT - if(numCores > 1) - { - InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); - for(pc = 0; pc=XRES || ny<0 || ny>=YRES) - break; - addpixel(vid, nx, ny, 255, 255, 255, 64); - i = nx/CELL; - j = ny/CELL; - lx += vx[j][i]*0.125f; - ly += vy[j][i]*0.125f; - if(bmap[j][i]==5 && i!=x && j!=y) - break; - } - drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); - } - -} - -void update_particles_th(void *arg) -{ - update_particles((pixel*)arg); - return; -} - -/*********************************************************** - * SDL OUTPUT * - ***********************************************************/ - -SDLMod sdl_mod; -int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; - -#include "icon.h" -void sdl_seticon(void) -{ -#ifdef WIN32 - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else -#ifdef MACOSX - //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else - SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#endif -#endif -} - -void sdl_open(void) -{ - if(SDL_Init(SDL_INIT_VIDEO)<0) - { - fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); - exit(1); - } - atexit(SDL_Quit); -#ifdef PIX16 - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); -#else - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); -#endif - if(!sdl_scrn) - { - fprintf(stderr, "Creating window: %s\n", SDL_GetError()); - exit(1); - } - SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); - sdl_seticon(); - SDL_EnableUNICODE(1); - //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); -} - -int frame_idx=0; -void dump_frame(pixel *src, int w, int h, int pitch) -{ - char frame_name[32]; - int j,i; - unsigned char c[3]; - FILE *f; - sprintf(frame_name,"frame%04d.ppm",frame_idx); - f=fopen(frame_name,"wb"); - fprintf(f,"P6\n%d %d\n255\n",w,h); - for(j=0; j=0 && x=0 && yPT_NUM) - return 2; - if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) - return 3; - i = XRES*YRES; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) - return 1; - size = i; - } - else - d = c; - - if(size < XRES*YRES) - { - if(bzip2) - free(d); - return 1; - } - - sy = 0; - for(y=0; y+scl<=YRES; y+=scl) - { - sx = 0; - for(x=0; x+scl<=XRES; x+=scl) - { - a = 0; - r = g = b = 0; - for(j=0; j=PT_NUM) - goto corrupt; - r += PIXR(ptypes[t].pcolors); - g += PIXG(ptypes[t].pcolors); - b += PIXB(ptypes[t].pcolors); - a ++; - } - } - if(a) - { - a = 256/a; - r = (r*a)>>8; - g = (g*a)>>8; - b = (b*a)>>8; - } - - drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); - sx++; - } - sy++; - } - - if(bzip2) - free(d); - return 0; - -corrupt: - if(bzip2) - free(d); - return 1; -} - -static char *mystrdup(char *s) -{ - char *x; - if(s) - { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; - } - return s; -} - -void *build_save(int *size, int x0, int y0, int w, int h) -{ - unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; - int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); - int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - // save the required air state - for(y=by0; y255) i=255; - d[p++] = i; - } - for(y=by0; y255) i=255; - d[p++] = i; - } - - // save the particle map - for(i=0; i=x0 && x=y0 && y255) x=255; - if(y<0) y=0; - if(y>255) y=255; - d[p++] = x; - d[p++] = y; - } - } - for(j=0; j255) tttemp=255; - d[p++] = tttemp; - } - } - for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; - d[p++] = (signs[i].y-y0); - d[p++] = (signs[i].y-y0)>>8; - d[p++] = signs[i].ju; - x = strlen(signs[i].text); - d[p++] = x; - memcpy(d+p, signs[i].text, x); - p+=x; - } - - i = (p*101+99)/100 + 612; - c = malloc(i); - c[0] = 0x66; - c[1] = 0x75; - c[2] = 0x43; - c[3] = legacy_enable; - c[4] = SAVE_VERSION; - c[5] = CELL; - c[6] = bw; - c[7] = bh; - c[8] = p; - c[9] = p >> 8; - c[10] = p >> 16; - c[11] = p >> 24; - - i -= 12; - - if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) - { - free(d); - free(c); - return NULL; - } - free(d); - - *size = i+12; - return c; -} - -int parse_save(void *save, int size, int replace, int x0, int y0) -{ - unsigned char *d,*c=save; - int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; - int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; - int fp[NPART], nf=0; - - if(size<16) - return 1; - if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) - return 1; - if(c[4]>SAVE_VERSION) - return 2; - ver = c[4]; - - if(ver<34) - { - legacy_enable = 1; - } - else - { - if(c[3]==1||c[3]==0) - legacy_enable = c[3]; - else - legacy_beta = 1; - } - - bw = c[6]; - bh = c[7]; - if(bx0+bw > XRES/CELL) - bx0 = XRES/CELL - bw; - if(by0+bh > YRES/CELL) - by0 = YRES/CELL - bh; - if(bx0 < 0) - bx0 = 0; - if(by0 < 0) - by0 = 0; - - if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) - return 3; - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - return 1; - size = i; - - if(size < bw*bh) - return 1; - - // normalize coordinates - x0 = bx0*CELL; - y0 = by0*CELL; - w = bw *CELL; - h = bh *CELL; - - if(replace) - { - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(signs, 0, sizeof(signs)); - memset(parts, 0, sizeof(particle)*NPART); - memset(pmap, 0, sizeof(pmap)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(pv, 0, sizeof(pv)); - } - - // make a catalog of free parts - memset(pmap, 0, sizeof(pmap)); - for(i=0; i= size) - goto corrupt; - fvx[y][x] = (d[p++]-127.0f)/64.0f; - } - for(y=by0; y= size) - goto corrupt; - fvy[y][x] = (d[p++]-127.0f)/64.0f; - } - - // load the particle map - i = 0; - pty = p; - for(y=y0; y= size) - goto corrupt; - j=d[p++]; - if(j >= PT_NUM) - goto corrupt; - if(j && !(isplayer == 1 && j==PT_STKM)) - { - if(pmap[y][x]) - { - k = pmap[y][x]>>8; - parts[k].type = j; - parts[k].x = (float)x; - parts[k].y = (float)y; - m[(x-x0)+(y-y0)*w] = k+1; - } - else if(i < nf) - { - parts[fp[i]].type = j; - parts[fp[i]].x = (float)x; - parts[fp[i]].y = (float)y; - m[(x-x0)+(y-y0)*w] = fp[i]+1; - i++; - } - else - m[(x-x0)+(y-y0)*w] = NPART+1; - } - } - - // load particle properties - for(j=0; j= size) - goto corrupt; - if(i < NPART) - { - parts[i].vx = (d[p++]-127.0f)/16.0f; - parts[i].vy = (d[p++]-127.0f)/16.0f; - if(parts[i].type == PT_STKM) - { - player[2] = PT_DUST; - - player[3] = parts[i].x-1; //Setting legs positions - player[4] = parts[i].y+6; - player[5] = parts[i].x-1; - player[6] = parts[i].y+6; - - player[7] = parts[i].x-3; - player[8] = parts[i].y+12; - player[9] = parts[i].x-3; - player[10] = parts[i].y+12; - - player[11] = parts[i].x+1; - player[12] = parts[i].y+6; - player[13] = parts[i].x+1; - player[14] = parts[i].y+6; - - player[15] = parts[i].x+3; - player[16] = parts[i].y+12; - player[17] = parts[i].x+3; - player[18] = parts[i].y+12; - - } - } - else - p += 2; - } - } - for(j=0; j= size) - goto corrupt; - if(i <= NPART) - parts[i-1].life = d[p++]*4; - else - p++; - } - } - for(j=0; j=34&&legacy_beta==0) - { - if(p >= size) - { - goto corrupt; - } - if(i <= NPART) - { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } - else - { - p++; - } - } - else - { - parts[i-1].temp = ptypes[parts[i-1].type].heat; - } - } - } - for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) - { - if(p >= size) - goto corrupt; - if(i <= NPART) - parts[i-1].ctype = d[p++]; - else - p++; - } - } - - if(p >= size) - goto version1; - j = d[p++]; - for(i=0; i size) - goto corrupt; - for(k=0; k size) - goto corrupt; - if(kSAVE_VERSION) - return NULL; - - bw = c[6]; - bh = c[7]; - w = bw*CELL; - h = bh*CELL; - - if(c[5]!=CELL) - return NULL; - - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return NULL; - fb = calloc(w*h, PIXELSIZE); - if(!fb) - { - free(d); - return NULL; - } - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - goto corrupt; - size = i; - - if(size < bw*bh) - goto corrupt; - - k = 0; - for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) - goto corrupt; - - for(y=0; y= size) - goto corrupt; - j=d[p++]; - if(j0) - { - if(j==PT_STKM) //Stickman should be drawed another way - { - //Stickman drawing - for(k=-2; k<=1; k++) - { - fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); - fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); - fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); - fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); - } - draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); - draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); - draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); - draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); - } - else - fb[y*w+x] = ptypes[j].pcolors; - } - } - - free(d); - *width = w; - *height = h; - return fb; - -corrupt: - free(d); - free(fb); - return NULL; -} - -/* NO, I DON'T THINK SO - #include "fbi.h" - - pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) - { - unsigned char *tmp; - pixel *res; - int i; - - tmp = malloc(width*height*3); - if(!tmp) - return NULL; - res = malloc(width*height*PIXELSIZE); - if(!res) { - free(tmp); - return NULL; - } - - i = width*height*3; - if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { - free(res); - free(tmp); - return NULL; - } - - for(i=0; iXRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) - { - factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); - factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); - if(factor_y > factor_x) - factor_x = factor_y; - tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); - free(stamps[i].thumb); - stamps[i].thumb = tmp; - } - } - - free(data); -} - -int clipboard_ready = 0; -void *clipboard_data = 0; -int clipboard_length = 0; - -void stamp_save(int x, int y, int w, int h) -{ - FILE *f; - int n; - char fn[64], sn[16]; - void *s=build_save(&n, x, y, w, h); - -#ifdef WIN32 - _mkdir("stamps"); -#else - mkdir("stamps", 0755); -#endif - - stamp_gen_name(sn); - sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); - - f = fopen(fn, "wb"); - if(!f) - return; - fwrite(s, n, 1, f); - fclose(f); - - free(s); - - if(stamps[STAMP_MAX-1].thumb) - free(stamps[STAMP_MAX-1].thumb); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); - memset(stamps, 0, sizeof(struct stamp_info)); - if(stamp_count0) - { - memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); - memcpy(stamps, &tmp, sizeof(struct stamp_info)); - - stamp_update(); - } - - return data; -} - -void stamp_init(void) -{ - int i; - FILE *f; - - memset(stamps, 0, sizeof(stamps)); - - f=fopen("stamps" PATH_SEP "stamps.def", "rb"); - if(!f) - return; - for(i=0; i=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=20) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - if(b==1&&h!=-1) - { - *sl = h; - } - if(b==4&&h!=-1) - { - *sr = h; - } -} - -int create_parts(int x, int y, int r, int c) -{ - int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; - - if(c == 125) - { - i = x / CELL; - j = y / CELL; - for(v=-1; v<2; v++) - for(u=-1; u<2; u++) - if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) - { - if(cp) - create_parts(y, x, r, c); - else - create_parts(x, y, r, c); - } - e -= 1.0f; - } - } -} - -void create_box(int x1, int y1, int x2, int y2, int c) -{ - int i, j; - if(x1>x2) - { - i = x2; - x2 = x1; - x1 = i; - } - if(y1>y2) - { - j = y2; - y2 = y1; - y1 = j; - } - for(j=y1; j<=y2; j++) - for(i=x1; i<=x2; i++) - create_parts(i, j, 1, c); -} - -int flood_parts(int x, int y, int c, int cm, int bm) -{ - int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) - { - c = c-100; - } - if(cm==-1) - { - if(c==0) - { - cm = pmap[y][x]&0xFF; - if(!cm) - return 0; - } - else - cm = 0; - } - if(bm==-1) - { - if(c==30) - { - bm = bmap[y/CELL][x/CELL]; - if(!bm) - return 0; - if(bm==1) - cm = 0xFF; - } - else - bm = 0; - } - - if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) - return 1; - - // go left as far as possible - x1 = x2 = x; - while(x1>=CELL) - { - if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) - break; - x1--; - } - while(x2=CELL+dy) - for(x=x1; x<=x2; x++) - if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) - if(!flood_parts(x, y-dy, co, cm, bm)) - return 0; - if(yhide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(ed->str[0]) - { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); - } - else if(!ed->focus) - drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); - if(ed->focus) - { - cx = textnwidth(str, ed->cursor); - for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); - } -} - -char *shift_0="`1234567890-=[]\\;',./"; -char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; - -void ui_edit_process(int mx, int my, int mb, ui_edit *ed) -{ - char ch, ts[2], echo[256], *str; - int l, i; -#ifdef RAWINPUT - char *p; -#endif - - if(mb) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } - else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } - else - ed->focus = 0; - } - if(ed->focus && sdl_key) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - l = strlen(ed->str); - switch(sdl_key) - { - case SDLK_HOME: - ed->cursor = 0; - break; - case SDLK_END: - ed->cursor = l; - break; - case SDLK_LEFT: - if(ed->cursor > 0) - ed->cursor --; - break; - case SDLK_RIGHT: - if(ed->cursor < l) - ed->cursor ++; - break; - case SDLK_DELETE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - ed->str[ed->cursor] = 0; - else if(ed->cursor < l) - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - break; - case SDLK_BACKSPACE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - { - if(ed->cursor > 0) - memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); - ed->cursor = 0; - } - else if(ed->cursor > 0) - { - ed->cursor--; - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - } - break; - default: -#ifdef RAWINPUT - if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) - { - ch = sdl_key; - if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) - { - if(ch>='a' && ch<='z') - ch &= ~0x20; - p = strchr(shift_0, ch); - if(p) - ch = shift_1[p-shift_0]; - } - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#else - if(sdl_ascii>=' ' && sdl_ascii<127) - { - ch = sdl_ascii; - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#endif - break; - } - } -} - -typedef struct ui_checkbox -{ - int x, y; - int focus, checked; -} ui_checkbox; - -void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) -{ - int w = 12; - if(ed->checked) - { - drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); - } - if(ed->focus) - { - drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); - } - else - { - drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); - } -} - -void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) -{ - int w = 12; - - if(mb && !mbq) - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->checked = (ed->checked)?0:1; - } - } - else - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->focus = 1; - } - else - { - ed->focus = 0; - } - } -} - -void error_ui(pixel *vid_buf, int err, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - char *msg; - - msg = malloc(strlen(txt)+16); - if(err) - sprintf(msg, "%03d %s", err, txt); - else - sprintf(msg, "%s", txt); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - if(err) - drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); - else - drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - free(msg); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_ui(pixel *vid_buf, char *top, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); - drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_box(pixel *vid_buf, char *msg) -{ - int w = textwidth(msg)+16; - int x0=(XRES-w)/2,y0=(YRES-24)/2; - - clearrect(vid_buf, x0-2, y0-2, w+4, 28); - drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); -} - -int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - int ret = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); - drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); - drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); - drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) - { - ret = 1; - break; - } - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - { - ret = 1; - break; - } - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - return ret; -} - -int execute_tagop(pixel *vid_buf, char *op, char *tag) -{ - int status; - char *result; - - char *names[] = {"ID", "Tag", NULL}; - char *parts[2]; - - char *uri = malloc(strlen(SERVER)+strlen(op)+36); - sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); - - parts[0] = svf_id; - parts[1] = tag; - - result = http_multipart_post( - uri, - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - free(uri); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 1; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 1; - } - - if(result[2]) - { - strncpy(svf_tags, result+3, 255); - svf_id[15] = 0; - } - - if(result) - free(result); - - return 0; -} - -struct strlist -{ - char *str; - struct strlist *next; -}; - -void strlist_add(struct strlist **list, char *str) -{ - struct strlist *item = malloc(sizeof(struct strlist)); - item->str = mystrdup(str); - item->next = *list; - *list = item; -} - -int strlist_find(struct strlist **list, char *str) -{ - struct strlist *item; - for(item=*list; item; item=item->next) - if(!strcmp(item->str, str)) - return 1; - return 0; -} - -void strlist_free(struct strlist **list) -{ - struct strlist *item; - while(*list) - { - item = *list; - *list = (*list)->next; - free(item); - } -} - -void tag_list_ui(pixel *vid_buf) -{ - int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; - char *p,*q,s; - char *tag=NULL, *op=NULL; - ui_edit ed; - struct strlist *vote=NULL,*down=NULL; - - ed.x = x0+25; - ed.y = y0+221; - ed.w = 158; - ed.nx = 1; - ed.def = "[new tag]"; - ed.focus = 0; - ed.hide = 0; - ed.cursor = 0; - strcpy(ed.str, ""); - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - op = tag = NULL; - - drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 256); - drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); - p = svf_tags; - s = svf_tags[0] ? ' ' : 0; - y = 36 + y0; - while(s) - { - q = strchr(p, ' '); - if(!q) - q = p+strlen(p); - s = *q; - *q = 0; - if(svf_own || svf_admin || svf_mod) - { - drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); - d = 14; - if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) - { - if(!ed1.focus) - break; - ed1.focus = 0; - ed2.focus = 1; - } - if(sdl_key==SDLK_ESCAPE) - { - if(!ed1.focus && !ed2.focus) - return; - ed1.focus = 0; - ed2.focus = 0; - } - } - - strcpy(svf_user, ed1.str); - md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); - - res = http_multipart_post( - "http://" SERVER "/Login.api", - NULL, NULL, NULL, - svf_user, svf_pass, - &err, NULL); - if(err != 200) - { - error_ui(vid_buf, err, http_ret_text(err)); - if(res) - free(res); - goto fail; - } - if(res && !strncmp(res, "OK", 2)) - { - if(!strcmp(res, "OK ADMIN")) - { - svf_admin = 1; - svf_mod = 0; - } - else if(!strcmp(res, "OK MOD")) - { - svf_admin = 0; - svf_mod = 1; - } - else - { - svf_admin = 0; - svf_mod = 0; - } - free(res); - svf_login = 1; - return; - } - if(!res) - res = mystrdup("Unspecified Error"); - error_ui(vid_buf, 0, res); - free(res); - -fail: - strcpy(svf_user, ""); - strcpy(svf_pass, ""); - svf_login = 0; - svf_own = 0; - svf_admin = 0; - svf_mod = 0; -} - -void execute_delete(pixel *vid_buf, char *id) -{ - int status; - char *result; - - char *names[] = {"ID", NULL}; - char *parts[1]; - - parts[0] = id; - - result = http_multipart_post( - "http://" SERVER "/Delete.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result) - free(result); -} - -int execute_vote(pixel *vid_buf, char *id, char *action) -{ - int status; - char *result; - - char *names[] = {"ID", "Action", NULL}; - char *parts[2]; - - parts[0] = id; - parts[1] = action; - - result = http_multipart_post( - "http://" SERVER "/Vote.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 0; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 0; - } - - if(result) - free(result); - return 1; -} - -static char hex[] = "0123456789ABCDEF"; - -void strcaturl(char *dst, char *src) -{ - char *d; - unsigned char *s; - - for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) - { - if((*s>='0' && *s<='9') || - (*s>='a' && *s<='z') || - (*s>='A' && *s<='Z')) - *(d++) = *s; - else - { - *(d++) = '%'; - *(d++) = hex[*s>>4]; - *(d++) = hex[*s&15]; - } - } - *d = 0; -} - -#define THUMB_CACHE_SIZE 256 - -char *thumb_cache_id[THUMB_CACHE_SIZE]; -void *thumb_cache_data[THUMB_CACHE_SIZE]; -int thumb_cache_size[THUMB_CACHE_SIZE]; -int thumb_cache_lru[THUMB_CACHE_SIZE]; - -void thumb_cache_inval(char *id) -{ - int i,j; - for(i=0; i= THUMB_CACHE_SIZE) - return; - free(thumb_cache_id[i]); - free(thumb_cache_data[i]); - thumb_cache_id[i] = NULL; - for(j=0; j thumb_cache_lru[i]) - thumb_cache_lru[j]--; -} -void thumb_cache_add(char *id, void *thumb, int size) -{ - int i,m=-1,j=-1; - thumb_cache_inval(id); - for(i=0; i m) - { - m = thumb_cache_lru[i]; - j = i; - } - } - if(i >= THUMB_CACHE_SIZE) - { - thumb_cache_inval(thumb_cache_id[j]); - i = j; - } - for(j=0; j= THUMB_CACHE_SIZE) - return 0; - for(j=0; j=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+5); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - else if(!strncmp(str, "TAG ", 4)) - { - if(j >= TAG_MAX) - { - str = p; - continue; - } - q = strchr(str+4, ' '); - if(!q) - { - str = p; - continue; - } - *(q++) = 0; - tag_names[j] = mystrdup(str+4); - tag_votes[j] = atoi(q); - j++; - } - else - { - if(i>=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - str = p; - } - if(*str) - i++; - return i; -} - -#define IMGCONNS 3 -#define TIMEOUT 100 -#define HTTP_TIMEOUT 10 - -int search_own = 0; -int search_date = 0; -int search_page = 0; -char search_expr[256] = ""; - -int search_ui(pixel *vid_buf) -{ - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; - int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; - int thumb_drawn[GRID_X*GRID_Y]; - pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - float ry; - time_t http_last_use=HTTP_TIMEOUT; - ui_edit ed; - - - void *http = NULL; - int active = 0; - char *last = NULL; - int search = 0; - int lasttime = TIMEOUT; - char *uri; - int status; - char *results; - char *tmp, ts[64]; - - void *img_http[IMGCONNS]; - char *img_id[IMGCONNS]; - void *thumb, *data; - int thlen, dlen; - - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - - memset(img_http, 0, sizeof(img_http)); - memset(img_id, 0, sizeof(img_id)); - - memset(search_ids, 0, sizeof(search_ids)); - memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); - memset(search_publish, 0, sizeof(search_publish)); - memset(search_owners, 0, sizeof(search_owners)); - memset(search_thumbs, 0, sizeof(search_thumbs)); - memset(search_thsizes, 0, sizeof(search_thsizes)); - - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - - do_open = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = 65; - ed.y = 13; - ed.w = XRES-200; - ed.nx = 1; - ed.def = "[search terms]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(search_expr); - strcpy(ed.str, search_expr); - - sdl_wheel = 0; - - while(!sdl_poll()) - { - uih = 0; - bq = b; - mxq = mx; - myq = my; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - if(mx!=mxq || my!=myq || sdl_wheel || b) - mmt = 0; - else if(mmt 9) - { - drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); - drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); - } - - ui_edit_draw(vid_buf, &ed); - - if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) - { - if(search_page) - { - search_page --; - lasttime = TIMEOUT; - } - sdl_wheel = 0; - uih = 1; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) - { - lasttime = TIMEOUT; - search_page ++; - page_count = exp_res; - } - sdl_wheel = 0; - uih = 1; - } - - tp = -1; - if(is_p1) - { - drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); - for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) - for(gi=0; giTAG_MAX || !tag_names[pos]) - break; - if(tag_votes[0]) - i = 127+(128*tag_votes[pos])/tag_votes[0]; - else - i = 192; - w = textwidth(tag_names[pos]); - if(w>XRES/GRID_X-5) - w = XRES/GRID_X-5; - gx = (XRES/GRID_X)*gi; - gy = gj*14 + 46; - if(mx>=gx && mx=gy && my XRES/GRID_X-10) - { - tmp = malloc(strlen(search_names[pos])+4); - strcpy(tmp, search_names[pos]); - j = textwidthx(tmp, XRES/GRID_X-15); - strcpy(tmp+j, "..."); - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); - free(tmp); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); - j = textwidth(search_owners[pos]); - if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && - my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) - { - st = 1; - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); - if(search_thumbs[pos]&&thumb_drawn[pos]==0) - { - render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); - thumb_drawn[pos] = 1; - } - own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); - if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) - mp = pos; - if(own) - { - if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) - { - mp = -1; - dp = pos; - } - } - if(mp==pos && !st) - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); - else - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); - if(own) - { - if(dp == pos) - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); - else - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); - } - if(!search_publish[pos]) - { - drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); - drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(view_own || svf_admin || svf_mod) - { - sprintf(ts+1, "%d", search_votes[pos]); - ts[0] = 0xBB; - for(j=1; ts[j]; j++) - ts[j] = 0xBC; - ts[j-1] = 0xB9; - ts[j] = 0xBA; - ts[j+1] = 0; - w = gx+XRES/GRID_S-2-textwidth(ts); - h = gy+YRES/GRID_S-11; - drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); - for(j=0; ts[j]; j++) - ts[j] -= 14; - drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); - sprintf(ts, "%d", search_votes[pos]); - for(j=0; ts[j]; j++) - ts[j] += 127; - drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); - } - if(search_scoreup[pos]>0||search_scoredown[pos]>0) - { - lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); - - if(((YRES/GRID_S+3)/2)>lv) - { - ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); - if(lv<8) - { - ry = ry/(8-lv); - } - nyu = search_scoreup[pos]*ry; - nyd = search_scoredown[pos]*ry; - } - else - { - ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); - nyu = search_scoreup[pos]/ry; - nyd = search_scoredown[pos]/ry; - } - - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); - - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); - } - } - - if(mp!=-1 && mmt>=TIMEOUT/5 && !st) - { - gi = mp % GRID_X; - gj = mp / GRID_X; - if(is_p1) - gj += GRID_Y-GRID_P; - gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; - gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; - i = w = textwidth(search_names[mp]); - h = YRES/GRID_Z+30; - if(w=XRES-2) gx=XRES-3-w; - if(gy<32) gy=32; - if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; - clearrect(vid_buf, gx-2, gy-3, w+4, h); - drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); - if(search_thumbs[mp]) - render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); - drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); - drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(sdl_key==SDLK_RETURN) - { - if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) - lasttime = TIMEOUT; - else if(search_ids[0] && !search_ids[1]) - { - bq = 0; - b = 1; - mp = 0; - } - } - if(sdl_key==SDLK_ESCAPE) - goto finish; - - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) - { - search_own = !search_own; - lasttime = TIMEOUT; - } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) - { - search_date = !search_date; - lasttime = TIMEOUT; - } - - if(b && !bq && dp!=-1) - if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) - { - execute_delete(vid_buf, search_ids[dp]); - lasttime = TIMEOUT; - if(last) - { - free(last); - last = NULL; - } - } - - if(b && !bq && tp!=-1) - { - strncpy(ed.str, tag_names[tp], 255); - lasttime = TIMEOUT; - } - - if(b && !bq && mp!=-1 && st) - { - sprintf(ed.str, "user:%s", search_owners[mp]); - lasttime = TIMEOUT; - } - - if(do_open==1) - { - mp = 0; - } - - if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) - { - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); - - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - data = http_simple_get(uri, &status, &dlen); - free(uri); - - if(status == 200) - { - status = parse_save(data, dlen, 1, 0, 0); - switch(status) - { - case 1: - error_ui(vid_buf, 0, "Simulation corrupted"); - break; - case 2: - error_ui(vid_buf, 0, "Simulation from a newer version"); - break; - case 3: - error_ui(vid_buf, 0, "Simulation on a too large grid"); - break; - } - if(!status) - { - char *tnames[] = {"ID", NULL}; - char *tparts[1]; - int tplens[1]; - if(svf_last) - free(svf_last); - svf_last = data; - svf_lsize = dlen; - - tparts[0] = search_ids[mp]; - tplens[0] = strlen(search_ids[mp]); - data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); - - svf_open = 1; - svf_own = svf_login && !strcmp(search_owners[mp], svf_user); - svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); - - strcpy(svf_id, search_ids[mp]); - strcpy(svf_name, search_names[mp]); - if(status == 200) - { - if(data) - { - strncpy(svf_tags, data, 255); - svf_tags[255] = 0; - } - else - svf_tags[0] = 0; - } - else - { - svf_tags[0] = 0; - } - - if(svf_login) - { - char *names[] = {"ID", NULL}; - char *parts[1]; - parts[0] = search_ids[mp]; - data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); - if(status == 200) - { - if(data) - { - if(!strcmp(data, "Up")) - { - svf_myvote = 1; - } - else if(!strcmp(data, "Down")) - { - svf_myvote = -1; - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - } - else - { - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - } - } - else - error_ui(vid_buf, status, http_ret_text(status)); - - if(data) - free(data); - goto finish; - } - - if(!last) - { - search = 1; - } - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) - { - search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) - { - search_page = 0; - page_count = 0; - } - free(last); - last = NULL; - } - else - search = 0; - - if(search && lasttime>=TIMEOUT) - { - lasttime = 0; - last = mystrdup(ed.str); - last_own = search_own; - last_date = search_date; - last_page = search_page; - active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); - if(search_own || svf_admin || svf_mod) - tmp = "&ShowVotes=true"; - else - tmp = ""; - if(!search_own && !search_date && !*last) - { - if(search_page) - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); - } - else - { - exp_res = GRID_X*GRID_P; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); - } - } - else - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); - } - strcaturl(uri, last); - if(search_own) - { - strcaturl(uri, " user:"); - strcaturl(uri, svf_user); - } - if(search_date) - strcaturl(uri, " sort:date"); - - http = http_async_req_start(http, uri, NULL, 0, 1); - if(svf_login) - { - http_auth_headers(http, svf_user, svf_pass); - } - http_last_use = time(NULL); - free(uri); - } - - if(active && http_async_req_status(http)) - { - http_last_use = time(NULL); - results = http_async_req_stop(http, &status, NULL); - view_own = last_own; - if(status == 200) - { - page_count = search_results(results, last_own||svf_admin||svf_mod); - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - } - is_p1 = (exp_res < GRID_X*GRID_Y); - free(results); - active = 0; - } - - if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) - { - http_async_req_close(http); - http = NULL; - } - - for(i=0; i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) - { - if(stamp_page) - { - stamp_page --; - } - sdl_wheel = 0; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; -} - -void render_signs(pixel *vid_buf) -{ - int i, j, x, y, w, h, dx, dy; - char buff[30]; //Buffer - for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature - else - sprintf(buff, "Temp: 0.00"); //...tempirature - drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); - } - - //Usual text - if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) - drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); - x = signs[i].x; - y = signs[i].y; - dx = 1 - signs[i].ju; - dy = (signs[i].y > 18) ? -1 : 1; - for(j=0; j<4; j++) - { - drawpixel(vid_buf, x, y, 192, 192, 192, 255); - x+=dx; - y+=dy; - } - } -} - -void add_sign_ui(pixel *vid_buf, int mx, int my) -{ - int i, w, h, x, y, nm=0, ju; - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; - ui_edit ed; - - // check if it is an existing sign - for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) - break; - } - // else look for empty spot - if(i >= MAXSIGNS) - { - nm = 1; - for(i=0; i= MAXSIGNS) - return; - - if(nm) - { - signs[i].x = mx; - signs[i].y = my; - signs[i].ju = 1; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = x0+25; - ed.y = y0+25; - ed.w = 158; - ed.nx = 1; - ed.def = "[message]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(signs[i].text); - strcpy(ed.str, signs[i].text); - ju = signs[i].ju; - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed); - drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); - draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); - draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); - draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); - - if(!nm) - { - drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); - drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); - drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); - } - - drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) - ju = 0; - if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) - ju = 1; - if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) - ju = 2; - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) - { - signs[i].text[0] = 0; - return; - } - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - { - if(!ed.focus) - return; - ed.focus = 0; - } - } - - strcpy(signs[i].text, ed.str); - signs[i].ju = ju; -} - -/*********************************************************** - * CONFIG FILE * - ***********************************************************/ - -char http_proxy[256] = ""; - -void save_string(FILE *f, char *str) -{ - int li = strlen(str); - unsigned char lb[2]; - lb[0] = li; - lb[1] = li >> 8; - fwrite(lb, 2, 1, f); - fwrite(str, li, 1, f); -} - -int load_string(FILE *f, char *str, int max) -{ - int li; - unsigned char lb[2]; - fread(lb, 2, 1, f); - li = lb[0] | (lb[1] << 8); - if(li > max) - { - str[0] = 0; - return 1; - } - fread(str, li, 1, f); - str[li] = 0; - return 0; -} - -unsigned char last_major=0, last_minor=0, update_flag=0; - -void save_presets(int do_update) -{ - FILE *f=fopen("powder.def", "wb"); - unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; - unsigned char tmp = sdl_scale; - if(!f) - return; - fwrite(sig, 1, 4, f); - save_string(f, svf_user); - save_string(f, svf_pass); - fwrite(&tmp, 1, 1, f); - tmp = cmode; - fwrite(&tmp, 1, 1, f); - tmp = svf_admin; - fwrite(&tmp, 1, 1, f); - tmp = svf_mod; - fwrite(&tmp, 1, 1, f); - save_string(f, http_proxy); - tmp = SAVE_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = MINOR_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = do_update; - fwrite(&tmp, 1, 1, f); - fclose(f); -} - -void load_presets(void) -{ - FILE *f=fopen("powder.def", "rb"); - unsigned char sig[4], tmp; - if(!f) - return; - fread(sig, 1, 4, f); - if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) - { - if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) - { - if(fseek(f, -3, SEEK_END)) - { - remove("powder.def"); - return; - } - if(fread(sig, 1, 3, f) != 3) - { - remove("powder.def"); - goto fail; - } - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; - } - fclose(f); - remove("powder.def"); - return; - } - if(load_string(f, svf_user, 63)) - goto fail; - if(load_string(f, svf_pass, 63)) - goto fail; - svf_login = !!svf_user[0]; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - sdl_scale = (tmp == 2) ? 2 : 1; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - cmode = tmp%7; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_admin = tmp; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_mod = tmp; - if(load_string(f, http_proxy, 255)) - goto fail; - if(fread(sig, 1, 3, f) != 3) - goto fail; - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; -fail: - fclose(f); -} - -void dim_copy(pixel *dst, pixel *src) -{ - int i,r,g,b; - for(i=0; i0) - r--; - if(g>0) - g--; - if(b>0) - b--; - dst[i] = PIXRGB(r,g,b); - } -} - -unsigned int fire_alpha[CELL*3][CELL*3]; -void prepare_alpha(void) -{ - int x,y,i,j; - float temp[CELL*3][CELL*3]; - memset(temp, 0, sizeof(temp)); - for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; - fire_g[j][i] = g>4 ? g-4 : 0; - fire_b[j][i] = b>4 ? b-4 : 0; - } -} - -int zoom_en = 0; -int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; -int zoom_wx=0, zoom_wy=0; -void render_zoom(pixel *img) -{ - int x, y, i, j; - pixel pix; - drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); - drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); - clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); - for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) - { - xor_pixel(x+i, y+j, vid); - if(j) xor_pixel(x+i, y-j, vid); - if(i) xor_pixel(x-i, y+j, vid); - if(i&&j) xor_pixel(x-i, y-j, vid); - } - } - else - { - int tc; - c = (r/CELL) * CELL; - x = (x/CELL) * CELL; - y = (y/CELL) * CELL; - - tc = !((c%(CELL*2))==0); - - x -= c/2; - y -= c/2; - - x += tc*(CELL/2); - y += tc*(CELL/2); - - for(i=0; i2) - { - pthread_t pth; - pthread_create(&pth,NULL,update_air_th,""); - } - else - { - update_air(); - } -#else - update_air(); -#endif - } - if(cmode==0 || cmode==1) - { - draw_air(vid_buf); - } - else if(cmode==2) - { - memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); - memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); - } - else - { - memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); - } - update_particles(vid_buf); - - if(cmode==2) - { - if(!fire_fc) - { - dim_copy(fire_bg, vid_buf); - } - else - { - memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); - } - fire_fc = (fire_fc+1) % 3; - } - if(cmode==3||cmode==4||cmode==6) - render_fire(vid_buf); - - render_signs(vid_buf); - - memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); - clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); - - draw_svf_ui(vid_buf); - - if(http_ver_check) - { - if(!do_check && http_async_req_status(http_ver_check)) - { - ver_data = http_async_req_stop(http_ver_check, &http_ret, NULL); - if(http_ret==200 && ver_data) - { -#ifdef BETA - if(sscanf(ver_data, "%d.%d.%d", &major, &minor, &is_beta)==3) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) - old_version = 1; -#else - if(sscanf(ver_data, "%d.%d", &major, &minor)==2) - if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) - old_version = 1; -#endif - free(ver_data); - } - http_ver_check = NULL; - } - do_check = (do_check+1) & 15; - } - - if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) - { - if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) - { - break; - } - } - if(sdl_key=='d') - { - death = !(death); - } - if(sdl_key=='f') - { - framerender = 1; - } - if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) - { - if(load_mode) - { - free(load_img); - free(load_data); - load_mode = 0; - load_data = NULL; - load_img = NULL; - } - if(it > 50) - it = 50; - if(sdl_key=='k' && stamps[1].name[0]) - { - j = stamp_ui(vid_buf); - if(j>=0) - load_data = stamp_load(j, &load_size); - else - load_data = NULL; - } - else - load_data = stamp_load(0, &load_size); - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - if(sdl_key=='s') - { - if(it > 50) - it = 50; - save_mode = 1; - } - if(sdl_key=='1') - { - set_cmode(0); - } - if(sdl_key=='2') - { - set_cmode(1); - } - if(sdl_key=='3') - { - set_cmode(2); - } - if(sdl_key=='4') - { - set_cmode(3); - } - if(sdl_key=='5') - { - set_cmode(4); - } - if(sdl_key=='6') - { - set_cmode(5); - } - if(sdl_key=='7') - { - set_cmode(6); - } - if(sdl_key==SDLK_SPACE) - sys_pause = !sys_pause; - if(sdl_key=='h') - hud_enable = !hud_enable; - if(sdl_key=='p') - dump_frame(vid_buf, XRES, YRES, XRES); - if(sdl_key=='v'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - if(clipboard_ready==1) - { - load_data = malloc(clipboard_length); - memcpy(load_data, clipboard_data, clipboard_length); - load_size = clipboard_length; - if(load_data) - { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if(load_img) - load_mode = 1; - else - free(load_data); - } - } - } - if(sdl_key=='x'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 2; - } - if(sdl_key=='c'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) - { - save_mode = 1; - copy_mode = 1; - } - else if(sdl_key=='c') - { - set_cmode((cmode+1) % 7); - if(it > 50) - it = 50; - } - if(sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo - { - int cbx, cby, cbi; - - for(cbi=0; cbi32) - ZSIZE = 32; - if(ZSIZE<2) - ZSIZE = 2; - ZFACTOR = 256/ZSIZE; - sdl_wheel = 0; - } - else - { - bs += sdl_wheel; - if(bs>1224) - bs = 1224; - if(bs<0) - bs = 0; - sdl_wheel = 0; - /*if(su >= PT_NUM) { - if(sl < PT_NUM) - su = sl; - if(sr < PT_NUM) - su = sr; - }*/ - } - } - - bq = b; - b = SDL_GetMouseState(&x, &y); - - for(i=0; i=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy - && x0 && y0 && x>8)>=NPART || !cr)) - { -#ifdef BETA - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); -#else - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); -#endif - } - else - { - sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); - } - } - mx = x; - my = y; - if(update_flag) - { - info_box(vid_buf, "Finalizing update..."); - if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) - { - update_cleanup(); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - { - if(update_finish()) - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - else - info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); - } - update_flag = 0; - } - - if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && - x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) - { - tmp = malloc(64); -#ifdef BETA - if(is_beta) - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); - } - else - { - sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); - } -#else - sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); -#endif - if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) - { - free(tmp); - tmp = download_ui(vid_buf, my_uri, &i); - if(tmp) - { - save_presets(1); - if(update_start(tmp, i)) - { - update_cleanup(); - save_presets(0); - error_ui(vid_buf, 0, "Update failed - try downloading a new version."); - } - else - return 0; - } - } - else - free(tmp); - } - if(y>=sdl_scale*(YRES+(MENUSIZE-20))) - { - if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0) - { - db = svf_own ? 275 : 272; - if(da < 51) - da ++; - } - else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0) - { - db = (svf_myvote==1) ? 273 : 274; - if(da < 51) - da ++; - } - else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) - { - db = svf_own ? 257 : 256; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) - { - db = 270; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) - { - db = 266; - if(da < 51) - da ++; - } - else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) - { - db = 259; - if(svf_open && svf_own && x<=55*sdl_scale) - db = 258; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) - { - db = svf_login ? 261 : 260; - if(svf_admin) - { - db = 268; - } - else if(svf_mod) - { - db = 271; - } - if(da < 51) - da ++; - } - else if(x>=sdl_scale && x<=17*sdl_scale) - { - db = 262; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) - { - db = sys_pause ? 264 : 263; - if(da < 51) - da ++; - } - else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) - { - db = 267; - if(da < 51) - da ++; - } - else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) - { - db = 265; - if(da < 51) - da ++; - } - else if(da > 0) - da --; - } - else if(da > 0) - da --; - - if(!sdl_zoom_trig && zoom_en==1) - zoom_en = 0; - - if(sdl_key==Z_keysym && zoom_en==2) - zoom_en = 1; - - if(load_mode) - { - load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); - load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); - if(load_x+load_w>XRES) load_x=XRES-load_w; - if(load_y+load_h>YRES) load_y=YRES-load_h; - if(load_x<0) load_x=0; - if(load_y<0) load_y=0; - if(bq==1 && !b) - { - parse_save(load_data, load_size, 0, load_x, load_y); - free(load_data); - free(load_img); - load_mode = 0; - } - else if(bq==4 && !b) - { - free(load_data); - free(load_img); - load_mode = 0; - } - } - else if(save_mode==1) - { - save_x = (mx/sdl_scale)/CELL; - save_y = (my/sdl_scale)/CELL; - if(save_x >= XRES/CELL) save_x = XRES/CELL-1; - if(save_y >= YRES/CELL) save_y = YRES/CELL-1; - save_w = 1; - save_h = 1; - if(b==1) - { - save_mode = 2; - } - else if(b==4) - { - save_mode = 0; - copy_mode = 0; - } - } - else if(save_mode==2) - { - save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; - save_h = (my/sdl_scale+CELL/2)/CELL - save_y; - if(save_w>XRES/CELL) save_w = XRES/CELL; - if(save_h>YRES/CELL) save_h = YRES/CELL; - if(save_w<1) save_w = 1; - if(save_h<1) save_h = 1; - if(!b) - { - if(copy_mode==1) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - } - else if(copy_mode==2) - { - clipboard_data=build_save(&clipboard_length, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - clipboard_ready = 1; - save_mode = 0; - copy_mode = 0; - clear_area(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - } - else - { - stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - save_mode = 0; - } - } - } - else if(sdl_zoom_trig && zoom_en<2) - { - x /= sdl_scale; - y /= sdl_scale; - x -= ZSIZE/2; - y -= ZSIZE/2; - if(x<0) x=0; - if(y<0) y=0; - if(x>XRES-ZSIZE) x=XRES-ZSIZE; - if(y>YRES-ZSIZE) y=YRES-ZSIZE; - zoom_x = x; - zoom_y = y; - zoom_wx = (x 50) - it = 50; - x /= sdl_scale; - y /= sdl_scale; - if(y>=YRES+(MENUSIZE-20)) - { - if(!lb) - { - if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Up")) - { - svf_myvote = 1; - } - } - if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0) - { - if(execute_vote(vid_buf, svf_id, "Down")) - { - svf_myvote = -1; - } - } - if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) - tag_list_ui(vid_buf); - if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) - { - legacy_enable = !legacy_enable; - } - if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) - { - memset(signs, 0, sizeof(signs)); - memset(pv, 0, sizeof(pv)); - memset(vx, 0, sizeof(vx)); - memset(vy, 0, sizeof(vy)); - memset(fvx, 0, sizeof(fvx)); - memset(fvy, 0, sizeof(fvy)); - memset(bmap, 0, sizeof(bmap)); - memset(emap, 0, sizeof(emap)); - memset(parts, 0, sizeof(particle)*NPART); - for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) - { - login_ui(vid_buf); - if(svf_login) - save_presets(0); - } - if(x>=37 && x<=187 && svf_login) - { - if(!svf_open || !svf_own || x>51) - { - if(save_name_ui(vid_buf)) - execute_save(vid_buf); - } - else - execute_save(vid_buf); - while(!sdl_poll()) - if(!SDL_GetMouseState(&x, &y)) - break; - b = bq = 0; - } - if(x>=1 && x<=17) - { - search_ui(vid_buf); - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - } - if(x>=19 && x<=35 && svf_last && svf_open) - parse_save(svf_last, svf_lsize, 1, 0, 0); - if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) - { - if(b & SDL_BUTTON_LMASK) - set_cmode((cmode+1) % 7); - if(b & SDL_BUTTON_RMASK) - set_cmode((cmode+6) % 7); - save_presets(0); - } - if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) - sys_pause = !sys_pause; - lb = 0; - } - } - else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)) - { - c = sl = cr&0xFF; - } - else - { - //Something - } - } - lx = x; - ly = y; - lb = 0; - lm = 0; - } - else - { - //Copy state before drawing any particles (for undo)7 - int cbx, cby, cbi; - - for(cbi=0; cbi=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) - create_line(lx, ly, x, y, bs, c); - } - else - create_box(lx, ly, x, y, c); - lm = 0; - } - lb = 0; - } - - if(load_mode) - { - draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); - xor_rect(vid_buf, load_x, load_y, load_w, load_h); - } - - if(save_mode) - { - xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); - da = 51; - db = 269; - } - - if(zoom_en!=1 && !load_mode && !save_mode) - { - render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); - mousex = mx/sdl_scale; - mousey = my/sdl_scale; - } - - if(zoom_en) - render_zoom(vid_buf); - - if(da) - switch(db) - { - case 256: - drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); - break; - case 257: - drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); - break; - case 258: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); - break; - case 259: - drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); - break; - case 260: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); - break; - case 261: - drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); - break; - case 262: - drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); - break; - case 263: - drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); - break; - case 264: - drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); - break; - case 265: - drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); - break; - case 266: - drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); - break; - case 267: - drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); - break; - case 268: - drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); - break; - case 269: - drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); - break; - case 270: - drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); - break; - case 271: - drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); - break; - case 272: - drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); - break; - case 273: - drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); - break; - case 274: - drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); - break; - case 275: - drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); - break; - default: - drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); - } - if(itc) - { - itc--; - drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); - } - if(it) - { - it--; - drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); - } - - if(old_version) - { - clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); -#ifdef BETA - if(is_beta) - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); - } - else - { - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); - } -#else - drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); -#endif - drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); - } - - if(hud_enable) - { - currentTime = SDL_GetTicks(); - if(currentTime-past>=16) - { - past = SDL_GetTicks(); - FPS++; - } - if(currentTime-pastFPS>=1000) - { -#ifdef BETA - sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#else - sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); -#endif - FPSB = FPS; - FPS = 0; - pastFPS = currentTime; - } - if(sdl_zoom_trig||zoom_en) - { - if(zoom_x0) - player[2] = sr; - else - player[2] = PT_DUST; - } - - http_done(); - return 0; -} From bb88587d9dd932c9f67add15f2ca7c83b02a5371 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 26 Aug 2010 14:46:56 +0100 Subject: [PATCH 108/237] More rearrangement, particle drawing in own function --- air.c | 141 +++ air.h | 21 +- defines.h | 8 + graphics.c | 678 ++++++++++- graphics.h | 6 + hmap.h | 7 +- interface.c | 15 + interface.h | 1 + main.c | 3388 +-------------------------------------------------- powder.c | 2547 ++++++++++++++++++++++++++++++++++++++ powder.h | 59 + 11 files changed, 3475 insertions(+), 3396 deletions(-) create mode 100644 air.c create mode 100644 interface.c diff --git a/air.c b/air.c new file mode 100644 index 000000000..55108d683 --- /dev/null +++ b/air.c @@ -0,0 +1,141 @@ +#include +#include "air.h" +#include "powder.h" +#include "defines.h" +float kernel[9]; + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; + +float cb_vx[YRES/CELL][XRES/CELL], cb_ovx[YRES/CELL][XRES/CELL]; +float cb_vy[YRES/CELL][XRES/CELL], cb_ovy[YRES/CELL][XRES/CELL]; +float cb_pv[YRES/CELL][XRES/CELL], cb_opv[YRES/CELL][XRES/CELL]; + +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; + +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} \ No newline at end of file diff --git a/air.h b/air.h index add56b015..d9e04f631 100644 --- a/air.h +++ b/air.h @@ -1,14 +1,21 @@ #ifndef AIR_H #define AIR_H +#include "defines.h" -float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; +extern float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +extern float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +extern float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; -float cb_vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; -float cb_vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; -float cb_pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; +extern float cb_vx[YRES/CELL][XRES/CELL], cb_ovx[YRES/CELL][XRES/CELL]; +extern float cb_vy[YRES/CELL][XRES/CELL], cb_ovy[YRES/CELL][XRES/CELL]; +extern float cb_pv[YRES/CELL][XRES/CELL], cb_opv[YRES/CELL][XRES/CELL]; -float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; +extern float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; + +extern float kernel[9]; + +void make_kernel(void); + +void update_air(void); #endif \ No newline at end of file diff --git a/defines.h b/defines.h index 5b5daaaf3..aa27b90d7 100644 --- a/defines.h +++ b/defines.h @@ -28,4 +28,12 @@ static unsigned char ZSIZE = ZSIZE_D; typedef unsigned char uint8; +extern int legacy_enable; + +extern int sys_pause; +extern int framerender; + +extern int mousex, mousey; +extern int death; + #endif \ No newline at end of file diff --git a/graphics.c b/graphics.c index 15f50c631..0f6c0402e 100644 --- a/graphics.c +++ b/graphics.c @@ -1,16 +1,21 @@ +#include +#include #include "defines.h" #include "air.h" #include "powder.h" #include "graphics.h" #include "font.h" #include "misc.h" -#include -#include + unsigned cmode = 3; SDL_Surface *sdl_scrn; int sdl_scale = 1; +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) { int i,j,x,y,w,h,r,g,b,c; @@ -1095,4 +1100,673 @@ void xor_rect(pixel *vid, int x, int y, int w, int h) xor_pixel(x, y+i, vid); xor_pixel(x+w-1, y+i, vid); } +} + +void draw_parts(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, a, cr,cg,cb, s, rt, fe, nt, lpv, nearp, pavg; + float mv, dx, dy, ix, iy, lx, ly, d, pp; + float pt = R_TEMP; + for(i = 0; i(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; + vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; + vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; + vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; + } + draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); + draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); + draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); + draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); + + isplayer = 1; //It's a secret. Tssss... + } + if(t==PT_MWAX&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,224,224,170,255); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,224,224,170,20); + else + blendpixel(vid,x+nx,y+ny,224,224,170,40); + } + } + + } + else if(t==PT_ACID) + { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28)); + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + if(cmode==6){ + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); + } + } + } else { + blendpixel(vid, nx, ny, cr, cg, cb, 255); + } + + if(cmode==4) + { + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + } + else if(t==PT_OILL&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,64,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,64,16,40); + } + } + } + else if(t==PT_NEUT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLUT&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x40; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_URAN&&cmode == 6) + { + int tempx; + int tempy; + cr = 0x70; + cg = 0x70; + cb = 0x20; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + for(tempx = 2; tempx < 10; tempx++) { + for(tempy = 2; tempy < 10; tempy++) { + blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); + blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); + } + } + } else if(t==PT_SLTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,64,80,240,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,64,80,240,50); + } + } + } + else if(t==PT_PHOT) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_SWCH && parts[i].life == 10) + { + x = nx; + y = ny; + blendpixel(vid,x,y,17,217,24,255); + } + else if(t==PT_LNTG&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,128,160,223,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,128,160,223,50); + } + } + } + else if(t==PT_SMKE) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = 10; + cb = 10; + cr = 10; + cg += fire_g[y][x]; + if(cg > 50) cg = 50; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 50) cb = 50; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 50) cr = 50; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny,100,100,100,30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny,100,100,100,10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny,100,100,100,20); + } + } + } + } + else if(t==PT_WATR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + + } else if(t==PT_DSTW&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,48,208,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,48,208,50); + } + } + } + else if(t==PT_NITR&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,32,224,16,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,32,224,16,50); + } + } + + } + else if(t==PT_LRBD&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,170,170,170,100); + else if (abs(y) != 0 || abs(x) != 0) + blendpixel(vid,x+nx,y+ny,170,170,170,50); + } + } + + } + + else if(t==PT_NBLE&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,235,73,23,100); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,235,73,23,30); + else + blendpixel(vid,x+nx,y+ny,235,73,23,50); + } + } + + } + else if(t==PT_GASS&&cmode == 6) + { + for(x=-1; x<=1; x++) + { + for(y=-1; y<=1; y++) + { + if ((abs(x) == 0) && (abs(y) == 0)) + blendpixel(vid,x+nx,y+ny,255,255,0,180); + else if (abs(y) != 0 && abs(x) != 0) + blendpixel(vid,x+nx,y+ny,255,255,0,50); + else + blendpixel(vid,x+nx,y+ny,255,255,0,80); + } + } + + } + else if(t==PT_WTRV) + { + if(cmode == 3||cmode==4 || cmode==6) + { + x = nx/CELL; + y = ny/CELL; + cg = PIXG(ptypes[t].pcolors)/3; + cb = PIXB(ptypes[t].pcolors)/3; + cr = PIXR(ptypes[t].pcolors)/3; + cg += fire_g[y][x]; + if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; + fire_r[y][x] = cr; + } + else + { + for(x=-3; x<4; x++) + { + for(y=-3; y<4; y++) + { + if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); + if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); + if (abs(x)+abs(y) == 2) + blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); + } + } + } + } + else if(t==PT_THDR) + { + if(cmode == 3||cmode==4 || cmode==6) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LCRY) + { + if(cmode == 3||cmode==4 || cmode==6) + { + //cr = R/8; + //cg = G/8; + //cb = B/8; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); + //x = nx/CELL; + //y = ny/CELL; + //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } + else + { + cr = 0x50+(parts[i].life*10); + cg = 0x50+(parts[i].life*10); + cb = 0x50+(parts[i].life*10); + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLSM) + { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4 || cmode==6) + { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + } + else + { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_FIRE && parts[i].life) + { + if(cmode == 3||cmode==4 || cmode==6) + { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + else + { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } + else if(t==PT_LAVA && parts[i].life) + { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4 || cmode==6) + { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else if(t==PT_LAVA || t==PT_SPRK) + { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4 || cmode==6) + { + if(t == PT_LAVA) + { + cr = 3; + cg = i%2; + cb = 0; + } + else + { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + } + else + { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + + if(t==PT_STKM) //Stick man should be visible in heat mode + { + char buff[10]; //Buffer for HP + + if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head + { + sprintf(buff, "%3d", (int)parts[i].life); //Show HP + drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); + } + + for(r=-2; r<=1; r++) + { + s = XRES+BARSIZE; + vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); + vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); + vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); + vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); + } + draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); + draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); + draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); + draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + } + else + { + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } + } + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) + { + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + } } \ No newline at end of file diff --git a/graphics.h b/graphics.h index 7779b0949..3932a2f68 100644 --- a/graphics.h +++ b/graphics.h @@ -1,6 +1,8 @@ #ifndef GRAPHICS_H #define GRAPHICS_H #include +#include "defines.h" +#include "hmap.h" #ifdef PIX16 #define PIXELSIZE 2 @@ -40,6 +42,10 @@ extern unsigned cmode; extern SDL_Surface *sdl_scrn; extern int sdl_scale; +extern unsigned char fire_r[YRES/CELL][XRES/CELL]; +extern unsigned char fire_g[YRES/CELL][XRES/CELL]; +extern unsigned char fire_b[YRES/CELL][XRES/CELL]; + pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch); diff --git a/hmap.h b/hmap.h index a356fd205..8af6e7168 100755 --- a/hmap.h +++ b/hmap.h @@ -17,5 +17,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -unsigned char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; -unsigned char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; \ No newline at end of file +#ifndef HMAP_H +#define HMAP_H +static char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; +static char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; +#endif \ No newline at end of file diff --git a/interface.c b/interface.c new file mode 100644 index 000000000..bb8f7cdd6 --- /dev/null +++ b/interface.c @@ -0,0 +1,15 @@ +#include "powder.h" +#include "interface.h" + + +void menu_count(void) +{ + int i=0; + msections[SC_WALL].itemcount = UI_WALLCOUNT-4; + msections[SC_SPECIAL].itemcount = 4; + for(i=0; i0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; - if(dp < -256.0f) dp = -256.0f; - if(dx > 256.0f) dx = 256.0f; - if(dx < -256.0f) dx = -256.0f; - if(dy > 256.0f) dy = 256.0f; - if(dy < -256.0f) dy = -256.0f; - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); -} - -void *update_air_th(void *arg) -{ - update_air(); - return NULL; -} - /*********************************************************** * PARTICLE SIMULATOR * ***********************************************************/ -particle *parts; -particle *cb_parts; - -float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index -int isplayer = 0; //It shows is player spawned or not int mousex, mousey = 0; //They contain mouse position -void menu_count(void) -{ - int i=0; - msections[SC_WALL].itemcount = UI_WALLCOUNT-4; - msections[SC_SPECIAL].itemcount = 4; - for(i=0; i=XRES || ny>=YRES) - return 0; - if(x==nx && y==ny) - return 1; - r = pmap[ny][nx]; - if(r && (r>>8)>8].type; - - if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) - { - return 1; - } - - if((r&0xFF)==PT_VOID) - { - parts[i].type=PT_NONE; - return 0; - } - if((r&0xFF)==PT_BHOL) - { - parts[i].type=PT_NONE; - if(!legacy_enable) - { - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; - } - return 0; - } - - if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide - { - return 1; - } - - if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) - { - return 1; - } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) - { - return 0; - } - if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) - { - return 0; - } - - if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) - return 0; - if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) - return 0; - if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) - return 0; - - if(parts[i].type==PT_CNCT && y>8)>= 8; - parts[r].x += x-nx; - parts[r].y += y-ny; - } - - return 1; -} - -void kill_part(int i) -{ - int x, y; - parts[i].type = PT_NONE; - - x = (int)(parts[i].x+0.5f); - y = (int)(parts[i].y+0.5f); - - if(x>=0 && y>=0 && x=XRES || y>=YRES) - return -1; - - if(t==SPC_HEAT||t==SPC_COOL) - { - if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); - } - if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) - { - parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); - } - return pmap[y][x]>>8; - } - else - { - return -1; - } - } - if(t==SPC_AIR) - { - pv[y/CELL][x/CELL] += 0.03f; - if(y+CELL>8].type = PT_SPRK; - parts[pmap[y][x]>>8].life = 4; - parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; - pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; - return pmap[y][x]>>8; - } - - if(p==-1) - { - if(pmap[y][x]) - return -1; - if(pfree == -1) - return -1; - i = pfree; - pfree = parts[i].life; - } - else - i = p; - - if(t==PT_GLAS) - { - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - } - if(t!=PT_STKM) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = t; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 0; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - } - if(t==PT_ACID) - { - parts[i].life = 75; - } - /*Testing - if(t==PT_WOOD){ - parts[i].life = 150; - } - End Testing*/ - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - if(t==PT_PLSM) - parts[i].life = rand()%150+50; - if(t==PT_LAVA) - parts[i].life = rand()%120+240; - if(t==PT_NBLE) - parts[i].life = 0; - if(t==PT_NEUT) - { - float r = (rand()%128+128)/127.0f; - float a = (rand()%360)*3.14159f/180.0f; - parts[i].life = rand()%480+480; - parts[i].vx = r*cosf(a); - parts[i].vy = r*sinf(a); - } - if(t==PT_PHOT) - { - float r = (rand()%3-1)*3; - float a = (rand()%3-1)*3; - parts[i].life = 680; - if(a==0.0f&&r==0.0f) - { - parts[i].life = 0; - parts[i].type = PT_NONE; - return -1; - } - else - { - parts[i].vx = a; - parts[i].vy = r; - } - //} else { - // parts[i].life = 0; - // parts[i].type = PT_NONE; - //}/ - } - - if(t!=PT_STKM) - pmap[y][x] = t|(i<<8); - else - { - if(isplayer==0) - { - parts[i].x = (float)x; - parts[i].y = (float)y; - parts[i].type = PT_STKM; - parts[i].vx = 0; - parts[i].vy = 0; - parts[i].life = 100; - parts[i].ctype = 0; - parts[i].temp = ptypes[t].heat; - - - - player[3] = x-1; //Setting legs positions - player[4] = y+6; - player[5] = x-1; - player[6] = y+6; - - player[7] = x-3; - player[8] = y+12; - player[9] = x-3; - player[10] = y+12; - - player[11] = x+1; - player[12] = y+6; - player[13] = x+1; - player[14] = y+6; - - player[15] = x+3; - player[16] = y+12; - player[17] = x+3; - player[18] = y+12; - - isplayer = 1; - } - } - - return i; -} - -#ifdef WIN32 -_inline void delete_part(int x, int y) -#else -inline void delete_part(int x, int y) -#endif -{ - unsigned i; - - if(x<0 || y<0 || x>=XRES || y>=YRES) - return; - i = pmap[y][x]; - if(!i || (i>>8)>=NPART) - return; - - kill_part(i>>8); - pmap[y][x] = 0; // just in case -} - -#ifdef WIN32 -_inline int is_wire(int x, int y) -#else -inline int is_wire(int x, int y) -#endif -{ - return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; -} - -#ifdef WIN32 -_inline int is_wire_off(int x, int y) -#else -inline int is_wire_off(int x, int y) -#endif -{ - return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; -} - -void set_emap(int x, int y) -{ - int x1, x2; - - if(!is_wire_off(x, y)) - return; - - // go left as far as possible - x1 = x2 = x; - while(x1>0) - { - if(!is_wire_off(x1-1, y)) - break; - x1--; - } - while(x21 && x1==x2 && - is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && - !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) - set_emap(x1, y-2); - else if(y>0) - for(x=x1; x<=x2; x++) - if(is_wire_off(x, y-1)) - { - if(x==x1 || x==x2 || y>=YRES/CELL-1 || - is_wire(x-1, y-1) || is_wire(x+1, y-1) || - is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) - set_emap(x, y-1); - } - - if(y>8) < NPART && (pmr>>8) >= 0) - { - return parts[pmr>>8].type; - } - else - { - return PT_NONE; - } -} -int nearest_part(int ci, int t) -{ - int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); - int ndistance = 0; - int id = -1; - int i = 0; - int cx = (int)parts[ci].x; - int cy = (int)parts[ci].y; - for(i=0; i=XRES || y>=YRES || - ((bmap[y/CELL][x/CELL]==1 || - bmap[y/CELL][x/CELL]==8 || - bmap[y/CELL][x/CELL]==9 || - (bmap[y/CELL][x/CELL]==2) || - (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || - (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || - (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || - (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) - { - kill_part(i); - continue; - } - - vx[y/CELL][x/CELL] *= ptypes[t].airloss; - vy[y/CELL][x/CELL] *= ptypes[t].airloss; - vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; - vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS||t==PT_NBLE) - { - if(pv[y/CELL][x/CELL]<3.5f) - pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); - if(y+CELL2.5f) - { - parts[i].life = rand()%80+180; - rt = parts[i].type = PT_FIRE; - parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - pv[y/CELL][x/CELL] += 0.25f * CFDS; - t = PT_FIRE; - } - - parts[i].vx *= ptypes[t].loss; - parts[i].vy *= ptypes[t].loss; - - if(t==PT_DFRM && !parts[i].life) - { - if(pv[y/CELL][x/CELL]>1.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - parts[i].life = rand()%80+300; - } - } - else - { - if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } - } - - if(ptypes[t].diffusion) - { - parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); - } - - // interpolator -#ifdef WIN32 - mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#else - mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); -#endif - if(mv < ISTP) - { - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - } - else - { - dx = parts[i].vx*ISTP/mv; - dy = parts[i].vy*ISTP/mv; - ix = parts[i].x; - iy = parts[i].y; - while(1) - { - mv -= ISTP; - if(mv <= 0.0f) - { - // nothing found - parts[i].x += parts[i].vx; - parts[i].y += parts[i].vy; - ix = parts[i].x; - iy = parts[i].y; - break; - } - ix += dx; - iy += dy; - nx = (int)(ix+0.5f); - ny = (int)(iy+0.5f); - if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) - { - parts[i].x = ix; - parts[i].y = iy; - break; - } - } - } - - a = nt = 0; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx4.0f) - t = parts[i].type = PT_DSTW; - if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) - t = parts[i].type = PT_GASS; - if(t==PT_GASS && pv[y/CELL][x/CELL]>6.0f) - t = parts[i].type = PT_DESL; - if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) - t = parts[i].type = PT_FIRE; - } - if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) - t = parts[i].type = PT_GASS; - if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it - t = parts[i].type = PT_FIRE; // combust under pressure. - if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) - t = parts[i].type = PT_DESL; - if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - // t = parts[i].type = PT_BGLA; - if(t==PT_GLAS) - { - parts[i].pavg[0] = parts[i].pavg[1]; - parts[i].pavg[1] = pv[y/CELL][x/CELL]; - if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) - { - parts[i].type = PT_BGLA; - } - } - if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) - t = parts[i].type = PT_SNOW; - if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) - { - t = PT_NEUT; - create_part(i, x, y, t); - } - - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) - { - nearp = nearest_part(i, PT_ETRD); - if(nearp!=-1) - { - create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[nearp].type = PT_SPRK; - parts[nearp].life = 9; - parts[nearp].ctype = PT_ETRD; - } - } - - if(!legacy_enable) - { - int ctemp = pv[y/CELL][x/CELL]*2; - c_heat = 0.0f; - h_count = 0; - if(ptypes[t].hconduct>(rand()%250)) - { - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - h_count++; - c_heat += parts[r>>8].temp; - } - } - } - } - pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); - for(nx=-1; nx<2; nx++) - { - for(ny=-1; ny<2; ny++) - { - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) - { - parts[r>>8].temp = parts[i].temp; - } - } - } - } - if(pt>=pstates[t].btemp&&pstates[t].burn) - { - t = parts[i].type = pstates[t].burn; - if(t==PT_FIRE||t==PT_PLSM) - parts[i].life = rand()%50+120; - } - else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) - { - if(t==PT_LAVA&&parts[i].ctype) - { - parts[i].life = 0; - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) - { - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } - else - { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } - else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) - { - if(pstates[t].liquid==PT_LAVA) - { - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } - else if(t==PT_ICEI&&parts[i].ctype) - { - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else - { - t = parts[i].type = pstates[t].liquid; - } - } - else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) - { - t = parts[i].type = pstates[t].liquid; - } - else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) - { - if(t==PT_SLTW&&1>rand()%6) - { - t = parts[i].type = PT_SALT; - } - else - { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - if(t==PT_FIRE) - parts[i].life = rand()%50+120; - } - } - if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) - { - float atemp = parts[i].temp + (-MIN_TEMP); - pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; - } - if(t==PT_LAVA) - { - parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - } - pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); - } - } - if(t==PT_PTCT&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - if(t==PT_NTCT&&parts[i].temp>24.0f) - { - pt = parts[i].temp -= 2.5f; - } - - if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) - { - nx = x % CELL; - if(nx == 0) - nx = x/CELL - 1; - else if(nx == CELL-1) - nx = x/CELL + 1; - else - nx = x/CELL; - ny = y % CELL; - if(ny == 0) - ny = y/CELL - 1; - else if(ny == CELL-1) - ny = y/CELL + 1; - else - ny = y/CELL; - if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) - { - t = parts[i].type = PT_NONE; - parts[r>>8].ctype = parts[r>>8].type; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - } - else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) - { - pv[y/CELL][x/CELL] += 100.0f; - if(legacy_enable&&1>(rand()%200)) - { - parts[i].life = rand()%50+120; - t = parts[i].type = PT_FIRE; - } - else - { - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_ICEI || t==PT_SNOW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if(legacy_enable) - { - if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) - { - t = parts[i].type = PT_ICEI; - parts[r>>8].type = PT_ICEI; - } - if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) - t = parts[i].type = PT_WATR; - } - } - } - else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL) - { - parts[i].temp = 200.0f; - } - } - } - //PLANT - else if(t==PT_PLNT) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR && 1>(rand()%250)) - { - t = parts[i].type = PT_PLNT; - parts[r>>8].type = PT_PLNT; - } - else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - } - //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) - //t = parts[i].type = PT_WATR; - } - } - else if(t==PT_WATR||t==PT_DSTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%250)) - { - t = parts[i].type = PT_SLTW; - parts[r>>8].type = PT_SLTW; - } - if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_WATR; - } - if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) - { - t = parts[i].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_SLTW) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) - { - t = parts[i].type = PT_SALT; - parts[r>>8].type = PT_WTRV; - } - else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) - { - parts[r>>8].type = PT_SLTW; - } - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - } - } - else if(t==PT_WTRV) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - parts[r>>8].type = PT_WATR; - } - - if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) - { - parts[i].life = 4; - t = parts[i].type = PT_FIRE; - - } - if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) - { - t = parts[i].type = PT_WATR; - if(1>(rand()%1000)) - parts[r>>8].type = PT_WATR; - } - } - } - else if(t==PT_YEST) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_DYST && 1>(rand()%30) && !legacy_enable) - { - t = parts[i].type = PT_DYST; - } - } - } - else if(t==PT_ACID) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)!=PT_ACID) - { - if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) - { - t = parts[i].type = PT_FIRE; - parts[i].life = 4; - parts[r>>8].type = PT_FIRE; - parts[r>>8].life = 4; - } - else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) - { - parts[i].life--; - parts[r>>8].type = PT_NONE; - } - else if (parts[i].life==50) - { - parts[i].life = 0; - t = parts[i].type = PT_NONE; - } - } - } - } - else if(t==PT_NEUT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) - { - if(33>rand()%100) - { - create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); - } - else - { - create_part(r>>8, x+nx, y+ny, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - fe ++; - } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) - parts[r>>8].type = PT_DUST; - if((r&0xFF)==PT_DYST && 15>(rand()%1000)) - parts[r>>8].type = PT_YEST; - if((r&0xFF)==PT_YEST){ - if(15>(rand()%100000)&&isplayer==0) - parts[r>>8].type = PT_STKM; - else - parts[r>>8].type = PT_DYST; - } - - if((r&0xFF)==PT_WATR && 15>(rand()%100)) - parts[r>>8].type = PT_DSTW; - if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_DFRM; - if((r&0xFF)==PT_NITR && 15>(rand()%1000)) - parts[r>>8].type = PT_DESL; - if((r&0xFF)==PT_OILL && 5>(rand()%1000)) - parts[r>>8].type = PT_PLAS; - if((r&0xFF)==PT_PLNT && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) - parts[r>>8].type = PT_OILL; - if((r&0xFF)==PT_DESL && 15>(rand()%1000)) - parts[r>>8].type = PT_GASS; - if((r&0xFF)==PT_COAL && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; - } - } - else if(t==PT_PHOT) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=0; nx<1; nx++) - for(ny=0; ny<1; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) - { - parts[i].vx *= 0.995; - parts[i].vy *= 0.995; - } - } - } - else if(t==PT_LCRY) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(rt==PT_SPRK) - { - if(parts[r>>8].ctype==PT_PSCN) - { - parts[i].life = 10; - } - else if(parts[r>>8].ctype==PT_NSCN) - { - parts[i].life = 9; - } - } - if(rt==PT_LCRY) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - else if(t==PT_BTRY) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts_avg(i,r>>8) != PT_INSL) - { - if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) - { - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - parts[r>>8].type = PT_SPRK; - } - } - } - }else if(t==PT_SWCH) - { - rt = 3 + (int)pv[y/CELL][x/CELL]; - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - rt = parts[r>>8].type; - if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } - } - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } - if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) - { - for(nx=-2; nx<3; nx++) - for(ny=-2; ny<3; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) - continue; - if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) - continue; - rt = parts[r>>8].type; - if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && - (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && - ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) - { - parts[r>>8].type = PT_FIRE; - parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); - parts[r>>8].life = rand()%80+180; - if(ptypes[rt].explosive) - pv[y/CELL][x/CELL] += 0.25f * CFDS; - continue; - } - lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; - if(lpv < 1) lpv = 1; - if(legacy_enable) - { - if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && - ptypes[rt].meltable*lpv>(rand()%1000)) - { - if(t!=PT_LAVA || parts[i].life>0) - { - parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; - parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; - parts[r>>8].type = PT_LAVA; - parts[r>>8].life = rand()%120+240; - } - else - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; - parts[i].ctype = PT_NONE;//rt; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) - { - parts[r>>8].type = PT_WATR; - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = PT_STNE; - goto killed; - } - } - if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) - { - kill_part(r>>8); - if(t==PT_FIRE) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - goto killed; - } - if(t==PT_LAVA) - { - parts[i].life = 0; - t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; - parts[i].ctype = PT_NONE; - goto killed; - } - } - } - pavg = parts_avg(i, r>>8); - if(rt==PT_SWCH && t==PT_SPRK) - { - pavg = parts_avg(r>>8, i); - if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) - parts[r>>8].life = 10; - if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) - parts[r>>8].life = 9; - if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].ctype = PT_SWCH; - parts[r>>8].life = 4; - } - } - pavg = parts_avg(i, r>>8); - if(pavg != PT_INSL) - { - if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; - } - } - if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) - { - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && - (parts[i].life<3 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 6; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && - (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; - parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) - { - if(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) - { - t = parts[i].type = PT_ETRD; - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].type = PT_SPRK; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - } - } - - if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) - { - parts[i].life = rand()%150+50; - parts[i].type = PT_PLSM; - parts[i].ctype = PT_NBLE; - parts[i].temp = 3500; - pv[y/CELL][x/CELL] += 1; - } - if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) - { - parts[i].type = PT_SWCH; - parts[i].life = 11; - } - } - } -killed: - if(parts[i].type == PT_NONE) - continue; - } - if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; - - //Death - if(parts[i].life<0 && (death == 1)) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } - - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; - - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; - - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; - - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; - - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } - - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } - - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } - - } - } - - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } - - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } - - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); - - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) - { - int random = abs(rand()%3-1)*3; - if (random==0) - { - parts[r>>8].life = 0; - parts[r>>8].type = PT_NONE; - } - else - { - parts[r>>8].vy = 0; - parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; - } - } - - } - } - } - - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } - - } - - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; - - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; - - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; - - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; - - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; - - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } - - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } - - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } - - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } - - } - - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } - - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } - - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } - - if ((r&0xFF)==PT_ACID) //If on acid - parts[i].life -= 5; - - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; - - isplayer = 1; - } - if(t==PT_CLNE) - { - if(!parts[i].ctype) - { - for(nx=-1; nx<2; nx++) - for(ny=-1; ny<2; ny++) - if(x+nx>=0 && y+ny>0 && - x+nx30&&parts[i].temp<44){ - create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); - } - } - if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) - { - parts[i].type = PT_NBLE; - parts[i].life = 0; - } - if (t==PT_FIRE && parts[i].life <=1) - { - t = parts[i].type = PT_SMKE; - parts[i].life = rand()%20+250; - } - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) - { - parts[i].x = lx; - parts[i].y = ly; - kill_part(i); - continue; - } - - rt = parts[i].flags & FLAG_STAGNANT; - parts[i].flags &= ~FLAG_STAGNANT; - if(!try_move(i, x, y, nx, ny)) - { - parts[i].x = lx; - parts[i].y = ly; - if(ptypes[t].falldown) - { - if(nx!=x && try_move(i, x, y, nx, y)) - { - parts[i].x = ix; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x, ny)) - { - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else - { - r = (rand()%2)*2-1; - if(ny!=y && try_move(i, x, y, x+r, ny)) - { - parts[i].x += r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ny!=y && try_move(i, x, y, x-r, ny)) - { - parts[i].x -= r; - parts[i].y = iy; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y+r)) - { - parts[i].x = ix; - parts[i].y += r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(nx!=x && try_move(i, x, y, nx, y-r)) - { - parts[i].x = ix; - parts[i].y -= r; - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) - { - s = 0; - if(!rt || nt) - rt = 50; - else - rt = 10; - for(j=x+r; j>=0 && j>=x-rt && j0) - r = 1; - else - r = -1; - if(s) - for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; - if(nxy+ISTP) ny=y+ISTP; - if(ny(rand()%1000)) - { - kill_part(i); - continue; - } - else if(try_move(i, x, y, 2*x-nx, ny)) - { - parts[i].x = (float)(2*x-nx); - parts[i].y = (float)iy; - parts[i].vx *= ptypes[t].collision; - } - else if(try_move(i, x, y, nx, 2*y-ny)) - { - parts[i].x = (float)ix; - parts[i].y = (float)(2*y-ny); - parts[i].vy *= ptypes[t].collision; - } - else - { - parts[i].vx *= ptypes[t].collision; - parts[i].vy *= ptypes[t].collision; - } - } - } - -justdraw: - - nx = (int)(parts[i].x+0.5f); - ny = (int)(parts[i].y+0.5f); - - if(nx=XRES-CELL || - ny=YRES-CELL) - { - kill_part(i); - continue; - } - if(cmode!=CM_HEAT) - { - if(t==PT_STKM) //Just draw head here - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) //Here I use r variable not as I should, but I think you will excuse me :-p - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = ptypes[(int)player[2]].pcolors; - vid[(ny+2)*s+nx+r+1] = ptypes[(int)player[2]].pcolors; - vid[(ny+r+1)*s+nx-2] = ptypes[(int)player[2]].pcolors; - vid[(ny+r)*s+nx+2] = ptypes[(int)player[2]].pcolors; - } - draw_line(vid , nx, ny+3, player[3], player[4], 255, 255, 255, s); - draw_line(vid , player[3], player[4], player[7], player[8], 255, 255, 255, s); - draw_line(vid , nx, ny+3, player[11], player[12], 255, 255, 255, s); - draw_line(vid , player[11], player[12], player[15], player[16], 255, 255, 255, s); - - isplayer = 1; //It's a secret. Tssss... - } - if(t==PT_MWAX&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,224,224,170,255); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,224,224,170,20); - else - blendpixel(vid,x+nx,y+ny,224,224,170,40); - } - } - - } - else if(t==PT_ACID) - { - if(parts[i].life>255) parts[i].life = 255; - if(parts[i].life<47) parts[i].life = 48; - s = (255/((parts[i].life-46)*28)); - if(s==0) s = 1; - cr = PIXR(ptypes[t].pcolors)/s; - cg = PIXG(ptypes[t].pcolors)/s; - cb = PIXB(ptypes[t].pcolors)/s; - if(cmode==6){ - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,cr,cg,cb,40); - } - } - } else { - blendpixel(vid, nx, ny, cr, cg, cb, 255); - } - - if(cmode==4) - { - blendpixel(vid, nx+1, ny, cr, cg, cb, 223); - blendpixel(vid, nx-1, ny, cr, cg, cb, 223); - blendpixel(vid, nx, ny+1, cr, cg, cb, 223); - blendpixel(vid, nx, ny-1, cr, cg, cb, 223); - - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); - } - } - else if(t==PT_OILL&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,64,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,64,16,40); - } - } - } - else if(t==PT_NEUT) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 8; - cb = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = 0x20; - cg = 0xE0; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLUT&&cmode == 6) - { - int tempx; - int tempy; - cr = 0x40; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(tempx = 2; tempx < 10; tempx++) { - for(tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_URAN&&cmode == 6) - { - int tempx; - int tempy; - cr = 0x70; - cg = 0x70; - cb = 0x20; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - for(tempx = 2; tempx < 10; tempx++) { - for(tempy = 2; tempy < 10; tempy++) { - blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5); - blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5); - } - } - } else if(t==PT_SLTW&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,64,80,240,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,64,80,240,50); - } - } - } - else if(t==PT_PHOT) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 12; - cb = 12; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xFF; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_SWCH && parts[i].life == 10) - { - x = nx; - y = ny; - blendpixel(vid,x,y,17,217,24,255); - } - else if(t==PT_LNTG&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,128,160,223,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,128,160,223,50); - } - } - } - else if(t==PT_SMKE) - { - if(cmode == 3||cmode==4 || cmode==6) - { - x = nx/CELL; - y = ny/CELL; - cg = 10; - cb = 10; - cr = 10; - cg += fire_g[y][x]; - if(cg > 50) cg = 50; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 50) cb = 50; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 50) cr = 50; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny,100,100,100,30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny,100,100,100,10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny,100,100,100,20); - } - } - } - } - else if(t==PT_WATR&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - - } else if(t==PT_DSTW&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,48,208,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,48,208,50); - } - } - } - else if(t==PT_NITR&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,32,224,16,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,32,224,16,50); - } - } - - } - else if(t==PT_LRBD&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,170,170,170,100); - else if (abs(y) != 0 || abs(x) != 0) - blendpixel(vid,x+nx,y+ny,170,170,170,50); - } - } - - } - - else if(t==PT_NBLE&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,235,73,23,100); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,235,73,23,30); - else - blendpixel(vid,x+nx,y+ny,235,73,23,50); - } - } - - } - else if(t==PT_GASS&&cmode == 6) - { - for(x=-1; x<=1; x++) - { - for(y=-1; y<=1; y++) - { - if ((abs(x) == 0) && (abs(y) == 0)) - blendpixel(vid,x+nx,y+ny,255,255,0,180); - else if (abs(y) != 0 && abs(x) != 0) - blendpixel(vid,x+nx,y+ny,255,255,0,50); - else - blendpixel(vid,x+nx,y+ny,255,255,0,80); - } - } - - } - else if(t==PT_WTRV) - { - if(cmode == 3||cmode==4 || cmode==6) - { - x = nx/CELL; - y = ny/CELL; - cg = PIXG(ptypes[t].pcolors)/3; - cb = PIXB(ptypes[t].pcolors)/3; - cr = PIXR(ptypes[t].pcolors)/3; - cg += fire_g[y][x]; - if(cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2; - fire_r[y][x] = cr; - } - else - { - for(x=-3; x<4; x++) - { - for(y=-3; y<4; y++) - { - if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30); - if(abs(x)+abs(y) <=3 && abs(x)+abs(y)) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10); - if (abs(x)+abs(y) == 2) - blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20); - } - } - } - } - else if(t==PT_THDR) - { - if(cmode == 3||cmode==4 || cmode==6) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - cg = 16; - cb = 20; - cr = 12; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = 0xFF; - cg = 0xFF; - cb = 0xA0; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LCRY) - { - if(cmode == 3||cmode==4 || cmode==6) - { - //cr = R/8; - //cg = G/8; - //cb = B/8; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); - //x = nx/CELL; - //y = ny/CELL; - //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } - else - { - cr = 0x50+(parts[i].life*10); - cg = 0x50+(parts[i].life*10); - cb = 0x50+(parts[i].life*10); - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } else if(t==PT_PLSM) - { - float ttemp = parts[i].life; - int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - uint8 R = plasma_data[caddress]; - uint8 G = plasma_data[caddress+1]; - uint8 B = plasma_data[caddress+2]; - if(cmode == 3||cmode==4 || cmode==6) - { - cr = R/8; - cg = G/8; - cb = B/8; - x = nx/CELL; - y = ny/CELL; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - } - else - { - cr = R; - cg = G; - cb = B; - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_FIRE && parts[i].life) - { - if(cmode == 3||cmode==4 || cmode==6) - { - cr = parts[i].life / 4; - cg = parts[i].life / 16; - cb = parts[i].life / 32; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - else - { - cr = parts[i].life * 8; - cg = parts[i].life * 2; - cb = parts[i].life; - if(cr>255) cr = 255; - if(cg>192) cg = 212; - if(cb>128) cb = 192; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); - } - } - else if(t==PT_LAVA && parts[i].life) - { - cr = parts[i].life * 2 + 0xE0; - cg = parts[i].life * 1 + 0x50; - cb = parts[i].life/2 + 0x10; - if(cr>255) cr = 255; - if(cg>192) cg = 192; - if(cb>128) cb = 128; - blendpixel(vid, nx, ny, cr, cg, cb, 255); - blendpixel(vid, nx+1, ny, cr, cg, cb, 64); - blendpixel(vid, nx-1, ny, cr, cg, cb, 64); - blendpixel(vid, nx, ny+1, cr, cg, cb, 64); - blendpixel(vid, nx, ny-1, cr, cg, cb, 64); - if(cmode == 3||cmode==4 || cmode==6) - { - cr /= 32; - cg /= 32; - cb /= 32; - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else if(t==PT_LAVA || t==PT_SPRK) - { - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - if(cmode == 3 || cmode==4 || cmode==6) - { - if(t == PT_LAVA) - { - cr = 3; - cg = i%2; - cb = 0; - } - else - { - cr = 8; - cg = 12; - cb = 16; - } - x = nx/CELL; - y = ny/CELL; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - else - vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; - } - else - { - float ttemp = parts[i].temp+(-MIN_TEMP); - int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); - uint8 R = color_data[caddress]; - uint8 G = color_data[caddress+1]; - uint8 B = color_data[caddress+2]; - - if(t==PT_STKM) //Stick man should be visible in heat mode - { - char buff[10]; //Buffer for HP - - if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head - { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP - drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); - } - - for(r=-2; r<=1; r++) - { - s = XRES+BARSIZE; - vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B); - vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B); - vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B); - vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B); - } - draw_line(vid , nx, ny+3, player[3], player[4], R, G, B, s); - draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); - draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); - draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); - } - else - { - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); - //blendpixel(vid, nx+1, ny, R, G, B, 255); - } - } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) - { - uint8 R = PIXR(ptypes[t].pcolors); - uint8 G = PIXG(ptypes[t].pcolors); - uint8 B = PIXB(ptypes[t].pcolors); - - //if(vid[(ny-1)*YRES+(nx-1)]!=0){ - // blendpixel(vid, nx, ny-1, R, G, B, 46); - //} - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); - - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } - } - if(framerender){ - framerender = 0; - sys_pause = 1; - } -} - -void update_particles_i_th(void *arg) -{ - upstruc *newup = (upstruc*)arg; - update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); - return; -} - -void update_particles(pixel *vid) -{ - int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; - float lx, ly; -#ifdef MT - int pt = 0, pc = 0; - pthread_t *InterThreads; -#endif - - isplayer = 0; //Needed for player spawning - memset(pmap, 0, sizeof(pmap)); - r = rand()%2; - for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==13) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && (!sys_pause||framerender)) - emap[y][x] --; - } - } - } - else - { - for(y=0; y>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==4) - for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==7) - { - if(emap[y][x]) - { - cr = cg = cb = 128; - cr += fire_r[y][x]; - if(cr > 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==11) - { - for(j=0; j 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(bmap[y][x]==9) - { - for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; - fire_r[y][x] = cr; - cg += fire_g[y][x]; - if(cg > 255) cg = 255; - fire_g[y][x] = cg; - cb += fire_b[y][x]; - if(cb > 255) cb = 255; - fire_b[y][x] = cb; - } - } - if(emap[y][x] && (!sys_pause||framerender)) - emap[y][x] --; - } - } - } - -#ifdef MT - if(numCores > 1) - { - InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); - for(pc = 0; pc=XRES || ny<0 || ny>=YRES) - break; - addpixel(vid, nx, ny, 255, 255, 255, 64); - i = nx/CELL; - j = ny/CELL; - lx += vx[j][i]*0.125f; - ly += vy[j][i]*0.125f; - if(bmap[j][i]==5 && i!=x && j!=y) - break; - } - drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); - } - -} - -void update_particles_th(void *arg) -{ - update_particles((pixel*)arg); - return; -} /*********************************************************** * SDL OUTPUT * @@ -8390,6 +5006,7 @@ int main(int argc, char *argv[]) memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); } update_particles(vid_buf); + draw_parts(vid_buf); if(cmode==2) { @@ -9307,3 +5924,4 @@ int main(int argc, char *argv[]) http_done(); return 0; } + diff --git a/powder.c b/powder.c index e69de29bb..d6b71d927 100644 --- a/powder.c +++ b/powder.c @@ -0,0 +1,2547 @@ +#include +#include "defines.h" +#include "powder.h" +#include "air.h" +#include "misc.h" + +int isplayer = 0; +float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index + +particle *parts; +particle *cb_parts; + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; + +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +int pfree; + +unsigned pmap[YRES][XRES]; +unsigned cb_pmap[YRES][XRES]; + +int try_move(int i, int x, int y, int nx, int ny) +{ + unsigned r; + + + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE||((r&0xFF)==PT_LCRY&&parts[r>>8].life > 5))) + { + return 1; + } + + if((r&0xFF)==PT_VOID) + { + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL) + { + parts[i].type=PT_NONE; + if(!legacy_enable) + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } + return 0; + } + + if(parts[i].type==PT_STKM) //Stick man's head shouldn't collide + { + return 1; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]) + { + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) + { + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])) + { + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + + if(t==SPC_HEAT||t==SPC_COOL) + { + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP) + { + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } + else + { + return -1; + } + } + if(t==SPC_AIR) + { + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) + { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } + else + i = p; + + if(t==PT_GLAS) + { + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + } + if(t!=PT_STKM) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + } + if(t==PT_ACID) + { + parts[i].life = 75; + } + /*Testing + if(t==PT_WOOD){ + parts[i].life = 150; + } + End Testing*/ + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NBLE) + parts[i].life = 0; + if(t==PT_NEUT) + { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) + { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f) + { + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } + else + { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //}/ + } + + if(t!=PT_STKM) + pmap[y][x] = t|(i<<8); + else + { + if(isplayer==0) + { + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = PT_STKM; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 100; + parts[i].ctype = 0; + parts[i].temp = ptypes[t].heat; + + + + player[3] = x-1; //Setting legs positions + player[4] = y+6; + player[5] = x-1; + player[6] = y+6; + + player[7] = x-3; + player[8] = y+12; + player[9] = x-3; + player[10] = y+12; + + player[11] = x+1; + player[12] = y+6; + player[13] = x+1; + player[14] = y+6; + + player[15] = x+3; + player[16] = y+12; + player[17] = x+3; + player[18] = y+12; + + isplayer = 1; + } + } + + return i; +} + +#ifdef WIN32 +_inline void delete_part(int x, int y) +#else +inline void delete_part(int x, int y) +#endif +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +#ifdef WIN32 +_inline int is_wire(int x, int y) +#else +inline int is_wire(int x, int y) +#endif +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} + +#ifdef WIN32 +_inline int is_wire_off(int x, int y) +#else +inline int is_wire_off(int x, int y) +#endif +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) + { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) + { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y>8) < NPART && (pmr>>8) >= 0) + { + return parts[pmr>>8].type; + } + else + { + return PT_NONE; + } +} + +int nearest_part(int ci, int t) +{ + int distance = sqrt(pow(XRES, 2)+pow(YRES, 2)); + int ndistance = 0; + int id = -1; + int i = 0; + int cx = (int)parts[ci].x; + int cy = (int)parts[ci].y; + for(i=0; i=XRES || y>=YRES || + ((bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) + { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS||t==PT_NBLE) + { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) + { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) + { + if(pv[y/CELL][x/CELL]>1.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } + else + { + if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) + { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + } else { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + } + + if(ptypes[t].diffusion) + { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) + { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } + else + { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) + { + mv -= ISTP; + if(mv <= 0.0f) + { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) + { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) + t = parts[i].type = PT_GASS; + if(t==PT_GASS && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_DESL; + if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) + t = parts[i].type = PT_FIRE; + } + if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) + t = parts[i].type = PT_GASS; + if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it + t = parts[i].type = PT_FIRE; // combust under pressure. + if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) + t = parts[i].type = PT_DESL; + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + // t = parts[i].type = PT_BGLA; + if(t==PT_GLAS) + { + parts[i].pavg[0] = parts[i].pavg[1]; + parts[i].pavg[1] = pv[y/CELL][x/CELL]; + if(parts[i].pavg[1]-parts[i].pavg[0] > 0.05f || parts[i].pavg[1]-parts[i].pavg[0] < -0.05f) + { + parts[i].type = PT_BGLA; + } + } + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) + { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1) + { + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1) + { + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + + if(!legacy_enable) + { + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)) + { + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) + { + for(ny=-1; ny<2; ny++) + { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0) + { + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) + { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE||t==PT_PLSM) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) + { + if(t==PT_LAVA&&parts[i].ctype) + { + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) + { + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } + else + { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } + else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) + { + if(pstates[t].liquid==PT_LAVA) + { + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } + else if(t==PT_ICEI&&parts[i].ctype) + { + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } + else + { + t = parts[i].type = pstates[t].liquid; + } + } + else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) + { + t = parts[i].type = pstates[t].liquid; + } + else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) + { + if(t==PT_SLTW&&1>rand()%6) + { + t = parts[i].type = PT_SALT; + } + else + { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) + { + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA) + { + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_PTCT&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + if(t==PT_NTCT&&parts[i].temp>24.0f) + { + pt = parts[i].temp -= 2.5f; + } + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_METL || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_NTCT || t==PT_PTCT || t==PT_BMTL || t==PT_SPRK|| t == PT_NBLE || t==PT_INWR) + { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_METL || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_NTCT || (r&0xFF)==PT_PTCT || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT||(r&0xFF)==PT_NBLE) || (r&0xFF)==PT_INWR && parts[r>>8].ctype!=PT_SPRK ) + { + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } + else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) + { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)) + { + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } + else + { + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_ICEI || t==PT_SNOW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if(legacy_enable) + { + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) + { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } + } + } + else if(t==PT_NTCT||t==PT_PTCT||t==PT_INWR) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL) + { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) + { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } + else if((r&0xFF)==PT_LAVA && 1>(rand()%250)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%250)) + { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)) + { + t = parts[i].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_SLTW) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10) && legacy_enable) + { + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } + else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) + { + parts[r>>8].type = PT_SLTW; + } + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + } + } + else if(t==PT_WTRV) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } + + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)) + { + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000) && legacy_enable) + { + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } + } + } + else if(t==PT_YEST) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_DYST && 1>(rand()%30) && !legacy_enable) + { + t = parts[i].type = PT_DYST; + } + } + } + else if(t==PT_ACID) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID) + { + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) + { + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } + else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) + { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } + else if (parts[i].life==50) + { + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + else if(t==PT_NEUT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) + { + if(33>rand()%100) + { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } + else + { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_DYST && 15>(rand()%1000)) + parts[r>>8].type = PT_YEST; + if((r&0xFF)==PT_YEST){ + if(15>(rand()%100000)&&isplayer==0) + parts[r>>8].type = PT_STKM; + else + parts[r>>8].type = PT_DYST; + } + + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_DESL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_PLAS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_DESL && 15>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_COAL && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) + { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + } + } + else if(t==PT_LCRY) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(rt==PT_SPRK) + { + if(parts[r>>8].ctype==PT_PSCN) + { + parts[i].life = 10; + } + else if(parts[r>>8].ctype==PT_NSCN) + { + parts[i].life = 9; + } + } + if(rt==PT_LCRY) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + else if(t==PT_BTRY) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts_avg(i,r>>8) != PT_INSL) + { + if((rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE)&&parts[r>>8].life==0 && abs(nx)+abs(ny) < 4) + { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + parts[r>>8].type = PT_SPRK; + } + } + } + }else if(t==PT_SWCH) + { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + rt = parts[r>>8].type; + if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } + } + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD && rt!=PT_INSL && rt!=PT_SWCH) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_STNE && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_METL && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SWCH && rt!=PT_INWR)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) + { + parts[r>>8].type = PT_FIRE; + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; + if(legacy_enable) + { + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_METL && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_NTCT && rt!=PT_PTCT && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT && rt!=PT_INWR)) && + ptypes[rt].meltable*lpv>(rand()%1000)) + { + if(t!=PT_LAVA || parts[i].life>0) + { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } + else + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) + { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = PT_STNE; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) + { + kill_part(r>>8); + if(t==PT_FIRE) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) + { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_STNE; + parts[i].ctype = PT_NONE; + goto killed; + } + } + } + pavg = parts_avg(i, r>>8); + if(rt==PT_SWCH && t==PT_SPRK) + { + pavg = parts_avg(r>>8, i); + if(parts[i].ctype == PT_PSCN&&pavg != PT_INSL) + parts[r>>8].life = 10; + if(parts[i].ctype == PT_NSCN&&pavg != PT_INSL) + parts[r>>8].life = 9; + if(!(parts[i].ctype == PT_PSCN||parts[i].ctype == PT_NSCN)&&parts[r>>8].life == 10&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].ctype = PT_SWCH; + parts[r>>8].life = 4; + } + } + pavg = parts_avg(i, r>>8); + if(pavg != PT_INSL) + { + if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; + } + } + if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) + { + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_INWR && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5) + { + if(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) + { + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + + if(t==PT_SPRK&&parts[i].ctype==PT_NBLE&&parts[i].life<=1) + { + parts[i].life = rand()%150+50; + parts[i].type = PT_PLSM; + parts[i].ctype = PT_NBLE; + parts[i].temp = 3500; + pv[y/CELL][x/CELL] += 1; + } + if(t==PT_SPRK&&parts[i].ctype==PT_SWCH&&parts[i].life<=1) + { + parts[i].type = PT_SWCH; + parts[i].life = 11; + } + } + } +killed: + if(parts[i].type == PT_NONE) + continue; + } + if(t==PT_STKM) + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; + + //Death + if(parts[i].life<0 && (death == 1)) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } + + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; + + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; + + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; + + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; + + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } + + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } + + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } + + } + } + + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } + + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } + + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); + + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = 0; + parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } + + } + } + } + + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } + + } + + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; + + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; + + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; + + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; + + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; + + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } + + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } + + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } + + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } + + } + + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } + + if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) + { + player[3] += 0.2; + player[11] -= 0.2; + } + + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } + + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; + + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } + if(t==PT_CLNE) + { + if(!parts[i].ctype) + { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx30&&parts[i].temp<44){ + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); + } + } + if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) + { + parts[i].type = PT_NBLE; + parts[i].life = 0; + } + if (t==PT_FIRE && parts[i].life <=1) + { + t = parts[i].type = PT_SMKE; + parts[i].life = rand()%20+250; + } + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) + { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) + { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) + { + if(nx!=x && try_move(i, x, y, nx, y)) + { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x, ny)) + { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else + { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) + { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ny!=y && try_move(i, x, y, x-r, ny)) + { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y+r)) + { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(nx!=x && try_move(i, x, y, nx, y-r)) + { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) + { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) + { + kill_part(i); + continue; + } + else if(try_move(i, x, y, 2*x-nx, ny)) + { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } + else if(try_move(i, x, y, nx, 2*y-ny)) + { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } + else + { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + if(nx=XRES-CELL || ny=YRES-CELL) + { + kill_part(i); + continue; + } + } + if(framerender){ + framerender = 0; + sys_pause = 1; + } +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + isplayer = 0; //Needed for player spawning + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && (!sys_pause||framerender)) + emap[y][x] --; + } + } + } + else + { + for(y=0; y>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) + { + if(emap[y][x]) + { + cr = cg = cb = 128; + cr += fire_r[y][x]; + if(cr > 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) + { + for(j=0; j 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9) + { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; + fire_r[y][x] = cr; + cg += fire_g[y][x]; + if(cg > 255) cg = 255; + fire_g[y][x] = cg; + cb += fire_b[y][x]; + if(cb > 255) cb = 255; + fire_b[y][x] = cb; + } + } + if(emap[y][x] && (!sys_pause||framerender)) + emap[y][x] --; + } + } + } + + update_particles_i(vid, 0, 1); + + for(y=0; y=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} \ No newline at end of file diff --git a/powder.h b/powder.h index 5f0ca7172..9757d5a4f 100644 --- a/powder.h +++ b/powder.h @@ -397,4 +397,63 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ }; +extern int isplayer; +extern float player[20]; + +extern particle *parts; +extern particle *cb_parts; + +extern unsigned char bmap[YRES/CELL][XRES/CELL]; +extern unsigned char emap[YRES/CELL][XRES/CELL]; + +extern unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +extern unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +extern int pfree; + +extern unsigned pmap[YRES][XRES]; +unsigned cb_pmap[YRES][XRES]; + +int try_move(int i, int x, int y, int nx, int ny); + +void kill_part(int i); + +#ifdef WIN32 +extern _inline int create_part(int p, int x, int y, int t); +#else +extern inline int create_part(int p, int x, int y, int t); +#endif + +#ifdef WIN32 +extern _inline void delete_part(int x, int y); +#else +extern inline void delete_part(int x, int y); +#endif + +#ifdef WIN32 +extern _inline int is_wire(int x, int y); +#else +extern inline int is_wire(int x, int y); +#endif + +#ifdef WIN32 +extern _inline int is_wire_off(int x, int y); +#else +extern inline int is_wire_off(int x, int y); +#endif + +void set_emap(int x, int y); + +#ifdef WIN32 +_inline int parts_avg(int ci, int ni); +#else +inline int parts_avg(int ci, int ni); +#endif + +int nearest_part(int ci, int t); + +void update_particles_i(pixel *vid, int start, int inc); + +void update_particles(pixel *vid); + #endif \ No newline at end of file From 0d25cae647b2d0827c366165257c5e812a8d8ddb Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 26 Aug 2010 14:09:38 -0400 Subject: [PATCH 109/237] changed some defines to make more sense --- graphics.c | 4 ++-- powder.c | 20 ++++++++++---------- powder.h | 8 ++++---- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/graphics.c b/graphics.c index 0f6c0402e..21121839d 100644 --- a/graphics.c +++ b/graphics.c @@ -1192,7 +1192,7 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); } } - else if(t==PT_OILL&&cmode == 6) + else if(t==PT_OIL&&cmode == 6) { for(x=-1; x<=1; x++) { @@ -1450,7 +1450,7 @@ void draw_parts(pixel *vid) } } - else if(t==PT_GASS&&cmode == 6) + else if(t==PT_GAS&&cmode == 6) { for(x=-1; x<=1; x++) { diff --git a/powder.c b/powder.c index d6b71d927..ea07e0621 100644 --- a/powder.c +++ b/powder.c @@ -524,7 +524,7 @@ void update_particles_i(pixel *vid, int start, int inc) vy[y/CELL][x/CELL] *= ptypes[t].airloss; vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; - if(t==PT_GASS||t==PT_NBLE) + if(t==PT_GAS||t==PT_NBLE) { if(pv[y/CELL][x/CELL]<3.5f) pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); @@ -562,7 +562,7 @@ void update_particles_i(pixel *vid, int start, int inc) parts[i].vx *= ptypes[t].loss; parts[i].vy *= ptypes[t].loss; - if(t==PT_DFRM && !parts[i].life) + if(t==PT_GOO && !parts[i].life) { if(pv[y/CELL][x/CELL]>1.0f) { @@ -650,17 +650,17 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_WTRV && pv[y/CELL][x/CELL]>4.0f) t = parts[i].type = PT_DSTW; if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) - t = parts[i].type = PT_GASS; - if(t==PT_GASS && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_GAS; + if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) t = parts[i].type = PT_DESL; if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) t = parts[i].type = PT_FIRE; } if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) - t = parts[i].type = PT_GASS; + t = parts[i].type = PT_GAS; if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it t = parts[i].type = PT_FIRE; // combust under pressure. - if(t==PT_GASS && pv[y/CELL][x/CELL]>20.0f) + if(t==PT_GAS && pv[y/CELL][x/CELL]>20.0f) t = parts[i].type = PT_DESL; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; @@ -1146,17 +1146,17 @@ void update_particles_i(pixel *vid, int start, int inc) if((r&0xFF)==PT_WATR && 15>(rand()%100)) parts[r>>8].type = PT_DSTW; if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) - parts[r>>8].type = PT_DFRM; + parts[r>>8].type = PT_GOO; if((r&0xFF)==PT_NITR && 15>(rand()%1000)) parts[r>>8].type = PT_DESL; - if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + if((r&0xFF)==PT_OIL && 5>(rand()%1000)) parts[r>>8].type = PT_PLAS; if((r&0xFF)==PT_PLNT && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) - parts[r>>8].type = PT_OILL; + parts[r>>8].type = PT_OIL; if((r&0xFF)==PT_DESL && 15>(rand()%1000)) - parts[r>>8].type = PT_GASS; + parts[r>>8].type = PT_GAS; if((r&0xFF)==PT_COAL && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; } diff --git a/powder.h b/powder.h index 9757d5a4f..fa7543502 100644 --- a/powder.h +++ b/powder.h @@ -41,16 +41,16 @@ #define PT_NONE 0 #define PT_DUST 1 #define PT_WATR 2 -#define PT_OILL 3 +#define PT_OIL 3 #define PT_FIRE 4 #define PT_STNE 5 #define PT_LAVA 6 #define PT_GUNP 7 #define PT_NITR 8 #define PT_CLNE 9 -#define PT_GASS 10 +#define PT_GAS 10 #define PT_PLEX 11 -#define PT_DFRM 12 +#define PT_GOO 12 #define PT_ICEI 13 #define PT_METL 14 #define PT_SPRK 15 @@ -306,7 +306,7 @@ static part_state pstates[PT_NUM] = /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OILL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OIL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, From 07ade7ed72face5ece3408e953198b5ebcf1170c Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 27 Aug 2010 13:01:20 +0100 Subject: [PATCH 110/237] More work --- defines.h | 11 + graphics.c | 4 +- graphics.h | 2 + interface.c | 832 +++++++++++++++++++++++++++++++++++++++++++++++++ interface.h | 61 ++++ main.c | 875 +--------------------------------------------------- misc.c | 18 +- misc.h | 6 +- 8 files changed, 929 insertions(+), 880 deletions(-) diff --git a/defines.h b/defines.h index aa27b90d7..6f0dab383 100644 --- a/defines.h +++ b/defines.h @@ -11,6 +11,8 @@ #define YRES 384 #define NPART XRES*YRES +#define MAXSIGNS 16 + #define ZSIZE_D 16 #define ZFACTOR_D 8 static unsigned char ZFACTOR = 256/ZSIZE_D; @@ -36,4 +38,13 @@ extern int framerender; extern int mousex, mousey; extern int death; +struct sign +{ + int x,y,ju; + char text[256]; +}; +typedef struct sign sign; + +extern sign signs[MAXSIGNS]; + #endif \ No newline at end of file diff --git a/graphics.c b/graphics.c index 21121839d..226a98465 100644 --- a/graphics.c +++ b/graphics.c @@ -976,8 +976,8 @@ void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, dx = abs(x1-x2); dy = abs(y1-y2); - sx = sign(x2-x1); - sy = sign(y2-y1); + sx = isign(x2-x1); + sy = isign(y2-y1); x = x1; y = y1; check = 0; diff --git a/graphics.h b/graphics.h index 3932a2f68..e7f120d25 100644 --- a/graphics.h +++ b/graphics.h @@ -112,4 +112,6 @@ void xor_line(int x1, int y1, int x2, int y2, pixel *vid); void xor_rect(pixel *vid, int x, int y, int w, int h); +void draw_parts(pixel *vid); + #endif \ No newline at end of file diff --git a/interface.c b/interface.c index bb8f7cdd6..cb61054a0 100644 --- a/interface.c +++ b/interface.c @@ -1,6 +1,33 @@ +#include +#include +#include +#include "defines.h" #include "powder.h" #include "interface.h" +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; + +int svf_login = 0; +int svf_admin = 0; +int svf_mod = 0; +char svf_user[64] = ""; +char svf_pass[64] = ""; + +int svf_open = 0; +int svf_own = 0; +int svf_myvote = 0; +int svf_publish = 0; +char svf_id[16] = ""; +char svf_name[64] = ""; +char svf_tags[256] = ""; +void *svf_last = NULL; +int svf_lsize; + +int Z_keysym = 'z'; void menu_count(void) { @@ -12,4 +39,809 @@ void menu_count(void) msections[ptypes[i].menusection].itemcount+=ptypes[i].menu; } +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) + { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) + { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) + { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) + { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +void ui_edit_draw(pixel *vid_buf, ui_edit *ed) +{ + int cx, i; + char echo[256], *str; + + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(ed->str[0]) + { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } + else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) + { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} + +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } + else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) + { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } + else + ed->focus = 0; + } + if(ed->focus && sdl_key) + { + if(ed->hide) + { + for(i=0; ed->str[i]; i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } + else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) + { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } + else if(ed->cursor > 0) + { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) + { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) + { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) + { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} + +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) +{ + int w = 12; + if(ed->checked) + { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus) + { + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } + else + { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } +} + +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) +{ + int w = 12; + + if(mb && !mbq) + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->checked = (ed->checked)?0:1; + } + } + else + { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) + { + ed->focus = 1; + } + else + { + ed->focus = 0; + } + } +} + +void draw_svf_ui(pixel *vid_buf) +{ + int c; + + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); + drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + c = svf_open ? 255 : 128; + drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); + drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); + + c = svf_login ? 255 : 128; + drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); + if(svf_open) + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + else + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); + if(svf_open && svf_own) + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } + else if(svf_myvote==-1 && (svf_login && svf_open)) + { + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); + if(svf_tags[0]) + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + else + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); + + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); + drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); + if(svf_login) + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + else + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); + + if(sys_pause) + { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + if(!legacy_enable) + { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); + } + else + { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + + switch(cmode) + { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; + case 6: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xC4", 100, 150, 255, 255); + break; + } + drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(svf_admin) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } + else if(svf_mod) + { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? +} + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) + { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +void login_ui(pixel *vid_buf) +{ + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq,mx,my,err; + ui_edit ed1,ed2; + char *res; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed1.x = x0+25; + ed1.y = y0+25; + ed1.w = 158; + ed1.nx = 1; + ed1.def = "[user name]"; + ed1.focus = 1; + ed1.hide = 0; + ed1.cursor = strlen(svf_user); + strcpy(ed1.str, svf_user); + ed2.x = x0+25; + ed2.y = y0+45; + ed2.w = 158; + ed2.nx = 1; + ed2.def = "[password]"; + ed2.focus = 0; + ed2.hide = 1; + ed2.cursor = 0; + strcpy(ed2.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, "Server login:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\x8B", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\x8A", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + drawtext(vid_buf, x0+11, y0+44, "\x8C", 160, 144, 32, 255); + drawtext(vid_buf, x0+11, y0+44, "\x84", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+40, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed1); + ui_edit_draw(vid_buf, &ed2); + drawtext(vid_buf, x0+5, y0+69, "Sign in", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed1); + ui_edit_process(mx, my, b, &ed2); + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) + { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) + { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) + { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) + { + if(!strcmp(res, "OK ADMIN")) + { + svf_admin = 1; + svf_mod = 0; + } + else if(!strcmp(res, "OK MOD")) + { + svf_admin = 0; + svf_mod = 1; + } + else + { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +int sdl_poll(void) +{ + SDL_Event event; + sdl_key=sdl_wheel=sdl_ascii=0; + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_KEYDOWN: + sdl_key=event.key.keysym.sym; + sdl_ascii=event.key.keysym.unicode; + if(event.key.keysym.sym == SDLK_CAPSLOCK) + sdl_caps = 1; + if(event.key.keysym.unicode=='z' || event.key.keysym.unicode=='Z') + { + sdl_zoom_trig = 1; + Z_keysym = event.key.keysym.sym; + } + if( event.key.keysym.sym == SDLK_PLUS || event.key.keysym.sym == SDLK_RIGHTBRACKET) + { + sdl_wheel++; + } + if( event.key.keysym.sym == SDLK_MINUS || event.key.keysym.sym == SDLK_LEFTBRACKET) + { + sdl_wheel--; + } + // 4 + //1 8 2 + if(event.key.keysym.sym == SDLK_RIGHT) + { + player[0] = (int)(player[0])|0x02; //Go right command + } + if(event.key.keysym.sym == SDLK_LEFT) + { + player[0] = (int)(player[0])|0x01; //Go left command + } + if(event.key.keysym.sym == SDLK_DOWN && ((int)(player[0])&0x08)!=0x08) + { + player[0] = (int)(player[0])|0x08; //Go left command + } + if(event.key.keysym.sym == SDLK_UP && ((int)(player[0])&0x04)!=0x04) + { + player[0] = (int)(player[0])|0x04; //Jump command + } + break; + + case SDL_KEYUP: + if(event.key.keysym.sym == SDLK_CAPSLOCK) + sdl_caps = 0; + if(event.key.keysym.sym == Z_keysym) + sdl_zoom_trig = 0; + if(event.key.keysym.sym == SDLK_RIGHT || event.key.keysym.sym == SDLK_LEFT) + { + player[1] = player[0]; //Saving last movement + player[0] = (int)(player[0])&12; //Stop command + } + if(event.key.keysym.sym == SDLK_UP) + { + player[0] = (int)(player[0])&11; + } + if(event.key.keysym.sym == SDLK_DOWN) + { + player[0] = (int)(player[0])&7; + } + break; + case SDL_MOUSEBUTTONDOWN: + if(event.button.button == SDL_BUTTON_WHEELUP) + sdl_wheel++; + if(event.button.button == SDL_BUTTON_WHEELDOWN) + sdl_wheel--; + break; + case SDL_QUIT: + return 1; + } + } + sdl_mod = SDL_GetModState(); + return 0; } \ No newline at end of file diff --git a/interface.h b/interface.h index e37fa0ce0..4d97f6be2 100644 --- a/interface.h +++ b/interface.h @@ -63,5 +63,66 @@ static menu_section msections[] = {"\xCC", "Special", 0}, }; +struct ui_edit +{ + int x, y, w, nx; + char str[256],*def; + int focus, cursor, hide; +}; +typedef struct ui_edit ui_edit; + +struct ui_checkbox +{ + int x, y; + int focus, checked; +}; +typedef struct ui_checkbox ui_checkbox; + +extern SDLMod sdl_mod; +extern int sdl_key, sdl_wheel, sdl_caps, sdl_ascii, sdl_zoom_trig; +extern char *shift_0; +extern char *shift_1; +extern int svf_login; +extern int svf_admin; +extern int svf_mod; +extern char svf_user[64]; +extern char svf_pass[64]; + +extern int svf_open; +extern int svf_own; +extern int svf_myvote; +extern int svf_publish; +extern char svf_id[16]; +extern char svf_name[64]; +extern char svf_tags[256]; +extern void *svf_last; +extern int svf_lsize; + +extern int Z_keysym; + void menu_count(void); + +void add_sign_ui(pixel *vid_buf, int mx, int my); + +void ui_edit_draw(pixel *vid_buf, ui_edit *ed); + +void ui_edit_process(int mx, int my, int mb, ui_edit *ed); + +void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed); + +void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed); + +void draw_svf_ui(pixel *vid_buf); + +void error_ui(pixel *vid_buf, int err, char *txt); + +void info_ui(pixel *vid_buf, char *top, char *txt); + +void info_box(pixel *vid_buf, char *msg); + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn); + +void login_ui(pixel *vid_buf); + +int sdl_poll(void); #endif \ No newline at end of file diff --git a/main.c b/main.c index 82522795b..ce1d6347b 100644 --- a/main.c +++ b/main.c @@ -100,15 +100,7 @@ int legacy_enable = 0; //Used to disable new features such as heat, will be set int death = 1, framerender = 0; int amd = 1; - - -#define MAXSIGNS 16 - -struct sign -{ - int x,y,ju; - char text[256]; -} signs[MAXSIGNS]; +sign signs[MAXSIGNS]; /*********************************************************** * AIR FLOW SIMULATOR * @@ -153,9 +145,6 @@ int mousex, mousey = 0; //They contain mouse position * SDL OUTPUT * ***********************************************************/ -SDLMod sdl_mod; -int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; - #include "icon.h" void sdl_seticon(void) { @@ -222,106 +211,10 @@ void dump_frame(pixel *src, int w, int h, int pitch) frame_idx++; } -int Z_keysym = 'z'; -int sdl_poll(void) -{ - SDL_Event event; - sdl_key=sdl_wheel=sdl_ascii=0; - while(SDL_PollEvent(&event)) - { - switch (event.type) - { - case SDL_KEYDOWN: - sdl_key=event.key.keysym.sym; - sdl_ascii=event.key.keysym.unicode; - if(event.key.keysym.sym == SDLK_CAPSLOCK) - sdl_caps = 1; - if(event.key.keysym.unicode=='z' || event.key.keysym.unicode=='Z') - { - sdl_zoom_trig = 1; - Z_keysym = event.key.keysym.sym; - } - if( event.key.keysym.sym == SDLK_PLUS || event.key.keysym.sym == SDLK_RIGHTBRACKET) - { - sdl_wheel++; - } - if( event.key.keysym.sym == SDLK_MINUS || event.key.keysym.sym == SDLK_LEFTBRACKET) - { - sdl_wheel--; - } - // 4 - //1 8 2 - if(event.key.keysym.sym == SDLK_RIGHT) - { - player[0] = (int)(player[0])|0x02; //Go right command - } - if(event.key.keysym.sym == SDLK_LEFT) - { - player[0] = (int)(player[0])|0x01; //Go left command - } - if(event.key.keysym.sym == SDLK_DOWN && ((int)(player[0])&0x08)!=0x08) - { - player[0] = (int)(player[0])|0x08; //Go left command - } - if(event.key.keysym.sym == SDLK_UP && ((int)(player[0])&0x04)!=0x04) - { - player[0] = (int)(player[0])|0x04; //Jump command - } - break; - - case SDL_KEYUP: - if(event.key.keysym.sym == SDLK_CAPSLOCK) - sdl_caps = 0; - if(event.key.keysym.sym == Z_keysym) - sdl_zoom_trig = 0; - if(event.key.keysym.sym == SDLK_RIGHT || event.key.keysym.sym == SDLK_LEFT) - { - player[1] = player[0]; //Saving last movement - player[0] = (int)(player[0])&12; //Stop command - } - if(event.key.keysym.sym == SDLK_UP) - { - player[0] = (int)(player[0])&11; - } - if(event.key.keysym.sym == SDLK_DOWN) - { - player[0] = (int)(player[0])&7; - } - break; - case SDL_MOUSEBUTTONDOWN: - if(event.button.button == SDL_BUTTON_WHEELUP) - sdl_wheel++; - if(event.button.button == SDL_BUTTON_WHEELDOWN) - sdl_wheel--; - break; - case SDL_QUIT: - return 1; - } - } - sdl_mod = SDL_GetModState(); - return 0; -} - /*********************************************************** * STATE MANAGEMENT * ***********************************************************/ -int svf_login = 0; -int svf_admin = 0; -int svf_mod = 0; -char svf_user[64] = ""; -char svf_pass[64] = ""; - -int svf_open = 0; -int svf_own = 0; -int svf_myvote = 0; -int svf_publish = 0; -char svf_id[16] = ""; -char svf_name[64] = ""; -char svf_tags[256] = ""; -void *svf_last = NULL; -int svf_lsize; - void *build_thumb(int *size, int bzip2) { unsigned char *d=calloc(1,XRES*YRES), *c; @@ -460,18 +353,6 @@ corrupt: return 1; } -static char *mystrdup(char *s) -{ - char *x; - if(s) - { - x = malloc(strlen(s)+1); - strcpy(x, s); - return x; - } - return s; -} - void *build_save(int *size, int x0, int y0, int w, int h) { unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; @@ -1922,500 +1803,6 @@ int flood_parts(int x, int y, int c, int cm, int bm) return 1; } -void draw_svf_ui(pixel *vid_buf) -{ - int c; - - drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); - drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - c = svf_open ? 255 : 128; - drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); - drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); - - c = svf_login ? 255 : 128; - drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); - if(svf_open) - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); - else - drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); - drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); - if(svf_open && svf_own) - drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); - - c = (svf_login && svf_open) ? 255 : 128; - - drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); - - if(svf_myvote==1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); - } - else if(svf_myvote==-1 && (svf_login && svf_open)) - { - fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); - } - - drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); - drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); - - drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); - if(svf_tags[0]) - drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); - else - drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); - - drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); - - drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); - drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); - - drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); - if(svf_login) - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); - else - drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); - drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); - - if(sys_pause) - { - fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); - drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - if(!legacy_enable) - { - fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); - } - else - { - drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - } - - switch(cmode) - { - case 0: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); - break; - case 1: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); - break; - case 2: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); - break; - case 3: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); - break; - case 4: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); - break; - case 5: - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); - drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); - break; - case 6: - drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xC4", 100, 150, 255, 255); - break; - } - drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); - - if(svf_admin) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); - } - else if(svf_mod) - { - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); - drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); - }//else if(amd) - // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? -} - -typedef struct ui_edit -{ - int x, y, w, nx; - char str[256],*def; - int focus, cursor, hide; -} ui_edit; - -void ui_edit_draw(pixel *vid_buf, ui_edit *ed) -{ - int cx, i; - char echo[256], *str; - - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(ed->str[0]) - { - drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); - drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); - } - else if(!ed->focus) - drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); - if(ed->focus) - { - cx = textnwidth(str, ed->cursor); - for(i=-3; i<9; i++) - drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); - } -} - -char *shift_0="`1234567890-=[]\\;',./"; -char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; - -void ui_edit_process(int mx, int my, int mb, ui_edit *ed) -{ - char ch, ts[2], echo[256], *str; - int l, i; -#ifdef RAWINPUT - char *p; -#endif - - if(mb) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = 0; - ed->str[0] = 0; - } - else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) - { - ed->focus = 1; - ed->cursor = textwidthx(str, mx-ed->x); - } - else - ed->focus = 0; - } - if(ed->focus && sdl_key) - { - if(ed->hide) - { - for(i=0; ed->str[i]; i++) - echo[i] = 0x8D; - echo[i] = 0; - str = echo; - } - else - str = ed->str; - - l = strlen(ed->str); - switch(sdl_key) - { - case SDLK_HOME: - ed->cursor = 0; - break; - case SDLK_END: - ed->cursor = l; - break; - case SDLK_LEFT: - if(ed->cursor > 0) - ed->cursor --; - break; - case SDLK_RIGHT: - if(ed->cursor < l) - ed->cursor ++; - break; - case SDLK_DELETE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - ed->str[ed->cursor] = 0; - else if(ed->cursor < l) - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - break; - case SDLK_BACKSPACE: - if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) - { - if(ed->cursor > 0) - memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); - ed->cursor = 0; - } - else if(ed->cursor > 0) - { - ed->cursor--; - memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); - } - break; - default: -#ifdef RAWINPUT - if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) - { - ch = sdl_key; - if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) - { - if(ch>='a' && ch<='z') - ch &= ~0x20; - p = strchr(shift_0, ch); - if(p) - ch = shift_1[p-shift_0]; - } - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#else - if(sdl_ascii>=' ' && sdl_ascii<127) - { - ch = sdl_ascii; - ts[0]=ed->hide?0x8D:ch; - ts[1]=0; - if(textwidth(str)+textwidth(ts) > ed->w-14) - break; - memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); - ed->str[ed->cursor] = ch; - ed->cursor++; - } -#endif - break; - } - } -} - -typedef struct ui_checkbox -{ - int x, y; - int focus, checked; -} ui_checkbox; - -void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) -{ - int w = 12; - if(ed->checked) - { - drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); - } - if(ed->focus) - { - drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); - } - else - { - drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); - } -} - -void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) -{ - int w = 12; - - if(mb && !mbq) - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->checked = (ed->checked)?0:1; - } - } - else - { - if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w) - { - ed->focus = 1; - } - else - { - ed->focus = 0; - } - } -} - -void error_ui(pixel *vid_buf, int err, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - char *msg; - - msg = malloc(strlen(txt)+16); - if(err) - sprintf(msg, "%03d %s", err, txt); - else - sprintf(msg, "%s", txt); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - if(err) - drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); - else - drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - free(msg); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_ui(pixel *vid_buf, char *top, char *txt) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); - drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } -} - -void info_box(pixel *vid_buf, char *msg) -{ - int w = textwidth(msg)+16; - int x0=(XRES-w)/2,y0=(YRES-24)/2; - - clearrect(vid_buf, x0-2, y0-2, w+4, 28); - drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); -} - -int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) -{ - int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; - int ret = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - clearrect(vid_buf, x0-2, y0-2, 244, 64); - drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); - drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); - drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); - drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); - drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); - drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); - drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) - { - ret = 1; - break; - } - if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) - break; - - if(sdl_key==SDLK_RETURN) - { - ret = 1; - break; - } - if(sdl_key==SDLK_ESCAPE) - break; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - return ret; -} - int execute_tagop(pixel *vid_buf, char *op, char *tag) { int status; @@ -2827,137 +2214,6 @@ void execute_save(pixel *vid_buf) free(result); } -void login_ui(pixel *vid_buf) -{ - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq,mx,my,err; - ui_edit ed1,ed2; - char *res; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed1.x = x0+25; - ed1.y = y0+25; - ed1.w = 158; - ed1.nx = 1; - ed1.def = "[user name]"; - ed1.focus = 1; - ed1.hide = 0; - ed1.cursor = strlen(svf_user); - strcpy(ed1.str, svf_user); - ed2.x = x0+25; - ed2.y = y0+45; - ed2.w = 158; - ed2.nx = 1; - ed2.def = "[password]"; - ed2.focus = 0; - ed2.hide = 1; - ed2.cursor = 0; - strcpy(ed2.str, ""); - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, "Server login:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\x8B", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\x8A", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - drawtext(vid_buf, x0+11, y0+44, "\x8C", 160, 144, 32, 255); - drawtext(vid_buf, x0+11, y0+44, "\x84", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+40, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed1); - ui_edit_draw(vid_buf, &ed2); - drawtext(vid_buf, x0+5, y0+69, "Sign in", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed1); - ui_edit_process(mx, my, b, &ed2); - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) - { - if(!ed1.focus) - break; - ed1.focus = 0; - ed2.focus = 1; - } - if(sdl_key==SDLK_ESCAPE) - { - if(!ed1.focus && !ed2.focus) - return; - ed1.focus = 0; - ed2.focus = 0; - } - } - - strcpy(svf_user, ed1.str); - md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); - - res = http_multipart_post( - "http://" SERVER "/Login.api", - NULL, NULL, NULL, - svf_user, svf_pass, - &err, NULL); - if(err != 200) - { - error_ui(vid_buf, err, http_ret_text(err)); - if(res) - free(res); - goto fail; - } - if(res && !strncmp(res, "OK", 2)) - { - if(!strcmp(res, "OK ADMIN")) - { - svf_admin = 1; - svf_mod = 0; - } - else if(!strcmp(res, "OK MOD")) - { - svf_admin = 0; - svf_mod = 1; - } - else - { - svf_admin = 0; - svf_mod = 0; - } - free(res); - svf_login = 1; - return; - } - if(!res) - res = mystrdup("Unspecified Error"); - error_ui(vid_buf, 0, res); - free(res); - -fail: - strcpy(svf_user, ""); - strcpy(svf_pass, ""); - svf_login = 0; - svf_own = 0; - svf_admin = 0; - svf_mod = 0; -} - void execute_delete(pixel *vid_buf, char *id) { int status; @@ -4232,123 +3488,6 @@ void render_signs(pixel *vid_buf) } } -void add_sign_ui(pixel *vid_buf, int mx, int my) -{ - int i, w, h, x, y, nm=0, ju; - int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; - ui_edit ed; - - // check if it is an existing sign - for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) - break; - } - // else look for empty spot - if(i >= MAXSIGNS) - { - nm = 1; - for(i=0; i= MAXSIGNS) - return; - - if(nm) - { - signs[i].x = mx; - signs[i].y = my; - signs[i].ju = 1; - } - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = x0+25; - ed.y = y0+25; - ed.w = 158; - ed.nx = 1; - ed.def = "[message]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(signs[i].text); - strcpy(ed.str, signs[i].text); - ju = signs[i].ju; - - fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); - clearrect(vid_buf, x0, y0, 192, 80); - drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); - drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); - drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); - ui_edit_draw(vid_buf, &ed); - drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); - draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); - draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); - draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); - - if(!nm) - { - drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); - drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); - drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); - } - - drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); - drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) - ju = 0; - if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) - ju = 1; - if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) - ju = 2; - - if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) - break; - - if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) - { - signs[i].text[0] = 0; - return; - } - - if(sdl_key==SDLK_RETURN) - break; - if(sdl_key==SDLK_ESCAPE) - { - if(!ed.focus) - return; - ed.focus = 0; - } - } - - strcpy(signs[i].text, ed.str); - signs[i].ju = ju; -} - /*********************************************************** * CONFIG FILE * ***********************************************************/ @@ -4978,19 +4117,7 @@ int main(int argc, char *argv[]) if(!sys_pause||framerender) { -#ifdef MT - if(numCores>2) - { - pthread_t pth; - pthread_create(&pth,NULL,update_air_th,""); - } - else - { - update_air(); - } -#else update_air(); -#endif } if(cmode==0 || cmode==1) { diff --git a/misc.c b/misc.c index fe50b329f..ade3c3cbc 100644 --- a/misc.c +++ b/misc.c @@ -1,10 +1,12 @@ +#include +#include #include "misc.h" //Signum function #ifdef WIN32 -_inline int sign(float i) +_inline int isign(float i) #else -inline int sign(float i) +inline int isign(float i) #endif { if (i<0) @@ -38,4 +40,16 @@ inline float restrict_flt(float f, float min, float max) if(f>max) return max; return f; +} + +char *mystrdup(char *s) +{ + char *x; + if(s) + { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; } \ No newline at end of file diff --git a/misc.h b/misc.h index a42396dcd..556cc979b 100644 --- a/misc.h +++ b/misc.h @@ -3,9 +3,9 @@ //Signum function #ifdef WIN32 -extern _inline int sign(float i); +extern _inline int isign(float i); #else -extern inline int sign(float i); +extern inline int isign(float i); #endif #ifdef WIN32 @@ -20,4 +20,6 @@ extern _inline float restrict_flt(float f, float min, float max); extern inline float restrict_flt(float f, float min, float max); #endif +char *mystrdup(char *s); + #endif \ No newline at end of file From a23f3777314312f8dfb70b779258dbb2f948bd08 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 28 Aug 2010 11:40:49 +0100 Subject: [PATCH 111/237] Even more work, something broke though --- defines.h | 34 ++ graphics.c | 126 +++++- graphics.h | 11 +- interface.c | 788 ++++++++++++++++++++++++++++++++ interface.h | 14 + main.c | 1250 +-------------------------------------------------- powder.c | 297 ++++++++++++ powder.h | 10 + 8 files changed, 1284 insertions(+), 1246 deletions(-) diff --git a/defines.h b/defines.h index 6f0dab383..bbce8b243 100644 --- a/defines.h +++ b/defines.h @@ -1,6 +1,12 @@ #ifndef DEFINE_H #define DEFINE_H +#ifdef WIN32 +#define PATH_SEP "\\" +#else +#define PATH_SEP "/" +#endif + #define SERVER "powdertoy.co.uk" #undef PLOSS @@ -28,6 +34,22 @@ static unsigned char ZSIZE = ZSIZE_D; #define VLOSS 0.999f #define PLOSS 0.9999f +#define GRID_X 5 +#define GRID_Y 4 +#define GRID_P 3 +#define GRID_S 6 +#define GRID_Z 3 + +#define STAMP_X 4 +#define STAMP_Y 4 +#define STAMP_MAX 120 + +#ifdef PIX16 +typedef unsigned short pixel; +#else +typedef unsigned int pixel; +#endif + typedef unsigned char uint8; extern int legacy_enable; @@ -45,6 +67,18 @@ struct sign }; typedef struct sign sign; +struct stamp +{ + char name[11]; + pixel *thumb; + int thumb_w, thumb_h, dodelete; +}; +typedef struct stamp stamp; + extern sign signs[MAXSIGNS]; +extern stamp stamps[STAMP_MAX]; +extern int stamp_count; +extern int itc; +extern char itc_msg[64]; #endif \ No newline at end of file diff --git a/graphics.c b/graphics.c index 226a98465..8f5c6aeb6 100644 --- a/graphics.c +++ b/graphics.c @@ -1,5 +1,6 @@ #include #include +#include #include "defines.h" #include "air.h" #include "powder.h" @@ -16,6 +17,9 @@ unsigned char fire_r[YRES/CELL][XRES/CELL]; unsigned char fire_g[YRES/CELL][XRES/CELL]; unsigned char fire_b[YRES/CELL][XRES/CELL]; +unsigned int fire_alpha[CELL*3][CELL*3]; +pixel *fire_bg; + pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) { int i,j,x,y,w,h,r,g,b,c; @@ -1769,4 +1773,124 @@ void draw_parts(pixel *vid) blendpixel(vid, nx-1, ny+1, R, G, B, 112); } } -} \ No newline at end of file +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + char buff[30]; //Buffer + for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature + else + sprintf(buff, "Temp: 0.00"); //...tempirature + drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); + } + + //Usual text + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); + x = signs[i].x; + y = signs[i].y; + dx = 1 - signs[i].ju; + dy = (signs[i].y > 18) ? -1 : 1; + for(j=0; j<4; j++) + { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void render_fire(pixel *dst) +{ + int i,j,x,y,r,g,b; + for(j=0; j=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) #define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) #define PIXR(x) (((x)>>8)&0xF8) @@ -14,7 +13,6 @@ typedef unsigned short pixel; #define PIXB(x) (((x)<<3)&0xF8) #else #define PIXELSIZE 4 -typedef unsigned int pixel; #ifdef PIX32BGR #define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) #define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) @@ -46,6 +44,9 @@ extern unsigned char fire_r[YRES/CELL][XRES/CELL]; extern unsigned char fire_g[YRES/CELL][XRES/CELL]; extern unsigned char fire_b[YRES/CELL][XRES/CELL]; +extern unsigned int fire_alpha[CELL*3][CELL*3]; +extern pixel *fire_bg; + pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch); @@ -114,4 +115,10 @@ void xor_rect(pixel *vid, int x, int y, int w, int h); void draw_parts(pixel *vid); +void render_signs(pixel *vid_buf); + +void render_fire(pixel *dst); + +void prepare_alpha(void); + #endif \ No newline at end of file diff --git a/interface.c b/interface.c index cb61054a0..f40fadc85 100644 --- a/interface.c +++ b/interface.c @@ -1,6 +1,7 @@ #include #include #include +#include "font.h" #include "defines.h" #include "powder.h" #include "interface.h" @@ -41,6 +42,24 @@ void menu_count(void) } +void get_sign_pos(int i, int *x0, int *y0, int *w, int *h) +{ + //Changing width if sign have special content + if(strcmp(signs[i].text, "{p}")==0) + *w = textwidth("Pressure: -000.00"); + + if(strcmp(signs[i].text, "{t}")==0) + *w = textwidth("Temp: 0000.00"); + + //Ususal width + if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) + *w = textwidth(signs[i].text) + 5; + *h = 14; + *x0 = (signs[i].ju == 2) ? signs[i].x - *w : + (signs[i].ju == 1) ? signs[i].x - *w/2 : signs[i].x; + *y0 = (signs[i].y > 18) ? signs[i].y - 18 : signs[i].y + 4; +} + void add_sign_ui(pixel *vid_buf, int mx, int my) { int i, w, h, x, y, nm=0, ju; @@ -767,6 +786,735 @@ fail: svf_mod = 0; } +int stamp_ui(pixel *vid_buf) +{ + int b=1,bq,mx,my,d=-1,i,j,k,x,gx,gy,y,w,h,r=-1,stamp_page=0,per_page=STAMP_X*STAMP_Y,page_count; + char page_info[64]; + page_count = ceil((float)stamp_count/(float)per_page); + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) + { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); + k = stamp_page*per_page;//0; + r = -1; + d = -1; + for(j=0; j=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) + { + if(stamp_page) + { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=60) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else if(i==SC_SPECIAL) + { + for(n = 122; n<122+UI_WALLCOUNT; n++) + { + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) + { + if(x-26<=20) + { + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + else + { + for(n = 0; n=x+32 && mx=y && my< y+15) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } + else if(n==*sl) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } + else if(n==*sr) + { + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1) + { + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } + else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) + { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } + else + { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1) + { + *sl = h; + } + if(b==4&&h!=-1) + { + *sr = h; + } +} + int sdl_poll(void) { SDL_Event event; @@ -844,4 +1592,44 @@ int sdl_poll(void) } sdl_mod = SDL_GetModState(); return 0; +} + +void set_cmode(int cm) +{ + cmode = cm; + itc = 51; + if(cmode==4) + { + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + strcpy(itc_msg, "Blob Display"); + } + else if(cmode==5) + { + strcpy(itc_msg, "Heat Display"); + } + else if(cmode==6) + { + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + strcpy(itc_msg, "Fancy Display"); + } + else if(cmode==3) + { + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + strcpy(itc_msg, "Fire Display"); + } + else if(cmode==2) + { + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + strcpy(itc_msg, "Persistent Display"); + } + else if(cmode==1) + strcpy(itc_msg, "Pressure Display"); + else + strcpy(itc_msg, "Velocity Display"); } \ No newline at end of file diff --git a/interface.h b/interface.h index 4d97f6be2..14ae878a1 100644 --- a/interface.h +++ b/interface.h @@ -102,6 +102,8 @@ extern int Z_keysym; void menu_count(void); +void get_sign_pos(int i, int *x0, int *y0, int *w, int *h); + void add_sign_ui(pixel *vid_buf, int mx, int my); void ui_edit_draw(pixel *vid_buf, ui_edit *ed); @@ -124,5 +126,17 @@ int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn); void login_ui(pixel *vid_buf); +int stamp_ui(pixel *vid_buf); + +void tag_list_ui(pixel *vid_buf); + +int save_name_ui(pixel *vid_buf); + +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr); + +void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int my); + int sdl_poll(void); + +void set_cmode(int cm); #endif \ No newline at end of file diff --git a/main.c b/main.c index ce1d6347b..88b712c35 100644 --- a/main.c +++ b/main.c @@ -927,50 +927,9 @@ corrupt: return NULL; } -/* NO, I DON'T THINK SO - #include "fbi.h" - - pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) - { - unsigned char *tmp; - pixel *res; - int i; - - tmp = malloc(width*height*3); - if(!tmp) - return NULL; - res = malloc(width*height*PIXELSIZE); - if(!res) { - free(tmp); - return NULL; - } - - i = width*height*3; - if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { - free(res); - free(tmp); - return NULL; - } - - for(i=0; i0) { - memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); - memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); - memcpy(stamps, &tmp, sizeof(struct stamp_info)); + memcpy(&tmp, stamps+i, sizeof(struct stamp)); + memmove(stamps+1, stamps, sizeof(struct stamp)*i); + memcpy(stamps, &tmp, sizeof(struct stamp)); stamp_update(); } @@ -1172,637 +1119,6 @@ void del_stamp(int d) stamp_init(); } -void menu_ui(pixel *vid_buf, int i, int *sl, int *sr) -{ - int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; - pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); - fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); - memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - while(!sdl_poll()) - { - bq = b; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - rows = ceil((float)msections[i].itemcount/16.0f); - height = (ceil((float)msections[i].itemcount/16.0f)*18); - width = restrict_flt(msections[i].itemcount*31, 0, 16*31); - //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); - h = -1; - x = XRES-BARSIZE-26; - y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; - sy = y; - //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); - fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); - fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); - drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); - drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); - if(i==SC_WALL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=60) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); - if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else if(i==SC_SPECIAL) - { - for(n = 122; n<122+UI_WALLCOUNT; n++) - { - if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM) - { - if(x-26<=20) - { - x = XRES-BARSIZE-26; - y += 19; - } - x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; - if(!bq && mx>=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - else - { - for(n = 0; n=x+32 && mx=y && my< y+15) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - h = n; - } - else if(n==*sl) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); - } - else if(n==*sr) - { - drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); - } - } - } - } - - if(h==-1) - { - drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); - } - else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) - { - drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); - } - else - { - drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); - } - - if(b==1&&h!=-1) - { - *sl = h; - } - if(b==4&&h!=-1) - { - *sr = h; - } -} - -int create_parts(int x, int y, int r, int c) -{ - int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; - - if(c == 125) - { - i = x / CELL; - j = y / CELL; - for(v=-1; v<2; v++) - for(u=-1; u<2; u++) - if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; - float e, de; - if(cp) - { - y = x1; - x1 = y1; - y1 = y; - y = x2; - x2 = y2; - y2 = y; - } - if(x1 > x2) - { - y = x1; - x1 = x2; - x2 = y; - y = y1; - y1 = y2; - y2 = y; - } - dx = x2 - x1; - dy = abs(y2 - y1); - e = 0.0f; - if(dx) - de = dy/(float)dx; - else - de = 0.0f; - y = y1; - sy = (y1= 0.5f) - { - y += sy; - if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) - { - if(cp) - create_parts(y, x, r, c); - else - create_parts(x, y, r, c); - } - e -= 1.0f; - } - } -} - -void create_box(int x1, int y1, int x2, int y2, int c) -{ - int i, j; - if(x1>x2) - { - i = x2; - x2 = x1; - x1 = i; - } - if(y1>y2) - { - j = y2; - y2 = y1; - y1 = j; - } - for(j=y1; j<=y2; j++) - for(i=x1; i<=x2; i++) - create_parts(i, j, 1, c); -} - -int flood_parts(int x, int y, int c, int cm, int bm) -{ - int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) - { - c = c-100; - } - if(cm==-1) - { - if(c==0) - { - cm = pmap[y][x]&0xFF; - if(!cm) - return 0; - } - else - cm = 0; - } - if(bm==-1) - { - if(c==30) - { - bm = bmap[y/CELL][x/CELL]; - if(!bm) - return 0; - if(bm==1) - cm = 0xFF; - } - else - bm = 0; - } - - if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) - return 1; - - // go left as far as possible - x1 = x2 = x; - while(x1>=CELL) - { - if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) - break; - x1--; - } - while(x2=CELL+dy) - for(x=x1; x<=x2; x++) - if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) - if(!flood_parts(x, y-dy, co, cm, bm)) - return 0; - if(y=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) - { - if(stamp_page) - { - stamp_page --; - } - sdl_wheel = 0; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; -} - -void render_signs(pixel *vid_buf) -{ - int i, j, x, y, w, h, dx, dy; - char buff[30]; //Buffer - for(i=0; i>8)>0 && (pmap[signs[i].y][signs[i].x]>>8)>8].temp); //...tempirature - else - sprintf(buff, "Temp: 0.00"); //...tempirature - drawtext(vid_buf, x+3, y+3, buff, 255, 255, 255, 255); - } - - //Usual text - if(strcmp(signs[i].text, "{p}") && strcmp(signs[i].text, "{t}")) - drawtext(vid_buf, x+3, y+3, signs[i].text, 255, 255, 255, 255); - x = signs[i].x; - y = signs[i].y; - dx = 1 - signs[i].ju; - dy = (signs[i].y > 18) ? -1 : 1; - for(j=0; j<4; j++) - { - drawpixel(vid_buf, x, y, 192, 192, 192, 255); - x+=dx; - y+=dy; - } - } -} - /*********************************************************** * CONFIG FILE * ***********************************************************/ @@ -3624,52 +2489,6 @@ void dim_copy(pixel *dst, pixel *src) } } -unsigned int fire_alpha[CELL*3][CELL*3]; -void prepare_alpha(void) -{ - int x,y,i,j; - float temp[CELL*3][CELL*3]; - memset(temp, 0, sizeof(temp)); - for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; - fire_g[j][i] = g>4 ? g-4 : 0; - fire_b[j][i] = b>4 ? b-4 : 0; - } -} - int zoom_en = 0; int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; int zoom_wx=0, zoom_wy=0; @@ -3798,47 +2617,6 @@ char *tag = "(c) 2008-9 Stanislaw Skowronek"; int itc = 0; char itc_msg[64] = "[?]"; -pixel *fire_bg; -void set_cmode(int cm) -{ - cmode = cm; - itc = 51; - if(cmode==4) - { - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - strcpy(itc_msg, "Blob Display"); - } - else if(cmode==5) - { - strcpy(itc_msg, "Heat Display"); - } - else if(cmode==6) - { - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - strcpy(itc_msg, "Fancy Display"); - } - else if(cmode==3) - { - memset(fire_r, 0, sizeof(fire_r)); - memset(fire_g, 0, sizeof(fire_g)); - memset(fire_b, 0, sizeof(fire_b)); - strcpy(itc_msg, "Fire Display"); - } - else if(cmode==2) - { - memset(fire_bg, 0, XRES*YRES*PIXELSIZE); - strcpy(itc_msg, "Persistent Display"); - } - else if(cmode==1) - strcpy(itc_msg, "Pressure Display"); - else - strcpy(itc_msg, "Velocity Display"); -} - char my_uri[] = "http://" SERVER "/Update.api?Action=Download&Architecture=" #if defined WIN32 "Windows32" @@ -3955,20 +2733,6 @@ corrupt: return NULL; } -void clear_area(int area_x, int area_y, int area_w, int area_h) -{ - int cx = 0; - int cy = 0; - for(cy=0; cyx2) + { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) + { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT) + { + c = c-100; + } + if(cm==-1) + { + if(c==0) + { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } + else + cm = 0; + } + if(bm==-1) + { + if(c==30) + { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } + else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) + { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(y=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) + { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) + { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) + { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) + { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } } \ No newline at end of file diff --git a/powder.h b/powder.h index fa7543502..a12c37a84 100644 --- a/powder.h +++ b/powder.h @@ -456,4 +456,14 @@ void update_particles_i(pixel *vid, int start, int inc); void update_particles(pixel *vid); +void clear_area(int area_x, int area_y, int area_w, int area_h); + +void create_box(int x1, int y1, int x2, int y2, int c); + +int flood_parts(int x, int y, int c, int cm, int bm); + +int create_parts(int x, int y, int r, int c); + +void create_line(int x1, int y1, int x2, int y2, int r, int c); + #endif \ No newline at end of file From c0563111f822f5253264c7805917a864e1ddda5d Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 29 Aug 2010 10:25:53 +0100 Subject: [PATCH 112/237] Include some headers and move some functions --- interface.c | 4 ++++ main.c | 34 ---------------------------------- misc.c | 28 ++++++++++++++++++++++++++++ misc.h | 12 ++++++++++++ powder.c | 1 + 5 files changed, 45 insertions(+), 34 deletions(-) diff --git a/interface.c b/interface.c index f40fadc85..d5d87e548 100644 --- a/interface.c +++ b/interface.c @@ -1,10 +1,14 @@ #include #include #include +#include +#include "http.h" +#include "md5.h" #include "font.h" #include "defines.h" #include "powder.h" #include "interface.h" +#include "misc.h" SDLMod sdl_mod; int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; diff --git a/main.c b/main.c index 88b712c35..e30a97260 100644 --- a/main.c +++ b/main.c @@ -1167,40 +1167,6 @@ int execute_tagop(pixel *vid_buf, char *op, char *tag) return 0; } -struct strlist -{ - char *str; - struct strlist *next; -}; - -void strlist_add(struct strlist **list, char *str) -{ - struct strlist *item = malloc(sizeof(struct strlist)); - item->str = mystrdup(str); - item->next = *list; - *list = item; -} - -int strlist_find(struct strlist **list, char *str) -{ - struct strlist *item; - for(item=*list; item; item=item->next) - if(!strcmp(item->str, str)) - return 1; - return 0; -} - -void strlist_free(struct strlist **list) -{ - struct strlist *item; - while(*list) - { - item = *list; - *list = (*list)->next; - free(item); - } -} - void thumb_cache_inval(char *id); void execute_save(pixel *vid_buf) diff --git a/misc.c b/misc.c index ade3c3cbc..a74b0e449 100644 --- a/misc.c +++ b/misc.c @@ -52,4 +52,32 @@ char *mystrdup(char *s) return x; } return s; +} + +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} + +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list; item; item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} + +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) + { + item = *list; + *list = (*list)->next; + free(item); + } } \ No newline at end of file diff --git a/misc.h b/misc.h index 556cc979b..e27909336 100644 --- a/misc.h +++ b/misc.h @@ -22,4 +22,16 @@ extern inline float restrict_flt(float f, float min, float max); char *mystrdup(char *s); +struct strlist +{ + char *str; + struct strlist *next; +}; + +void strlist_add(struct strlist **list, char *str); + +int strlist_find(struct strlist **list, char *str); + +void strlist_free(struct strlist **list); + #endif \ No newline at end of file diff --git a/powder.c b/powder.c index d1c832120..0f31577ac 100644 --- a/powder.c +++ b/powder.c @@ -463,6 +463,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(i=start; i<(NPART-starti); i+=inc) if(parts[i].type) { + //printf("parts[%d].type: %d\n", i, parts[i].type); lx = parts[i].x; ly = parts[i].y; From 0b072510f0e8b7dc4944fb367ca42c8ec92503dc Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sun, 29 Aug 2010 12:41:45 +0200 Subject: [PATCH 113/237] changed makefile --- Makefile | 2 +- interface.h | 5 +++-- powder | Bin 0 -> 335738 bytes 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100755 powder diff --git a/Makefile b/Makefile index c02fb2eb5..1e1860a63 100755 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SOURCES := powder.c http.c md5.c update.c +SOURCES := *.c HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L diff --git a/interface.h b/interface.h index 14ae878a1..6fa96ef10 100644 --- a/interface.h +++ b/interface.h @@ -1,6 +1,7 @@ #ifndef INTERFACE_H #define INTERFACE_H - +#include "http.h" +#include "md5.h" struct menu_section { char *icon; @@ -139,4 +140,4 @@ void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int sdl_poll(void); void set_cmode(int cm); -#endif \ No newline at end of file +#endif diff --git a/powder b/powder new file mode 100755 index 0000000000000000000000000000000000000000..1dbdac4cef7ff407f16f91e11953c4890263d951 GIT binary patch literal 335738 zcmdpf3wTu3wf{^Wknr#X1Vuy>?bs$3ZKBwc3Yr6FbfOcb6%<=6U`XmzUWG)tElT1{ zgwyc=t+v|MR{pK`)@yCCtwm6TnLr+(LWqh8DB(Sa@Ccv~UYY;zxA!@d6G-sU$GzX3 z?>lq$d#}Cr+H0@1_T$X)`fo{cyIuA#$#s*9z6qBWh#>jza@BvBBK-U-a1C{(;s0{i zrLJ!9r;0GfFs`7(J7N`Wztcpl%ax3`C^5+jNGgyH>pf8VT=v_BkZ;!4{wuJY^8NgB z38(#bxw1q&^AXk;toRp}PZHtwyERjIT|*1LDjilng2#LfR=x%+U*gSz8E?Jq_7Ms` zgRJ%qN-BVl{sO+N(%at>YL{!&?y^aAzwopSdEseIq_^MCTM6yA<#l}v`3UD{{n>DS zZF1oLuT7qG&E&w;@>$o+8v6BXzCPsInbWSl4h6C73_NVwt#^#UzsqIgqp$F}TqE(m z!*Zuv@2}%M49^XCF30mVJVWq|z@y^nkLOxE{N0X+bzP5#W#!=EuO}X_aJgJx!JFOV z!{fKYF2wsLJXcwMzDO&?)^K_pzZ>EHvgP+!?`*uUwA?pa@7t{RH?6nxRRGUWE1a{Kl`0Od%O*X`w9^v|1Q8Q56?AtzJ%viJp5garw~srJ^1yIFV`UJ?W9wV zwu`KAzSu^V!@8MnUd@$mS4u%ohOvLxuGe<{Z1!y_f4O<2_r3j_emHi}&?DhN%Z$Sp zG{19*Aa(lNj{-Yu??MoCXW<9B2p`Zz_|h)QAK69v7@+K|UiM#BCoSMO>MZ>2F6zzg zqTWSaq~Fv<`d(dxhq@@|nJ&Wb?xLKZb&-Bq7wNy=Mfeurr!#!M-$nV4b&>vL7vZ;c zQO+k_z|+u0IC)5CaGvNQeRUVmvN2F3S0F7wI#*2>(tO<@~ja^jCC|zIzwxAL%0f zi7vvQ>Y{)5c2WL_F2e8YB78*`^_F#!epeUi|K0_hgdHh#Qo{A~}7|8~ju12fA?W{jLXapugDnXd7rfvEx4i0@oC{{A10C@(D?J&pe( zr%jnYqh#jHb0V~oVmoR)GM2ee;a!^ln!Ia8rMWJ6#*djgd0O#8>&qCH#d1SAaKt5{oY>mR3z?2eK`BVt}54xs2I4Lm01>{TyeqF^6Oqn)`dCI0ub`{Go_$ITulBtti z-!CbfIB61~D4ph-QZi*GARIrwWX6oC)5atFM1i%^nI$C;qQv5dn1pqg7Ehiwv&1!H zB1#Ztmrr(0k%iAFnKJF65`<1dDFkDZfU5N283CZUlmQ5xIuQUPXYm6wT%|S=W|Sb( zf~B;0Y8lEbnPQbTLn4Ogv?z7T#K2URR|0^GXH6WB-kK#zZHh#AaYA^ov$VeneT_<}u7?^Bw9A)bZ?Jy_KGN zj13dx8XVyg12V@ZN4N!|h-h+z+d2>us<`H^C9^)ZZR(ggbTN>5g!x9y-erZtJkDqrwqx+khB8&k;@? z*8VMYgxh*1owkl9NBEZ=>0^%YuQ>Xk#_p0K5zfh9O2a6 z?O%o?oOS~HH^322JAwVna)jHqAjV}o!oOxG#yi&$Zrc?YJ=76STZH{9aD-E~v41{C zIBib$ZL9pOGZ5btLk;k3!wzeSF4r@ib2M>y?k_U~m!xNR?E+)_t)ft?udh$CEe zgx5R5M>xV89N{A!;hP-cnj^f)5$<(_#~k6eIKq9w{b{jZr(lA(8q-2-_mX6nFSt5w zRs4p({=wslU-b(9mCORT=zoAY&89ehSG`C-rz*2S_*}h=QLwZ7ycRab1F3_2>%c0#~kf4M+yJ^^m9rw z3xxkW^m8gQbA|ug^m7U_vxNUP`Z@KO8Nxq;eoi^2OZdM@Kc^bAr40dBT}MBs7_&+E zucn_9hAm@f-|U-~(Pn2UtJ2mPEn%!R_AL_entvqJb!{ulh5 zD$MD^e}sNc5#|Kp-$y^E26L3~@1UPkf>|K^o9X9NVCD*cBmJBL%q-zwOFvn^nIZhu z^poYAF5!QTezJPAoqfke+2zxxu#3_zezt?t=V!~^gsP%v1XI-Urj$*tJxs@ zSJF?GYDR>AApK;e=F7t0mwvKPbCK}(pr5SMTqyiW^pj$hVS|G z9lqeMmQkY%>mo0|J<{c?i)M*eUCZ?&T(P+TS4WQeV2+Lz?QbM z9`&q=H?3Lagl^%&rTw<#4|{F?fB$iKUFzh6Uv)ihTz<2jdN*8p|Iz$U{kCwA692-T zD&2R8SU>&&K%##29_5~6$~}$h>%TfP!X^$p<~tu7~19&?wka(_J>N0p3ge*713 z^*YUy_Cjq51Fo8i08PoR!PEaSxRvbFaQ2=Hr)p@PxVkh2S#{0R&lg6vV3XpD#*);W zh+mHewYQoQGg$3Dsw(5Q0L*Sjm2t^r#Bd+LWWp*pGa{ReY~Pg4KA}A65FKu{Je7_VAz770&=DZ%(aOKcYtW zCEa2S`#Az!-m16~`a2xA87Vop8RK%?ej^2a_W%MyIS+u=ebJpsKI4xTz=Sk!jn5cX zC19>xMWFK{l75uz>R{BZWUp2FrgR4mH!FR6byKnjB`X(c-P1Is@3>T#a*@AVnyTEp zSyL_=mzt)Giz2;>glP3eeix#~y{U{{tBj2zQB)bbNy!-mI*nwg`D-8kt>!-I%{k%C zZ&O0Q0MLcS9~&d$0`I=SF?RVaMz0>eXM9Eq@Rc!0Gz6Y4K7AG10mKg)(44xE`1KX9 z1$Gg4fzRmGQ_EjVgv$&z%2N!s5qM7#jYWaIs@Pn_-wW)H{m8<0orP@~TmJvl;A*$8 z5~RZZF08B(q!>IsL8*EP%v62-c@SP+1jP+M{^w*tlSlE^j0tXkaiq|q8&$~&Ka1pr z#ru7MGc2hn5MfC^W1a>ee8xi2C8?qx0tZA?WgX!wG@hwgwE#6oTo*5J`3-|FUu6vg z&1X@BrYyP3tyY|LE1^E1)q;w)G$qs>E`-5#21yXsT?r-2Ft|RD*~Tylvb`XaAn|YE zlG&b0WZNafknIRurQlgnP$?<38V~3{xXN7!O7R72@Q%0(^WRiL?;xp?{g#p)RhC>2 z$}VPY<{R#e{168oLsGr!Ye-DTW!G7b{x?{T-h(X1@MO!8+7?4%5Zna_ z(8993qsrB`qff}g-c!*RMaA`+9`Y=Qw=fVT=zg19Efl0C*pv_Ka46zQb$)%eC)=lw z_T>7F3Q2KGNou}e4C8B|Aih)v_>rl=Uo0zS30cfKfLVPYdzMugXknFi8Yz(?eHCgJ zxg|aOQsWn)ROB1$Lm|XYA;$Eb7}H3mkkh15GTy zFuFYj44O6GY4l3->rZ%IhP%jk#l!4H#!DXNFRWb6{Ah$*3?u=K-&iPGXF)UCGl3vY z&ub(A59CG6VoVp39|GfJK-2rc3irXSkZ~MRvbP`gD)+_^(2W6mmF!I*-Gg+KuJ^z( z_5iY&@O&hbB4js0VhP`eEHb!UAmKjEC~z}oKgeP10cJ!|`;mLUlHEl2F1U9pkN1ay zfm+9Tz>1e#O4=#&a5~up=eAVm`bz}61{ePEYI6nu!_$%5wZJ%l&` z0-Fy6veX^S%80$J=70c@wKno^E&r;K@LfD_GOh-xu5Lk*m(Bfe^4@zl!+q6{rF%Qv zFNu)=oerWh$a0E`PjGPEX$*@qXc2-6qkB_GGPC?)8Q@Qbhm{h!SA(AIU|EC;hFMg+ z265vyBGtV&EO|jRp#Puw)|5VF$gPYsm27atjBB13vExi&>HxULOP&hUNoi#88zga- z0Ghma10Fvz0#65y-lE()_ze<1THptlScEJ^ZZu}B>_e3Myr%+zOuh%nGlqy6mW6$c zvhVeXiISrcV~&FiF=IawLkz_c5y&}qHxjr7C^9!iBs*h1;2~U_8Q)LF6G{}`OU}Y5 z;2(L5m-Q^LUjdBjRcWyrJFj!i7nCi*#W^j>3gL z$S6I{|NHolk>lkM6Ygyswir%eR%Bj4@E$lIOo0`lFAr8ll+bS=>kemUDxsgji5in+ zg(3K4g+G!mR5%tcR&_0F5@VJ=DMU4)*q!ta@-TK2{>FZY{v1x(PFXMj?Ly(Vxyj(v z3XHZ;DuUoblTMu!F4S-Vy9_Ounqo6Vwm~vO7Ct3~g$sU2?<9}#OP)A)KZ;o>kk=iU z0bjhG<)fxn(E`?VP`XglyKIYKprBBJJ8-9VRypl7QH0SZc&Bpj)YE9+eq!uWWVA4r z0Vmn7T5$@J@($5do1uz{fedvg=LErs0XYSm50wSK0i`W$_kH`>`7X4xIL5Iw09X>My`=Eu@CwWcC5=bwi@F>YgfHsC%@PEL+Lmo2d9J zvR;AoZLHxE0R#Hv5CQm_=uKPc%Cu z#SC}7gS!E}3C@OD3*MB3meI-lW!{J~ExDC#ct8r9zl1akAVVMr3>}CYXoxjKZl_xe zHBuGaa-5mJkXbaOzqbEGD6r^})O+z(9{-3vdu?yO4D7Foz}*N$lHOm3&)f@7qCUb= zAmR88WZ8wBmC05FPC>qqYuK$~(iXEdhl%-TB$asOcrXvO%j3xSRG)&Y9t1>VpXgI@ z;Ug~dOC9Tjz$Jz9Trh-%fQqatLlG5cK;`^E)P=V0WrJ;|MqXy|G4pz4wDCpw$4dAw z0~9O|LXwz;+R4$9hB}OJfnjr?fE;*aIX+p=B~aZG_z~q%u-Po|AX$cxdCYc>!FX9- zCi04LrBmt6W`=a=v??I!?V${hm6$-3X-KQ?*7|X-1E^OPNOv(rXOM@D+a) zp6nT_>Gi6yPG|+GKdyaN`eO0tMGqk1rYu?bY^1j1=h!k^rR-XI=*ub1*RlnLBI#7P0 z4DJQd&JO=7RZ93{^`@`&7q0_wm%z6eb_f9I((9s!G7Ca+0=NqR3IKXm zwh2I!HT^;_fWJ@%_o_T0f>ShojF3bsYwBU}_f@XqE5D)quMSMZIOnv_jbQ`sQs#$& zX&OC>KMK~m1JwkZwh}Gb{W?$rJ!kM-$)cRVUBNoHz+^Nfe|`Cz(D_-n1Y65rRsPHG-nUAQfAt=l8hj9l zTlF%}$IuB|e7fHg)1X|vtHHHNS>i@aQz%k4(c*u@dMKg4p%KHf%{e~hH-dR0 z3u4K9Ke|;5kMl%)m^>Os=Db^|w`qDT8p}|X#j7=C@k!V!hx+xHTDe=~TC!RLl`LnbO-vG<>{*`X zRTl4OT4gZ?sOqjm6PK&eLusn}J#dROun;x6H%&`#)zV|C-VMYUZA*ei1@n`T*tPt3 z$_lCuC{Rz(kXEHZjoNA2{y&*(J9OIhUWig(Id!cs~dmN6Dome z4$ReJx!(oJ`VUkM#`36=#nP$$DA!3R8WcYL%v~6Z z)zOog>hTk>WK;CUNXX!*Nb|vVQGo!z#kW!3Fy!tT2YkcqOv>U`g!`j=lYGVT*k!vg z8_f3jg)QZQFiS$Wrz!KfACu%W%%@NGjLJIz+8c+Wu~g8MB#az1fImRj1aN6(aV@xq z6*a4{IBL5Ke8si4djKjL=2GV8vuI#o6pNUUw+2OX`3WGvZp0F^K$qUCHOhQ$Eb;@W zTyNfiytp@Si#M;)n-@{_{i?pLxi9&;3cH~{xeVf7{@Z2aMjGR;f<4s_!*>3*M|Ywe zV^CWDM~~)&2Ucw<`;z`4_)zpfhUx}WI8?b)P?>w5>fVx=pM_#aUSD6n+F5q_^Fc_| z`fg1>_2@8FKdo*!eXEg@a;wp=->t@=L7HBz=@E3x@wlcpvU~K1rZ>>HS@;mW>3Cd) z?HMi4QUww2Nb{yQ5D5jEdyO}Jlcpz8Ap|W9#@Y*#`P|Sck$zbIXwP7!DhA3y=MdR`bocj(68@}CG8|fOg(jDfeS;n$o+}(>Zk#wSii{sPX=gX zEfDwd?h;{MxG_5VVO%^6oZUG_)SDN__%@S3YML>~5P*O`JmYsa`HUfthf~XSkIS34rYcfoOwUl}N036|w`z+r z|99|ttG4*{YM7~AHpEw4Q)u+7Ftlrg zypi&_#V@sRUlgP1;6Hsi2sC{Zm~kX6zj@BCaO#qI9*p#;+wVT8=0}w$ZXsvJSk`U? z(#mrD$(m|A#Iq0NIr;bk64v=!2CL@lK2Y_zXY%)m3228A##^4G*6w)zcu4~ZdHFD zGf*aU!!>v!>fLatW4!u@6kolexJv1_>R0TC5GJ0V!clp04k=(k72Im&sba`Bb7o6H zOd`{0S`YWQ+}lLNRW0Jl?FvdtUVWdSGP zI<3kQqWb||lUH9I*urR8+|J6K0=i9@#36^P`Z1vpP|(;9r0!Cx1Yw6T)_#dh!zDiF z6WlgJsVsO5ZYi?6j|$;@&~rY0oTnvxDdrbAHlfopyn#6DeDH(msxc@NaALBLHm5~* zW+278YG9jyh;4Fjg8;=m02We=_rccbXp#gOk!s~$!YkrvXlOy|cU3(zxX-Q3`wKc7 zs)rvdx~H4W+z1&Nz&%Y8+#KDP5oly3?jy<)RJl!7iO~?N(ZJsnP>77S`(gRs)AEP*10Aw_Q>!vCn5 z23-~l=RI#RQh<09l)Of*Y?5>v)q6PDpyYo}eT`DVST2P?A{`9*Wf*3=0wwebjI#O> z{jlB=H8Y_rCPSEUV`WkE3{sa}idutB?owr{-!mwu-sn}a;bb5Z%LObuQjH%Z8NH0h zFf`oNsdxVsYbeFL{lzWlK$M(yyP=b&fk##G<~fGj`Bb}r<(gI^3TlJ z_XhWm<($zEMGqxmf_(!%&X{FiDl~@tBySDmOiWIt%A9VeTQ;--eMceWS8ut+Hfe^k9b3@7qSN9~$Ks82$SA!t)9cTX~X4%w8kJ znsR3~rO&)LCRnUXmtE_F=$=_2c`70#)~BkKswNnIsVwrH7gq&%6| znCS0n^!Hv>cjvsX>QwSz>WN^VOyk45)fLR|&DrSHTU2cGxy8Vm7DK9bmEBJ21=;OylqUgfuFu_8Nb2eL%?v_e|*hi6nr2LRkH0X9? z$c?_@H9m^Z?l+P6dSL0-KI7TzGhVjkJmiwprqk+2dh_LPE;k|CjCG7@=zdw~h#u@9 z%_#3n@fVK!E&yJFb*X_h>=OuL-2!ppGPK?aYfN1(2b zu&Ss_d7XJj7{k&LYWa*udV^^xNNFe246gzOEe-ta0sGIo2U(CY(Z^~k~&lf4`$Oi5t(k~^@1U~*LQ3sS_7~X zt${b);k8=Lo(k6Wkp1CqbD!vdWMjxT9oQTKRNJVv5WxNoMtjOGbgy;Squ_?ama-p8=NY&rN zte^#Jl7g*$l*dib5}BNs3BcLq@VUcy<@e8y%D~2p<(@D1!z3i82rxS_rYJ!^6@31} z4Di5E@Tq6g|oE`LmL`O<|6{;nBgEe5aUZ+keVzD^de=A6>>ZGy>T^;?Yf z17%;9Ox}|B&*t+nEoYxMzghD6*7NiET8rIt?D%g4CswLPfYU?s%e@>{kgOLm6Dd`H zg@xXzdi>H9m+|wvu1cYvM6AofRW%pk?PIOV=;)o_(R<>u4v9~8^tN^M#yff^XLZOs zrK5LRNAL8G-fdTQ$lKJ>yWQ!vxkS~s(NyE--)e8Lput4DYrfK<$l8wH>We+pG5>3S#_)o) z^2@#0M`w*T(~H%#PMOd@w@cpX+1@2mF0kdyc0Tk!+AlYMv3^ni!G2+WyIbB3Vj z7u@AoHJ0lM5qGfl(((gPQGJ!7X~7dp`C79Ta)w=0A-20x+S2Pcv_c)ntl=wefF^Mf zRgYjKNfwnBY#sRM;b0WHMC~ppZ7k<)^W}e1IS+i1a(bNu4-PB*z5!SfTf4E^i5}MU z0vMDF((v@c1M65pKRg5QVCAMD3y%j+HXbmZf?QuJ1-0NwrF^A1g9@I7@P7nLKjBWH zPCD+2M8_#y&-&DUd($j%l=P24)C#eLMgHV@Xtr{=x@B(7YvXc6?3 z)(ialS|#)nhz=g?Yx*5retm<;rM}KY%@;{N+B#6xkNRLjQM7GTQiT9AkOa6(g&V8W zQV15N4-}@9FM`IIj`><$R>1O?X5oLCpM?J>P`RcbtV{7!AS~9j4OV|)L6AbjvO64! zPyo`=ybxQ8bml;`&W5lVYZIB$z5~cCsOpjkHUVok@5k&1ENI3fDU=N4;0nnpN8hdL z2MhJnR5W}7Ur;>+au|{e;XUgDuBZ9RdeZGys#*brkERIgkH*TF0Ty|FfJzhg!T?cuAoxXsVG(DY=OSBNZ-#TX-(5V zQCEP5(Ooq?VS2c_7F&u^7tF?vu6_~aJCWEcwek271dYSdrX$MWNa|nF=vmil`aW3b zu$jXnx0+n0R-O@iP5K3dVG-+hsZ#wweJH%v%|%i**mi08FU>z-sEBrp?E|l|h0T}S z>*1#c3LDfihWhlFqT#?&O^TjzJ{(}3&ql+p51}WWy0rXN^J7Q|_CV^K{M|=Bm20gt zPhvL|idoSeNLt1Pew+9UEyc5Hjb?o7)T05f{tk#=QhIQwTdUe6I4fwG>s0ymj~)oN z4b)raTnUZ|6O`NMKFR8}s)jOhU@ILt=YDWtV9Xij;ig3u}nc7wismTx0Fj8>$ji+lMpd+W;9Kv(p5e$goB#Y8!4{}B2f$3}@P1`qJid}9zC4(Q zXfQN;?C+4E2kLU9uY{`L@a{mDIlLnQlf(P$5iTefSnI(mh9j2vd}85zZ1BV^*g-rn zXJ#u4cEK*nO>Q(OVzUH?lr)6M^NQZUG0}Ko#C}6|J}llv#m5Sb(cRpI?phc(pKjkT z;@4qWk9TJ6&cPXKzrIeOqCGv)wGZZQ%@}2Mwwix(hN+6Cs5vJ!{r$6S-d{mi>$G`S z0Ck<)y}kLH&u8~maVRb^4+x_-jzpnvc|INHV=UpLpD{Er5;#qhp0VwJ9SZ9%3)2i7j6^CsjTgpOui;5XgAlw+Wd8j*kfh1XNa#}Ct7P@42pLe$ z*~#sqgOPNZO?5{c(8A&hFcW4+c)MBc5tR!(c7VKxEX7^djyz)+u$C~)4ogBA@Dq!# zp96bOD|^)0i5%HvlgO9~ew zzo_^Vd(`u)1u@W3y|8&o{P>=64EQH8%)4CH%EM&~_CTk-^Q`f$<-h;%zjl0|J+}8l zCb}JCTMfo9SE{y24gdel$c6xf5&A_(H%7Z0+FkJl$I$kYH^{LFMj)BQ|J}iDF5waa z&8AJ#Z0hkB?@@(lDdis3IVVm_-SMBv+zjm)Eh(5DSF6WXxy77^o#0RV^+qMM0Rs#R z2G~cQIKK~}=%83Zq)@a2Bhc0yu~!xHkT>U`rXN2`7`h5G8v!m((3d3d!He@-dTyP*EFMQDg0-MTVoYosnTT&VH!$YaU+lbAuHLY6TqK= z=V^-2SRdPnJ@6U0h?y|wjM)x{LyX(^~Px35orZ6r?ZuJ;D1 z-PJ?8%NE+*P+RD=wY%(g?M@3%LeqjZ>2FBYZZ-DUU5x|p_on`RYC^Nyyi{s-kNsY1 zcAC3s7OWbUUU#L`>n^qRy1o(*nmfkHH3(vI35Bl49XxYs`64q9#s(Xq(n#=z(BK3f zojBz1ve5^knwtl9PqP6A+$k7arP<)HFuSf1q`N}shp-w{fcl_^57gVBoGaQVmVT~Z zM+ttfivCKB1VKu|Xz)8|xdIi!(0}k8+ks^>2-YO)`(l4s--+RX)8avg)!;ECGDpB_ z@R=#oGLKpIdk#}nE@>9prm*wqta4AaD(R3f!Oy8dg=259U3ezFFX` zyb0I!*C@Z(Ym{7|8r}iiFoZBg zgNm7r2<(>HMI#GD!#j*&SEA4!jPfJuA{?4d@*9J~NRJIp$8c%MjdvK!Z*0L1XC!A* z9;qJcFUA2w5GT|1K}1o`UJ(cQ5YpF5it{e?UYPI>qqkqeJA~f;me=n-;xC2{OxDMC z`Ux#V3j8^fc>lpTPXSFo*^J0#gr5<)MLB!?7{R%)NP6{TOTYE%NnYKia837OJCLAq zP48|WkkPvVXJiW+H*W|FF72^0-7R{`Qfq4m7QCK;cM+bKr3uq_BhHtUFCZ`l=3JO( zJ}+fp{yPs{yk+)<68w3~{4C?;HE7dhJD+#FJcfK(F^Fu|26o(4YO^B zweZh}f3DSiVf-_*#Q#s~f&beM{|oW|HZ)y(6#O5;Ki96mF#eg@qW?P5|Dk^&{%?XU z?f)SDxu@d`m~`^!m(=d=hbr6WSRLaj&MV-6H=sE0B-BBRp(*wJG@PR+2K8GcJMZ0pPwUkB$RZA z_Z8@04)0aa9!mL3+|S43giZP#l!s6&PFUd#kzJKt2cQH1uGkf*s`*KQj&^*gdgEP~_;4gu9HLgLDv(qa7xRfj z)n(Q}>dDqo@JYkjnz9F^^sOweH-=pI8iTM|9rkWx*sD0q5eeg*%Hn$cBWwv*79YX( zR~)8*1N-^0i?kb0IxNPKpP1Mg%U%B1^pCRw*z6z0et%v0E*l*}p*R;H4%4F&tMuk~ zJNBmvgyV2uEzTo9EB1}s$G35C_SdwRLd+G%k#X9U2kSltj;vD|WuDWV?s=@4E2i9A z3h71Y-g$9q-!a-1a6V0g#=%p}P3)ss-Z5-iJq`NVN}LtyF>^OE+wiJEv;BZFFEhl+ zbX>LvhkZbK5#6&rP4a;9&)~yBJ$WcOxGNcWn*<%?oa4#QBb^qWBKEGgIL;@-`~%W$ zwhkm?KO4@Fpp28^z_PoQTiri~dn=HA*169Q!)<~dMr~)A3g0uEB$sdETTAF_^=ociu6*h)eo=I*JhK886 zdfbXL$-j^`+0#Z!vcqKUSicgBSDl^5$DvifXRADqzw4~?_|IU-eTMV+vl=>_#}`N3 zK@*!u)t#Tm-{k-jDTgv8-dnA=$l2jM{?<)0g^Y2Y$KM*UV)*WG9zOvGBF;UJkLsEj zkvNA>Tw5o8G!M2><6J$?PyAF40dXSVrf*O(_X&$5_zhkxcFn(45coJ`1GzNhZ2^Jr zvQOTdsDyR_$GQ6mg2cIdp0l;d8p~58>v~Dnzkv^jbw8D?|AchbsryY1s{Sme?pKqx zw_2y}SD#JYJavzQc%S{$y_&!I(Gfg#-&fMNf6lfe zk-S0U^@7G5EE;bDjq^;jh9lCu%oi|)0ldVa`(5TQ5F+`!^F9*ZK+%F}X)8#)m2}>O z7Wsz)s8nA8P3}sxEFJnIiAaq-kYt43%B zJbpv#A8%XX(JL)KRyI|ykw;F;KN9C7i$M$mE@i=3I04(clH{pPS@2aIL|+%_?`!CY z0v`uej%%MjW=AA`Q$WrEYfU^)Nq>}uc~_O4{`IqRYnb{r?9t=wzV zM62x3H;5QkRgiN=)v;2EF5QHwk#iJg*i6`oaMj}CLooEs_Z6ckc=qDi22OyhF?&5O zBr{OSE^`Y?O3c4nIM0teZE&`=a*yoP)tJ;(y-r#D39_Hj+z0Xc#OvOR!-5=dUiU|! zyR_&Y^e1n*Xw%Y<>3QDJn(}}pN=#&bicLNDbnMUT&s&pfl-+oNXz$s1m*EgaIKh2vqn%1U({RKpSCW91)+shL}^Bw)&dyXgi~A#ln9AAOSG zsy^Z16=MxUa3~y2Cg;J@g=YoMM4%WCjv1nZ{E735*uZ8BDd^~->@yC}kCpislMfr; z7AprnvN!xq=BBTMsu+W+lw7p0j`M&#-9SbQq$Uck9Ny{UJX~Mks)+jyl*D7oCwMoI zmJWdhiJNge`)Qj`@xn-+qxI?=NFQjnPmZnMArNq3nC}r=7*(Fpb78N%nTbv;Vo&3y1D{f!5D@MZ5K>OS;aJ(LmlMEC zB!GQw0MpT9r}gVOk6AUYO37bazP5QG?<jbKTe*gFDLEHIMRwL?YK1Y(Te&OO!+U z6f1vNF%l?-JZcPn73J~zhC_aRAH*QbTpIi3Z>b7wowEz#dzys1U7l6%#(h($bIe`r z+FUVqm3gaxHVEBbeWzF7gIhj?G_EY(gdRK$1RhW;Ps`2`^QFZFuvtfJM)c-v$9@SI z-*EmkWo}+X;D_60#C=ZR;nhfEtd1(OqYD5McD54KMnyvHTJX-aZz*>6+eC&X2NAEKyi>*0t9u z+KrpWu>KT}m*vQEl_eMB7EJ7;c&e}5N71OP_!)&FcLS1QJtO8m+VTE&!+*gkdwg;R zj$wSgg~@d*?{;Y5G`t#5leqIObTc@Gjy+!~9Dp`=9__(R15_YdN*ChlB<0m-#Z5`d z%2mE+loj(>I|kTW?s_n!ra3qJ^oG1fZt57&duKeQ z^_(668pXZ0e9Fo#+~9_D_bZ-cC4M7J)d!+tJ=VQIs(A;{j+c31OUxDkmsj6Z?OX! zD!z%Mb{|Pe@GYB&aWh>2vKv>b(Q6H`Tk`ZBD5(kkzEyObx-7a1N1~M#{r_@{NAxWc z$-YI^k`O=yO^FVcHzw7=*D>`(q zS3iWl$pEK0tt_sFJlkF16!IXZtCJi-xNM8}Xcge1087VZPb0&A*|#mCZ@CeGcP1pR z)=F>a>}D;>_&2d{F9L_?c(Yb_gpdyrLi8_s$m(9e(ENvXeuiGGr+n}1WN1B*?|(%R zf!!ONjE+{SZiC;<#9xQ`Kf#~AUUjVOy1YoU&DRdP%f9+4%xa5dR)WvLxr*@SMNned z_mJ~k7N>8(obBGQ;Y9wrM~A^M)cn=bg{r&Z{AqDeIxYY3BfZEq!FI?b-vozD*f&1i zUc`G&=D=PgZesc0W-p@Q4;RzG>W9s+H2k&F+UKo`V27;!?mWLIqgM0uag~4H-WQJ3 zyRK#Y!+=cVRB7)Bul^GTwSf#cnCwY1%9HIJOa#-eo$kfO(!!TT>k;gFSb%ld^_V$s zl;g`D{AAHG{>3)^`K*$qT~C&Y1g_ZKD6{!R_P^u)3$!CR{M6034G1SC&aY$M0PRg3r!-=Lte7)IAC_wX+A zjPA;{QDyEAIFj#4Ev^u^$oBs=-iVLw?3v^;zlS)<4|!rDjrjooESc1$j7}X6XKX2w zA_@QvVD!C=X7RD-5J4uKVP(7-F-SECsgjV{#mqlO8fa{T^lH>F074Itl3t(QVD11b zKqGLq8jen6@mdKS*BCrOshWrgQiNj?Xy-Sgf1!QltW(EmI&@AXOTP4tIi{9_GZt4z^_IJk0>qtH3(C&Usink{Mz%T~f=ov2^&UxV&DAw*UhGfs zK{n1nqXvk(#?<^{k33j)Y}Q!nmlNa_Y0x0_!+G%>Tr?_g6ny|ZxDGscFRl{Rj9xTz zx|-7jU((!%y++F5DqKDgxkc|6oR#W+Ps>>YW}>=R=eIqAGdUeDvl7*ai`cejuoBHt z3rfdj2D0>YYko!XdK0Ry!yS6pHGUNsp?PtqkU!DVAxRcJYO{#DG#A3kpjgQ9o>v^VB1{mq=CxIU{jQ?JSUFsB9=Flu=XT24LqRDO-B zJQr0K&}Od3H2t0Y_aD7XZ_!WX)aSed;ysg@7t4u(V%O=Wenx*^-vs000>iqX_HAeT1D+?%{1jKn2<(`PTg7B)ZvjH5SnlIU9K86(3Q%^`e z^=|#JrLb1UE&Pa%GbhOTAT%o&itVI>P7`xYh7X!gVWG zX!x=bR4=qeRqkA;7x5P8C@%KD4F{QKbjK$Ssx|jU&~_>%w)~T`Rbe5Y1ukP(zs?4z z#_FdxtbY1?U>!5LPnc6BQ zwjVluk}{v)?lnf>?xb-Sh=tBpIg~l@Mav3{-{e=UEMu9vT#Sus?h~WB@7~}uW*cy> z^SRghjB!7Ay$1Y%+@QBgyNJAoj;ia8@p4c?$Xm*CY+j z(e&+=XDsr1TklEJ#W0!w2KySX!C~by7ob2L2O6+jOU~dzNmlb4lm%me4V$!}WH|Vt z~tXp*FKa!0s z1u5h;%f{euDP1cL;4c{Orc@ontVbgUg&r?tCpWcAReaJ_n}R zE1n4=U>&pYepmH%Q3&oE^aeg)MwC4d;h1BN<2)ud$UN(rMZbQEzj?u70+~}(gH{9Xto$;S$R2{6{{?HMHJ>JMPLA>Xz4PIAKSf|goS;shLkSE73T5| zL!r1njsn!m6N0BaV)eL$`nsW+=8L+|g*WPfZ8on6)3~Sg%TmeQ*)5fd? zHcO;SGPCNULJ-F2&Wukd1aPl%Tw;e?Fa;}7s`lfiK|!h)vK(s?{SovWF{}QNA4ns^ z^153fPy@1{7xYOI-6u)3QPSm8k~IdZr8guf28q(F%M&5F1G;LEDXtoe*oh>WVrKwi z^oyPST!oIXftYRafH^Y>jU4~~4rnR>gG=<|TsQ=h9)%;(e>QxRL2l&GSYm+40vq`2 z-Z0qZ``G&r+Y-7l5NCsvms>bmE1Um>z!6u7E4Pz{^48My^}x_t+=*rQM|5dIBlNmnpr2DWxASmZYtYOGGb8zKyIbr?+YG-K6y_ijbw4ngcmz(7S2AZ4307K;18*|jxET*oHe*f3B86R!kBfxfvq{M5NZ1V z>Vg87QPh^dL0M3TBeh0RQvO^4`&$aGI@NH8JcpM1pbWzb*Xu|aE-YTpGupCP2oOcZ@w3WB0Z90y zu*!@;t`s69S;~7}{iJ&z>e00)QD8WY?XTwFn^2{5fc~p7yB|?=*5cMCsLi=*-bOVC zXQRc9>Uq$E8a43Sp|OWfxvAvmLY&Ula!w#$GbFjP4x)%g0 z*~A`P;yCE%AV$bGhgIFoJErAqkf&HG>+Xhl#XWizB3|gx`9j6Tf!QGBH`gqvxf`^c z4`5<(*QxnO9^nV$Zn!A-PWIj4W9+ch0ra6k5kw7-e+?dG@cWGEon*zFK-D=>EvJR8 z)z?Maa94aIT9uu57O|u)0TpPVPa{4^B4AW>d!pg6Lt+U$=Y82~*)75d8e+3u?)6@y*F{xvd0ArEZZ`0= zP30;`wKu<7wEL=?&^S;P+PB)PqYE;w$(7B0+u4`sNHu4TvoG1VYTgEXv6hw*U+l#b z=l10<5JqzdjXmhgb&9b|G-b`KF&+A{pCS5+ec8;uT+^X1yMbRwd&rIF^y53|c&i@| zi}s{Wy_TJo(f=X7(Vyra&?Y+WUMqlYylk9EHTWpVG^g6`#0}8PfrGrYYR=)Dwb1hl zuqA|Dif}b=4GVwxOT!kqP}OK`tt_q~Gf@L?ks-CS6Sv?QDdBMM%f9My8R{9V(<+bu3grY(bW=h< zg~PT_2T!CZRo}-hP?QWFeIHz2So}kyWl)|Hx=p(JDW=Ji91IIY}K-btuk}YAY_cGxuVm;tz6<3q13;|og+Fy^ z8vYG$a@7Gc=VYZ2w#+1N)h<;jeAo9(^dzoB!0v^9jran2AwJmXr>>onq%2ujab^zg z6=)C!GlyMFn^(aY^h8C|*DEm8>a6V=cb+Vmx0FH3lBHRz=eTgGcpDW_<&KT>7Bawm z4-0QX-T|55$n7s+;D@WP5_$#mC|nofd%;r2%~C=YnIh~`+>4wFk{kYXw#Nl!HXmhR zQ;G*$1&Yu?P1IGPq!BY=DO}**Uc|={?hSlQk`9~@8s-t$8Sue8k`{DaP0qhiaf!2{ z+byBzO2kT=k+Q&&dxT6_j_-Z+5Mt^eh^amKIayK*Kl&sk)3?!5ukm^Xa1PXbpe%VC z;wl5%CF)g8*V0P`Wt$fGKtxuqT0|_^D$O>3SQhNnZv-EM-YfMgh+k4+d5k4W@qf;L z04CfO%bUgjeK1u30CBbRJiLXRI0p{MU+e*)^3AY-ofELQHtx6;BH|#3h&SS%5=eX4 zL3TojiEjtu0&{^id{x#Fe?mHpN@QV|vXBrpnLw?KN_+|7QOJkH6R+qN{rEzm1=LBF zCT+AcEFI(rw;2BZP&Ig{FbvHCU??i=Jnj7_I!yqgR<0r>>?~AigCez!H#>#Jn+{u6 zrX@$9-^zb%RXfw}F4j+7vh(_>UCH|CLj5j|1X+LNJ~~ZH+hP4OO|*bxL<-U!>L=NB z-9I)ytnM*p52w`;rz-zt{e!UzX20I*q=UCwokaVx)k!5b(co)7{d#~UVc+AE-ta(t zNe8!v9`)-Vh)erPB!OdsRH_B3>`SYxW%ocIg|d~7`}{w#;%iALQh7{2qUz$iLF^aw zhZsw9eqeXZL{!NukDjH)uO>W#CIGT^lr3&gnQrrC6CLz4>N@f@g**p?+5i z*HudBJJOY}R80rkj9bs(!hBBmI|`%`G4uf(>Pj%*xZyoR2HPfd8Lya5jd7kNF}sX3 zdJWTG61<>RHp->0;D!pYXlje#zrt35$(9PXj#Uh45QH_3<_G-=VFuJt#&mc!{dvJ= z%_bBA2fPXJPwsS^CBrQ}zS79Cy zxxYmRKNGSL4w;L$$BM6A?6wnK0FW!>Q~~qcP4H3u!A&L*ZoUtnhIJq;2ExD8H3Wo^u^0bTJ`Gqo%q{7(18pUpVE=&D}w&G2|Pu%bT!9S%ce)Zow7VY*UT0 zfcv2#9S~>dWVb~T77*LMjj|TZZzdKrtsGYM=VX-i;;MXC>_ucl>yu!XlUCjH=YdY; ziao?U4#Y2*iz)?OS!JA4p%YShxHgt2E5=rhyClG*hb}V;Sld2INJ?EM6ac=5gzWfG zcL5maU&>cq<`Niu4!MX5rD_W|27O8v0nubp5s=RN&q0?Wd+0x9b`thyz-Bhf03n7R z7G+cb!-SW)&kygR4+Xry;H~Wyc9})MyBt|a;i1b#U93k~;m;;aXMe@!G7~B52ycUx zInLiMQP(JBON^b+YUC|lh}^=s*lB$nT9CR$UtEaHVwhF&d$w9wvH`p}oV2jy2I1aM zTn?@_7l+%d`Bp4*WWvwo4gAgaxOMDyg?hGAo*Ne0bJFXrxdY3twLPTRi4>FwVKCGi z?!f&nT6znD<{`*$al3g>NIRZ1=fE&7%+Ak6)7PqUm35v(6YdqthFE9x%cf+`+`i08S}5={|f-1nz|hSLXc<|JYrvRN^Qen9Fs7t^*Z^y}J%2VK! z(rRtqivzz9R;4{KI6Mcbpl!d2Q^B2R+oTP>1^R=Syp0apHn!XB%haTq`W!v`rmtC| z|94P=t!MuhZLnlvWx-G3`7~YI9^9BRIN~|zC`aa!I1{?Jm8gPZ9ujHkR)W9>&g@e0 zwj*ur8kT9QD7k5_ruZDRc^o`jZG!KKhv5SOW4t+-| zKG1iDDG80QCx*|BFlj)+#0r~OgOL;r#n&Y;Y+?uzjnvC|W;p!>PMyd!plBqK6pe7N z-c!hf34Ofa8mqsBUBy~-rCr5R`yOi7$#FAJINc8gfFlBjsT}ZljbE}F^z9m{A`4_% zSOl1|k4@NBs2elVXW4@6HY9XpO}~V6Z`)O@iGM+`y*uaps9jI*0w!wTgb5mYJ4`|) zZ-=P>m%vbGmoPEX2@`eujxbdq1@**E`pweU?;p`YQ~%fW8)PwMUJb4Wz|0h|I%%S{ zdFoz#8VI|%Fe&!JqzKO22+}!%OY;)5l;nn$)$A?IhG4-Y8>ec{&HZ;p^*siNZGFmu*Wm^SzPVElOaLUgrLsYCz7-r;)SlqLqO}RVJluQTh2X$zVAxIY zTWI6hK3sYws3Lgg5+(F5rU|(4Rr4dz#)HFujU3>{!;uF|*+Rg@o#?djs!N;jzbp%X z(C%5qW5~j;0`_lI|;2Mb9Y^ep0LDv14ef2k`=cH2jfjyw7qv} zboc2Sd@#C;4Q|%nRAtFL8qu+#F0n;*o(Mq%t?0pMFDv4X4dLF8_3^kY>-xj^l8Qyw zShGqUe3x9&9%OBs&VoM{{K$>vuJ5H@EFv@dUx>Ge9~{9F5Z5MS6GW215nOBz=Jwiz z{Ucq*C>%;i@;w8R{00Ujf?sAZ-aq482~8&D%JxHQrGXb;WrY-~ENS#Y(82y&cg&l< z(f5p|!@AY`?F^u>emB9D@&=|A>=NuJ)@ZRCSznj4u^9#|EH13`O4Z2gZs9VQxS%+0 zt;*JEIot-Sy4U5OeB@oTzbLQ*ns;*$$w|L`XNo<;MH5X0(m&G4|{_*P|tEz z_X(~(^4oKX<SK%CdfiDnM(X<_)@sUgX(TQXH^q; z5UZM2xmN*P+YT+)N5EdSdDzLXR4t>eLyvLMM9hKzO~1XH=pjtj_JsHYxUGE$I`);W zL2m*`@Y40z0-j#Sp3sK{&0^$7KLt--t1Nh6gxH0Mtu^3EDfnM{0DoA&Ki-npsMjtX z!wBJyiVcczo8#V>`G+sNKybM40(P(`Ra{)jjiH!^W>QO^FX0`V2U$LXyN_bB7Q&?7iAgnKStl6#k6UZ!%3 zOHifp1_Kwi-H?!(aXcSa#DuH<8FVS@kICmd^^Ag>hmE16=@&j zS59I+6hb-H8i#&Mq42}f&tTZ4Ftt!JM*s`<>ic|_mCFaUibcFmV4%5RCoV3$sf_aM zN?~P;FH|-iDcbp2;&lCk*sxVzYHesE^#~)-7;iWi`%l1*aSQEH$oc%_@tTt;9~%nz zs*Dz(JS}jP9xgOh)-9ro7XGyH_>xJ~J?mk>Fw;_K z9V&yxocY<=1OSK0ok8^h!9pZo)(oB80`-Goqi(LN3I0i)tzFS|vS>9Or=ZeMyGb4$ zDKD{Vzt6_PXnRT$%Xr|?3NCS2f(qU~hexAo2@NNOjyyUlxR_YqPOsN(9$otBEc%~S z8(8$G)plME&9?pT=FnupM_-nc>_rJ81vHOmI`@2|HQh_|J6Hf(BAr*8(Cr0qYdcSMmIdH>q_UcG zPD{)!`{i1rltkOxwZ8w9}y&^Wz z2WRJ|K!RBDUOX<&%B#zu)PUqZz(0t{?w&Zjv2U%Uk)+uLIbsje+j7JQ2!I^%V+3*E z2sS%l(ZJfmrvzEr8S{dQ)#zh z05D>eU=D%FODuABy@T+d2n@}em4Jmy0bJ)KYQ<8(G#k27OWF85Tl5GZC8WxzM9sNd z^c>sLzL_SoS2heMEZ{Duy9~Aa#7;EPEsUT{VS}q6e+AJ zyJJxu$|>li9DHEVX|BJllO*jkwSea2(uA$PV_oK0EQ$cX7h|6|WV-g9i`iI1;l7|y zCKprMcP?UskXX^?G?Yxs(EsP{UErfEuKw{|lErWdPf$=)kXY81DAq(l6Csi{8-1by zsR2c$HZ`bFQL!Y7$|Z3(HBXm?D750G7OPdXRB5f4L=DR=0sE?41W^8W5F;ir6bIMf+fW4d&W*fn>ef%#!oj{F6GsUMylQ zsLkw_3Iu6@=Dz|iZ?G6^`R`%PSR~=!12Uw|ELR=?y$P4^7%mdrE{+6k<{*eXD#`tD z`9qKwUsFKT?7}xi5P4gZK-k*sJL-}RMPI|!g_P0Z20hx(Ht`2w|i4`Hu|3}0bOM-J8Tam3d zIC%uD(mZv|EaROJzPJa}9xV*Sdpe<%@}qQmwc!U~BSxUwGJNv18;)hu0X>&Cd^L6+ zJjNPpWP=x&8{Yzxu=I>U9(RTEdw+yURvZXUPqYSkG6qEWi2|~5lx*&60fWT_ zG$T!MFxLSlko@)Ge%8UE2Rrf5P{lgPnm9yNmkM-nu?`M}9f3CXD1MCwP}>pM;e;%1 zY%G;nV`t8yM7Us*XP5-uCY~kGMjgSye%!f=8iRl za*U;1T`YRTQR_Sl_FT^7T`xGeB4=7E8+ISHlCT?6qF#|T$&a?Q_D-IDgc^M|G(sOjYq$iqLok!s){$rY>aqU-#XKZx zZ(2PSVf8tSF{^G%!Ne-|?ATU--fTatG3GlQ>8m=uZ=8kx_28Hb%9ptn2w<;XRJ|~h zQaD7)J`mYL?}Uf87QuGo1KF?tE80xy!caQZU!oloP29ZSCNwNir8s&K!gD>iDn8{Ao38@qRrr!+<`LBv)b z!FWtC;r(*7u3rsAiHkMGdJL>0Fyry694r{9r=84hm}Dty@3DHJSltlml#QZ+ILdt$ zC=I%BtS_vc6PUfQHG-8az5oLYr%ccUxc!dGTZ(zS&UKY{{7Ql$mS{x8yj30p&scde ztr)oR8%C$J<7xsRk$FgIswY~wjPs7)sI~_iWhubR53T?%xBvkMQREs579mzHn^a+< z9prg?oCzUT%Hru8nD}kRAtD8{Od({gM|k@I=^|3LB8_O-2TxY^mPpxjLFw8G{wDe z2t8=C?tn9?QA3Rs0hJLueV*cJ?)GI!sa>vSt2RL+*SzKz>?$3ZRglR zI4x@%szse|1(a2_R)vP&!tROanSI%7_DZ`?!V@h&qTRp8t%t3$ZPo4@2qnsumK_=G zLJ0YaQ===)zqg%je7lzc2-6+r8m_8%sj6XG9$v0*%{SVt3V0Nk(`G%)2&E?@+iio8 zxn5SwYU@lB1B8%seg#KlO%*ylmXO1#$QW{Uz}5MKp^o6F6In~OnHug*U--{(9=;Rb{dOK_S&omVb+jVZiy;d*D@c)3Y7=6(c5Sr;$RnS>nQ3{JFeUO))1 zUf4|C7G-g{dVztE&8ECV*Z|%Lz&1UTq5#~!pwDfYIpGO98x9|Uu&Cj61P6_sHj*^G znc{1bs~4D467Cn^k@d8t>H-EB@qO1fJZgS4PjUAC@!h zI~XQs*a6`&mdR}dS!=c6&tZx^m+*%F|xwXE;uiRk7Bt7w+0v<9UO2ZPCQ&$W?xHJ)09!$zSRfu1JibaQu z=AgvZ!c)#C#o?KUTcEIgqR32HTiJK9@j#H+LG8iX3TNErp?ZSzQ*c0traDND(#_({ zbJj|08g(Iz8NY_jfgL3NSSR{C&T!-$zJ?h{jSu`IPmfKuhpa_60 z2ER;E?Hj4c8ps$(xy|Kqavh3&B3OlLdB&G`lnl1?=TizHA^a7^L+h*%eKLZmCP?Rv zU!&+@GqLnIcgkvrXU}5p9b+MA!!ztP4p$&pdvNRtemuwb70|W3JlcY?xhC4kTx~d6 zZpH%2<`z~+XGPV7|A|HR74ZlOYqOq#$HKODA|tF@9^cP%E{#DNRDo67EC3K=&pQH& z>mJ!cL^|5&XmDKgM@SoUm9Kpz#%B;Mc#mW(`j|9h6R7Pus|J=r^Ht(zH}`Y!*e3l| za9dtX3NDTl~bpSOeXn=B9fks#d>NX1u7%QO;Qd<%W z0}UJ{6+H#WA(|3R|B2NsvDAVqNI}*&U^6<}1OFzSWbhHPhwYH2VNx$J>BgQ&O&4|dJ))L4|Z#8z3s`0FFpi_Vp(NT;P9 zBPEc0-8RgwdC)t{y6hCL$I*=q`jT%Fb*Kt>i!>)NOWo+J@9aBqsdmGGoJvdmC_2a3 zV6}U{PaR|!XJn+^X}GWBf2U{c0X^gCqG#kW<`_+%Xw_VT zNL0@#iZxI;8Hu;kMx}SO^(P)f?zU*5XIyp4dd4j+OAl7Ec+oRT!M2{UQRx{!1;73) z$jjFE*+&#Vjp`Zku8%brDm~+>sIE_$-a^-B9Yctj=!Ef8&nSG2Ma1eEMdc~1EmqI? zC6sDF$ksCw@rbVPQ_gd3>KU!F_eUq$__DV|%BBknRi(wF;c<*Y&n{cRs0e#jP-UN@ zo>5MEcoSxb!YPi&lOc@E{Xw^~cj=z_!2Gakj(D%h~Co7ZNA5%8n*j4Vm% zU)#_#3L23u??Cdw&%svrfR9n%>CeU{Pt_AzMt15iGaAK&M z+c>x5!h3J6&g)>+6u>J7F=ur=Su3Y~5=ef47)$^LTwhxG$+{HBUT{_%4=QYEOu+r| zdFm$kJm(UgD_SM_VHH;IP1}rB81xKSg>4K^-EYbHiEp7>RDR$pmL*);KECfF_^rml zQ&DO-*Kn1t^0T!TT%bdP<2>rg+Ba=oc;r5t&s%F`qG{kb5jOSqSz3U!)ftCl*Ndz3 z>;e5<>-_Va8@Xcs2$xf?5AWE6D|$wC!2RPhd6POdMwVtw(SP_$oLR8?0j~h~mwhRV zD+(>GHgt_W*wV$xAsq{$&ZxgR>1iymxH-KDfm+2ADlNtAcGF@D+F@RSw2}^bM1K)d zM(xd@vOReocG*YfO4-a%=jqLKyLgMgbrr~`la?YgYuOzzY2D|i!4Zq_lwg>TB z1xdk5BGv;ZOC~rjlw|0_ig_xTtQ}64M0##2l0YE@MV_@1Y7;t^POevl;2J@plVLwp zl9g5v)R30;4U%-$xhm-olBXd0@t-Xc3xB=21$|ZiVEaFX#NpeSuFAIeT+RX1mc8e^ z|AoD0%E``k_6T>`V6nxwJ^?P-8V5nwuk+kjfhb z(W^h5a&d6t>_GC|4ZwLeK=tzFB*vJB6#_2pU_WrW5}VU0O=?!XHsjC^rMtpq%p0{C z-@u1POa7RR_O3Kq-H2~!PL|fu4Um z&<{HhmH!#a6R-rub58ozfdXfuZ)exw#3tW&#drw=XLfwwbqY>ATn!BXuJXSc0XQ-y zW#Gy%vGh_#UsRz*ip1z{2D};ea*2eDRT<%nfI6Ohu(1@hGeYK*7fX!>13|k+fu2qx zn7rf7p?Fv=Q;>R~$=3v={*VBqnmPp^ILtfGfK(|0(mu4&YJrrE%I!cUob`7pXzg0I z#BCCYtUFTENe%s-^D46a{N;kY`O_$>;85@5jPp2e(KZ3rJx+R3XsRv9pM zX{!DhF*sng1V3JFn2DRl%jv|0uG%mh{K53SEzj6*?tK!44TIhdMkfqYn!O@`T8Hlf z_RivW<}$+Kz`O-(T@8ylmMj`&GnM%~fMnkcVCq^}WXo$|)!8X7JGpHsu)havY;Lyt zQ6fhn(keU_MkP;WQI`=yX$SyFBqD$@P|0ynl-=5b+VO;x7MDq+Ii$1|fC#Vt8`vrP zvMrGK z{O*pHY-Ov)bPU!pd1ethdEFW?u@9kH&R7-p^M*6yKn>;?%N9y*?L7h_Jpdag0|rt1 zXz+9(XHlxyJcT46XOZ{Gl;`Kf_ixg@>ne6M=NOZREOZrE@!@4K?vKmFtZ}* zGgsWWxb?_)I$qSZ4X1P`E?2fJrn+{vm^xHv9IY^p`q23a!l=RUR?7KCz=QU!utqraXrK^ zZ1GIOFTl)A5{^p=bSLg1kjn>f*??nbE;e3Qfg>)Y6Tdb54J1!lZQGe?k7t3i!N4c9 zGa+Oq;D|ID5P%^}aR|bt)QgUixK4g0L#um`Imfkq4>DtrcbPO!{5{A@<0DpOarYpL z&gX-dtRXqLNg8P?HnZ)s7HR~`6?S-2Bt6mC1J=X-gn{a!Yl9`1j}Tt45Bpr^_8>;z zRK*DyfV38$GET&7^Vb0kI~C+x3Me{&xsu_~K@TZDvd^pnbfk!wEt?|XU`}FWa18F) zBS&SKGA40LE7h|U(riYV56CE|i|{Zei5V6B2xXUT<%lw4Ae;&!E`xZ8Ei+slT6Y;iIwSU0HO+J)qJr$1$x4Q4DYgYq1E5Sx7PKl}=z)D9mK>Db zQJ}dgzxr?Q*5z(R-c2gaJ_t4LvEW{2*NbVXB4%T14iWQo88ki-=^#Xyca z38W&eSjdawAQet+=jkM5^0WVge*5za;G3cF+lQN*?^)Zsn*1sF$EKq&ND)&}ER112 zs#R3Hht&!rLX@{S5a2m{atgc0G+4fBM6IZt1Li1L^pjKyS$=zjyQBZ>Dz9l&QxHK`Vsq|lL6K&?-fw)2y z&Ev(r3Ty^%!UT73;D{91!{|7EHI*y*#Vfr=1I$jPX}WgC6%8}zCq;Hi$?>*Y&%?B1JYmcCX{j4lVizu0r4gJanE9i$4p+gbz)!bMno zNHsXY-4&oXu8BHni+Y|7z|2utYIFY>{?6jZik-V?@E<$Q_yqN?Um*8T0SG9)uGbJR zw8KY&BNAXit}n%P{jdNEFt4}Z=$^=D8Jy6F%zXfU@te`61SE$}7sG=%X z)pEs;s#sMUXjg?*(~EOq@KkundfZlbt_~ztI2M=D!YeqUx%}vfKVhDK+=bpSLL55j zbz`s$L!HWW<0I5(1nSiRZ}$|}52aj?(_8AK!%QcI6?-m~^CmnetzCT8p1Z=XnkQ?8 zR*{E}L+d~Kz12H|lz)QwQKbu%|JUM2@AQN}P}r0ag2j`=anbeP2PPfz9X-SNM0+j- zYJ?&)=yf!gUJ7d>WfI-r8WE`$#r3k@b_7>QmG_bwyze8s12ZQ7l!PBTm;V2m z4iBq3mx6Z{p$jI4zXsD4{c2Wy$vyewKjKKRyF!sz%e}dV7 zujthy@4R>7m8t2!6k@mw?J2!5}oFH|0p^w&sl1q0~gah3LW+^ z_$cBQN*rF6xB=kdu?*~6h8_chUrq)eqcUjm-s;UVVc^--QG96?^Fe>qi1Wcl9fFht z9^4Say%vZD&3vhGAKb4)dV`adM<|`&Bb0xTF6i{B5QwnPiC-^1f-EQN<3Hqq1wHr# zr9?gWDuu#=U^&G}9YzCuuzU#t3m^fkW+;Fc^0)Y1L7W%Xtd#Ht?z#LO|B=FN2wq1HJAsudG&V1$ z2@w|Z1KWXl&*yJIwTli6sw94a#3Lg-5^4g`0z3d7N#u2#krck&39N7vFTr7!Na8}0 zL?%hngMXA3G7{Y}32=AF1U!hXngeWFngf_^L~Pd6epoe{{DlN0C<9gL zRj)f0!R*}`_(4zd#c?--*b7_1kv8$Q?*7beA{#FSF!rr&*!l(lOp9hfOo$IgP%49H zI(AnTUo^_p7G-IRF4GoWXdLad6DK?To0HgP$QQAx8Ji05GqC^(CZdT*YkW1m68FA% z`+$^oCJ=>{oYYfs+5!5a5log}zHz@kO3< zxyRTD@VyN4EZLRhN!yr*TjPvx5xCj2WIF=!W?tI2c}`jbVW;qW=7k07R?m{JVgJ-* zc|($Er{%asmmwA!H*C!7^!c@h`*CmJjvO23nV5eV51hTkd50e8?M89O^8y3rdX2BN zH@3j{O&(6K@x;y;_i`K~!#jdN-c!C^Rpl$-bkJh}!*7ys!n<#tvDcHf*_%+}UJjcl zM502CNz6FU`MuOjj&cZYKz^g#7+o$8<-m(GJ>S5B2rU(LZn-?gElOwi~E+$zQ!n1+pSz@24RAe~4?IalYVs#~7{RIiQATyr-z< zRft~7#}BkOzW5>5yFJgjEROYpx5lvEZ{k?*t~P0*1?yebk`~U<%fVl{j>5_>9k+Mo zt5sFLy~e`CCb6hP<=lHf=l-RbJUw{fK5*+mu2xY~+&_X^V&)lvndePb*qV7-4v8%! zTCCGzhs46jkU$Mc+`D8*xPOsnV5r0liA^#jc14E7LNz38p6YQ5`|Ks7J<6li4Af#s z?1~vPV3=T$YDnCg8L3LqsZ<4z-o;jB-cPN{yf&*MHcv4f_T#EDMDy=E0@V|T`W-o1 z#TgX5{{p#K?R$FzW8H4NHK+M6gqDrlS(EcRbmO60!=Lx zZ_f4FqVARxI_NVj=LX7C&nZEyxWMh!mwc6|!{}8cvtZXQ+M*{YE=Kcsf^u*)ACbE4 zyg+dx_m&js#WO?(qz(nj(Endm?>wCbjq-E$&k z|8U)Ge6)&=$PGHD$-gOil-X^xvfC=Z&xthq!`WHuA7;R*gl#>~%3w8qe>j6EK5H-{ z*Bqy~l)0wa*tzC}$hN+niN52m_mG!ED_D;=bwyhCRHg)P{+l`;38}Ij zAv#c4DwIxMH*_WVVp)OjKKVA`o9Gs2l6+I-J28bIz2H_YFPUz&Gd1a8%W$crRh)MS ziet47gtAbrffPGaiws`biTEY}^S&>x42y8@_D~RKs5}pfq>49?l@Ju(zlJk>3C61O``vKr#dD-LNF%bEajyAMWrVjN zQ;Xg_H`nN>Wk$%e_%!@tU0sLug9EGU_nV2tH(-Ao5S3e|7&4eB@h zdi6W#TJ`J7RlgSxRlgSuR=<6&;4iWsbjLE3jYppgu;p323|gtjxI~*b%=nVa(klI; z5`6FqWx+)w=|j*k!z|!$!9`wtj3b_RSWW#Rh*r7*XlC0V$IwReAYu3Z^o~oXzma}8 z8BoN4of1&QfcYe5hJ_iXd<+g*!Mh|_d<@abT(6Uv;GJNnFtvj3um{7&mR3UUrP?0JIKohEp7_^|u zZrNQ-YI!BXZrMf^Azq2FTh>Y;UWu?<)>J9PD-qJNHZlvU#ES?;4U!F<2v8J&z9fR6 z1_=_JcdHR=W8)qwp6!OIIC(bq&sE7LK|nrDQqtyY@CHfM!blyakf%K za9(KRtWdMPNFg`_JylEb>b_9A$JdB`jET@;LlDuir^dN{o--epDCcvB4YsuTumScR z!=u*Ue}_q}fAT-}cW`L^F*|9utkL?r7SMYOP7vR=_AYID&py8yDzO_G8x6kP3Qmd- zzQGF4j1L}X1&@mlE|=grBJ9M+JY~g@TgAux(~2RBijP@l#gJ#k$9!tVkZr}s?6qPl zTgAAFSnoOR>Q*u5O3X-ib$nKdx2uLSFtSRDS zrdcr?TQ$cVD<-K`1zxjaGF!!jteA1FVm4SYb6dsivSL=Yis>MYdt+)m#=FL_oo*Zv zAKLNP41Kb!RWc0Sidlg1k@?N+hDDOi)v4S#oa3c4W%6`7_p=VUS zaojU9FXQV`g~mFpQ#48YDR6FZg03q}fbXQTfL5 zlJU4*4o3aD@ePbf3UDhw?ed4X&CZF<%@v{2u@##d65UKUZ78^iZtN^DzR`nYZcD(Y z53YQpk_(kt1moE2oV2?A5>NBO-2s}91l;G{QTNp+>RF$aevX{YIV{+>yjOv-HKuCV z>qiyLhZqT<`|;cOX;ti>PP2YD3hzW}cE0&G}kax)f;)>t9qb6QRR`0}{hO!(N?i z|3%ZYF|pG(!M)X3&*n7Qocr>P@7b75`Di}huKsoNk>z6MYYvcpn>-FxSk_QR?He}$ zHUGPa4fK3{ML!4DZvHdrlM4VVK7vyZ7N+XKN$Bhy4Y?^u<7mk3F&Z^9FUInVD>R-l z3Ak=xa`=wGR}gq{9)5;Zd|lE*4?K#r-f+$8hjiF{A=)W9nQZ7UzKveHP?3Kj+Lm~BL0|{2wmnT zHJ%A&hoW~>}mi{Wr>1s{18i}z2;n? zY^(?mMngis^Jr>b#$mGrVXS*!*6AU5gy?Q>K7q=81ER|}>dh)4!AYs%)o8`o{sws9 z9rlgh;G2gZ{+UmnIDrau>0#pY>VN9_fOu0uM9`7qE@#Bx8fYe8?GkphIBX5-l6WPpRda?GEz zf?zPN@yL&vX#N)%2m7u^QDv$79mq^KHiL_y`sN&@sJl{N_L`?j@=!@aJ#bKgTg(GY zNK{t=3Jfk|6U7|Wpg*@WO-81wK|#;vP&Qohs-^wVaM*W7I!DE-k^v2_e{g>+H};qhpbCUO8zrH&H2*v}@;LmNJ|A|y$a2W{Y#B^mxtXe8 z&04gT7vsOJ(NCW6W5z$p#`wYU52ikbV}C3;`vh`!*fxPwGQrPVkN+L!T;S{h1IR-6 zM8-esf!gV(lg{nOhyW)Y8ULtRfr0V=VRZZxJQLt;jQ^u;jQ{`G<3Gycy)vD7 z*=n4w;`n@6v*CqbD9}~RILb66Rd~Os#B#vza?m-B@H8akU_5|u@Qu91t@(xrMJm2= z1#-0b8R>B==O@#m$9+1terYg)i7DS$pKly8Z$`6#k%Bdt1#F?>!gRD_e;6h9Ow^tA z<`Fi?Js63(ux1EjcBspNxS$sw*Mmbcag^j*Bnl2dKaC}~#)NDD7<~vvPD2aDx)r~V z3Lh3eO8&?|`L^%@mEL4ba;6jY0ZJJm-{6kgz6^qhaQn020b>_#kGl7g2s1&2YW{Oj`Fvvq&C8 zbDiY0!~8FP8xp{Ypz{rH29;a$Wdd2fZrqcE;075rWe9Mn{`OI1dKC&`NJZXSmT4YD zKICrCN`vDA<>@_1y6?D#%af5k7{{-XW%z!{3w>0aBil>&kiDW6h82Hp-awoJ_oRY3 zu+};7axCNrr}TKZ0M>WT2DA4Owk!A}#Ma!=bvnjDMyMfP%*m8=O?twkqxC>xFORX@ z$Stb7RY1*i5g8~pP&$ejDP3I3&06I{ZQ#V$X@iqWGFpCib^_sLO3`?y27WR^LlNDr8K{6Z- zP>@hO`YsQaDV-gGM~i?)4$#VkLc^f1nWdQjK#D+aj>0L^>l1t7Dy+0M}gWPe^!D$qhP=7WN17V{dRLV*WXM3*i}#r+Y;GCK=-bKRo=8P`avWfCClX*U>t0xb*l}1x$b4@e zJB%{pY<62jwoVeAgvb^#5)@@qSu4ug4uBZSx(41hD9am|l!8-wCBI{wMP@NX6-Py)>lW!y< zA1wFU$>&}{3Ha*4Ic`oZmRu?_(I+CB&Jbn?RtC102ng~kIFsNcH#3(W5a|>m3{H+A za2Oi$43BRbPQUv93}9^Xm~{uyPvA85_$4LKuP6rOb1Q&^-G>{fO0?`zi*rlBRL0dq z6!r#0_$mO2Vwbk)wmkZh}KtDEz&p0gnk--zu^cA4@Dqwd zqEtP-uw(cvq)^1ejF3e~1mp*&r`V`oMN}0fC4|G^0ac!nSo@5^a;VTZ6n41BN={ep z%BAYoZzKur4iuuf5wuz5X{8NeuJC`b~CVM$bQZv?O9EPfh-NKgr1Nw!SL-J}cZ(#;1Z|3MS zbp%-D{&P3tkYEskZbPQBHjmYp>J@8Ck^+yjQH&0pR^VavjE)B(qvkjYb>H+}DDzlJ zAHm^T!NGLJBCs)9IfXz20xSduChD31i8W9r(#n{$A$zd%hJA|*hP;gsP7iMY3^R}d z`x^pv+}T`&RgZbWubqy?=Oc~z=q~o)GM>gk4BlSzZPh|M6LHpbbuX{Ow@t%oSh^~6 zVNXM--?jsiP+2G!aoo`kjH|K`xqIEk?ZBK?S=f;{^+dOqjb*4wI`@7Iq`dIAbZ=291J7vf9OJsLH~W%G~aR8Q)GmXH*uRPMF`d z1Jkpzum@r8X$R)4%0gU8=XFnL2j=X`!d`^A_vA2z=TzpNOPKpk4wKubvamN{?yt{H z#btvhC6B(9h3A>sjV;N&5%lE^+!-PF!%=eo-cko-A`vA|ke}DMGu8$!eow z88v8;{g>$Y&RA;?@BbD+5%D4(=ON2F>G=M)%-=tDd`HV;X}Te0U162=vy<_XYgm?= z-+v@O@$DU3-uxX#^MlFNv!Uk&qbb8Mbr{Xf?&D2RWmK0lwE7H2=@Ka-vv;1;$8rljfh$1p&e5+!T8CAdcK{cPSl$0M&e?rc_Jr z!-4{fguY0GEi1T?sgXZh%ecIJ)#0aw?(bsep9*`;B;XBbun{^ejg~mM9SD&6!c`5D- zh05rfz*zr8(XCv|Xjn+3I(^6c!fp{l02K5iQQo7FWp!9ILig@)lyu|aDmoiFaH7WK zj3}K^n!h(~zi}##-Ug_qAV7CQkgX30KJr&p?=O+LG*-4%`d)-XDAb8Jsx#A@JW-zAzH6@_A=WbRx09;Zl2#)O@KkEsTrea34EG8C>aU zY|)J+dRo1n70Sm^Ovvu*&?Q~F2OmI}oapq>UnE0xoyxHBEy+&;(I-~mJl~0a+AQjz zJi(kR(0+0TQd$r#S$P_pv7&}07O$xHCz1#q`2lQzQcZa~+96m`hMXh6+Jw}bhzi>MHSDksmm%bVbSEx&kgeqhKRF>();@Evi|^#Hst+LZMJC+hhh5g;D9%-3k*!BE`zz}7msq7 zp8_;5;ZAtaK+8K|kh>gM*(G=8&X7ch#M(er0{vBwNC^Aj?zUgmHVgGrM8 z+e@n`6FNa_)D^`v;A?1nX$elrVXSyS4(L5!eRfV|dN^O!-t1OvvgC-4XNp^Ab#NXK zt!dta-(H1XYy-kSG;Eujkc-oiK z^?Zc&*N?1$yzJ~|zQ(43pbinbz&%>T<$U(6wWn~*5+V+6L)DORkt5g}DpbI0{u~w% zRPWfEm+FvzS(;(8G~zez302}EnO7P2xE;b|A3ogc%j1X`+vc}{5 zsPTO;|4rssTLFN2qS}~pj7?;6tD5T*&jGvtq>YB^ZkDsk7a7K>J{7Y2kMtY#&UmF8uC8?SrWWhTr{d`(SE~;ddWy z7tC5__}xd^1+!KfFyU_>tUJ~lY-37_YE80LleLvGb1dl6gNZ9$h6LB$ zk%dTfU-Av?Ct=wQiuGXTN;iK4KY5A{W<^7eg5Uxr*U31+@C@VnCuqK8=<30T`D1E>QjUrvEG#t6)70Oj47(8X|OSa52RdDrLB{Xa4xGzmD7 zsR0Ad>D-8DyafVHf=s|W^)%FYkJs5~zGvZ-dQso}z$LT|ONAN*&y7NdY4N_j=1Krn zY(gF--O1eg8yjIA3k7v5lE54`35>S%Z&vO!MCir#;~b>;Hg=Gu!GmMEG&er2`>sOo z@RS}lenYqbp$W3;afhSyfT(jbHf8KKcc4HK!!ZS6uP!45QRXzrOXf_}6S}(R^x`j& z>I-tTM0}C@3rH-KtsUV@aOQ@MdLv-Nlc937DdM+uOZ#8Js2kx$+gYNJdlUN{Qc!p! z6`|Jh0KyTRI!g#|LbyV)*}Mh_+64l^@H+>g`jo#0*P^HTIW#0_a7~!o&w)7v6^&UB z7gxFacpZVtRD5A_T!d=^Zgh5Czxv~`4m~>rO=#)o2bV?R*?nd~@m?|88#ewpuat05L3AhuGwV58#UzwuVI2m^**_0; z&9_m6g$>tTNqTvMT&p7T^MTrEJIYySB4tdOU{(G6(>kB!3xAigGSpo~H& zH<0|iR4VWoYcg#7Zo(QJJ%K-sg+F-pp5S$fxNJo$SORS>^?jMt66VlML8qC*2o8|Z zBqYp~%g154n8O9NMEP|a2?D_1S~!X?Hi=GR4h0#4()a@4_s+AfKoOi9LtGoyFy6nPw_oG18KP) z?9==f@gq9Fmi&|VO2BaBU%>powDOP1`_CuIoB8%)z7c(lYD>>WiSF<}5P|)GM7Oa7 zZ&Ttqh&4?|HYP}0hi9>5uB))7)(xd9E#H;G&X}2suk8P$%d|z)QslO7H}t0kL74RE z#y%`=jcwLCxV}SBTQsq|ELWFeaT{{x_z#zcu|PtydT-YhFav{qUzixUEcTYs0-mMX zi$RveZ5r%Z^T(We3ATSOOPG}8sVP&bJk@m6IM1dkH5Q)1xC6zvr;B+lQ~7!k?@;Lg za8y=AwDM^0X(QD0%U^Y{U^sloE@l>>|Mgz{1d3 zkNY^x%LlXrY(aXR-{2Y!v&*T1I?b&YA=k@*L|Z6Cb2Y08cQRC?aIkSPgQp7G!Mx*C zK@-d?P8BrK?0Tx8F7wL^PqA7Z%|)jQdYTzH1yJA8B=nY91khOG(E|Y)5rv5sHD0EO zu{9l;c0tq_exo(0(kp5_?SgPs&lYc8VsI7@zeCL0r&qb$85;JUk0qawm>lmzuc7v)(%(#S!QpxFyNCE_lzkS;w`R z)aMxMFB;!9YwwgkS;wZG9k?Yic+at{JySH_vd&qXwV6+Y=!sWDIfnuNP~-k^TFTvk zghOv@dIPREemN9YP@$5~y#YgEd<)Rq2*aq7D;3uNLUs|Xp^{q$e6>Z7bcd45Mi+d5 z`~a8B-I7x89f&PAV{_n_G=>lUsTl^hN7kRevwT|_{z^>alO=mojw~%J1CriP^x(7( zy5>FNfM$7ff}XY+SG}A8R6WKa&HoY{+N^b`fXCOAr1^cyHC?ON2G?O%2jCvkDk!D~ z$~nk!quI<9FaSs-xT`U3DOR(Comi|6rWMOuA46imhHZ1!F>NL_M1k>%xH$6|uI<-m zy#~K;Mdz$N+N{6AshSQsq7j)f|LQ$>#pQiO9(EZQvtWOZNWm4MX{iP;nbnQ1Zj?J0 zeTa846IgCG%GCp1-O-%F6Oaok$|<_UgoDQ3nxBLS4|CQ0-S7=u>_kDqQCodSZ`U5b z0*TNqwYV~~x!&*Y4gj>^dI-IhbL4n@;8#g3-nTOuQ&(3rZy*{1t3}BcTBbqpbBD{D zg?sFX5S|bKH3yzx1wCmW>%~iX!6mT{PDyaG2Ecy$I)%MzU|iRlQ#qk~3g!Sq8YcV# zvxqeQZ1@_tDL?kbXZql$-JXKI6E!eSMB5gqr$I^A)omJ?l6`&%}@U2K}{EOIy z2S-X_t{2DU+7~{(SW2k(I?+en5P&U64z%#ybnjN~1=e_t%!aV83{2|^^;&6QQWCa% zuK~x!Y?Z=kO0fgZU1jir%Yeg!)-U_-W9jLWIjnLZuv#U6tGb zKZ#6sgJSlBMp?HF;xtY*t5@R!+O^LBv`~a=2(kTJPWqL<0L80$wwiKc4NW0x=ORrV zi%{%V8op)9tH7~+*-y=Zb$ZQdc0qM#MG}c@arP$PSLNl)q~i=crL)oK?KXR`O!!(B zh!?cTNJq{_;CgjS7w z0pXrzBX3r4v5njfaAnzVSN0=UEyr3;Dm4%NQu7R;6*l`K>Ec@aY6zXtHaJXhA=yoB zgU^m3av2zdA{E#H>|)5slHkk-+^n*YZA&WsDw3kjVeyNWWnICto@FC6MN-Pxu*-6x ztbnWU6LS8@e+6U_yJW#NwAQB7&YbY$T3!8)@6Iku-LFk*CA#34AeJ>Z({OOyRg5JxQr+ z+sFS|3_O%-al5=oLvM^Ei!1m!oI$gYy!MA+Cj!=&{q!Wf@A}XU0oN07z<$2y+*td0 zPYqdv^-xSvQ?Av`qgqv4y6HURXz}k@!io;y8zbr3Y~l|=Cg3cm&0@2Gvup-9IE(T_ z+IpUqR#Tp}K19#k?JATMUuk)t85l~SUB2AhRw`Wq+Slu1D)b0VcJu}FCrA;OXjLS zV%m!>a`N_KYnpZE{n+-J(MF0}+HK)mnZj;iyZw%9S4z>;2S z<^jMGDf3y7ObaLB7km03?<7RQY>)T163NZ6^rhlTX^vtDZSUc$nVBW{{ zzlu$dK4q6E+46?C^mdiemq_a{GmtoLIQ}XQJf@M5B8MrOd!x8*pvarjbMyfyB;7&Xi= zzB~fSTgQ23^Eytr!J?E}PK`mm2X|MhdjkP)+BRc7E?#%8ujN^eHOGUcC(HtJeB(eG zB=~qLE6{DrPzd4>k!xn(dH960i3CYhCJYR z&qJ=frzt&R7b)D z0=op*fVi=CAIc9TuAmMdm(cHUr8Qt<{n9KvhD-Afd3FR!Xs_qJd6=8uc?89K>dKMk zy&=FE)y=`e46QiUJ*Fz?n+&(FDdEBUeaC<44c>Wdy5{lKpW%7;3cyN&ya2V`#B-1F zDc>+Lwwr&)$;-4Ad038~7tHIM1yrZ?4CZAGhGPouoiA~Z)Pi54+$!$N^v~+0`TL=K z*{aSuNAuqV541-(5SCJYEC@KQViHk8Lyy6JS`OIfyOhOo2Dc~u4{I}N+>H1Bl5ids zh#}V;pZN%0j^VBIfw}WhQS_~O9MhlRT6Ytm6!qeXD;b{L)O!d8$Mm;Q?bBzY0kH4y zEbRitc#dFfq%b5g8j^1C+~K&GZ81x330~6;)gP(NIvo{|qCLTzKyByQL#I2cSJMZd zSn7nA)X5*S6Gjb2NlqAMjXy1i22gBx0aEimLUfdcfy_5;7SDRy#s86s??+-qzieXv z8)&9?xNnrPTTzZDj&vH&j_?zu2Q2a(zgqKOjZC~*{Yo2skACkg-HtaEewi1XdTct5 zQG=islb}>S-axJx(cr||9`2FiNv-4NjmK$MLb6qab%DpGtaIT~q}5$WYid!HA1eCl zuk@ITzAn@%?uzXT4?5%2nqvAnXbMQ}dN#PF1o15QT7(dqIdrStqv~J^>($A5h_z6e> zCMYQwj@D50^N31>FFdqO^&=RA>PKM=c0XF2f&EC}rO8=MqR?`^kJD|+8<-hsoeXeZRyi(R6=k*4YyX{s)Y+Ha+PJVNIkQD}tD@B3-B zeCjOJ^3wkUIv~L!>;PvMaU0 zxO@*$oAv7wm#^uf z($jpdJCMTZYr2gA7bD=}Uojw?`xQ6>hHtjg-51h%IzuZs?r~jZpXxh@<9EQa`Iv0I zpc3E8q=VXpp@Uj?*Iy77PDhx{kA}EPdJpNURbUQNH{GBEQ*Vpjzrm9M9fsfxE7ed# zTv`PV+%@|yUfu)9gm=JgjjKqdHUDpc#$eZ*55la$pA2`fiUZPj)T#Y}dk@*%Oend; z!ucgc0cTgD!a3yIdYX;v{;|N-FGb|AUddY#fO;+QZS7*id_b5Yfl=!#$z7`$rn2q% zPnBfpd|bemg)raBL_6t|OnQMN^@0z$_MgEj^^gE5?}CXc@p9ivr=956OtcT|+HODK zb+NACR`^zSu;B&~ZYAJwAIMbI#o-Rfx=J-hgKHl``Nw8?Jd7ANLUXZHP^2#$QK$?K%3s1L{zdllJvZkY&5KueP2^Ro zO3oEMx;$0FlW1ZAPiZ$(4=!+*A;hdimbIV{wE(8@Y;35x6N3Q95-HS$uvS%Tkc)gjrf+$=l|m-}8`PsV3KOY%%`_5!{c&(QHrkg~-FB zy%7rP=LScg;S2RZVN+l)%lQ)+PR2kk!aRxxKVXM%W=Kw2#UV(Vv|ublYCZU_U}Tmc z-%1<;f;dkM1IaHI^>bLSeHm7mUy?)vB?A!l#K2sN>gbAPd||L=V+V&hhZX1%GPXc` z$0{O}wne*jV-V8lCI4%YDCSHg( zXh$~TSRiIM9p2MO0GuV{1;?D10uBF~qiJhuZ$QJREk*V5vPozBj6oTrjWBW@L-Q5$ z)}GK?SRRY3Vv7Q|bVwP(w$VNEYZ*!C-6chl2wBNMqK5WJq8@DnGh6OF&_kuNIkzOF zhPAFpkp`>OR&k$V*Axg&k>YTg0>&6j^_$kI5FDYQ7m-SqN6!FGt&I2@nl8&DTe>YE zl~Pt3(fD%=35;u64`pVZhxH4R#V=X>tC4*~PI_>g@Ayq8T|YrKqKJg%;Ogma?CfIZ zS7Z|$)i-PD)L#TgWo50No{GRSWQ+H%ruTpt-;Ix_mxCZ}enBJW^sKYBieg}TvXusk z0jja>hb--u;G)a?lh)j9ue`F5Q)K*O5-$+pXN2ajLY3_$SOJz`TiJ551ls@?2)m%I zCDkVrZv>;~oiP^Oq z#F3Yxd|BGp{}Cu!gij$+EW+Xll(u;z8hZ+UvGOSCF@F7ZQ~T?$5we=c5{&DwwR@F3 zs;JVV$P!CQq03$|blKIW%k5;8AcOR*{w32X?`39T?e#m56Pfi0QfF()8wke|ro~6t z7BJ8#GQS5Aa4}hN8M1+XP&$q#bt7<3Dw>J(KT!`nO^GrbjJ8``i8k4_x%OpIHV>MK z(!$`xQTpfls-Wfi>H?J0&RC1BPi*e#$Q@HmL3lZ+OYs>l(xgu@KI1!8jYi=;n*T*) zqxesRzdSS@>oD|Z+v|%wht-v2F)fADtBcTwL@4#S%!-!ru#-?^N*D zX7a>Yw0y-M(=?)q z(N0J?OQj_HpT(uDoy(6w;a|uIi?f38xEM5kOa>E)$wf%~(*{?DUH)j$!B45cz9eh> zlw;6AroR zkavQSKp@_Y#V-x_$BBP|djfvV6?ur9OS!PW8i(c?2V@@TA$N!DHOIaIZI!lYE9S@2 zufPD(c}^0)10Tn4EiEbF$$VY~4ndZZdf*Vs^;Fm5TelV;=ptBedqQTcu@sX69ZCalCHG6_mPjwT)ZRy6 z6>bji2+Edhqj7ct<_l;+d$_TrntQoj^B`PxpW&l$h?R#-ErBUQh*S@!E7P6|rue*7 z3WAwm;09JZ1!d=&h4|DyhEGfxarLxnY0h@>*a9{dwwRS`nMoNEd8&)?t$7ZgT8cMy zU*XfDvC0sHO!#9CM8$O=6epn|yJfS0T~v<6PEw2kW55X3oCm{FETv(q)pPs3mLbYf z)H*--U`p*!I0Vw{1VjFMSNE~~U}oz2M=^e?(WP)V)7{|u6Vjq$a6N0eyhip*aE6~n zsHN|T?RX9j)j4QFdPLQs@V4o)48b)tIjnWD3zY2?2eI901Ta6uwp949m@Salj{sVO z%n(*f8{so7w#)GFo0ya!U#fQbGv0s20ZQDBh|FVTdZ{&h)-H*td;n(TK|tT<`jyJERfs;!icRtasJY-QXI5jY0-AxNfps zFk?kKj)6}MD}C8Ha5_p}iN|q*E zAs{%zhwy8@`3mQSP#}5daC<^PIzC6mXph{>WsU5;$h|F|8P)7C2~x6vxVa$*C}D13 zxOu4qEJv~xj$X?+y8yESj5CfO{gb4v6GY7o#K9(Q4hi$%_a|T)_#CuOXi_hpp2Hs< zqv_E6Gr(lIeOkb$&Bl5b-+@rXX5NoqXge^%F@t;FEhg}vyzZg2ZJQHHg)2M&*ha>S z)gD+yd#CopH)l#8tD@elrYYSKlBoqBk~S_wUJeLe13We9aCzjlkDA4(2u-u2CLb8o zsfdSu4ZKglWxy+wiDhkpONBcST=fp|n0f(ZKFCKGV>!?D3)|QOTjFjCrQU*44&Q!G zr2$QW{BUXW0_+3W96PTLcl3OIoW(|63=SmU zE`AuQ(FoBSa4A1f+zvmwYXGM&{O0UezuvFZZ~t%9ug<9l@dGJwDg6}ao5K=fDQp0` z!DxsSKMx^5Emeg!-6KAC7lf2{4rC_*3tZIID=_H8yJ?+N+AWa$F4wiPz743F(R?KvJ;DfMwULXq5+pg9FpeY0SneROGL9Ya5?XYIL2Rrdw5XrrcQ0`s_ z`xMCUCgx|=U!N-~31o$c_fR8A@jO%f2JLILr%HF8m5%d6T)GN7-P26>Hv6STTOBMu zNn7D880L)dz4(A1aDVU!ugKcKCvZN%ao+dXrhHz427f$^n9lXRxoj(GptJ{vBIcKq78UqFr8b#*K9|Z)RJ-5EygE)aVse{Vmm1wqp*Vi z4ZAsRX`6~1%=rQzg40^s&V#d-HTt2t-;Nu9?N$@6J0g1I=+$lID{&D zs(;+*7$Vd=Pg3$rYX1*@Pe$#%ae-9)=m@tvI(BiF$~r4T;;-RVeeI5pT1gQCtVQiI z(ocojCt{qOjAs4Sie@hX&0ZulD+H3-l3u5EQ*`nR+s?(cbHADwdy-aDxE)-*Nlk~D zV4+bWZNxFh91LGtI-B3lC3&LrX9#QwuBckB#}ld2cgXu=qddm9a*@J%;k&rq3#`{% z@)QN1$tmXiKNI)exJX3vFTlbCM_c8pnw@pKz-lmyGyqblONdbzxJ{2{7eS!(bc-;@ z05Par(F)tmeV?%&l2EHy*McrD17MUc?;QG*=yJI5Ue%XBjxJvUol)!Pe-wCmYI1}e zgn$l_y`F?bQvqf^%&n*xlKUYBp5Fq#=CpHufJD!d6d}P$*y<^h=m#L~lac6`*s3O5 z9e~d1A0^Q~ibT(hurh7d+bB6gpV#e;rBCzRPb0iEJ&rzk=gsYZ!h=#G=a>gK5-!3| zy`VAKCy%F7tbcN(n$q+RHcWd>f1(i!r!o|aLKJ<=cxW&$K=$EVz}qeUN*PV?2;T-* zoV`+8dq49*_1yC*BlY8#mJU`uE>iWd_j#tEhS7Z ziRR1i9s?)-MfpW*77Y~z#5gz^4Ch2R`Pa^#4<2*@a2<2Ew|%$~lp5LlnTnf4-c@yo z>;Yi|hzYO(Gyx@;$LF-#08$D*B^IPwnmhLjpaMy>zoogON=T6By5?Mkd?v&22jp|$ zqz_Kn+JX~LC!{lnHusWF!?o>=Nzy;uzgf9K_+7cI$br++nG9r#H<)5GKJijm8A8mTNeU*mP7ht)P6{bwpUE;pl0w+T zLO7Mos@A-%HnnV-^<|7BTca}%iE1)g)^fP46?v>CJr%*GU&@NXPLAxJB!ysiW1HB8 zSjG=vmjvu&4TJL=Z%1~e4!{}L2Uikjk%LdNWwRRgq;c)T!j)Y616wwKz|jk3c7*L3 z^3#~5`7;Z#G>0`HNz$g(u(8wpHx%bB!}lZn8HD4awFkj^OCP{0nZ&5n@H0OGKEkl3 zXJV^|IhG&&C&IWh$_27E^F4gak1k(e5|7^n7f8kn3Rg<4%hK0f+;a!@+)W2In zGlqXwLOR2=m#mUqg=t23tT5ml>=l)!EG7psAFHBP=)shXwTm54KSQi2b8^+{cTYiP z8LN1m|KhFKxbxI7UN;imP^2LxHe$d?WHZ_fzKlkGS5oN3W_j~U6kIY1c^!I5TAx|r zo)3yh9gaYH;th9P*{_(%?Uk8&KW?cs@TbA`!HxLAUxO>5&~~kggneYWphuXGOk-p# z;akl4y2TVWYuFT+hHyczzW8d;WDTy(wF2@RTn`~1wrhiHs+}Y783cS9T-RH1jn6E; z5eZR^Aoev;G29c*GhSQF?88_}4@O%qzMeTlscq$aW`nDbm0yFapPkQ34X)E7p~;r3 zab_FypKbL(U2$3V`R5JAI=BP}%wV*Iea0>f?9~^6TE)@M^qiF{o_ob}=K12;ii(zH z_xzc73dPf-pLjk*Zb2Nig>(IIsZ%I$(73aUl7mLQaS(g;_*o3{LhLfM=Ix^ zE1scJIsc!;bCp!i|D<@brE>mR;u#{9^Un~^V5yvczqG-XQaS$=#E=xxmNBFV`>fy` z>uS{*vVq2Zt|IFYnLAeG>~YI&c;bT!xXbBAW3#NKpxMBn^#B_$Z6(|391TLQwDt8Wa^I)z}6_OB5<8M67C%i5OVt!Q z(IQrMyH;HC?DLhc{{9{*pKYpuNS(deN2JJ9w8qmhn$}I9JrUV!QZFzd7IizmnON7jAT* zv`(bsh{6vgs*lF;yRj?!AH)%;st37L_ZXm(Dl}v~D-&k{r!!5CA|gGpz2^W;$q^xq zb6qmWAqQwm4l_E(kfVo8+BG_XY}kf4kHHG;ngEiN*}s62z0tY(@#N?fx-MVnIY9RZ zyW*YX=u{5IrWvH&1JwDF<&QTylPNSv-4q(2PFq)s^kfPRQa6PLsPi-_^vT=)UjXuE zOS3_8Yoj=C3R*eDIj4h`$&u22+SEK~4%2>LZ8$K;oG#wrxK|$t_oAL~&k zH%_VdYrO7P?`Ahevfj_|YAzH_{0YhZ8^aeLbS^s({$)MkpMN0y5k29bEchxdar}P+ z9}=SeT9%~9S4*vVtG?{6|59sC1Fxy|C&eRf3R8bl+|BDEm6rGuJ@HNJpWo?Ru^(`R zyK_>2Bf1UW4>&0XrvN9#5xjD~?^{52<+=YzcUp=#?>*eJ-V{8fC+MsLLGRseS|-`= zpYys%r6vAM5Bx{C8p6)h1L0ad;ier3cS}#W?+LC-OPmVaZ`$5V5X#e>Ov;3j{2g3h1_UI|&Z4i@q7)c>NM@Xt9A{;;0#2MfMROFTwPeB=5{x!_Da z5Pma8@G1TO46pmu{{c5evi|dVU8K?yr~WtarH64gJ$OL7LLH-pCNngv%-|BS#_;qeE&c5Ia>yFSzF$e<^1ohNG3XR5}v+HNQUeM!Yy$g;Jf#yUBj4pIV!Yk1z^oB7li76i<^`6X-VB9c;?0%#=k;do)e0H8p-CaF)DsI8GQ9P1g-mPzuR^BZ z*@5#Y5N(t<7IZ$|9hJXSsGmxisgU86QwfEq(;cc{OGGQ}w8S-AQ`*zL4{e`03cgrX zF$cjr2yomva758bJg*3}{3)Fk1D9hEuj7>)c{;zFy^mAt!mB&Q5c5-F^e*g1$HnZ@H#hi}VeI z#$*wjM2w;*H-G5YF>cI8dj;c{_mN#y=mm96h;y7HNKwS+OZi;P=W)D`=RG{G?2`-Q z*$+j=yuNWxM78njpc~IRy<0UegLpXhi!5`SXp>$7+xS2e6@}tIP7lS#XNF?4`ck0~ zXApC|HBZQ1#~mZZ_L^pANOSv;VtZG}w=U$v12sOW)^@Djvvd8<4Z--N=PrpJ)=(B30IC+QFK;1p&?IUjaKNc^2SY zO01vGkNr7F(9~V)rwEbMR1fEwHZE)V@f0#*^gEoG;G*C2YgQ=g=J&{$Tn^?a!|z_* z*Lh*w|4?Z>cZJ$mb{9|3x%Sd{#YlGz$EkYP*pu4=;{J5X4!am63u>aEwH+L04pEp3 zdcUQPX}A>7X3cUmsiP}?8RYb2_1>SU&b42$xhbo^5f~tc0{o1*3X9~cg4LZhbhcId z1m6Kr%6ZspwGN-zcn8ZO?l{5Ae(zbZCdD~h)`NeGF(-7_M9rU51Hm*-7JV%#=&#-9 z5y{T?s$0$gh*R|ngAV{01Y)!NAW=*)(=fO$wdV8#OKb}#`B+`9ATXJuJ+~0otwI@R zZ%f%mxdfX6l1(I8A9z)Wk|r?{urO>wiy|dTQ_j-zJdc#{Q9d}@(Z5RPjztrNcd63z zdXdwWS7U+O)||}_Mdi^HTIy>JT+gfiqO=KY6ivtoh;Jh?)w_QHUX>?T?=It6HQ1xc z>fLUc>){pM^eB6A#bEzOfjS_5g3*CYhtmpWhQk!6x3+lL9Jzvs9qpi932olBLKr1RC#PKa}!6OAwNl^x;X2dQ zIxnTGy^eP7f2n(|oTVK4Y4|;DZ9HAOIl4xd%1q|GRP>!BhWK`fu?OTocR`jX$Adu5 zJv3zbeEk~8Z$p&(5nj!2fL~mLbw?!u9pRq*JarJ$j3h^MvR^KQPh+Pr#2gSYX)v?p z>D*qSiD7;1hKdcyBhE=Co&By=TL?Y}q@LoYhCG!y*6+?iJq%jFzk41rDLAn}!lZ($ z+ZfS}cgojw>xm9x*|J}Is6=`~4`=nu$|((}rx|)!ZQo^8(X;Jyl;crEht%GJnRVM- z^-OQL)2#i{?`M&CkR0ck94R;%m5tfEl}%#L90sRslcNdr4r-I==IEkCrR%D{p`?_Y zT|S&`i(y_T8>__1O4oem7$Vi7o>8KdtnNG&IP4{t zZ_GA3tItA^`5U_Vi}T`hhW?H{fTE7P(Qt_ObQRz~cf;J_sZ6|Ao`uNu2=6Z6bL|lC zNrhe+GxBNW-Lb&j7Y*!+8bki=w^#3eScuL0HjK*6pWg(BnZ|rv+8P)`YW-RFa%{xhOz;$$Mdb}$v2+ezxgHhz-p2`t?*qn&=caQi^cHV3AE@1(Rd z0czFU!EdxPVAXtT0==vn`H_lt;)83N32+OP)*R7JU-=m&&tG=Uwbz$TFTbUvAtyBb z#+lb%eM?K=dUV^+)8L6bOYH$y@W2c&)7)1OZWw>VH8f!`ED0?k0YyEAfMF;(l|Lc$AyChIV1#q~i1H&-cTpF(ty_ z^8^tki_W|Hy0Tk<(HaO+pjvAx)J5r;v|^}ULSB`VlM!x=|J zc*%LwZ@9*-!Uv}%>-!!d+O+URo(Y(-M;GB(;akU^O^Y_9O*|sa>8JdS%`FgzbL6<lnVI0Rl?u%d45spvD)b`78 zTuPwA#|eeAgQWISlS+r*%IVQ+wpu&y%3z;|1V}9doxhWaDSKdIfrTPQSEC7Vtc97?yY!{vAH-I-YPBD%ZgL;ZdT_yrn|SuRpst^;US^Ok_=tn9 zRIPT0y{puIofXaS@)OMgOn27ZXFattgg3C}U70*q2AexFgM{IDd9*P{Q+6hWo6W4K ziOxal&h`1;uHLQktG-R+8oA?Kw$JJ3`33Bq6Ud=0O<;JD>}-h1G%>b6*Eua}CYn<2 zWcG|}&UWspCaxSn_EI)W=wauPbx2i7)0&^n5c}RJ)yMcSRpY|DDP0%daqn%DYXV=s zA=O%@W&2;sDQ&51<#M^ov$qxx|JWHsY3)yU^Fu?!DfiP*{k+C3@LjTC{gkfV_XrX7 zIs7!}lWNUFi*IVyDanA}G-v+LG{4I=(|F`ZfsGL7$>qBtK%;Vb}g z%FRXFD>!_~>8TI-=1c(~l%CBB?ACDE24mDA3z6oJ*e#sI?a@Qr`2_ob%3_g8W_scK>M%SH9G zbF(YC5DM}RBeP_-KcEAMmy;$MxSN)Ni!7g*vap&TytKsr%Cso;-rgw23JK&mUs6k2 zGk(N5)O>~4G2DBe-y}zhKVuDo`#o#Mom=&b&wmn`q4xq6=# zmNy?;+caxHVU>pb5!0K*GJM;@ch{8$(&A%%g@zYX)AmQg@#pjrj*vxzmAx8{|N36W zf0#SDrmwn(I)|&9Bg^Kw@?@kSt^Bfb<2Eoh0)H*R_)c|r5h@;gBnk2 zH(iX4bI%_KCoNkt@4*Z+?(}pnM^9)t62}WNThcB8*=ZnK0c++u03Puv1l`t*@t zVnnimCmi&Dh!%b6{MqVaQR|-IWySU@QcOYt6Ksw`L_eEY+ZMYwcRpaOnrHZB?smc7pL0wGepU1h=krmt)reC2%~JAkD{Qy=)9F`lX7=Gs&?9`^E!;K7pANMRC)aTA z?iSkhlUm&G(Q1&)`wY`kXzr&|FcfIxh16pxYE;);-%sl&M)sJ*O=hm&q9Z4dlCr%u zIq|zE6q5YWoY&D|NsjC^M&3A<3s5Cr+Ao{S1H_bz4EJ)*g?fyqRYPEm7eh}W`_p>H zIb#!v1J6Z}?#^AfQq%nbEg^dwcL`9_cyUHj8v(LGq=<}AJoh>BB^45&Jpw*Is`-QT z_^`Xohf>(nDpf^BPt6{|*RYf9|bLh(tx@nJG4H@ADfFW6_rzane6?5%JH>4Wy$!JTghxvRXm;O%1T z{B>N1RBXR#)%0iUY+TvP*k{`>UmWkdifdon#@VlwG;i`>93PRNY|qlNl}L@~QO~y) z&dC=WMXW5Y%Pip$ENHv={o;ak_&)|>vHf20&^L6PJ5W5*c>w15G=BueetIB^2jwrH11G=Jc~ zDBkz5_I~bn3D+Iv7hx-163^}*X%H6viUfuD?W+^jT^Y##XGH7LIWd*A{ zB!@RJ2C?tEXbokQmNheD6m*QO%g(5HCP*ddrrEa%F|Y&oph+zp&+~8`D;&G@o8Wmv zN!hw2o@+|DzoFE(wEYN=-?(^QTw2z25eoKTWRZ)gvwbX>)<%xHm6M#S4nXw?57lD3 zx!AgRbqb>A)%DG&_uJp zAn5zFJtJs0$+$c|=5|{3m;C>I?E5Uj!lb((DGKb;OIEPptEzm-1Hl3!hOMp4E%J@=^f2)klUOFCdywQs-!RN;_q=zhvij}17SK(OGos*~WES=>5X@J8jp*nnLe z0xNjE>Ih-va|)KCB4X1lQuw9GHas?9qnGXEWVSDEJuWuj6=KOIzr@+T&kMe=?pM#NaW;~AAgJ(SI-(JSfgJ#@v$c&qk8QTaP2(gLSgF~#};X!Aok!H z=j`+{&LVJN#;L>}JmXK~eL?+rA%O!k77%;zjA!5u!el&wz=0Y25_|BBf!$ule;qXA z`-jZ9KACYjfde5vL+rsJKDNh$_y+<9W~?Rl;2A5w@-qI6z=0Vj5__!pP%;t`)x?=bf2?o}U>m9Nab;XB!0zdNq_`c3^z-sU9Ore5^<-gKM{%9DG zfTB%(?cVP4BlQLzZCa1lRP)h8>1h(?@_6aj#!K)8OpnqfM@K7Tmda zY@Pr3l4vtn?5cQCtK7Vy*qpHWg|QP|MZvbItbY|UJw^r>&$jJ9E#BSS|I zVj5y1zsgMHYtF07KHMzy3OXuQs=eBe(c!SuqaD4+ceSUQAL@p9~knPD^YGwrvpV!73bfMTy5SGIynxoF5-{x^wdt$loU+RogGy+Y)DD#3+(kJ5ejb zt8h1?m+U!9qdZf#oh9?X5pNm z{iYH8omSxCec9r~y!NegDl>yv*{7dd9%M<(g7R+ihGUQCF5p=jdnor&^Te->c|M!F z$UNC+RZ}RkN-XjS;kC#hxd!u@kG)aGts_gT;f~RtiSukFd zfnXQ1!cEj-6bjJvVBF6p_vFgMgNr7UDs-yiK`G#WK`I)n_IPB!{HEFsL3>%qD%pUX zM=^truim3Vt$BD+!TP=_Xq7YpeM|<~DURT9YaUknh>f7r$6%OQ^qjBx!^}QwOx$73 zA7**M!?h$B*!%+gf0RKIRbH@QxizPRFA`Pr^m%N&?|oDxjq!SEu=$g8);Sy|kpA11 z!)lKSAONRP0DClPOCl((1Vacrf4@}L5rhm}EY1W+f2Fa0BVqMMz#OFr#%upuI42!Ey!;yWj+Re=$WJXu{?7lAuIDDLS!>~fB70O4) zPGNKMAK|iBSTox-7_7kY-Zf2~A^J!g!_6S;83d4#p%**wljGPcSwR#HHJm-bF;W^N z5vNQm{w*Ue(vv~^-TW=ZL*ES*Y^WStQnr$nO^7@3Sa`91I5KR%8gAaqG%%*Xqho8~ zVVpQQEL^s&ZqC_~*URR+lK7bP61!t`IkXfnhw6n&1=W=gDReXjnXtV&%(^Y?TU#n^HCGO_ zXPNa{7x>Dtk?;E}wgn45v*vD~iNe%{MORpf^TK5>v-YCR`W}Y4TC<#oGlxuqeO}Sb zB^>^^mPYOWpn=EvoWw5}3t*?~G79hAH;!)YKj2xO_Q>1yJ9xf{8Y@HT77Nx@7DNh? z?SCZ=SX#CsT=qpcgM=*6{pqwnYir#u)ZOgQX`R=;m_97^ZEc^Y(F&Dd2L;_;N*`Uy z_?(@jTfl1MMhoXt9n=e?m50kP7rUhIeB1cgQr=4;Gx|Lw5<_beLIE}&5|~*MAM|TP zF0xI-K5d#6-vFrzL+KheP%jO|5?0c>64HKOWHVeSsH*H>13gsmi4~8)RdhwmZQJ})-x35{q@kCjgm=>?m&WD1GAab;V^ z&Db&wP2A9+U7=%Rd9+Xe;=T|e3749eEc>i5dZ*!1bQo!()vvj{B)ZH$nmSo?rqR;s z0#qs!6S=(5X*lk@2KyA6yq+7j%FMwvgZwnc?lV`CAfaaoDPB zt5_8C(8b*(ly(decbJGnli*P-F`Vm^D22N^KUPHK6SF1WR6Z@uDNTt;JN()-XLL$L z(ei7!e|P^fjwK?6IJ#$rL>cA;kdToX58pG6Nddb|$UE@)?s4q=tmK!mM_g=VlVS!p znwYEs=6kF*553@}|lc?th=4EN#sPKMvKgrSlj+dGIJWg+C$tYAV>?4pw6C{a)^H+577}?ZT(@JMsw= zXW0AThrRFhJYnzu%Y$>F6x{DI6LZ>~Jfu_W$>Z-QmN<{cPcd)(PrKHAo?Pxe`^|Kp z1HAab-ZLt@6HC)AdA>|rae`1;7 z!TPR&^)9oi3u_P>O;;5)W5W^E?XsCntQQf@oZ=Aa*_9^bH!sS%dpo;gbg9m zOQs7Iz}Kz0Iu#i&4&Zdynk!eS4KjyEm-hX%@+yfN)k|e1AMMDh_$*$L9=|R_GLyA% z#8C{dV0_ro!Gf*UoK>LAlB#M1i=MK!ab-J7r*BlYaD2p3rCbtKnwwJ+$1^-dJM&9f z0~2v>OU(#ldM`zB$aaxRTqPF2!k0LjCy*!B)l`7(Q zxNJwC-KeN99p@?&g6`Q07HD94W=VXJqy{g$r1dXIJ0@P?kFE&Vm;1SkSmoN6XC{VF za?pM?@f!}$mDq2y+mgS-kI?)6*#hVJ!S*nYix{l?-gQw_h5_1Qiab0zjmRYhTDYr1cv zD1;T-dY)RDIp+Cz?l$v$Hn+n(7w2kK#mY?OurdqbKB6l9+=>Qv{VFP+jhr*J;wg6h zhTi;FYvK95*sCtm)*pRa)w|;N*22sC5S?k(HoUki8v=)?ENPm6;|yo%!3LmJ^Apo6 z>}TnY472FeQGm(x^<;DSg@5Rw~9XH#1bEqqp^&HRL3! zX>4ciilUMbjQ4%#^)Q5&2^TN1SE5GX*uvu6yGb|B#%|yPpOy?orFN_8Qm5?stD=id zh$Zf8Lfj4gj#zyH8laP8HOUMss(-eE`NpD{K&xbJl<$jFgMXu+}+Lv=4eBL zHfHq6f^m4Ti9yO{ExS{pTHsdn4z~8=9U?*lg)l=@U>gC-W3oe4NI zYyWbj2#ivw!uZ4xI2(he3EJR*K|~Mg68DcSa7Pl2R%*>HQAf>a-B*Iyhy7{TqZ+K^ z(n}dU%7x`xsf|jBpw=4W!*|o{tVG7eL$`I9)y%nZ|2cBrixg2phzcY6c5ut)TR@|YMx_IMJ6T$hBTT8UG zo@OoVZ#p=BL1%PV(apz3cb`>$rMLqhix4a)$8I+!g4$=5WH!zG7BLE!GmFz@e(Zgu zZ=+mebO>)l>zlv9c|C-)1hC6v9&%RllGww{quU*XRG6M(p@&vortWlI=f!cqgrQd7 zGaIoN>!n|YpFh}|<_25*t-Td0%|K8OXW&CSx;wq%oD-jv`l!aVZtPi;DSqKzw^$aalzY%@?N5*` zexc7p12_f;lUALTf`ePu{&4@M0``ZS@gL#dNH%GtN4d?c*&{K5rqm84s&1G4$$X>K zhbD{)YRF914}%9^MJ9%sCGk@RN~yge*^khBiM?Dry#KjE%%#|n%|@?1A~!Jt6Yse_jMKomh{#gtmUV&F1G{E@RGmk%EoP&r=fZaJjuKM61&D4CzUnkE!OXk z#FN3KyOQ%#%|5%|uZc^nC7sb1JFflZ7Rej3zZ_VC>D(?^y;TO26L0yYC{!3!6xHhN zEFzj3JjGLP%?Qg}$$6jmlCm+m&i9h}R+ML#l#ReX;w@v{rp&tmtIW4keeH3?2AOUD zOpVAa%#j8zORazKQe&I9OpB|j<-2i1JF!6%krXoXO#ycqthx@Uio8=y#*&F{CqT)UI0&p@5*Ck z?;Djmwhe#k7Rq`^WE!I3*qALklNe^tyuWjX+Mv~MV$>C-@ezMA_J@r}d|y3wQGA%z zqBQ8%lK5S!i*pWHOv4lBq<2--s*x2_O8eh@j$EZ|cD~C~?T^*8UMKTfQnr)L1x#$MZ ztgyWnvrI?MC){qh!1n)JNy~p#9IMC-M)ys%<~~aC#j&4j{dx*#@do{g-I>7ozvUL- zxd4>CMTb7EKHgtA2ZlPtD45E95;V-BaL-&_F zMhE{##K$FlO=NnyL$bgXJ{lW2!VIi088|8lk(r|_&5XB*-SICl}zaQBf|^osD7WX7Ss zd_cqk7lKr{H8A-Zws!d=_~Y*2kGg}GcLy)^g3*qft+_E};sz;0(AQBUP4G{&XWhft z$#c=yAReC_#NSWa!~ExQd=G^lFpgErB0j)CCYy1bEU(FD2X0P>-TjpQojO0(@3*`d zCRnZ5+hFOb{TnXBH*|6f4cd(yY`p8{-oSYGo63oaSsVA znX;%qoW|to^6OVd8^VAeST(m$-xQv4E}xWs&-XKkh+^tFg<_wDJYiMiG<(s!jlQV?uDljUh9Qt5`LMmvr<*m zB(cJ(;gDIUp)u_G+s~Rh-<>B)%9w!@hnOb{s8x`27TnL9hc`EGreMjl)p-vj6FHIs zXvwv_%ugI?2&l{6D|l&x`U@je`_1}^Oqix)CS1Zkgqg#fQf$2ZDPc5zPwhs(~akJSq zcuw>awG-pME_3(KH)^s+DB7#Bzm4fsd*~93W?|G>!tOaDX7{m^lVJCX$uZcM3j6r1 zGo3R>X}lrUE@Q+r)^TzLE`F8yib~V79%qe&Rf+Kj>z!zk`T~`$3Ova1mFvc9mHfV$ z|0o}YZ>e{T<$R}&35;ppJ;t)t9Efz@ThQ4#4wvYvvGX7~q$OfIMib>k&5_fzhclBF znC0;urS9K-k_E4p_K#k6D9n>Woh{!p6Byjc z`QZ~p+r_Yh3|CaNPc^cmU7V>pVOfFbIDdjh-oFhchhsy+*z+IJo+EqI*p->Ql@AHW zM&oM3c?b-!x_8X7-lYH|4=9-5bmfnEiKs)(g#xj2B+_xlqlj|OhnHnIm!3sGQ&eqd z#b;NhoZkrw0gOKK+k%TC3?ftr=0wJ18ixT^{n?|coe1cA9^DKaO`tTcZV(lfc+q)R zc!A-`15TrakJ1#WurHo0iQnqSW<*TsuPJ`B_(P{J%Nv;ZFY0OxJ;rRTPO? z5?Pxbn-wjbvP=Apu`%AN`9c#g-9GVjC}N3z!qL?*Qe^Qjo)iK2*5ZqJD-AK^nM5IbYmdJWQthAHY>a> z7iyv}e5K<=-j``q1e_8z5p#4{wrk^=grDXs@8x#j!#LCNP`)GM2$aXH&Tvk?0A}^9 z3*KHT?sVq8T2gF~JL~tI9cNM`-hj#Cab|rw&MZJ1bv1`%{uY<$6sc$#kQa+lg3+-fP z^kE#HL!Fi-9fol?NuB}XDzt#2Bhj! z^};exVD-m=^!bsxNZRP^C-kW7qYg1K#%!%H%@5Rf+Urb@e@8v8pF|(T3=zvaRGP}8 z0%{{<4rM6ia21_6#YiTbSvlnIa6bH_nJb*XDcw_iF?#+9J?9&-w=lh6Cedm~QYX%mIis$y7f5gW>K<1nOQP*4G+CQQF zb&=CvUF0Nsz9fGG&7awRY&U*Jlga4Wqw!LHO{q7`P!4XA0DT$_#I*aC87Ui_BdDDg z^=72_^wP>AqHCl8FF9E5`v!5=T1uk%IH+fQ%@x+dQ*&0#omAKO66&sF*D zOy;IPg49;SJy^ZZU_519>{b{qK(W2mUaOr?bGE@{Lsrf2 zH1eX0(+sGJwNtI@`}MyC3%e$-9z;Y0ajLbid8$=q!W57db{Wb>s!~$+ZYkX9u!oHJ z4Ldh2?fmvMBd8kx<*a>)72EPtHG9~7k(vk!T+{f5dXceQh8(;q_>*NNWvx@GLpbJN zA-p7QWVRn;_>5Zte=ZGc7-{(oQsKR6_&7|2KGaNsOuEAv3>aD$Yqp&j0y+D@h1PXB z=fCvQgL8JZ6Ycvo+;c;*y*Kf;;dp6DM+SyoIct{xF}@6t5A8ke$C~q#EcD#||4RLD z)%=Efmc%MxOu`ca_~q#a#W(Vs#+7~C-M*NK=uQzyK6_flLiMn5p zcP{n5Dn@^;wP}BKL#$fayx2S5s+E9WG<=Jphj8qLvW;=zcSw#Xv`r8#OdTF zi#>*{6v^1~nU8dxp?fDind09RSQ?)uz+QIduTwp&*7NZo*|VHw$rK9@o?@W$U^2y> z2TzgXRJkdP`saFKVebT1Y1zM>0SiD`gAR?5T1skLk%{vTGJ`&3c^}5w{^ufd_^{0T zFfjE)10Vk8eaKPL9K|ep0P>Dk`BbQ=#d(B?akX3YF4`(T#=w-YwAGnGc9XLvlGY%u zAvJm?N9jwnud}ZGcz1r&>30+`u#Zl6T+RpUaO_MC%a7C{A5o6s%TjG?Y`XGI7yo_X zYsTl;SoRAM;4?l=GKyyX^R}JMM#cNiEqTbR*}06+z3vEYRYgSTW9{tcMCJ@y=cA!U z%Ta27Bs#2}%`T7RnjS}~;a5u{9_c|)kY2?k{FDsqBwV$E>iG?U2jLr< z7l>8!LlPf^3I{rc$rQs$u|E;#BtIT?@a&n+KAO%9zJI}e4+0>|c_*3T)q|(VaT?qd zhKT=0BDXa}#N+Q13Czw-l4KVVAEPWO)ZInI`@VA!>K4g<;(h2Q;_a+YdJyr4L>!8U z|3db!BjOXf`0)XByi$acLdVC0`~NK+C(fj>9&GAX)l2<8lP?G9fK2B~FGcN5SUo06 zNapfqXmI|wkp$wo8Hty$vFjq5Q<6mvK6sG>oy=sB4k;2lQ1(Yg`=al5CfW(2T<5P_ z|LD$N#%|lyj1--jHPsj^CnufgaQx2PERv#i>_uT(Jmj?oaz8!Ml#PnktQZ=^3AaBMj?c;6 zM)`o0i3~-P0qbW`)^L-bH1?YfVrhTRbHf}g?h1<+{yp1^hlM7?Vu{JHxJWXuIEfc_ zKfkXUs^WTeZpWq>!oU@Yxe@cDlUZ7DTb#LAMn-YMk$vA9tfCPMcp*4~U_UoFir~Hc zU()otxvg&uVg9jvtI6ePM%rECODL*%4fCo`1jiH9pDqi0nlNgE_+kU0QRR5*CRPJk zY`vF~z=?qumtf(M^4(j{HhC##C4njY7qBK1X-b#jpZ*lR-VK^?9`Tx$h}IT}{s_uA zE!zz~ZQ@L9j#mZ=bn}Y-2xfN&KXW7LyJyXQi&MhRkMu1+$pSK}9MO(yrIwDl4X!O2 z-keHk21~2h$md=>QS{|d7OEMgbk7d%!_vxqC)yCQzx9s`w!k*ZpPbOU8ep#3gy-?@$^Db0lqW2m?~a~_ZXJ(Zuuz-|a9iQ&1z<0WGCfm1&WX^T7lq1LF&~N=SUz0-#oH67`X$GPYS><%Z z^ke-8Z`==T0W>vebKepo)=h2^HMoXL9S zP^$BLytBG!)xV&$hQ^HC+JnYOn&$kBw6VZLpMWKUs1~w;;56R);GZ^y%0wckqaF!C zZ5lT+Z4r;sWi`4sXovB5Yt?M$(3m%-C~)q_yyE%RnzzA?*B~mqgW|2ZtB5K5vx4&) z^)WESAW@!;X(VGl$z<$6Z{pdfzQyG~hAHNfjepz_WYv@_GgeHL?E1#F=3Y&d>mS#e zH^KcZz}355$YafC7xecC%YI1gD1>pFs$O|qH1NBRSvtrHN)ajOv<6NJ5cj4nMa+B`bC>}28x5g%>&c64h1paXefQizZSd%nebJexa5kJ+--V~;oF z*>LH+_e`A+K0={cB9OZ8Fh7@IX2XWMW@E5e~t_4BcV9ocl{7(HKDKroS%))H4lQ==V7F*oL8DJBNSFCmxMis?@CUX?G)!*y% z(@*DqAI1?XOWJ2Lh9~&GhNNB2CEwR~nqF}^N6H9qqD47-jnaDLU(ixDeC_U#?+cuPe}_0x;OH9D2bISVP_tWeKcJr7@>4k0*OUu7qKu@A z@Cad-LnOz!Vw@-0{+3~)$VBVfJJ}KtX32GYe|q&^$y8>ou$4JDHu8@fPlRRdV4Zbl znC4X_%mtUhg+AvxYKFr0xLCg$Qq``i$RcI5@YlRxtbJDt_7(2z7_YdiVB7373Y@Cb z!PHdj&Ro&&>=Q6`7Tv%l=JSr9l}_kRK_iF4C(193Pw2p>dI%$ZTBb1BGLZ1>;WUc~ zP1GoYUnGjRE_QcMimi*Vcy>SVP?_^X1zzE`7xY1802M%5=Mba|yO?PcDcy;IiFE-l z;4EZ=i_YcOxLy}`8;{#f;Wtx-3Oc8WC<%(%l|m3X%9wIR6jqwkj1zWfK&2da1N@Y@ zCDvquohv3G91aS_3U|Lpf3XdTo0pOMOqe?% zexnx7zAvXHVrKulfq^Hx`;Wt>@9pE*3SXT2cX~aoh2G-%yjAnWu^MePMq)Ci9-dwi ztD=^)#pYy5lP_|MFRfxrd@RFjE4ALkO^G#r6;K~8Tj~WHaQ@a6pXN-`MDFf41&3mx z90scE@tD1(18SVbS7+Bu31RSS3dXJZ2{`ELrvK=tN7Q9m3&%@4>Z@t1*qSW7zR8rV z--DH`c;^91_FBbj4QV7+9s70gmR21cUi>D{hSU{?fZ22Wna(?108yVd(0R;tzeGwA zd|nHd+RfIu)zMu!*1R@2osK9*clBnUwcoecUBzNcwW9qEYt305LmU_Wgy}*0R$29S~cmEMbu{` zJj$B;CCPXbk0iMyCdPr7hfx=X%iJB@V57=4s{lCY7R^dKcaiOBVtvu|ouL^WWi#IX zr85Jeu24zq0V1b|lS9_HZNcbPj=O$=hcYb}cI{jrpOjG;-Q%+^dTVUle`ev;B(BVS zUXRew?ZIg05Noa_fv~z$a>t_H{7_CuFn*rDIDR=^BCgyQTy#GW=w`b)WVeOv_W;I0 z7EU_qy#9Enzxr2EaGNm6bb4@nQvOxeRPtyNvMPsuUO<@QoXJqH>YAJ_a)a?-kAUCC zMm(XlYp|aAivH}t#$#$60Rxy zPSL^YRyDn8=ituW_7`z~hTYP&Y=+k{jc{fj(p}Q z2uK%4?iKAkn_M-%rh2$Cu*5%y*V?8cZjX@UcUMzU4(4gAiGV_?;{qlI6sKaqvrV9dA+|MeC@@F@^t#*VxMu2~n=$y|et3 zaM`^kSTA?xF!)30Bnq2oA+a4|W5e8Nm)#I)K z=DcwdE_3QM#?4LOEk`)hVu6()Y37h~jzpf2T0RIT3Imga zui^+ol9-uTe?CwZ_gOVl2y`uRt(t3T5Xq5R=ORK{HGPQC0(U*xoc9K*N;HZ-n}TZF z7)3ft_fT$x6c}R;%2E#Yqq9UvkDDA;?e|ds17^@RS|0FY;M7t-hogH2R;;GE7n^o2 z)0sMzW8Kf}W1^f-FEhp^U>CGka834-CB2!o{hO5fSwn_KrDGQJM`TlW^>S&>WVEC$P_r>7DN!6s z!mfN*pvD^StVI}f#oO_&IGQ>fyCqymBxTq%fwU2C%cf&S@NM^MsZdYe5h0B`0AU__ zNi5zW&k?8KQ{oh6t*ZhTLD23DHVjjuQ&yWWGuOWoK^Qt%{!S7Rkb4M4AF?zB(-dsX zr25u0#-|aW{vg1MG|uWjcGLDm{s(+<{zme|DiHE!UWjI1C38YTr+Z@~?h`AMIQgXt zGip8r=4W})nV$}o;BXsRt1BmqrV{J9xaw2`uB(C7+8;kV|$mzWKQw&>RvMNr~mcc3)tdbOxBtAnV_5F>8`6#NTl%xAC zdi_L5dbv}=FP=233uzYPgZjHRP4Pijde%zu*~eYw zI7b*fOf|7O3NEUpv#r_<{a_J=yVp^HimYg%?==F8G+0WlkOr*4knCBKN!2C5dcD09A%{H2WjutXl;>>8vjxM$82avY0?rd!uzK_}FBbMQKNrfaEJ{-3#?;{a3 zG71|E9Wqn#ocBT`y`+6cx4as^VNFqFU!R-KkKeF_z_B---I9hSM*pTy{rLQ}7T%sW z8cU4vSX}g%|B%!;4mT6mlz|LORyl>6qVm8gzmGV-k{V4GUh2%o4CtlBrS^y0WL z7xAK27qiJ<{pFiG|;}KsaUYl?DY<(dI*G*Q_T|C#WJP} zU|$kDTUG-D7%Zm6oe1g0!~TIxt_tXwEe7$~6|bw0f7n+dnLA@T#d>M2ai>qU+!hLK zKhmu>)-~j^YP94mjXft^Tq}_13lc5UDlkfZ)@;3KcUM=qIROK@e2LMKldbE+X8?kb z{-O_QqPAp?b?%3_Yko@^u5F|a-p9w3z_2cM791vOUI7g@W}OpCE84Nbw`ds1TD4(} z28(vIrdzcm2-(f~ZOw`FN7L<9+aE4J-1_IyQ|)7nJo~7xyf-cvj;`|`BWrR_d6Zw+ z#Rb}n;uoxm?CNtVcH$eTX4~Qe(P7jU0uz;)s=z=`n5TRCUaQl!C1*gVH6Ey>HaS+1BXL;*YxlB`;fUA}ePT#{a234-kxIx)WrCk$LJwDS z>Adc6xR{Q$)|hn8tUmi>HE-4K)-g9PH$%g!Nf6;&aU8MGy2{jFVjZ#j%P!_ZFfBkE zCqTX_jcCw4I;Dc9xAfC+r;_7|Us8H%hbapkW^%stKUCCC_P3(E7BzRD8Gz!V`vZLV zC*3W&A3%V99l$FE@Gt-_d5uoU$98Qr8Jrr#!GY!x_g?iwpd811M)Z#&+)Xq&g33fimi>HOVj$1PQ-cnhge!N%DqgbF&U zj*a{6B`96eY}Ye}TQKfDniomc&M|6(5KuCQ;xln)y&%ZH_=m}ES-US}_sw-00Wb73 zL7zQPQ-cxIAQTInl&k`()$;6E^y8E|1b23LmB998qBDw8mh`AZhgS(y)Dx))m8d+k za63p;>2j_Gfsn`D>dP(THRWiLpSIKQi*Y&0D2&!&zRHd812ah`#%N&6a zmmS@Ef>rwo_9^4+FB9*6Z1i`=b|BTBz^V;wgApfJ)`+Dh35~#^SiT^>b_Uc^cN*Ch zN0Ntyxw(AqR;|;M3WIpI;pOh)oUDnpeC;uhjw05bM{^J4%uReuPNir3SS)q{G2dW! zIfrCU){nZGvN-wI?k+2V^WGIbc9#{Gx?)cJ;R9hmS<#COn?Dfyz{1uO`EI6&E|Fle z-u)~nf$_6R!fHIh;37rTf88#*fH+~WN>#vpZ9O8&adgjmC@!^t#H$-SJ7>6yvh2il zETIcluvhvXt7vy``S8N>E47rnlPIH{`HT|ET&0YHiC-&ijafw?5nNyo`$Uqagk3H7 z6Cq9PP)-wR)5^~#WN62#ZKRJ6x`-}M-)|9pV~ZBi(?}1T*C@tY7fBTd$vHewa_K{2 zUpsEZw1;oao&1@>OB@`vo;7zo@2K{ydFK<5R_|1bO)bi3^^PGjaWW}_OLA1;4g?*e zU`xzIEd=(D6AL!8Nh1B-eBP2v^~O!izOMc*dxg}etY_a$>srPM-9$+Fv>ZyDv0WuJ zYq2#`*Bg13-E6+jAz_LA86i_Tsb|UVbz1v?15Dihhy)UjohlvMN7{Jhe8%U_nLg8i zxNi9rTg_7Y6HKY(tXAa;_DmRoS&A8>OXthZy;_Rx?OuxYwCp^@N-XgYhy|?8CbCwh z<7sKrp*-_fnWHW}&Rf!J!};W%v8%})MOc4Y@w!=Sa;0)KYHIg`KiAoOw4p@v!CvN` zd$DS!lFlg|z^7;3Jnq4!A7Osfb+BnL)#@U=6pFEGe)*{ocS+LOv5#bYZW2iT5|j9f z4p}OV(StLWLwdEf7~26!ii^=B119PQqQcR_N2ZgPbvN2h{5FA17} z3%c;X2VFiW3HI+ESab|~SWP6J``j2)a^A+AH0nrE{a6bJ9Q)4`5mr&0ps4wY8sh&O zZ2BJxo8!QS$?Zguk~fbfbuaXDQdP5#MNJPC%(C*Ivsb^^*s&Z1nnl+AEr^Uy(|gXZ zzuGI-Dh(U@x<%^nKcgb;qPX8Ti{f5^k9ASp9VTiGQHfb3o%(RpNlz?g-hJrlQxi|~ z1eDR(87C|iM@I|CH^JH}`pIBmf`UaD41k9-^i@&*?A$z1mkzQXjT~Icn8oGqz@8G! zI)vr$-FrLD?VYHSteWRAE=@fU*y=pZcYV2oFD#+lV{jYFC>IWpn%0e6JKgJDdY)dX9e1!})5co}Cmo13qL zi%t-(ZH+6tRGo`S1LMi0A#{*3k>&Qe@G#dn8s?zF?s!l$S2}$rknCj9X1Hg=l0X3m z|7Z=nv|uzg50`-o^q`c`(W?~BAyT^$%`vcwh)wd}uu|~HvV)zFt-D0xu0;^DtdNk& zYS=z)obu8>lNCj$sEky;ZU=sPiB3B&HYtpjd7A3j)sgmy+~nEmIk_`UDelubtiNp7 zPQK#>>9tqLv(mE!L7Dxgk2z!N8TJ@esqDS+lT%*C2Jn>RN6VFdnK zL@Hp1aB4jyLXe){Q8`}bbGaeBwT<8)CO#1Iu)iv1Xi@gq_=uC(>*hFS$R3ufGg<8J zTMJiO3zs)1aBJPO#3b=RI|9*>=9sj^>;5qM~5L z>@Q!ds|BXy<^VS@>3<;=p6efi6Q_AJCEz_?1fze;fN&lFzAltNl*rC)-pJhxs7Wew zTZ-8j(g6M%IHhG9lTOOaNl5hD6gIXcbh4Ov`--mqyv#UH(fxIMmlQw{p5K%l=Z9aa z^2=g@TkbnCt;Nqt_}UF@()mLCq+i2N##Gv1h*cx4s$i*0T@PjU=F<3-+^k?@(;E!< zdH|a}F{hIv?G@x=tNJb5>26F~77ovc{!UD7juT|h!D zIeQElyzl%&&!~HSsCMN&|0><|Y@FY?9#2F^kagHO;tMhvN4Mo?%b!;&i8#$T6K3-v zcg*Rbvi_{Egm{u)qO!RC)MgMF5>k8_SS_xB`d34H5u_?-Z+ zB5C_Pk1wg<^Q_t#Fl!Zlz3b-G$Z6r$7Pu%){l2qso0&FiOU?UR4NON}L&14Vjesao z-q)?pEh-G@E#@O~RHG=^C zA(?G|Fm_ zChF@o_6jdZW3MKd@GH@f5CjlEFYA&pF2aBPH|jFg+WK*R6KBy2Yrd~N%67^zRaekY7?lk5<+Dw!Pbnh@x7RSS#@n9#W(-&bJx3+mBHw$w6Pw}cg zEAv<3lB8Gs!cMNN>9f){cVzm*+`t8tibePYGVQ}eQQt(%m}$cJAjm^3`OA}P*?v#) zhzPF{EP>Sm)L--O*t3xOP{9} z1$b%q^e{#FqM!RzPQ;YcZ>T9Ja3l{h#s(Z~%E{nYx5f+JICJ#u{lo_R z4f&0WCGOC}w>0S6>svj&O*w<{O9!O+mNJlVDpat|9(KpHeocmB-M&008e z5ZJ~FFLS?SjQlYHzOV2(QS&|U6%hq1Di`DXjB?KAEmoN4ruKb~2Y%;DldkYJeHnRz z`z50=K!ER*GukcZSt1Hn%w8;Jb&^ufAy|9@HUd+8|8hXySP~86(VGy zKev@uDb@z|q}+j|$S$^?a(E6?XOo8MZW+>B7GhkMFNU|yAbtR!YQw{MM{N_^1i4o2 z3OG)1vDi+&doJI0itSC-Q!B>CvquFBUZ4Fv^z?Wre=X$O9V+;=s!s;eV6b4tttV)K z9;VQN>`7(EXBTolc_JFUEmrLhD2|#2qszHc2< zWuI2POS6_$^KCv=@3KvpT~)#{6F!2lZtntKo&ZyO-QtB0=MXY5COR3>DY@BSu_aqV z3W>ql(GS1kh*5YO4Umnu^G#o^#XEF7JIl9i2Qhx@u4dmVG?iQgJnXPgd_?A~v+yf@ zcK#O1;|8U)^WsxZ6LDZ~MqNTIpKrSyYYAir6S>*Bk=Ibc-pV%w0H5RP521g)+QJ-X zH7<$O!=r?x9xkJ74!qI%Fp;t0O=JTIKzBzM5w_Ef>k zVK^mRz95UH%e1UwO(hq}@&n{Fwqu-t7>hI16{T@DPc@kjPYi`Zy>^w0he^Rjoaqv? zOXZR|M8PH3t8u3{YZt-YT5&gr_cgplOyl$X#KS)4VgPep)Z9;ek;+NPTO z13zQ*v34JrDZ$S7s$0$=yYt#P+H+Bqx6`wYV1tlvl)deKb!#HZE5Z5gSmhLh<%Xwj zvu9aDJNIX@Va5vg_gkc_$Ea7J`V5oe=~Hv0YO6DP7ugpTQDFU-{4{9VZmbwF0KVI3; z+3uG^MLG+}!HAv+pQuGd?p!j1#7+aVpn9PjHoZ`N+U|5SZ6d~U9 z>oij$lOd$~wLPi~T_vTfBqMyeauxSBg&|=s-rDN)+F^JHVb2wnReKR#WAvc+5a3>d z@s>6Brv$Bq!?6?`Yt@QWbx4QP) zhm=K`3Dk?7OBN~j0#X~laXt7Oz6uVbl?-z;uD0NB+l{>>-Xl90w&6HRd_7U*rSa6C z*({<5^oPcr6f1fA`w`n8Te7CFKh62KItw}HK}kR%PF>XGe&%H*xPYKC6P({28|eB(sWl zg&KUyI)7yEfr^ZxLaI~yv8>T<>2(G=TC*hE5aWcz3fH$x!IsMZ3CAwXY>+Kb<2&?; zXDmP5new3sR%bznm*bf2RX52;CJAv)sQbHBQ^_g7hJecW)Gfm~*?caxLYvxe&*x0c zLk1tGaSQfiw?O;OrLSQ>wQ-IrU>xGI8)_5+U4DWyD8Z-#R+L{7Tx?QqXg|(#fBWzw zh?gaZlFlTl;a&H@dpP#ux-_2Andd4ps#}%O`3;1o3s-RuEFvEGF$jFb>5u%*Na2qb zoQQTzijc5X+~K_QAqQiaTVY*|lQp0^o#`KIQm8Rj6pMi=Qy?c<{=uE6hX zl7*m&cYy#wqXdkaARs|h(h|(V1~w926nvpl#fG9OR8Tj96-nZ5AlKzW+M=Z`wzjpc zZE3Zwr3eVw07(E}0*HY4LVevOqP!>xiIC@eX6`175})7i^Zfhd1AFJrojEge=FFKh zXU?3dvR?^qil(yCEwMf$O6DFRPlBs?w6nBk+MFi|dCpW%?dZ}DmdlerzAjQvZA5QJ zEwH0rkSBkD9Vv9AgW^uX4iV}v&{oPfawy-l@dQ3P&gY`tPFZkhzs-Vbx zH~Y<4G(8*BR2`-|J33LK!>;OVc1d!verce|bFt;HoshOAhh%iMb>Y1!g^iT?YgcU z8<&>Kfqb`-mD$aW{z0mEK#IrOM?M%c*ic?>*M5zC=*6xf2&Rp3UdMK?qt@%#>UD&? zj(V@7&TV98b~CcxH+uar&glEYB!C#b3HBo>u~!*=@70l48T|-J+?7V(IXdo2qaPuO zyWHqotm7^>`Vo@2fkxkZi2J~8^q%dc-u-4f<%8Skm6_-^`p!<2k4Eo-Mn972_ymbh zurp=G%k-Bonq)35>o+@I;=KsavxHy-zd+9HE}y#V5(gQ5f1rV~1=DY~L&s(&M1dN; z2O0fHA+@8~eP?&GQ+L-eR9!PwRpU5%SL5>JE>|>bEUOeIuvQUmP!neMT1D~P>Es3b zxoZ`f8-bg6kpm<$8pd;~jg#q$HMmkMg%Z40l?)EAwO*D{GUC0~3&Tc9%<6jec<#v? zfRM}S>Yh3a!!^~Cyf%M`zPM6fj*YcnT&e$wjkRA~sZYno+AqKrY6GsY-Bh+O72i#L zIX2c#;!6E{Z0vtxU!IO;w1iwc!08vN85?US0bFeCe_~&rmKUS47L;%K*S3|YirmU# zsIb0Pe0D4SMq%;pNoJ$hO59VJ9rkMP-|Sd$vlq8y`;w5aY6&cr+m*f66H-5KMV(xf z%e9dLzUd0B|0{2E_y(1?b@$DozsZG5ZhuIG!$g$IzI%*yY2|H6r3Y`a(&I(@1&5>C z_;r7!9*JT&5!b}c2&m#;${>sYrQOjhktX;MbX3HfTw-wa|?x`#h6Qw5yily_uvYgq*{B!^R%PETh}YKb=j zuUsOGfIE*j#I2RP)5C%NB5)HCzJQgQ4wV;T<(gMWW^z>ZXT9Xi4xvND6sHrFNy&xP;kPSzYI7P^#VV9WfXeU&HPJZtg*S6>W42LW#n@77O-gW! z^Ib-0xFF96Y)zvi?KsTge^$jBL8p6!oM+}3bBTOzdB6zFQi0hC6^hMy{;ptzA$ja`VmsrWG$8X^WM)H6E_zray7A~Ddl;CB`^2Z z4+C-jyhM46mGz9uwRCOJxt459Y6?C%{Vfl1vx)d1YRNGIk6lV2uZkoijKCQ6@+dFY zQepLSKQAMVz!vGHynA@L4hI_QWjZg{8-W+q%LHC-FaoW?Mqr<6Gu{G@ zbAnhr&IDeP4$A9Kf`^U3t9%YRQ&j3jM&(afvjzKH#On+374O$b(>+=yrp+Q6s|{$0 zdxjU{l!QnA(hY(aS|J66zWuf zlJ|P&U4W85F^3V?8D18FH9`=7fmqP&`D{XB1$-?05sHS6IJH&??>Q%mjB(*D=S0bV zQF!e+QB*B1{L6EqWEm7*dQOzAuEGzU6D9j!;aTTIB}vpIqQq5HARP@|aE)q!Scyu5 z#F33i<;*}nuZ0ztG*SkK7y>=R3$7(R=IqQQGd(jrn`O2?ZzxEG$Z{DSUjrul7%OT8 zTFQ>c2E~|m95qI@igRyK?wvN@l0z2eHuFI9 zX>W0(i7Vu7-jW(g?R7K;M^?&Z=Qw+4NzxZfuZTb{=36fb!psBYRlP%zn|qG-;79_{ z5?OqJ0)V(0Sc)Y%aP;xLL^X3M0t%<^qchLNOL^Y)zoMD8%wtski`EJb@pUm3l2Hp8 zx3Q|8oyw^U{->!!fn0OEiop7tsqxi%K_5)nvY1VbRSN0G^C5iiWS4|)69m+j4Io}R zp(OMpYRxA(tFIPDM&*PYiC;xL-gzXEv2q-+nS_P@N_LB+m|JVCe2)`cCA)XZTcfdZ zH*eTGuO3ADz&7Oz1*r^D*vipJiIviA4Pfa(V2?vy(tQn*US;z8!}IxcH5#2707p^`>HAM~9W5|x&%G|moL z?sy$;8)r?=;}lbTMXONBk{<4tOY>e`U2fx#lY@+jLLM_3#d zHqxV%ILipU#>7G6^P_B$Oc<8G#jo3%z-+Nb9nbY393LP~E*d&w*!nEjW8qQe`tc%dbmXqLo z21Y-{ov1tay|P!tuTYI7g0TrS_7SGa{?yc5T3+@9!&>ku{^F#@GTaZVr|uT?=lOCX zD4!g&aF?!zya$W&}f#9mzR8_xe=|1FLzXA^x>$a&>4UxnRmY)}Xk#dct*r z21$iSFZg9wtuiJzLSji9Qb`$pNW->=xI>Q|QL2HxX<$#T>ho@pZG=ugDrz?&JOkqn z#z-}v5Wc;0Yi9Y^7l9l!$!i1TNHZ3=qMADMI(buWScHkeUop;* zLGJKR&z#vFNyo^}?o7t^b-F&!P#t8cL=gz`8h<_rG|2dWQpW#^s>_taFX4H|B*FRQ z5(r=LVzVkeQcu&7Q)NWZ06qvqvp*=mgtE%yt3(?s){6iUJ%3SoKhiO1nL1QBp1&n! zVU|DdCRM8e{=5fN06XZ#5)eK$Ujjy8GB9kGZuv)w+^KWAqB(Df<{TT%d7aMrG91qG zUqP0B$Gqsu`~hAVRBO4X)IkUuj3Bc>>%$cDQ&ht@5idNJNGJ0c&?>GVG2xe(nmLBw{~Llz9G%Zy7Vk!D3Sk}P0$P8IYvJu0&gMTuCc(T< z7Ujil5IYM5?Mq%k^*<|D$Z$*fnKJGVi-|aVeL4Qbc6Fx6*hY#l5q25=rr!QG*TTU7 zZT%^_akeBb^XJtOjPvygUN`8fF=F75vqPKY{MJX!j~c7C8kK&i)25oCQ{$z#jfDkr zFSM_J(0OkuCjzvI4~v@S+!b~mySK8lH|T-Q?aR(o#XrArwzr zgdMUU&t}leGUuXZ7KL&)Mh{2)?_LIHS`l|fc(;@^Im1h`u#_csSbI+0*VPX@V z#0#y*WjXDRMUOjs`y}%-ZemYxD-69jSa>gb8!l6@5)XlS^f)DLQiN=7h2Cdvp6be} zDYE`t^Orejy;cgyB5PUAjXwgN|Ee)%+5Rhg^*(E=EZc33SgkDLJLQ3bV0tFoDTUlv zU10Vv2&NT+>p~Qh9&Jnc2bK+AL{k&f6 zRw`YP>u_f`xpR*$d`7GnXNif?jwx2=l{Z*p%uO zX%u;_4bnPkk80MhMDc(&Le;6FR;p8NWF3%hFtQqrtOg_Nu+i&om(lC?45QbS;Y$5> zcbd`n_AI0Clu@FJqbd35>}Hm`BqPeZa`Nz;UY-F60!8J+1yHZMfN~p9CIbb9-CaPr z4Jea=GDlPr`9|+MT}E$PTX)##cV`+9jo#BTjDFLyq&mGP4mbKu90fEGlyCH!0mPeu zSO`Q^dozG|GY|`bcn=UmK-Ai`-rsW>{l1rG^u7gHw`3W;ZvxOwqrhsuP;qj1e#?@( zNw~-A$LK={;Vg^Qx+)?@GmfXe#5PR#9sO z13*?nNCH!58I|ow0g>(O@CBW{7O+^+b6QEGFv;AvjFmeXJtd6~$lG4S5<{ox>anCT zN#1hbFY8m%*pDERkk6g_hTAAQi!r{hq%n<1A{O^6X}n4Y71uW=v35o-B1Kkb3USdv z;tiA(7n4E+Bpb#AJB2KpV^VlKQ`~N+5Iz@^;*QP~_u46(=cc%?GsQwXg{-k-U@YoP zvCK{(^HEHSDjjVs|0CEesriL^-L_s<;l?Dnyp8`6Q!ss93tOhal;7Xqfp7DeEDsMD zD_$U16v2_dkl3nL0!(Yl!m0keDNhVy8lB+Jdsqd=`12|xP?LP@u<&Y}A^*aI8P?3sXSn`tvSPpoa(hTtxszekCF|?xyjl zvu;mCt=wI!pwfTQg<@pSaT>h)5Dm?3Ts*d9_ihrgpdIDU`;CHnjX!U@3gB<=6#|a_ zr*dj4>Kq-ge4VhCDp-3J1Y>zMJz26_PWrOIwI1iqZWO$G-bF-58#je)TB3P-9|ZlN zoVpdsd~+7sfbjZuJhbMyX;AjU-uSCRwN#!rme+V==~KLfo9SMae#7A##k?SV3KN|= z=QVQf(UM`8+u7VOjG+L z%H#QcR^kZhY7`*5_-rM9hc~4q*~F_Xo`aWO>>ngc=jPMd$F!JyMz4w;ET35qXSdj~ z3C=iD8qXgD1nW+bu5B?IJxXLA@WMB4<-Ehzs{?rbR1(#a)bJ3ZP*uuas)OY6!8||; z*=LoDAmRX%_X%Tc$+e>OmvqW4<%Vq9yLqxYUiUc`A|DFqH7XnGL`f!p$g9i1nF!Q!0b9ED))L( z#%_>n3F&v&a$b1Kz=~SohCj|wP{L!PAU01Yw_cZJ*J&>*VxlcHBY7KiUS-AfR)5LM z{qWJemY3^uqNTDji`y(eT@^i7idMC@EuJz+ES3YZywz*muN7EAfsqu3BMbF(DzteD zb-nsU71of}gEYMc_J?|ee>o7tENM?{8gDS=;F3W!@c>D612>543~8M-iv?~5kMLKV zW{Z}ibW^eA*k1q92*qs>HI%ebWd?}k_J^FnkrKksUP7gBQq=#>+)2cg-xyiJtI(`c z=E$O2n;@*_E5Tzt?&d!#9IfZkWGrr9M6ILaD$Yu3W6F!lc!AaHr@Z=G?iLr+0>JG* zD`YA`bh#I*h(y+(j9Q9#j%cba!DsCtx+h7D?n7c&UkN}6S&~}p-0-JxY$YpM)q@5{ z;w)US@)tfjOgV&@m!h#T^I9S!U&`35Y0unVUg&`ziT@|~(ejOSNy+Y$`px<~Z!z3S zs5Q!+{`n~jjU6l$MiI$MBZS3*1S4<5r=rW~7e>&EXZWtt*lK>7F8GO5;4g^J>j{hc zI&xP;FJ0bQJV*et(0qeXB%frebuXR5Zf3)3nAzqwLg7CR((A>a4g?v_=lYL{i}*OV zTJQWNY)J}?I8|1?w-Nqin=)4nWRXVpCS{(M)uos?x~4qo~&FL2K{ zK$y3f<-~j8=`YLv)^)e?0aISA{Jivi72m@{aZYvF3~63B(nofYFu{2z18Hp}lA^)!KX_w)R1K+dCP~pns*Y%u z(VKkl-YAM1H-U=9=)hzH$B?nO+I(vZ;~#x#!w?uQw~r^JT=0W2_;Z4}va?Z`POQD_ z!4hMWo@URt`;l*~tJ}OD1|j-HZ?HN8h2naui@t|a?R7v@sEI_N7v5=5VrY-kpo!R3j2ZISmquuB9W@*-m+>+<>j2{!)*HtMYWV`F)iqJOfHl zYIRwgdJ8M+7EDGHbx7+S+`+_je8F!Psh?SzrCXv|TNTKBoKiToSOvusq8E-N5w0Mt zRZH7wg}0(jbOEIsC*^)&1eOEA)($lNZi~PR8`78&5X2T)5QO98HBVjz$Km4~WvY&3 z@E#>VV|gYz(30JE>waC?m$w+6e<7tudH&0SG2Zc)3z*2i-{)1K_t*0JPhQ2Y^<8k} zcMd3nrXweaLuK`-d|yadw?91beuucW4O9S2k#ST;y=4#yZ%45dOu79B2%yo;G!ffm zqELyMXt(lS&AUyh@Y@AU+I8VQuaH%L3a0b{f}OygrkxMwkFj@PoR1=DL|oCyWrHi9 zc_mLI>-*6|M)rOIWkLrvG*|liB`!ozg`Xox$%Oc=g4CdX9fFj|Am<8g=M|(f@TMAZ zGj!^mKc$B97rB!W2(x^FFlz04LAm{wXjJy4Ph>h1o+$>fht~_w)ed>XdwF3V6Ba3d zkrN~q;YOLzYT@QN;%D)nWFlP1G8&ilHTH&-IDnHeDPsE7Yn0p(`}Jxq#Zf z1;XDlOC%iuTzLp?ErInyHSA|lZ+RuHj+YH9oy$&WR2ssMH>vG#8v8G()_y~We=%=S zDae+I)+m6sOk^wTu=SEctmLQFW3(27<}6b3#xoMfU*x35>Kb`50%!T9ptbr>NQ4?Fsl?Oa)3`9-`D_=Qw*joNGmpnzwJoG9&RD=WPdxnWT#JOCB; zRIVRbR7{q#@xUx6osJ*Hp1!=5fwQu!?N97$Eef^7hg##=_buLIZ~c~UiWl7o!lO_k zR|k+p}2c^0Z<3Um21FXP>7HKpPsRUk$*>2nes{g_#~uZr+T(C_zXe$ zi;UH9>$-KWs)K}p@{+m4oJ3>^a z;Z-paqV5X&VU;2dlN5YFq2on(6U|Ug!@0PfCXUDNhwAV^PP*%F)1Z>5NfEX9uk+()$ z^2)6!9`lG?ICD1q6OM1-P2mWe03MT-wDYHwSMMz2R|quxmPZk64DCK6Aoz={!Mz^* zSBkY65RH)vbuP;^cS=>mbH&Dv!w3oNXjVj=~6kwi^v271?DlS9( z)KpkN*F*f&VTG;gcdP^^1syC4Z8A)5s@;~*_B++Bt?QF`HL`6$t6)gdVktDM#g|8&WGb+wjQF)nt3VAEzj-@^> zsyYYA#`C+gmHmnHGj=ZPonP=PfA!9tgk;bdl@Gn!A;&OJ{*bqN=UTo}OkCtPUc2bh zxUpSz>4|RO?w{n8`B7OLKvVfP4Y8wo3)j5yChgH*?M4YH9S@I`ubRg6*X5bzRK?D~ z?MJ;OfsWJ(D8MjExq_o7=a>kIp|dA5BmDabqAURzFZ}Y6E3w%VE!ip(ptt0Z z+K+MSJ;8s=l;*A2Dic}xsP@te0di4YTq2JIw$o5bh%GPMN?Q{vPD}pMgKX;gTW6L2 zHQMe-{@XO$d8qrCxaZi^-A|(DYD$Z-HqXaqi7QH8R5FY`-wTy7I?CnY%Ul#mATx#v z0&EF!M&QIDMJXz;p4X3yuzyIRaoPsL$hROe81_g9EvO=sFHbt~G2itP@q|PSk&r2& zK@ti|C=L2sK#lU<{suX~P0d2#((!8es8OU1QcD7`c=3pQ|wf$xbrB zaPi3U^`^-X;W&aMM>DV}l0_EiM3h&;ON`1QPK}Aqq>&iWnH-iUPVA4t;8ATq@;7lu z1@nCb79^Z%{aVBZ>eHd)a=jq{#-hoBn2lv4fmZ}gd({b5R;)eDt#Bb@-B+O|mvw(T zHWwH`PTq>Qi^@}O!xPRq)FX^#L^td1_Rt4OJr0SMToPF5C zIRB*Ah)dPT%C2+9cbW4k$$4wnIoG?pDs!gfyyR;+4}b!_{(Wh|*K=m@O-<2*B)cp{k&PUyUplqS;?=l>)8#My`&qy`3x=WoXR(>Sk zC(X$}ZkE<;NwUiEXGA{xGx^`;+k2?FwtU4;xJ(zW&Uf!*=Y6AO%Q=cOR^JH!qZtlg zhPU{PI4od$1I66ePMsbHve*Xrw`TdzEGpe0E)Sk2E>Z?4HcH}sNzWm2R*)AyoFBL3 zc5Q_XlgfW=B2iQ0mUv2b$h4Eo!ScsOiCt#Cx0s1I#?+eq5R7R=qDrc0mGi`9E|w9= zSBU%t%Xo&|YWl_)CYD9(nI9Q0+)V$2r4Qya^0*A{)#ctaw zu}^mLkENe%kRo3aTb_=4TVxXeKSX7TGWVg7SBktN9ClF#N);jfXjK*tJC$WmAhVn@ z5QdT~^NY7O% zD<5UwGpp0SM-KxbR!00ROniF4w-~VtSfnU@7m}Bfx{%`3$bevEWQ1$4XJp$lKL+1D{WPIPyDO@v&49@lTf2w)lseg&0eRe01E%f@gj&C9uwYsR)4so5{@!_z=F$ zskH#V+#@adyvW}62(KWyvTwx~UB-dga@zmVXJw^4kF6cro*x-NbxH!6^C9UUh!AWqeZN)d-=Sa>d zUNWRrKgaK?@|F|rQbC&XoU^%>knY!L4*3?oha8ZhGy{Klm3XnRJ?Jb#vNLPdc9E`w z>KVzS+~_p7tByGrVg_G3`ldUOBX^&b!NVtbOE&ffkaTWWi029A@oslVkBxz6f{Km3|e9$0N=oDwIHI zzDhbZk>%V>$=u-{Ct$xvJ>*2c7j!zw(MiICe*=kB;RRJL912SCuZ>1knBq3G6 z@HzY%X_P;o)vux(!0JG@6Y}X4nSXNjL|)!Z4EyWJL`CNA?{cl;`uZwIh+VC6M&np2 z(gxF?dwvyW7-O zR#Xu5=WUubNY+9=UIZ^a1TWLx6e`mz)7IcA0aYAoFTm{e)C`ME#%M9-NXK>=&Gn zXnX4m&QF@gV(B9O&*2`^x(w~!RXn=R!inoFY@zOZgOB1Y_9V~ySyjz?i^vl^@#s4L zF#j8Q|A=QBao9=Scb4b7{KqBid`X9i)O}y@e2*tSW#_jN#w)B!hY{BNCf@h+A78Wc zKj8U3|LgdEgePUqC+~gr{Qr`$RE)A_;eU31ggDBc6(;-@&j#M5?2q|R`SVFX3mDP5 z-beYfJ|X@LPwGZmk1>B2FP~vcR>OyrL{h<7pDTbK1yM@8@0g^dsK=USmNfEGLbb$IuG?sOOLFt=!4paHA)3_wx?3lqB#;OU+N199f73vS4vb4!j{slBZ=Ik)|{KFn@(NN0QS zcv5I*f3m;rAbHbk13{29mW(;{NJ-dAzL2-$QhyNAv^TUPmB*{xCrm9s8I|UguP2j_ zDpk`f*4mUq3o1796)y_ns5{P5?b z2_NR{bA)*|gc>ezG+3(!KW{Al(tI`Noq^kPq*<2?u3I+2am3tCRdZf-)DGOoZDW?E#ncyf*nY~*Kx^ z@Cd&N#7(f)UUT#J?z%Fxvmfq+&He72`htPY;AiAt>(@o(&2fgR^rHL%^K*C3e)qt7 zw-reEzU!Jdc`I<7r3%ThRiH%Iv{X;Lu8Lg?v%VmwxnLkp2Ak;+sm2$oL@B=F%2^#ETsml!wZF@iIEM65WN#3^0rb696e)WF?JJ4XQ>iuT-8@8Ue3KW^WEM?yp zx+>?k8xqbrn)E-8pZ15=dgL>REB>fo0Kt$Y~yLjUFYw z{Bwjv(}h5xZy66ChIaM={Zt`q&^=H8SPux=d~NcmkIq2h7G7@MrjX%yYttCdkcg}VpOSf4^kyNOM+p)bM=QE){yQ5x97drdP>+epammmfjU z8svcdtOc94Z1y-#Ks{1XENOC%QBRlKv7dSZnu>zoS9?Ht)NOd(l3!<0Q>osn)Yhwh z2jzy{R${jT^Rt4SvkZ~k%Hf~C5o$>HIKm8$@z%%@5PHrL@X?21ECbK6pCQ>Og@6oN zKiGL`6-Vw)jcQr^`vD#^Jl0x!-7ne)kIPZ5v=X}u!XOQo z;OmFCt=$G@7^Pqa?f}-@&HJQWBH;lIQlaMkjLRM}F6s6^U%u*Z1&*%-$cOIGD;K*R zZxrx?^pNHv@HdK^dTMM~(M`^?Y33ccD_LH)?xgKMTg0!z|Z7*tP3 zxX0FW?j8}&R^}XRe$!ghf69{Q=6f6s@aQj8 zdF~!H?wl}%9sYR8Svgj^ zLF%)r&+mFBP3B`wkK?M>at>O_NmRyKbJ^odrZqQ{si)&O9_NoaYEAgxi#J?%;yW)( z%NiX!do<=WScwVduI9a=hKn7IAYiYRewp=R%EmqW2b;U8&aS?Wt&Y2ssYb|3zKHyN ze!6#QlUbY4oyG(Dpkqo>kDWPhncWf7IH`K)_Z@W9h3=W05tXYe%-a*)cSq&9>9=~# zGt+|OIpTXV6i)CTzR|3$^Yl$C_gahl_E#4zWY_vzyBkaYhZI<36{q=+Bw@nx&}-9XC}>V5i-T3MiabHEvpPT&mc|PP;|EO;_J;Ro^6b-0fAUW%-Nbhm+_xsl z_oVZGPv(2Fd`~{#cW=EI;l_!NT0urYUQ`23HYmeCw^-_$@6o<+67_VS+Lp+M$A(d) zDWx0m1RP25zn{pJ;@-cpTaB`#UQXo2MLr?ed7id@T$;pstw+=UHL|I`TKk7DG{4mM z2MO-+be$BO;KF13;oL^^cC6K8^%Z1SZb`->v8b&}&uxW`Iq$-A;lAA`Z2y7Ob{VwLa{P8n-` zdSS4ePUH4}p6@ji3WMW0{yi>kr;WF_}Y z(0uF;BH{}19Dm`;J2;MWtEhkFp3+pVDUxfKlEQzG{(>bXaUR;5m+4}8>rzV_+`Fr_ zjVCirEp9xS>9V>39VE#Bj3_!Y}ZYT5-V4eha8rZ2Ep&6<{6H7-SxE&LWZU<6%y)wGMgC5^gk=8>vtu5U@x zTj2bpYFaO|RwK8w=3FVM(cDMUJX$p^^;_WdlQfH~ruF@nH2o#bV^!1ARGRa*{o<-| zmq@ZDb>lJ^W1Y46TGwAHiOQ;`rFRW$+<>ZSm!Vh_TD|l8Th+qbxP8ZZF@`jTH7rbG zw{cj=_(jdhPW~fN4GRanK!VzZX(x@DTzE1QFQzk`ZV2Kcw7>8h&w3cN;vcc8!w$?Zmmi+BkaG3K~QeQ{=sJr?CYi>l{Q4&g0dOs0*> z-}B}JoHgwkt00bShse#?0LD%&m69$?WAnsF^1}3-GN)gh0$8g}=>hEE9v8BFH4E2-z;Fz&r$^x=pd>Jr*~veACr6 zl^#(nK2IV~?#`m(cOT25erctHJl2mKIW?1tk4`E%Dt$c3@y^(C%>3DLPcs5#q{pdH z=#wPd1i;f{|D=)+B_V}R#sP=wz(Q-t5L0IwZzeu1nSB%7G!z088-a!2$$qWCtnp+s z4hGjvv__W~TB8@?i+1BlhYntLJFXz4K57ppqfbT(m zhx+F6+e3Zz1qoh{qczfS|BE|x6nq|?V)_1#Ny@y^xUv4le@k>4D{kU@WG39AQ=VW7 z4PN?-A!8uM!w4&SICw5h^s7o7WX{swRoGDQ2>c2|4ghFKS)r1u2bIQ zi9?c`=zyOK%F`j?tnkg4>ahmN68xt}!~rb$io$0%NN!!I?s8;#SIgL%RLn6KhF6g_ zl3fnQj%w#5v$-(zN#Yc1^cd;6Q4r)9*`Y>l?E@nb4m?v$5J>Hw(tQ|ZC{_gT7*GoMK-qFDSe8_dk4*oY*?pZXva>t?}6|KTj z%Q7`PErZkS@fKs&xkqtOEBS)@L`w#U`~~|g2CA9&u>4L<+&ZTkAFpuq1H#b{!>EO$ z!_4OiGxx#F{h!_!s4>4Z_xgspH_1GO@FoK!Uj~R*2FO$yAa_W+XE9aW$EZ+6;Tut% zl-XfdFH~_>otJsZs#pjZX-wj%GKsjHJm8EC}C)MHWoi{PXFmX!SXQd&TUQ- z0#o{Ho=OtunJB1%a(fme^OhuUZnGdA*jrVs%cvCJw32cn-_-c=7Vi~Q6d$z_EthIE zc+n3gD(62D-2b=xPvh*hJDk{mdSvMUyP7dQd^ii=r}?V%rsw^qdl`Wmm6$1PkP6%| zr@Hj1U`mx2*B9)_mIE`U!7-4Y5=e13P`Ubi)w=q8)i|KfCXx}BpIo1>T2`N*K4(s^ zvC_DD=U^a1JSu_9DiG*3*0^r|t->7}tb#K<8m$6{e|rKjoR1EfBuS&sl=K?mhQu#}96lH2T}%R|Up68&>o=&3?C^eXgUeun*TOQvs>zvXJ*wf>f2zF|zBzHD6J`ZE13m-+_yTe7Qt{rxS2 zeX0JI5kAA;a#=ObfLlfyl_McXvyp2^WlkyoFwTT4zGA@F%AZ0eeolP zbE&KA)uqZ{T{_kDCV9+EHM6-xpC&~@41b6Klx`P##YffIc#et{s;mM4&1gQVs*qi4 zrQSkv-@`(|uhICTOjme;N`vcrmCSA^ES7KCwe*b2Bej!!(lg|(v%6#@wWMF4gAX8y z|K!5b9>%bpM(`NpR8X7Bk2fvyF;kkVj#G-N4Ydvk9qI3A^dBzEZuE!Cfd>!2E9Jr+ zBD$+Oyc#hIf)CF&;Z9U%vz$g$ zO#f@ND2N%36RbBvRD=h&8B28zQys+{Q>9a)Z?OVLaBEjphma&|`6fxA=s& zL>&_Vpz~lGbDg8PqU})uVz`oR&+0S5O;7z&b`>iVFA{l4yE1b`Zz~CHXX`qldSO(y zSDd+9dS&H3r(p^uJCvzet=uW-b?oje#P;y6^QsqP!L|AW&a;FNhkb9lUB6+A2dnlwVO1P9N%ct9ooY%bx#BcbU>C=ulW7&U5 z)WIW%T;X znWz%Xbbd!C=rh<(c%>v1zgN+OoN>o_<^}K`d*ar@nP4&UKTdv2z~6GCQTYZhkquCd zy6&!1-iyjb6U-JZAdRUwtK_%qE83NSG>pkWQGT7C*IMiaFiWrAG*-Erez+$>c>qK+ zer&xheh6uqvtqW$k;y-U3EYGmK;+0iKjG8{pKeMP8Ab-2k|W2uPI`AVglv z;%d>biqonlSF(swRk;*7a#C>(V@j$r86R+C>otK0AlnmSFeRG;Oy}kDdlMSk(PQel zJH!?^x7w{iG{!zhIVN;88tYbdmj$miwso}Q;Y-U~6MSjqtx0+*)VsX(Lf=KKN?Vh0 zB(qgT#^^)3fH$fWo)dVb8L;n|63aJ@5*fU^@l=hmt_B%3j`Dnmq^LJlQNGtjh2nw7 z-fkW%Dz1}bwT z+{c}mE7l^(nP;q9WiSE!0tNhzR_hp#6nnw$)461c~osDOFXiz){J4P@z_h$5>zimZiE zWZkaal+8VC|L0iYg;!%_$|arlu_0YkX(Tg(yeKojAjr zhAKSCV7ftwdxQ}8P)3n2OZK7V@>ULO;IG?Qna8{fPaR8zl}5|DN$7Inwz1`#hHEN& z)sy=Hmn!GpL+^f#cDJktCH?_4~?%wzgNS0ACLY`Dg1_7gD04k~h5~NoB zc+RQjW>|5wx=pAiF;h?$jv&;5H->y-rm-WF+BXO1O~`h*JR&1z#bCDt$&kwpCMQ`!p2-apP5$4H-vaah>QZp_)lrLbCOg zliBcX8UTN}2L5uj;xAXgUk0k~&wbli`E%M*So{Wf4-8g#S1f7at91Qf-Suy{Nf&6M z8{D~{8iDr-h^VAXFzm z>>@!j36e;VI6Ap>up}50lb}Bd`jDU}2~wz#@Oz{3FdfRRz;Y#UJM(phevB8S%XbsLd0$T6V3uHL{7XvTp^EM>r^kP%~X{ zxCa8_O|eIwikC#r%Bo>&L<&%&y!gyHOhva*GnI!g7MkxPH1C4unLm06rBuEtz#s>! z)FJaMB82z=mZ>(Nhqy*jKQPc63>aYGLcsv-|Fx12HX(kU%tx}F#EW1O_pZ{v|%fRJQ_oCw0CY9`# zRS8(JX9&f=jHOOeDIV|@gr|7GNfiK_M^r%O>%)X3rzQi<`4E@rNU8Ki!ud1}{Fj82 z^!jHU=^d)m?2>-1z=6)6sQ~yiRe+MpRRHWQBw%8w2;U2TiTJ7*UL+Ob6y`gMF1@I8 zFd0ktP@=tvrFZL7sH66fmbc@;6@1Gm%xu>h=U8UV@lhS9a%F9Z47B533c4 zj297ogDG`=P=G+hR^k?s*Z(#{q}s#@bY=z5b^ISs{8;w$6Dve1in?ls$g;;I)@7?n zXM_MjWQ|(iX=(bHttDc+K6;*T;YG3};qnIlj|~D(E~M_bPZs?wX9usRKGQ_|KYwS`e&hDa9npKU(T9IwtT+Vad4tY}QgNRZ%v;QZTWZ0R^VT~=e)VLwNIiu! z{fd;cv4;G5 zij_WB6w@tJteH=%wctc_yND$A0toaT2kowjg6#&uc7#K|||)uQ3qOP^sF4x+$n@9NI=FnBR`7F96wT^N(ADAF4-5Qzg&OKhX zh)!lJo^;La*r(xCC#yPl`{HTfe>I@ptd{(3iN0B8Em*bJ1?)Nup)Y+``CIQU8{{o+ z6_O}4TMLRiDMgGn`vSf!Fy7lC~_SiG39xQjVI&D0*ehvO;fq#R* zAMp+NMUMAaU5axG`6DO}D&((fr7BkB{oH+zy=0eXSVQQ9rYBw!)%QmE(Rir%s)8`L zg!8LToQdz$xX5!%{VxetH_A`bUb9sNSgOmtKq$0urxr4gHMd!hv|A52{JYwVibF-k zucL>yrnXnK3)U760!5ce?fVxM?_sbA=V#AIEe)KkmncKyx2u$DdLiX*NvZtNo;M|D z*OdrI%0H7*21>2N-xkl&4B9NN#@Ga^k<#k|YA$f9wnxfH?5_CgaXyr0a24>O$Um8C zxtKsAu2M%1H_AYX{7NSBim&_7|W!JZZo30zxkji_f-$8rZi*u0x81e$_O;m z1?I;d-x%Zn*4I5$(7% z>AN2D_!g-PX~NIq@GSS8$Mz$nBsso2FEi<}zeM6FO711Adb7SQo^5=eOEWd~+lZ4qesThOQ z$N;H`_-=pCQ-w}@Qi-~%qN$gfhiZg8aIU0lqijo2aqAQ-dCd4=y3MQ)`Tph(HNmXg)Qws7wUZ&i^FGr?A^UM%k@w z>lT zpU^$-&{y#jt(ixebU&1hu|YJYozvEnrB zg{#ca0fW+!a4PC#tkass+}hH)Ab+H?$wA~yko@l4n$lZkgpQOx8C7U1BxW@Yol}hk zxU5DS3aw9tDu50n}j`*UNAf z6_}V!D-=x6#8`f2=IADa_M@S2i!{B9BsqJO3p@{&odJYvkuR~M$Y3mV%*WVGiRs26 zSP^P?FLPJ)R>KC!B3g)9#lmH#D8BUxBa zBOntxf=lYSWmrW>&x(Sqkv%j7MJ{cih(J$85n^t#3^*^KGH=1q*KHJF!o4>##V*h8 zB55kaZ*)O!v#~<<{uDZ1mw?%#FfyAI*$u)XN24GSf}$!#oHK^7Jmx-nks3r7nKnzr zKm*(``X@uWCM`UY38=D0T9F|QNGp8`#63l%El0U=P>51zw1-}0tc=>Q7+$HyBSuT^ z-2H}CLSpn$xgV%lW4RccOt41hq9COEF_xbo19MU_rDCTgC>MZPs;1IvTUw3LBQ~Kg z5Gfj%i|<7NSSY6_qEwl?z4QYaOaT25VB0!ctc~7s>r1!6-$vQ(E#PF5`H607A*@xJ zDy@8mR=&V{2feAvN1m2NURz{1oy(|?tct+{{O)!4ZSYm4Xvh57+zY!)%H6*t(cEXY zd2-J#Ns@a%5n}7z=9jte(9304bih}&IIesw)9^*u~NQWF~6|yr{{8DN6uo!bWv)+^CsO+-#3~+y) z2o_%we`(@GwM^9pJY;MkqYN^VVjMv9NAcCT?~HVl-TmZig8jW_0|PCP0ccOqS#iZ6 z=1SK+tO8vnF0r+{D0tm+BE{YIDAM@b`UG!Igs&535C`&A92el;paMOOz%UiSHs%Ty z7$y4UizV24f$#flW>oHB-YmP@-*ypp4sF>+<woe?55FHeG9UnN>Q99^>SDiL$eS%67%R^L!(NmbE06P1fStQ} z(v9_mJJbdnZJkuS73DrB;RBgrsY-`-zC&@N^ej)4R}{nQlGO563?73j1}|%ms{o3P zJ5>PFMCAT9Z+XaotDcfDBIsg?FSJ6MzXRV0h9Kw`_cvlUvD0(Z)MlIty`G+P=<)< zNpxEyTCENkYQ-!?i#ZCtp?BXGQj9dxZ9U|W_7$I!=1H?SIMq?A&U6k0W94YF#uQEN z&a5O&R0XM~Nr{mZlFRw@G)CS=Ll9Pmab)H1CA3LlaD?wBJ9LpR-ws{oyWS36>KkH* zvVDW>&|qJh9m-U9ib_9RZdC64krcH`6%|~gVAscsrA+-;SxoXsOywa-@~I7obD7^u zs*jgiZPe+MDNv_8r8MzMi~m)EQQ3`Ej>xMjf@MnOt1O4)qEr{q3e2~Qtn@5*u(u5M zHbDB@7}~wKjTggF{FHr10{K80Ne?4&kCR>arnek%5BI0DQX+&f2RD}ek|kVpzAiMI ziV`lJ6R$VO#R`@|h&7?gFS5BBl8x9p*u)r4%)1joWMOa2LKBvxxGP$PfQ%KF+^7oe zIae|@MRhCerxy#%4}iIy|8KCbJd_1-cAgUO2iePti)DE#p0Kr6t}$j?Ip{p-U@c@0 z-NVCej!V?@v?pP$;>TW|!dE@HYc*qD`B!A;pmTNxe6q%uTJOA#ko?sP3GMb+d=3-QSMFog{fJ0cz zm4`zk>oqT4MyrKnvScEdo|$hQ{nVO|%5;Hq zf(PIbJy&H8XCM)fsGcvX8@dQQfSiML^LM_nG-HQ79}E}Bn$B%K%nH7y!-`BX45+A3 zZ%q|-npMc*lD~07Rbg=rdoAKtKYERF8Hi7u+yfq@16=E%;e0aW0e|xd zM~;J6(^d4f}THAcbdz2$`4~&uxgExTiLC4!Rvo7=*TJuw-51Mb}7umhzwgENpuwoPwg<~vWly-46O2hA= zE&+9cTX=TzL%M@*S+0AFR<4QmRH0y_Czn)KPJ?COMMRJ$e*^`W@+V!mIy6yw;&XJG8;#1-TO+eZGr-XVc-O-62!?RO$B3Bc7@ViA) z={?E9Y$dOAsztvRxB?XwIvX8h{uP)V?bjxnX$JlLq*ay>ZEeAqYMrsCTiLd9=NmtgJ-70a&Hxm4WEMn%8_@k`f?=4sQB zYR`b)F>s|}ZtFILECG8K1%!xMki#h&r$7manKVv%cRJ6G`h5t$v*CJz&Vl{83tHCU zX-KpFwthyS0YSpw_FW@Tq5=qyGj5ZZOSxU?G6@W2J+ViHQjE%7ED^qj<<99s8ydoC zZ}<)JNRRr&YiLv4zg@xW{+gy&G#98+;~AL#wh_jv+8(w3wqZu#5N-9hU2O#7DTn1i zpoIuDtN#BX9*w6+xAiED;eYD=GWGr-7ZNR+T-mQPid{aLW*x3SIaVs>W^a3z;$S0a2I$xD0 z^A?HL+{Jla;p8Gv7Mh=#UwYwIS&|mEC=_JVDX|%LtZ4f?W4$UiQ50*Pk+XIIEnl8gc;PbtWB~exf)rm?ejCh z@p|bv7U`bmJP`iy*>P5)%<6rrUe~6hKAz%-Qoz##ajKLL3QOu`qa`XXNskFOyrLz+ zM+uj^yr`1OmYl3rH%TexZZQog-s8y$W$$JdtUAmwX_*dJ$a!haM$qdKhNp=5Y^>bO zi>R7h$Sk2v%Q(i=LJ$r zcJRDrtCE&%sh@>RKUpyM5^^tZb^4NIVV+NJZ?T3+iY;WkT_{x;t1N-kGxQ1fg=^{s z^};2CsnwP3HsI1edVP6|NKC<>iM+<8uJi27{v+9bvDPZ%bc4MdyV3|e(D_Dp70X*2 zLvRRV)mv;Y^X;Q-UTb|LAcN)dE7i!Le09l!(120-C&@!$y4kVjCq<4%x><9r^`wPh zrjUPT6I|2dV*GI!7g}$iY=b5ldNqbu7gb`c$0Eiwi=GIyHxTkaoXqD9x<#tzZ{muQJcm5tZTMbaFN588SzO1LJ^MnkmWsYV$0Nae%jo{E@4#q+bRo!NP4#bjbDSV$ilju_u;}NF0S;ha9|e z+G|Woiyn=d$?D4Wf?hPvKtHBdTUzI2tbC2@VZXT=bu@Y%qN?mT^?@DH3|3&+;B*|9 zSVc~I-jfaXz|JFR3J@v+Ar%-5j#c1t(YO9x1tGR)Re&-3YZYLa|4aoKsiq1rxXV=l zZnjVb4D$b2g|6p_xeCBJ?o`cz|r!~d31hS`-UKQO9M;hrQJb=V9QoQx|}x<4aQ_? zE31E5$j*rBEANn%tUE1|(}_P>?}9_r!)AZf#i;UN%OQq2FZr6zZKZMKK!hv1rkzkT zf)js|C`=;%QPo9`0I)EqC==q9aS&Y#^QP9KtYd`X@XFW?KY(Q-=2kU$O{N8TOVOin zJmSvJ^GM*j?)9@WO7xiLJ(^RqrWp|VOd2CbW}*ag-6Cp%RccNr;KuEUW`Mk~{^gge zX(%~-h9lcjCRuch=>I=cC6Z1?_zSwxx;!=V1x3--wO&#SQtfdrL;jrFXc>eO$EHP^ zz>-a;Y!oniRo+1iBPMnwbRHRf?-_bwX^^y(lZ+Zo^vf>i%({-Q6|F^~>RRO!94zRr zjbc1za` zR_f0bmasRcpORKxV{A{j-p;Ay9Cb`o z5hFNy)f>gp))*Y&jziC(8cEKL+mtYR-G6z4zSWh>M@m&X{h9=^UeSE|PI%1f3}9{~+mS@Dr0H zCL{ePi)>k7cPJUoryj!OSPF-{Q4z6D{{Oh#kMvQHwo$xH-y-5h7h3-hb8iA4Wp%~< zXCP5f;u9>mf&H7OaGNYJ2YT~MQ9qgE6v)nKtA1Se6ZaR|0r_pNGO>Qd{9 zYXV5X4aB-zMMcfHf(xsX_xn5dd1gr_EWZ8x-#?!Znfu)3+;g{c&pG$pb3;oFc2aYI z#$sM8)j^@+Ze0z_a99?Y0)<}zQ6 z(H?G_(`qDU(#+@vc9lh-sMErl=PbaE_Lv3O(eAeZJnJ167{q>ay@lB1uCxG~(JTwV zlFqOIJJ5v$%8*@TeqaW2$QouB;I5)vnAN^{B86tv1QgvTGt57+g}yFROXycGAR|d5 znMp&*#q#z`vo;dD0gnCgvBqfgZqcgnnTtUUYGLa z@H#8f9$u%A2fRkN!fQ0qZSlI~B2*f6-QU?pY9xB>G;(bcvyL>x_1FPqO<~rLFNfJH zquRqPmpov0|7V#!_7!u~*>U*ta?PIjG&ZUr9od$t-ijpOHh8toP%)zrtm_O-Bo`^# ztn1BaA`>?N3_jMh+V!tM(6kxV{zM>9orJ-?3<4syxvcU#X*zw?$C9K3@6CR%%=Vv4 z$mG@UpduV+NUZf0zG+Gtul{SmqbsTTl;5-&bP63GsmmLZ=PUf0gvF-jc4wp(H&Qo} zH8oPR`EnywII_KwI-5L!7JwjqWdR7%3JXAf-nGCU;&+!?5F*uN0f^MI7Jwo>Y5~~p z`z!zcLkSByYAP4LiCy>qJcz9o>|&>xbiqLfCP9DyzJt{xP)F-@{~V?my$? z)t4M8-3+EJ{Bi&QBeUdVL{#1Mj(6L(u7lD_aR?PH8Vp%Igb)yU9lrVrwTY;HL~%l9 z2HY?!BYW5)O}shWl(;n@j7i+;=(>(2-c|UZ9kyTMKZq1gzdICH7K+C;aM2-&`-qQj z_yu?HOr6US@G*+HsMCI4?O_(eLb0}l5QiWG?I>hmxL~gCf=C%?-5pyCYocyOwa2Sp z;n*u*bhrDbdR}VgdKnop6;Go*2kkedIehTzRUg-t<#Jr}9!Ed}8ubSuszO#Z6=jm1 zb)jXEmUpkAtNO1BAN&gUKb*)R*#9tXxqR7}w!Fv!%-@>*EYyvQI43A=SEFq;U$O~- zdqIseSTeSW#TUN}4)WS318p^v=MEFY)hg|0Qdx`NCE>op8UmO|kBNO%E@cs4vH!+i z^saHu4)_cvnCSE3XL|QT(9Oc z7eaY<^*t81yLXijrgl1;Z1g8|CkNaD9QXTDS8Cm>g^8k9TBi=YKb5ZRfU|ZfElcn`);BjR|fm2$W5{$|j2)4wy}Dhk%s) z+yR~z4H|yF3(@dmwD$~p+5kVqmT3*Y?H}11zT&5>4d3CAO%Cuk?`Laxpxv*18p36_ zoaURIvRAt;ynJcw``8ycKhSb4k9`G2c1x6iTar5Mn59H%U-?b^lE=+WJ+;SZ8li)| z(|)T!iC1&onF@4gzf=1*>TX9o)G^p?F#VBOKi@+^gAZIz!=(NowClhSQo3 zjjeny96x0v#IBhE66Gl8;a06KqaM8p$ny3PUmXbD&}#Rog9t~NK3R}j8f~eB7E-J2 zgS=8FD|TZBVHihj;x_&SYeYu0{u)tQFjW?&&arx<-RMzXiKDjS)Ban`n~iRh;P@mFIzJ3)qg__dptt?YIJMg*hwZ`+5 zdV0e@2&<8bU2LSfv%GQx4kb6yZ0<6i?SsRc-F~jw$2o9fF=rH)cXZTnWSzTOfiXhz z5HPLt3fmyn^Hy5vCWRfzxuXv3D08^_Q~U1JkKqzJc=bmyV;ocb7edAq%U7B|g0uHy zK7H{-${xY-i;umV;ulvxEIs5$AHtCT$yN)4K#UgJ|{_%kPV^O}tbsyap{)kh{JuGGNh-Sto?Ct6&vwvSVK`Tn1LXGvb|V^?d1(|TpLcd%+fM&!7`C?m{%Smq`Y+}}^xq5@qW`A25dC+K3(0&cx`9k44KD!wX11}KMp>KgSd`XO}AGK28iac7DrYHI~as6uv;eQrOG>Z znn8IjyG@keon$8`rtA=I<90)gmpmFuV_$L(T+YJ`Y~MNL498y9Car~zdh7%3((swH zEPxC;!vgT27ZNb^&b63cc$~rt-grpbLA??1rvZrua$75jkp?@r&r@)o;h6 zdWk{+8J^7JiEkifRW2*%%6l-K4~usjSr*ToQ&*5=Jw1TN#^I7WVGj-0E#D9ph!BB1us~dht{&?`Jy;+v#5f%6LOZfRTnL`1FCmRYO%DRuNXH~h z7o)|mf7d5F>DcD)HuYEkCw=NCmcZBf^Oo^=o5Zadk1Hvi(Xpa4u46@)3DL1Xx{jb@ zzjYxxR{R>NbnN>sM92Qeh3ME9T!@Zsa3MPOF&Cm^?{gtKHU?({6gqYm6P*wpJKcro zSozl_j*dOsh3MD`E=0#3=R$OBIU(!VQ3SGe>@V(9$4>jUosQifo`t@<>9vfGU7fU_ zCT%8ZThp&|Dg6JiU$4I{=-0_Y#QOD27ouM)T!?->+J)%XG8dv>f9*o_>o7vrulo?l z)~`?9t9~t9)lR=gZnb_bU6#?W?#r()Q~vG2BKb-H53D`W5stcK-or z`5)aQR&3FQJAI2rA*{&!YZSnYSFzn^`?32@QGiqAxF0cmf<;v1jq@XVp63UO2N1yC zcOgIqHVI_+W0q54sg6{!u?Q1335aYv$xS z^{&YKhl}ohGrv^%nxMR%^4vYLLQUw4c=bm_;+!2QGCKQ ztp71y-2p*leP8Gf0k7XWK-m433Ynj@1yfgK3@(;iwTB*MGqZTqFG8q=`Yk8_G6tsN zBY}9S4FYw;TuBVr@1ZK%I(+zDpp02}{y;zQ0Sz2J<2Aoa&i4cPClE+fQKH*%tjl|xF#6CzrdDgiAFtfAeg(4&ucfyVF4ljw4T#WLv zzN3Oo9fygIH;sbrK|=ZF#k75>`%$kH!{)EXWfA>3z?=1jvLdrhKgmhnST3hDx+?=A zvnh2}QGfpaPNRD^zeOlff6K4r5LCL+X&pN4;MI;J#!OGjMkOMIxsQtKxc&fwCJG+P zr72EmRiSgsYEp9220WHl+wA-b@SFLgiLE15BF#89RU%D%?Fs+CYmp}##Dz(mrf_Sq z2bGSJ)j)J(i&rz5&M{ea_InaEOzW`uw(kMvVib1bS8dq4(9DT z7q(V``Is^n=)`R0rV{_hUkILW@fj_8Vy_bKYTP0@ zkR>%Obw_t1r`jODFndn%g1WgMC+3tacB@V~;7Izxwo_PNzBySa`uU#N`CK@ZobXzt z2X=Yf?b{Camzbt)#gaCS?xY=n2TC=C&zv*!X~WQ5Q0!J#>AoDQ-HwkI&DjfvWsx0W zsXF@jy}em<&M*|BBYx3W&0t@JE;p^KyA{;^i97mUt!Y@)^9bn^fKoRjH`>yH5A~>5 z|2E^qHRQ&YUPNg`B11p(6Mf^t{w^zDDiK=LPq+RlBP@Zyd5>Ful zp8KSuw0pANZK#QQ>Gjt2dNsdlg3dVQ4i<3tk(GMs8#f!63eolG0Zv*-uJtgEQ<&+| z^-SmK1k`5L99-LE>3>1SrfvN(<@RGv;%#D3%G3~c!=XNaz1#&nSO1B@^Ru(Bg>CX@h*?Q$S!#iO-Qb_WB1IZL^N;^XNIYcior@!8+J~Wib>!UG;v4VzOwG7emCH{o#4(}uz{8@~Xo%#(f zq;@;?Td=3_z#XVN`dcQv{ii3e<#$?B$?AK9FPK$kb~D=+>2V68YY(j2 zzF1nNs$7^hoXnVm7_atJYIEG*?M*V!r~TRcN~E}XOioS!)2n%hFW}-=iGabzP?n(J zYwxK!DJ%>Z1bVb&Z?bD_32Hl1Jh=Q*8uW-=r_S0VReb`~s&-a$cXZ9&9u4iHg~d6s z$N-1c{(B|C!sqi4x9h}E(95klv3;oL`%r_vtXVamfo0@Ej7j@=dNqs57vSpEJjIuF zExK@bfAs=&$wU_QWfv?rfQJB(xaTacGZN(&*KJ-QJeK-!XX#Md6$lUSnmCy+ zc&>JB829bN3A#O*(D>}>6xsCgdD3>#d+-gecr5nnf5JG)zbrzN^FF#!HmFW%&erW3 z3fHOI*EvwV=4X0K!}F|6h}!@Syjv!}FNpNiX z&BHr3ce~zrM;ey(-e%%-3dz2~Cd8Ir-otryUe%6{4*X`Z0OTZoWViiaUFZAa4)H(p z#s4@9bo6DgKnFE#YdcfTA5j9x^1pV-t4O`>y1XP!DMTL53)oz^UbJU9iH94|$7k%7 zC(4meZ8452>nhkUH-x6|9PF1~d@rKSomx)<{=T^(GW6sA8$vId-cD}c}Q zD*6(?qfkuzE-y_E0XCr8hGUDcyO16xx*Uflqxz-hS_Y^8x4+1x3IiJ0!v>?K0j^z1 zL$DQbW}7$6E9Q}?9%IHdew-Jsdsr9A0X0FlY|kpFUCl9rdc&)|ydRa8^}|CP`hpc> zq2uxC9U_OgjT{QFG2$H=d{h+jXc-P|Gv+BK^LC$-@lRMK^TxZl2e9sSI@&UCi!n5N82VMN=;) ziQScvzd$;F2lylyjN|)#{O5`G^j}ZfJrMGIw)ll6r+j9_unimmV4h9l?)-2$lc~&#>2?)ap2OE>HCr ztas=o2l@q*y*mpS(DQtt`OOOyQBZtVZYbw&gk%{`Q?TIhE|P8KZ?qu)j%yKK0ftjd z;$CGZmyd?zW*&G7f<)sWq`K&8U*3Kejyk#)dHYcUl;jcy#T&rC4Twmc^Du>fsj3L* z#$K!omZ-(B72Z4=9NpcH@0%Iol^p9us{Aj`6}}d7gKB!4u?%d zXTuU%QwHrtN&bCgybF?!Zz04jo)Fe%jwwV-Sv66|il6%yVShXcH^&X(*gVMDGTsEd zN%IT4`s4d(ejQj<6kXeo*V*#*#fy%ABJkZ9$VhZ;H?MXQU)r`r?7}<|5?x!#I|;Z~ z@%fN3@!Zb7?_Z|EAGnqtyoz|n%#XxqhGR>QWJIXf<~8+x)tj2uA6ONMuJ6Z-QS0}v z>ZSS`qU*a&>7J@Xy4=}x_|EC-&DjYft!*tncV|yQ>b{C z%b{a?=!|sexbqQEa(a5ua_1ibYF_O2+Itrg!3Em_@;^c*X0tQp9g1A6@gmcvdZPDGR|xDazJ0 z@AV*sT>|$lN?2;ZUm}5uRZ~U&5|@j6T;rFjbN|UVX`oDn75VpB-V+xK=f%W<$G3!p zv;8r|-xe^yzeFo4ddB|(&Xj+bKPSFO{0WQczxUZ?D&AL>A6hHPZffhkhY0~?Qd%N_ z#7EbC_fIC#SCnc{CC@7}u1x#Aq5|cEwV91?;9FihDk6gmggP}ll-2dAK4+s_q`}Ht zcctOjZ!PU2s?28YU0H3CyhMek z?xIXmJ##CLOjCCeG1ZQI;4|vel>{BdB+z|t;^^S2!3AEwS1D8R1{1|LfYo&HY9sz9 zXanHlO~K@D>hPtSB=dw}UVk6M2Byr3OF>4vx$H&zLs85_ry9#hv-O;>$%&Ab0;cLc(&z-RvTd{PW&qA!T*vw9lf668|UCu-Vf zcc6yxpYf+_-#;n8`uJD}r-54XOI?^QsL0DRJO(z{K}Q9*>;^890%4^yj>5%ymmTnI zl5`IaS3BN#g^+`Ru>P$>q$2OhdNqmidY47T+_RV3W_A=teXmmnVYT8Z4MC${jnJ5$ zS+;JN)mXc_O8jE}1WWCje+A{3dC5u{C{(e@8ht$RV!i`|@7TM(Q#0#oRRn%0=}k9Z zqhyCKg>CB5IZ3h}`r0p~zP95DwQ7gfHMJ^~>P6KgcByOrlTT_q3-YGVHhMKa*|hZ9 zGW)Tj?@`LE8gKMVmneecq-2LCQO)Sciu|1|W7qsq6m%VF%q3;r$csOCp)ScUYa&&+ zi8PcFHe_beJe?+US(NR0~Xr@rM-0m z$$y@v6gQ-2JeU@Xks_f}@uNbv?+kzsrvCAHVSvN%LMvDeqEiD`N<;~oOV4eSrfk^b*Tc_C}|M5=?HB60F6Wa1>gY(9AXn3%Mk z*C%On{=rlY@J0b&;vKWdJ9eITob`kcn+b(eTN(d{hpr0uUo~`fILgS(maF#^`0Mn= zQq23|G1#J5&u{G~fBVNZ{ks;o@JVt-zT!26J5jB+L?$&|dIA$k{sG6MVg$Lo80Cj3@MH+oZa@!@3FVH7;()VmbS}b-j&#V~qY(Yb-Gp_tgI$Z_lIN{S z_ZM{VRd#W(c~HL8apAeUpkfSMH(+@s^^{7ZdJ?ek8eDhHo%~lz@X2AV(F#(5~k+mluLURI?15hrIG&; zgYNkBh=hYccuPrc64NlN^lI<=R!?6$2%T283LZ>DSQ;Vq*-G~wV?M&+EMy~x_Ng$O*{do-!C+GR%%Wa-7RrLL- z=zqKDl~R(V5ut87`DOtn-eVi1Et=`8r;L+VpLI-wq%E~q|2dz!0~;Tv*BZ|UdSs5K z`5@qW(X+ZU8QGTl{(?{EK<-$gz&!C31$DjM7n^6?9;wqE?zWS9%jWcn+qE;N9YB9- zXU=JVp0}CP;8B;?`2mxRnA-6!{e*A}Q`;Tde0@JAJ1zA5PMjY_TYfPmFC0B5H`J7O z+sl2VHpod-{8RQzoW}g3A3G`T59^BOQfRIcxm0D>%T}h;4=ML>>2~Tv;raIU5Bcfe zZR@rnqKEF0RqX^>O5Gu=V)~6gv`6d(|4<};SSWrzH@)scleLM%CEioPYdfb>Yjy7I z&AtMfMA6`6rS^Pu0l`tw89H6TU7vvyZ)+S3m%IJFDihX>1Hg1YT|#Afu;#Z7*I`vq z)!T5F*VHuJw}*Q&RD&wpq7)up*s|CglzVkG3?;k5)hrOU$L>3`4gG5xabo(mf|ns0ND{ha4A2zp*Ej-kQl!fO$qqGjTF7y14&3W>7kS zsU32cj_}R8X|RG#9S^1tY+En)9Rg73DL;~(xB2&ZW-!eSNw!#A1URc{QrNNWJZX&m z`)V_Gz?4Dc0oJ;Pn7Yy^J-B#7x45s?g?4!n#2BI$^F=GwM+F!;c-bcD>o#`~njJDHgn%IRy1+<;Jo~ z^y^7sBec<%tzvl7^WE*u*a3~fc1U)>>kvsoIKqd(vFO%7SbBI8LKh$)LZ%axEcSOZ zl8t$oqDfkD5=X(bs)Ieg=GEu1dVWTGnhygT=PYvm0}jGgwr4>K!b~7+O?&R5XwaUT zh*iG@_JJcYIPxb0o)i31o0$+^{U`V9+|sN0FTb+md!65OdqJ;uJ~4p}r*X35n#|RwPQ9$BgJK%2kk8?!)Li!iTZIhcT)h7->gpUd^!y zt;2%6ukS9;X^ISnExA>CQfFrSHjzqPrQaZO1s{n$C}wNzr1vzm&Lo6Zw`a^#b2buV z$|R(MFEa`G4FTUIq>P}Wp6hStut_#N!OA|AN)mtO&*7VPOqJN_eY!p-d+^7AQFjM8?wIG#-PoTxnRQ|VM_ke3KR?$;%)rBZP^GI2uc#fo%WhS= z(7DC}RNC1p4a|VMj_i?`Mv~E^Kn|$g?HyLzHa7z;(ofeL>KCOJ37zwG>IJ*b%1*Ob{+gU@Jj zh^-0SJYvI-zQ2?vpKHb5Ypt*4X4ri0yj@n)ZPk0w#~MK?q39LrZ0@=beLQzf8eYL%vKbD4?H!Jg#EFDf1l$*oi- zRo)F3O0$T-)jV_kkFa9T!RiH`SYda4eKRvb?cSYS1W}LgCWn_gAYT3ZME#ND|>t6G@>(nRak}K&`FEFWduDRx@OkG|C z{L)=>T|~6(<7o2eE=`;uTW^~gy`rS9n(y=c=!Nkd%!j&l>QN9P(VCp8qy4k;5!kFN zM%d76T)LxG}6E z4B`S~IK3m2_}ih}x3G&bOJS)K`eSB0kH62C{*X2YZ}3XgA9~@}KowQf;$tlUE4wLQlL$3z@ z1%T78#v>)c%=jzvNIh3n>N2m*AU7vj&T|Q;`A66yxL&=~%VKMr`4wBMSMM|Hc!ijN zt(`~M`9(+Yh_$MFbMt^Cy*7y+*T#v_BF^4B}5Jt^O6i++_q3cU#&cwwH28 zRN4w>5Lp^qp0qg(=(tJo&9RBuEeTD6XLAOIv-_KKohcq`f~Q6}0_U_R>TCx&&u3a< zEp~z(o9T;#oWvd1Xf74xJ#rJLeVigtLWjCt^KK_1G42a`NrwzN!;bwSBu#7sDoyXw zr(u~BRdTel9-aL})L%)R{r`KTn#2X~YWX@c1EEHuor7}0G0A_r8l-ja{IuKk{`zP9 zRiig$wCCK?>3!}I^i}>9H<|$9j*w^QgUE|rq&va>y&rjWdd^ZlWYV!|dp#!-*%j7V zZ`s)77x|#go<--@!v`7suKB;T--7(@Tn>lPPd6}f<&@RP;b^!iq)TtUvtdvTypo=I zrGc+WdBj5dKJ5@xS=Zt_aO2oYu6W`OOM8jjV9EQH@8OHp!KA^n4U7pMu|6q>VGzxh zQ;!M!%A3b5e&rfVD>Rs4Fm_wMQNFgjCgFj&oj#u0sPj=LmL> zb74KSrD*i?wy^1+wgDPfR z$kv$y=$xuk>?KzfB8?HZxI`0mxV6p-CnEBa1s zgaCx?O2*vzVVXchdF&G=lA9Z)u`da`xgb|enkVw|pb3Bzh{UbzR-(K|asgA6cQn75 zly^8W0p;yaI3-!X$d^gh^9cBo_2UF3PbVHA;Gc_dO7hpMU;vJ9NXSo}7l}%BZi&LNT2M{|B8ExqW+eD}4@)){u26m!MMKc)nYWCHc7O%k6 z9K$4{h&y_OQCVj8URWu612{yizyR+JZ_q2}_Y@eMn@p0jp2t3Yh#h&@b8mA9i5*jJ ztwUm5r}Ouzo2;Y6e2zc*qR{8w0{*5koG)ZD&orx&=1>u~8$W=C^O{us7kKQQ$t8me z9nC=JGtOkJ=Vl*8U!fpmQf`Ug#u5;>3GRt@2a2m#}SiRV6)oPOelpExDDlcvN_!g`O! zp560mu7yB=L~zuXLZZDhH=cIk3Zn3s&u`nMdOxvlsoqYg6(Vzpa-$i0Ara*xu$N8Z z^IxHwI`>N9lXfJLI%@Ok?Ixs%^EoiazjtWz#ia%QJophUk@en;5&W>Y7I=##{6 z`BPRI8Qh5pQ^>NI zTBLZnmXCKky8oMsSQ(B_D{8S=#l3;5{D79&`sdj3Tbh@gZX82!DTl@&@FwoL0-TFK zx|0)Zl*7+JDS7uv-o7?QmxxVJ_JR3_{8bh@uVC<=j;!2wYlo2rL+YjGNmj+c{4Qii zR#%$25Cc>swk(2FDTV^8=;o1r&X4{=PN$sm3y_zy*ycWdhDI`!#!u}Lb@PRO%1)$|GHF3IS=+)uyVE?*&$aSOrC0rey0SrC*x%2#m~7+_ z3O;h4pYk9nfd(YKR~9yZ^;_2)ag}vQq(C$;@l(&sNYxmrc@O!iM;Ua7Osa4s_Cj+# zIm+vLHecZzNHBqtdXq7sFIdn8qq+o7skVKX72CI;@to?Psf`;;QGQ?>aufH(Y!U~T z4lD8&&vC|Kp))W%$u#@AtTWof@4OT9X8L&^JzXam<1rpH3&gyM#HZ3LlJS2aKJn7q zR#V=1%T$p!*#YT(EkH6VTIyXk&GMd@*U!&W?kbuWR8(Lvg7k`H{4T^NMo>8VX^6$~ zFD8I3Ij)_gue12Dp}ZkSjC+McHgnEAtN*IlE1`wHTCw?v&mbL*47}h-vz!PNX7)x* zkHYBkQ2#gkFN&=XHMqfBBeNi=0Ph@EE-bIqNx7@SzX2i1(bY62)G#tQ!EH>lc>9j3 zFsKrBtbW43^72$4n^Ibr9qZM@Mnpv8Bx*e28cD5L8q_>sf+ksz3k97+bfj;8=g>`} znZhrL(jQMJHNS2)(%PW>YdQb$>h=JivP$d|2X;SC@z~{P_wSh3^UuXOtLJr~z_@Nz zo%qS~C=mT91lu#uo}U;Xdq>f{l5T(-W8j8yIHbJ2fF=94nAXFPksK$r$BDMGu=!c0F4Tj8k2m`&>LHNWgWtnB zzVeR8R58nIxxtm?#tR2w0+V;ZX=Xf}|LsfG@S|j{t6LU%CtRxt%=DcdY`DkJWrz&% z_x;wG{qmDCR|urh5{Ql5uljEYmhma6vp2uKlqp$tf^x;)Fi*|S_zur=2&Ix`%a}nT zS#70IkzB=UgHOF2=p@$ME*X*i$SUb`HK@TwB7F`gCXhat6YGnH%9yltYDyPAcZZMM z*%x)Vka+4yru%^j1j#XvWca7A$Sw@oG4>Da=ZNW0QT;$xoCKwHFw8~(K>+*e+0J%M1og}#ATXVPi0al>4CSg}vMq?}#b;?1t* ztR_73CpQ7-0ZPTS=w-B|vh5VC|C`kh%O59z2FHj3ZU*GX%V6up`TCprVFKpxQc+Y{6k_YKp$Fq@JAf)aKF(U6Rb+A+pPlwox8ie z-~DKj3EIIKDgsjjo$cS=@3jMCYsY$Yhu4Y37NVxM^}(q1f4}Nik=UYr9C|jHRk2Qu z84#C`53aRv{HsFr6e@a-*Yy!O#EGY2FrwO0@3F@@x^K){}AL%b#&dCMI;3T1@0c^e?6IMmu`?FOIpm;wxeDHf-{5&=` zyzT3fav7ksms=AU2B8b1I(UZ7c-KVA`mXKKtd({29b4@O@=ZDRw}f5Bwnp)9NsArq zyyV18ITGL0sC}(gNb}-%On)H}r1=@b;G=M?@mZ9VIb0WC-)qfAWgH`KLrONg{6 zR24h5B*sA!5F`gS*lTcYpcBzr1hPr7W?f7-sul(xP0in)Vx6D&&)_c~SLfzh%`COry zKRSC?UDA~H8iq!6AW~OkXK9hx`s5uPG!LSOGY&7UZK*mGGWiWm7ADla4-rHT=W2Fx zA-$-pkoQRllQ4LH+BJBD>G0wW&XE@1Xt-h}>X8 z{i_s8tH0i*P=8;%gOG>%cULH=A37;p$xfh=Q+2VVs1kxYiBqrGNnC)@#^n7b1~+Su zLk54ws4{mRbK5DlW5r2{?Y^XIveyvtufM)Ez$p`p-AzKLU6H!&*q1@}~f-3p0vgcl}YjxdEu(O{+nViFZ{XIiL1CDCoUi zU5MWE6iVy8XI#G)RBdNtS-XUGvHG~s@QlpRn$P}^$Pb;;qY&B?Uh|WLx_ikKE#Bc8 z@b+qM;sfKK@YLcQyUy2?E03Ky%|o)4oUF`nKf>Er3U#7jQ;v!xjuu>zj1FR*AQ`pQ z_X(YXy#2>PO$R|(FZ(?)iI4DJYh)w&7S-6w{}|EGWJ{_zt|iI|(t(=8*HoCQ!>z*D ze^GtJ5MKVT^c_0ON-06K4@lqf42^R7jtztYvFR?tZS@`6N`pIk&NM&F0SBYyi}zK2 zku=Rl)*=TSm@E?3f&KpND>AZ{A3=HMv;4G7sSL}ZiryEJQ2UmFZeD(pv0i)09gZ6$Jcd-K4pmBX}8)(WE+q$K!T0jGWMTHbq-&Ez;WI)sG>A z1oSY!MPaY@V18{vH{bHA$$Wdz{Y+(>(oRRQ6Ir6gBd+Shbgu2p2h;idDM)`|vf`1Z zpMLGiZE6>X-#pU6(=ze*)4UZJ`E2Eh6PEc{Hq#{HaS1A#b1;ilXI{Umn2q@@MF zXuMCoE>p+~_kSmlvrGo#`Re9-BkhS=7r;2e$_0+n9;))?ts!)-iCV~9^7G~#rR_r2 zl%up=63hPWcT-TKlkCn}YJH|Q29jN>k;a0^ol*V!+STs|gnIt5SIl&wS47=;4oG8wcsWQpUSu zJLR$2igh>@Lecv6)%%Mzt+X28o!tov~QnHqVdU8hsIf-r>j@r?#ZB{+pax|Xg5+TUb1$#Rj&>r ziyNuN$uu~NdbJBVYH*kFDZWp+9vp7U5z)a(CAW)^Zm!>pOi@<(Ce-dgVbU(OJ4Iva)=Wm9hOC~=PMyl+2roTvQ&Z;< z@`dZhcS5DbPF(ZB2Ye=t0(K#2;&x*1=abk3t+!_TUC?~ai|Y9B6PYVL=m@_T!fVzh zm;Cv!2Hh}ZllUD*J`u}q99_xItBY(fGo0VAM`{da;MatsQ@cPHE*+>9=S}wwUeFn`%QIv5AtOU>Og~U2J~6i>q1k8 z32+Ak+};)$xzP325zJEc)}flM8ND@(n4q=&2ty~48kVo8w^s1SKGk1S*pw3&@rNf5 z_5QCn5W!?(({;>uCm>&RE=KGKZ_UI+b^AFsl)(*NbHmGo*VTP^wV%%ei#FXF=%3)B zvuhWdcUo+{E+IcqET*;(C)aBaae$m$&$Ah(d-A3F*a^N+pE&SGohGf?$7$Y-O~~eo z)$Qiz7O5KzRIr;{byZbvhrDEx?T`)@*&gwCN1UVjM~=7v(+-&^2}o1s#$B|?=#)0@ zpaSjPaw6=L3fsK>t^44>u)B`@varyGj;2*zpUDYj)KVH+-hBHZ*;~Rpth)Vb`~8FG zr0w@k-5_2_n|*;)O19;f6eOw=qM_V*&xy@X?1bhAA+dmr93)jFf&JEi;m5~2CU2() z1*M>D7rTgc5P3Lam_&)3Dcx85!X|nORkocXxA#9Z;E~u$w5v*r_zGL}M*1v6m7#{m z{yTPJi>6~>y;BUZus(KLppO# z;`R5j%Ec~LCPAPk^NW;i8sXO3*XBR{S_lu!-|<{ChIsKTiqv`dtl}>GB@*|d>kja04kLtRG1h6(bseVsIUH>WA&-Wm zYdhen0h1Nw#C5aBztI`m$KH?@ zV5$;XaatdOoOTD?*VrgF)9OJ2e>kqUsNajdn4t>jO^Q?jS1E@X-oHjDSeUv>>@N;w z%%Xxl3cH7~{?U8)s!`FkovJ$Xz!i_2=pqYuuIuue&Scb{)>*ow%QD>PV6@p3QiOkv z!95M_AG-&2cSzMO^tYz&F4z&cx)1+(bzcTuygVq znV-Ij!wfSto7z`#d`EvI&&4NFR4R@FieLj~YbQg+QAP&wjwSpCQ^Tv-kFV79I3PJh zcb~phJ(KvHCin(ZoYW;Ae=MLB-Jgb1?8+Y_RL$cWY_Hc2#~x3=1STJ=QIbZBS6l*POaJ<@uDe>KK<_||A z{B7rG`I6_lZEdfi^ZL(2zsv=8S&h^c z?+xxE*{A*vlI;xPx)J3|BTaM$-SNO(;%L{D@xpX;+J1Wc>dU869PM(#Z5YkqGI6#$ z&DPx3_nBS8o3DA+*w4RFZAL5e*8f3Qgc+?VzjYTmwK9FaJurX`*t*n>WNsR9*E2eQ zKl;O=6gw5iUN;&6ZW`Gmr{ToXrVcu><;4S-5-p))3QO2*b8jkHaE3lxZ(m(qO5&o$ z%)OKlck%~(#!|xD*^ej1jWmyZY1?~i{`)C5Wa_hXwJV=dFX-BvWZl;Mck6StSDj~x ziqnd7W;U*Ljp$JrD<3RA+~$-fMIDZ$xu<>zLmyo`FgCIirz930Ja=Epc#%fpnmVA7 z%1KPewkFe4$Uo<%2K*Mn!IeB}7_Ae2vQ{GGDJR7XxE1qs=4cBoICR#jjhOOc0d@w6cozQv>pQi-lwMUWWtJJtF z8R*ZlU7?(KGlQrN+ufRTTKh648t42Xy2&lrDeor`#XYp-Zv8d9bPjQ>ZV zpNN09ef?)`-L2n>?@bljwwLhhw(VVDW`eC#@Z2}2Bxrk zyH66k&ERki_#j3Je>Qf2o*DbBZ z6B&y$GR9&}g=?|y$IFz%&6uvEZA@fl;3A=#RcT}MBc>w$%xPzAk_^Ur@Y8G8Vle#Y zveWz_diC#+uB~|)zZsaF>|^FInsI1qmT(h@%&D33?<6)}Z5=7?&1D{$AT|4Zw&Oro z)r!a4p;PBfqt@b@KQa8g3Cag_>hY6W)2Sm#P=g-(1oaVTLJ#ok0M|LdZO?@2$Pz8y z#{kz(=L5i}2ymDYNuCLvp@fWGdz(j7M11`tty2f2rS3sEQ-?J=E%gvfP3H&p09v5o z+R-4VKNopOTIyiJzD_F~=gAIO)Ig&}tM4e3J%z~Zwfqv{OemnMnh%gwaT+4XI!2wq zZ)vP45_7j#VPm@4d-u_K9VH`)zA#IB^8-0=frN`CmWVaSrHBBORo-ZXKy0<(Qj=DM zYAW-I{!`Mg`t$&zQ=E zfoi0qyB8g)8|dF?{xaP7qaKJeSDf`vl3Po*<{<*%nV;Cx9+J{{WK+x!3mf}}BcZNn zcocyKHq00C*c%+^LU@F|3NuIIw)JY7TpVY&WiGCSH?>h~rpn*R7kRh$YARg_E}@SL zahdb-0!!_N&qWvd7438|5AkZAbfF^nYEq$OYC94!r?k%G0?An3kVw&BhWJ(ADOKO3 zo<}Nn2pWqC#6;@cz(V*maz^zuJ&fedvJ7r4Me?rYJJB*BSUX2P($1n>`k>a%Hy8HN zAkF84we!pItrz7ZN-*YO8`8u)=)tKZ?~wT8v#r<1D^I6Zz&yfo0Q z5ujmhj8waP8DKK)_;dv*+LJqc?-1sP9OvVx4JWum)I{;?BKOSJ@cRUkMi*-lNf}<0 z&tJO`Mi(m-N;A5+)TJbiE?WNU_o;7m@x#B>vxX|$zHfB#4w<6G*G;ireVGq>^`+xl z8C^V;t>mrBT$y2X@mC7^Mi-X`l{Zhf!gJe7bX_h~)qA+ATc%jmM*$&IqFYGdkj+K?Z>vXJi#$nPU7C*8nli;D+@L2!nEj$mYP?8 z3Tf$XX_%x+2-ls|=?M-#lP?ov+Sf_d!LUW%3deR&tT|c@PA8A$Po}0$31Lx}8lBZJ zEY6nvC?K0Hd6@+`Zj}#wk^^@JmyaTQ%9eaMUv3W>{gADLw#TSDlEvAQ7amJznL?(- zIbqAuM`9Hwat=mE2crNBEJoZ$-q|J$2F4iI6l~JpJ4VB1XU02`;ERL~M8m&?# z9u@%5FDw9{+r9@-9$)FLG$EW(K}rsM{30qhcYQ!36n#jjbvj5_H^G&3?zNu)qMF@4jup&QmUQopuA@{4pS*O{Xol+>Ak^!DKL>umEH5 zpanXokH8U0V2>rT0K1Jy*BO1uxS0{?@Xt++zzEkF|2-nJGy1jdj6G<9tMp%F-b|(O zdpA|7KLTg9sx-?8JWi#K?jGVGw%sO1KasvobOWZpj}0Orom@1py~kE^yZhMpX#Jwa zS5C5R;xj(nKGryP6WhdMvPJ63ayeJpuBu3G0&8!VfM?IeUq^_Upb8Ul!sdx|&#EtF ziCR0&B_ht|Bqm!TFQs?(>Q5(J+cINC;v@pW!>7%Y4%7^EY8`m_$siZ{Cd?xu(Y4!E zO@aNXy@0rIbh@6YKTAQLrnibu;sY?5GJj78E<@(`YG#nNEc7`S&IC0qsFPAqPa}w{ zPy>3bqU#PN9~iGY&xGLFtN2y5)}$5s2y*O2cA(AP!-232I}%PdFMdFJ^A4wMs(Em^ z&`%+=zhJs1_Vep9Y}?WUx!bapdorWkbSuXzkU5FllI12^x$u*x6CJPt;Wg{6 z+7TJWM_BP)ReY~x@d2**+*>aTr4@J1BXtrOEq?QC&E(pJe59K2-C=6_fr7PD64v|w z$kOyRtJ0hPl$9${x%WwMP5(!$auD|3)aK3p9a)-ZS?Y7??OVgO7Pi{I0H%2&$I?j6RTD- ze@*bq2V49>lyu|epuB3z`2HL8TGELnyD0YTwAft|vnh(?syz!#{Aa5_bFG{JBI>}p z?vIUuOmfg7OrGsyw~F+9_w5kl53pWO4LAf-Fu($^l9i8EKCsj1O*C2h2@x#~KzA&G_zX7_ngtS;j{4 zpyh90AS!!E8%f!jeZ=P;!iU>PrjFjkM$(gPNqTwM*^XY0t1>$=>IDKovr`xC5HoYc6&fBCyQ(EXamxoY<4R7 zk{f9G;Pegjx!(aI#UGrf&GVnc`J3mh3I_baU-@tty>)9l&8j;+quc%!*+jRUO5Wr= zJ`mX2_XqnG+Q$D&KGK&{J7U~nhRxQCalfA&h;g03GbzSxxJ8Y7c5`Cfe@1P!7}t4{ zdPnv$*HAcJjOz?4iM!6*qUN4t_-%c2znB;_cURRONUdGAtht|z-0J53g$iAB@1}5i zbN8bo5``qE^d^&$72V{z_-312ZFN~=B~BX68V|fIdXs@k7za8SnZl$rQ0pW@6~8&b z2=14Bq%HCeg4&MWM8cS%7k*BNHNSC_kTj+P!Wv%F0`S={Ll|h0)G(0qYm!>(d$MG% zpGq<_As%kEL=vZxkg{O*EpTIKA*}vDe}U$JZ)q_OH|TS9q7PqkH$RTlyOO@mYb!N| zm3GREOJ6fQ^1$QS-6#x!(@)~Gr568HNpVieqa8%|Oo7yRYWnVa+r7c4J%3|6qbC3P zZg>4Vpt9_)@}KWUex`%bcGO;J(x~-0)kdw6kF-%M2Woqx_BXPordZkYK}EZ?hiqT6 zxGDC-h^$jAHwoiEH&}z)BKztBAzO8dA-jN&G-PiP)OM!Wb!2t@aFGMu_C)ZmMFPF6 zfv&xt4<=AKATv({XOiFm4QUV1%?4=c$-=SrN(ZQ88$eS7K>nG)hu3FLdb^0ZjWxH{ zK-H|9Z#X^i>&#|0-<7T8OUj&iCNP77{+Yl7q`Fp|ZH4Ey?T#~ST5RW9F<#T6F0U8} zncXph1Ow!^V)tygG*DZ#__+!jw1-_QzAbLmiVv^L(*DcZwqh;?{Z^b6w8F3a=4>Ed zx5`Jl$``rHr?js8^lT+>Xj^$vs`5)nO-=uk_;MY(tAWbG2_GbIMqyVMWu5*zCtFLU1#))_paAP)0Tf^zEr8y4{eP7Q zz3(aup!eN|Bv1O{#QPQnpz|y@fX=i4fKIjmfR3>MfDX3+fJRzinDm>+5=`vJpCr$; z3wp+sPGu1!FpXzAT|Cnx#Q8kaJqiXq(~W#stL}ZzZ`ExU0GVqo05bI!0GZ1y05X?Y zfL7f{AaNdll8n;f02HG%%CE&3r33ijNPBW9C#O)fyYTv8%DdgF-!+*N*LJIG$(h=% zUOh3G9UK1EHgo;INoI9@@T=Cl)paDK=Gbrs(ao_(4N8_dwxgzm&9T1#EXyvwit7(l zRYhw0#xo>9(BFZN$%5wWOEcQ^`(Wia@0}%c{gIAhY~Q9$2Pnau2M*uw*X21w7yC+` z4-W>V)eAd#S2yCkvHvRX!B_27Xq_?+fEm#H$!|Pp*gvMMY1`(<3xkfi@oHN*ZKbIO zvZSq*Dj>8ga$H4TdR<5Fa2ns-9snQVfVbtHULuRzg?k8YTk-0j0Sv!;f4HjcESP2l&} zM`pM-SDs(Bj&(Y~VM z0t!TnZ#mYe`k4k+2ct_4puJ)j)lPWCjFa0kveh(je!#1R+!l`gOGRmUCMOG)0XUAah?CATwa`K#;Iv7*VwY(Msk^Sm#3$SNSv_R)6m$-tXDd^7B4qlSw z7_5-UGEB&jj|yy{-zy7!L+gGgJDT$ff_0(q1J3n9(ML)9su`z!PQ~s z`MEra>&@;;boA>`Q?6N>#Lmx6ln1^Gnh!O=bKCAJ+uRrEi1q|r`{(!X{}bTrL*C`< zuY~3J6jGJml6EvNOJ}P&Td#_^;p9LSF?+u>Rm4mKw^_~0iIlM};}7Fyhx0lC)~43Z z0lIfmFjzfRVcG%ufuNH3PsJ8B_rv(lYwpRgXU<;WmZ53Q{fmLyY;(_{%vLscx%Nbx zn}bwgT65Q)LUaGdA0A7pp}(*;IDY8rCv(Q{kP|*Gd~EobV}DZ?+wh$3%9YLhvW&&j zl=s-UK9;jN9Q(1Q`MoP_3X6*`tIL07NU_unGVhr(oojm_n)g6ePR6sqfwYuk^=H-^PGUXSbOCF3!W0sB~0+cI@=?dqw|&up>h#-5pJ zE|g|G%6nA0syA`9-P4K}{W|tW02)I-LwZDFaWK_51kwga{JGAGfVV$*B5xf@Q>&5LUM3{OB}=;8K1}c&aH} zK~Qv=SQ)SAA3=4m{zdAh6_#Mlqg?Ew${{05l@|$I&Tlz#x5dY%6%N6~Wr&W->Z%Hd zL_g$c?die>^2Evur)qHx;p{CskLPP9X|a)?4Oha0_#Ra`bKwP`h05v)i@eY34bPlk zMQmB+(^hX;rK>j_UBRpK&wr|(fQJsxY#Ofy$Ga?xMG7a&(c&zC$kw;oe(x*1ieGq! z81C{PDXg)`rwec8S1%&cQAKudKJ=>ZzPxPWS2jW1)lYxABpxNd*Q=VpIpOMc7)I_+ zpAzcGZG0EX#UM>cRqI`$p_uj&!U$uz3t=BCs!JR;vrlYqq0T(@Ae-6hb=c>g=R(_g zH7~nR7mR4IzQv`=72DgPH2-ih0d_SN5lsXYK_sPHW(G{eMG!)ugxP>G@@0W_HoM08lc4Q{lTC` zI+hoXXF!Sjr+SayymGY}iw?3-jzx zeq?sVF;?dvMqy(szbfxIsj#Fp_F?$dbz$hk*vhw$j92tzTzlN0_s<(U@B)P3jETPon{CL%=j=J)~$=Jb68Eix*n9HN%J$8+B zyuv69{5&|`(9qDp6kjZK6%-AcirKR(IIeX;5s>x@K2lh%R`Dv4RXVA4SrMD|%HopG z%6{d_j&EJ|)^^L5$Gdb5SI-q0;G#Nf`MT<#X3#P73&JxuXgetNj(n$dmc=S{`2p2g zQWdMz-V3soRV=A7zmIdh+Mye^W*i44`2jbcEt?$AC)39hH$h9*Z%tjMr%TS8mQBo? zXEVAklI)y?Gu4A=+~)Vr?7~)^#5Ifb4sO*++j_OVK|H+5>x|O)A3~to$0x-`zG78{W$dD> zBV0w&)Jg~8)eM2VP|>nTM>?}KKGE+2AIDFQj1TNhiR7RdM>aY>>0t6%Z>kQ8b&PN^ za{`r2Q17!hi#15j1+R7^{ET0A+QDRY4}SYwyI?T;dS=YefbM#=*TS>uYn-(Kh0MX3 z&uZn~hi|8ILwIJ%B!e-kaui$c|p-YQa!4Kucw^H>s#sdM`w{ zQB*DZ%N?59J-2a4PRib>q65=QazV_7cv>MdvAs4G?VVmkO%m))HK}NDdI_&~+W@Eb zThwC@irkds9=M?5wyAf$+D5it?XBajMIsT}T+{Y9N+uV&hr&$Rs|v@9PZ%Aq*nx>- z`>&P+S(Eb|pS6BFD!OzKE0qZ{IW_T04F>o~9vv^=f%Tr;!P6=3|3@1l?n=tI8nER| z$1hu20;WSjjoy|q9c>D31=G={>{c)xt;+sC=wmF?zy5YB7=d&?ps1*56MVpP>HJ1M zN7h?Yje8f`=QsX%&GDP4=h^gnu#et<3+fpg`a+y=EB@*D=_7Zw((T{16s{C5ccTZ#wczne;j ztVoqTGTvhkhjK*e#=ons*8KazB>z4?5JG)X)~h)djA6%acbx13IN2Y4PWGeHSr)5Q z$H}%%^_jHW9Vgp5Rk4X>D@{cOen!AVkwm{lY|?0$2$Ou6NpX@+%UWegr(N1w$3xt@ zuwAATwuk zW?CdnroAKpIST^g_C68C(^m1|)bzsc_nHaNaynOOOy_Rwib9>EKE1aXYy zPU8`NOuV_qWzNbXITkaMMM}IyrzdAoYevy$N;79@Vi}hPv+~Qz&J1bIFDG7v4Tw5r zX^7uN%&S~}SNOlulInZ8e#>T}iCqMzH?ziwj0I8H`cYcre$*uYcbtB?>n_FU1h4iF z*bP1@P3_RtWw8&MN9@RHOziz8l)@aSweVX+8d^RAXkm*=hkn)gQ3vh`G+^*I-hZgC zJpOcn#QHCGb@S}`&={1pxYDpQ#F`t>&WEc<WE4C+A2#>mn6~x}B4%!|qtf~p2*=);D~cZbnzPoh1;bA$qCB>S z)2&EhK~rvF3EzB_7xr%asY7$0_kZNr;kB~LmpQhwlifnp`URwx#g>*eF3)urAQn|W zq2}<|azPI~kDR5`jc&C$+fTwxW#r(ms0(#`bjIQZI<^j6G0?1xcm3PaGT znpV&lHLf`y$EXQCjf_5hIT5D2uPLPFoE3B@v6?8p!d{1}(q9wXgWw5LWdm?3ITR;t z5?i@~HTs&pYS9P+I-xEu05qj~lm zJm27;q5wLGOfu3FioB8uAR#YZ{P$MwN1W5R0{~y+AD+2jim@G^Fhv*Ygo9CUK+!Lq z|I9|6Z&0|O0lBfTo508BN#Sp2_@MP8aHZQ<9m6b}|B6MtTY)VUa4xc9S|X_z5B{Zc zU|Ox;RJ1#ka3hcw-Jo3L))=KliyGKzLGpa8h|_|<=jG%SaaK^Y4ZoZe^k$70>E$y0 za!POq@@)}k1oFXA#0f!fF0d4FDzHsAemN(&L%*C2MDU1L#L2*W{FXD;|+ht^sh zX`sUKQr=k%puNZ`aC}OK_Mll|9DquTBFLe)%3~FUlQY4gV0xad?5h;iDS}$sF&(d< zsr1tX&RK#AWlu6oO|K#ve@V0^4LEz8DWjST0jMIHU+Ti;{5t5YvTA*#`ZM-5n9_&s z_TZZw1qZ-_;)b4jEDew~cx@UwnO!$04NO@_4%9Lb0#;cjtV}>{JFO%GUX682YmgJ# z1)1!sbsQP1bq(~2x=O?}38rQ%yXw9)V04ug{~29%MjDvRt`fwp@2c(@@LF}14{{5- z>J?5#)I}>mqP*iH#+@X)O0+7iw}V;5N~Eikikx5_MFAxro+4?QCO+}E8D$;jK$Tq^ ztOI}~C71xnuK}W=6Ohbq5;9xgO<(^x9bT($@J;?&oF|o(4u!vZ z51u^^dRSyVFQjpP5aF;iwn5shqE|OWKMt95IwDI$8^^>4)*zRRj1SwVsWe9f&2@NM zPup9$pP?%*i$33}c>tA1H*}o-GH2!;#32q5XMii?+$lGRLXRt>n(^hakA>m>MtnK) zT7ZPczyr1J@d?33j_GCuH5K666N47X^c*xKg1u*8T@ z31N&1CCTj_8HpipzF_*quGqbvRq$IOU>VgsZGox`vA5Fxglu!9v4 zr3{eZX8dL*Zri8hR_JikHt&Pj0`wNoQtN#5{weexF|I&wUFkxwhEeD_I?_N)KnPl+ z_b6$tx^9vI_q*-~0e8NBd=TxR7mwuO!8z#ue(4BK6%6N?TbKGBf-=BxtYWhNG`lm0 zg#LS`ErKszo;J1%9fD#sK~NyJ2*Jw@hTnr@fKgV5M4+`WuKEdg4mr+yY>tFXMV;URYGQFf?`OJe3_Y`81J!ao9i4sE=P>h7$sMujl))~#t8Zxw;pv4 z8Sw4ZAZWxYb3I;vS-b1;I#!`EO~yWn(duD1a%34XQ8S6;q49xRh$LnL2RfP|d;&bH zt6MVZhI%s-&u?qn#q)2e@d4vth@c-f2;t`hY+<#At0g+Gw;QUkcjTM1EIm0Sdc2FA zE+u_TIO(iFPBzxCoO7jdVcG2KJld;00j8DN0ay5R8dvD3pRfDS4j_iHtn!CQ{E|>4 zelGXeS4QF|cTD3Tf=pv7myD@=UH8<6l!X>$$spI@>3rn;vQSgn)+0QOX%DT*8oMNG z?3-C*Tf=QoBSLG+{GGK`8JD`G4C@2!cUe>4l-J63Q=8=EuvKc>)(kyw%8dscbW`rt zLC|J(?CZ2{k)f9M1=|rqU*k_O*pmMlW$%k08fwjE`zvE3zTZ`iW6h_#%pKav%$Aat z`6!pUqcXF6hqT!TGji`q?!cVPr|oSD_$*2~`d?mZ=yzzZNJRTw8d6V_U)6}%`!sq> zs;PC=i0i4LWSb($z!}vXn?kFd{F!L=b@@B`@HgLG-=iQ`J65=M*lu7$md0mf>8@ue zriaj}M@7o6buID7H?6Gt4GmLV`IAB)r`MBE)JvsSA|D{F};wz z8o3_-MuU^!Ya0}xN1@KfxSP5YcUO;osRBhbg?3uu5 zZvuyM0=M&VLcSR0R^&(qhE!pKKHut)b_Pm7>aq4a@9KHsdN2NUU<3}a{O#eM$y>!S zNdBz{29LF+np*#3)-Wck&)`^sf5#eD4NWocDD7dIzcxO%0$eigx);CC&Bu?goq6+h z-P)P=c4H4?=6)flAj^5(XOX+Gch+!S~ichN6@^`-M)tGlHW_Atim zX>l5TN7H|0n#ApPOv&%YjLL8L(%&NaNb~bX&OGBTVqq72Ozob&-*@w!kE#6OppOU# z^%w<6tKL09*xBorXhbt`e-y1pwmw4?7|-+?r|4>w!sO=faLo4`pBoMg#$EKwUse8M zd%{bBEx%jk;co!%0K|F#8mHhr30OP!mD+H~>n~NNV&|RQ@BA@vkm5uiJRUX5%<})`_r?Hp!881fRKSTpdWbPXq zxi>=j2c=Jd=rL~QACx`;uiGVkZrE;tCt$U30@+`I2Tb{U@rPx0!` zos^Mh0lPzCOL~btcVxC~D zFtFA79f35c-p>%<-LFw%AB&vKMW4Bi<5lR((zVCpFb55(p-Dq`>Yn?sza!-_6OAFR z6GRx>a^DJIYMrRJ?G?wqhJ1tl6j}OfYPiG zX=ox(vhtU*`q+VFgRrImS<#f>SthHeWRHm4Xo3>SNO-%-&3E9=N(pmCel)ju)(OW` z!nZ_@KD9;+@oKzO;XXr!?RF%*LF7oYmdH_j`u$SEMoJhU5_)Q`XCc`_X{KSI$EW6c zPP35G(3%LO@u|6b4ZvByfjj6<|c`AW8?e5KYdU&+#zug&rmt3GI!9IHMO zo3YC>=p(+~iL#`8^8)cdb*3ON68>2?HfAB}m5YoEjf;#|8Lw_|&o>+A(?-nn+Sjoc z(^UIXe(mAfSI7KdtbM<>$vEccteS65$Okc{UNC%k`8J3Ya`AUxgVn;X@a^USMY}v$uj{(SO;v2@u2lh|=IBl~D{|?ILrq}DpFAgu)3qN{YO@8s1gW)*i z(^1^@^dTzu2b%CNsp(4}2aKYifx}zA{#OTWYYoJ|OxW;$sv-a`#p=yvU;$s}mNR@f9rL>`3?33I{WB(k^==Q=g+YNq;7v_qfNA2V zk(;l>EPYl@W0IF}&^jGpk6~380mQPZa{=Oz7d2RwZhT@PKWEhqok}pqJFl&Q?!2x? zpT-O8A*^6P4^a1VcPQNxdY zkHLs7#@ZvbuSseA$yEFDF%!%P`aje2r7#}*9XveyF+fNRMzJ>|EnZ{s`aAIo{;Xdi zUgJUOU3fjV)Z=c&E75bT0WVuT7q!3a+KzoG5D9FEuKkhkiLUu3tL29r7?{t++bXSv z@pel+hNl{`YIVa8U4#Cx6<;mX?O&Co)AQ?e-Jg4a_Ru4D9gng23=O+ zt@a;doi85Kp4uN+`^t%|Cmdl1FvLSf_kqAu`!$X}#pH%dgGDzE?aLu-58?ZI=$3$Q z(Z}RO?rqPh?P!V5g_T)*h8CCMScQg`2WNo9$i44m)qa#!`(;brOqY@ZXXM_4*t0zG zA8Yo*R=<^6Vix{U#X4$pK-Mw_(XuwL3~h;`5>iqO%pGV+okgzWEnyV=d~B7i$n3DN zy<6`!Ar+2^E(l^R-%*C^o!PaGj!S91MeU1wQ8+BD`U-2STB?B|d*Vxu$vGeScK0;p&51{(80av|d$c^m6&D8}X94|JlzBRlk#g>5%Sa=f>LhYz!^F*sjg4eXpe^n^^j-W5C!CNj_1%Ii!t_8xYm;9;bZ8p9PfwXdq3WB={EBKI1HX{3iZ4K>Uy?8Ae0`398zlT7 zPq^RA74Rkrr%L$aEa88(gt;c+zEHZ~oGIMvBvivs&Jg}Z(*=AxOF(0$fGZaY_}4`O zW?v=X!xEmnTDU)5EZ}6bfR9MnCgH5hh5x=n0s9pRxJ*Jd{2l4OvRH(FxKzL^OQri7 z0YA10X!`~D(l3PnQu-&lNk6|Ee}8POApeJ^n`NvPGcKj z3D&WCU#q3Nu32H!mcrh9c*<@2tI)o3cphkHQ`Pu{3!}B}YY^VZ59SE2oyH9OuJyxz zzjQYl^z6QE7XkmUDOsPaM!U6l!Ve?T=Q+0$V*EGWa-orM|AHq$#OU3DpU!|S=RQ}Wd$NjTPuT1oc%AdSu@MjzF zKRktauhuW>gyWx+{ridj{3kcz=loCEYodW!gCG5GNc>Gsr(1rAe!@@mz5@{9gv4w5A;rW=&U4xPb{YP#y<|>EB)yI zPQ~A(5DI=#J*)3MLBdUscl)aI!+%2J*DKA4ShJEv(68H;3+|WHD(sot1J9!{i<;Ys<;WN_z(Kw?<4Um&1(A^#`QDh zA=+2YRMM#zK0BLR#2l6UQTZeE1LOROkoeSigQYvA&Z&BJ$$vG_TYpBvlW14#cRSus z`_Vt#O}`$Y>P7umbu!w)KJp>@t>di0~<2kFl# z)V{p>moD|Enuj-js^0~E_~TT5JxS6mE)}=x_J-d4QT3b3A0r}e^~0Z_@@MY1XVrg= z_R5TCr$_XUJB>r}o}|(%qF$ur7e%s|o{}n3zb#;i@S-%M# zmy%5V3nKVjL^t8ra^I7w2Eb-N{8vl-G_xV=_pJIy(rFjrA^d9pScLZ|m#_R3srdC# zXT^V@a9?Ws68x_-UWgEbAO2F6KhO`qhJK=%X!oYS0`3Zl53l^%DBZ1jXJ`MY=?MDL zFZA4*PC z>0X>?`&IlW`Ju;~|A*mz*$@BQ(v6RPgsPXXep7wBf@(Qfb+L))-|ENz_a%P4%}xKm zso(Na3BS`1|Hl&l3$3kg^3I0;6xmZ$({eXWS6*00)r$#<(C{evWayS7snVa4q890_+Al?>dZ0(u|AhavAO1NKe;)cr^*S5< zrs7ti+I~kXzVb6);$OUY@vr8OTED7&LiF4G@Gq43>-_o``j#jAnZ{J+>>8A;mdzi! z>33d{PWr#z55HOBSGK*t`HptlX?%n7>gxN2@*@0b66jd2NVfwNOMK)-*Ba?g`IYsn z(yc<3|Ck#Sh~@9^RQj8pZvU?87vC3Te)wFf{UhXObpw4r-sDIB-O_zw_SXpQY~Kom zp6_?>3{=`VfAIZ&4Fa?L=)X_m4_d$8owO_Z-GTB&#jQe>KM(rRzel?B{zLkq&X4~6 zzWH%E6k{^t8v|pC`}}G5b`$-i|BH*yO(p*WzWCTD(tXb4C<^A++3<%Vs=Ohn@~730 z{x2l{p+kpuEB}Z$4`i69Ug+Jexvb|lmK7(KjqGk z{Dpk>G`>nYN4?Z<3}HWr@lTr{{x&cEsOfs*KiLfG<=eh?8V^!{-}vhJ(tW({?ChV7 z{Z#A%5`P5!bGZF;(2xELBz^_>ai!2t=kd2X?oVOV|9W49UwDb}ZTu@y?_hS3#BVef zxcz(Lj~a>adOxas>NURj2TAnnt)>tFnf*_^o&i% ziK>jvW-OnvxpZshYP55;!E?1CbA$TK4c5&Kj+`43HMdW{xnUQ~)m=PSH?SZ=pC2`> z;GB{9{VthvUfk^S$L3vlS>8oSvo4-Gb3n?>fu@|nnKOpuOdpn;J-i@m#Qe*gY95-k{*QSZ>Sk|zaL&!Y&%fpOb2r~V@3#Bq-@bLh9b2!s>)tEx zxqIQgcU`sZ&a3aceenZZ%)j5V+L(&RsF37_ll=$R{XtY)iX7#pQ*WSSIwH|*4^-2&D!VJt$ktr z?{=@R*|TBYo}1S1xoN}RjT`rEtld|8v-6f)oSQbkxcRmhZ{4#0w%cFaa>xGL?`pX7 z?uI+>ZMb`D!#&#?w%*^k?SY2-{?K^;gN?thYy87QjSp^btb3&Kp+_6H*Ec@$_)CxO zc&Yx0#>by*-0|neC;!s;r=5*|{#)bDryBqIbmLQhf9dIG8lQQ#@!4IC&pzMy-1Cjk z?{0iycjNB8jeGVr?%mh8&)MjFvGK+Ijr;dEHZ;=RsLI#-O2^x6t~XEp{L1&I_J4iy zh0j}``smvo?;iW(o1bqz@UL6<{d4^@?_c+)cdmV;Y3T!p7TtLu|K^72zuRkE^<2`m ze>arw9BqDb$QAYd^B=xo=7Z;E-XEE|HFD}*krTH>CT@x})JDdvj~sntA{8!+#&IqA@NzEaoPNy-Y0fOpV*u}F*#u|Gs7;O z6@FpcRy>HzNy8oC% z_d_#v56#j&JWIDdm+nXMbdSu|Jvv+W*c{zs`MP@C1-i%Q>UQ9sr+Z>P-A^viJ$bqA zPnYZde1-1MSL*(Pd!cUUBHdqcU#0uo)pS3#SogG54OcCABT6DXL>3(jh z?zs}(^QF2Ma9^X_y^QWXWx74(y1f;;eYmYUr%mU)R`=qyy8V^9{dQf0gYL#EUE^}y zOSo6)US6p?u!`=3t91vj)4g&%-LJ0Ey>^4{wY9oKxT|%q->7^2ce*!l*XZ6{r+ag~ zt_k-B-9K*9y|t0E79_dl&buy7z9=y|+bo1o!Q__wUfXf2ZyP z+;{0dyqoT$_vnt^tNZ6xxb}DLC*9Y7=J#K8-|Xb~Uv=N& z{+sUGr*z-pewyy%f9Llzy4Gj;y{qr{yCS}SF7o^5qrQLsoF85|_lFny{jmGI6MN1- zvFCyldoMh(H~Qqhi%vTGpL7m5`QpGIUmWz~{=q*s4EeEP=&8nGry56`dTHdTmq-8f z@|d3vT=LU_n4b>D{&X<@^ebaezdG*ptBI#yyX^F96HXsW`uWhLpI@Ky^BYrtek1wk zH;q5PnRcehbfzie%s;ZuyfyvITQklao_XeQ?wPk|x4oU;_D(_DJM-G!UC{R46>aY= zY&&vQ+mXd>?=Nw^U*!70;`(5z>%&slhs#_?%UwsUu76(Z`lsFXQI+eX6|Rq0xjw$G zy?IT0^V;@LZfyUgru|>*+y8Y_`=_<-pWf2`+2;1oZfpPi_V&;3Z2#i!_Al;j|8iUV zm-n}~JkZ|qhxTK2?Z+N!|7v^tSC6)TRp0UTj*hRN?D*!-9pCKi`1Wrd-#*px?cY1T zd$!}d=Q@tR&~bcEN9*2>R%b`+{*Lb(JHCIpZM#ssfj+1Y7 zoIKp|<2xNczT5HRk&aUzbe#IIk&SD6SKV>qo_PN@@Q|X+N#B|EzSJQ99a`4j0`D z7WQ?JRWX2F!jf19D_~2QjorXDvHMs(dxkZ#w^%d#j=5M^Ky<*!fW&~*fV_aK0?Gnb z2W$+uCt!QP-vXQgZv?y-@Oi+G0YRE*&1lV7%@j?hX1->rrczU_snu-LJg#{bTU_4L ze5v_K6QaFPJ4!o2o1&eey;8eOd!6;Gw{yf!_pT2W8Okpb0^lL01G>g6u&z1l0y@3wkJMXVBiDLqQ(|wFI3A z3J8u2zBqV9a6<63;90>7gRco*8N4C*w&33f*9Sin+!*|J@V|mvgFAxzghYm19CAs> zWg*i;N<%h=JQVU`$cG_6hD3&r2~7)K6uKhxp3p}_ouMCuo(zrXGptWapGAGH?{j~j zr~16s=hHrIefou68kQDzWtctemavDz_Jn;9_EVTHd}Me^_!Z%f@J-?OhS!BZ9{z0j zOW}vZKM6k`-X0#VyGS=mcbP6tH%m8Pw^&!9yFquWu3ooacT{&u7uENYzNWrc^yMVyHUi@Z4UlE_Js(<85l zye4vWb+ zM12)?CMxWli_f{_oJr?QKPOSzo8$fL&MDG8&Ch?jbm#c_&zJ7Y{rne8_Yyz_awQMU+zPZd1qc3u&Ev?Y6z$(;Hg}G37MnTWxB!K^wyLy9Ki|AE zj^*X2&0@3YCui0;HDp$)qtd$6QW2-;)lq0ID~e;;v+|K!7Aki>{me-<&15q|GZn9_Aj>ode9NE7^2*Hia&wH{veHp$DYulZ(wA5r zaV))H4!E10md;cX^x1_}SE)JaEVW?HRS}H7+V3b{-US=tDRF)Q&I#$K8 zoHUA3Fk>dmhg2;qH=_t9YsDysepzW*nZBg7d2Gm4iv32Q-?}QMj~R zBkEpckXlt)Vb|NstSib0Z|*phfBqbHc{*g&bUFQ4%ntqK7Bgg&y~yU9%gXF*KNHkg zD@qIPtbw_u&CXt8nPxi#9y(sI-_Dv?o^?f$rP9v+A#$~|m)RV1QK{8j=zxf_LoDBB zDJ(UY(YJ$06{k;wC_n=2dW%=V^%<2G%W5I8W*`j_-RkpIyLM{R33NH$5L#qEC)|2il{l8Z8nR!(x0z{S>lxy zCR@8ct+I;Om~TB$ZClIi`XcL!3c+o6`mV*mqy3~Liguw2jipGxWR*|~oKUH1cnzp@ zsnw0V%@z737F8%p?MPi(;jrp?GhwqVRZtQYU}<&*A{1|x ztcOmTIs;0t6l&e8EmugKe&Wb01RA4)RApsp#WK5K8!yAsO6v;BBFkE4i2(^{=0%le zWN${^h~Xt098bQ(VlI!-mv9NLvJqQjP(~{n6$)5fX)PyJq-tTzS6M3xD=iM-hU&Fe zEJfKICE$$RVXc5>BE9cGrbx@V2@0)fH5EWnC|asdLq+{TcD=V!~#l3Tn=uwqa=1#1oUV!(SkX?tq+zLH_ zRz(UKsPzu?*yI7FAnP$NwqTXbqR%fy^RrgO=;ss1K}dzY7_2F*s;snBaMFqOvV>OX ziCJBxvsNIZt`hs^Lgmk{uve9t9ahv{W%39TH7P z38_2P_TYk~N(7e@{G+-Os6Uy`CK_j_RFE(kn=!TfqdrZlE4604-!M`H9`my*nmo@uSL2&MU?(Z+35K<;D|Xmpyn96jK^Z zE9wHx5S+?lb0O!g1NI#%&8`a$@bpvwl$Xy-O=4~eRTM`e{zM+oui=6TUYKMvYf*~#3~r$HGl1sX8eT2(196qcAP zms(&ZjVAMsqQD96lAVXX&@RI5TtH;K`-&GADLeEz`q3hYu8K)|+2JLzd3=hCz44i3 ze<(UMFtSWlDXNhnYf`mK=9z8QN^~-+yivnYqsle~>sP8TuA9_Q-g>B|Y?!9c|d%gr(?mlQBlmyDd>$E6kPU`q4KeOh_ApEaHPdl||*0cepG1IbZZ<+SDD|S!&VocMt%7`zfZB6f=9DU!V$@90)PA-3VDW5w9 z?v#Xt$dnR?!!{{Co{g~M3(p?L@^bSF@S@KuD9DQ+8#gu#J+$2+!q5yH=p|xvEEP)~ zCGaZ>V+&%1H5`ji4tuG!f?|#+%BP^rbbm~QlX_+!EDSv(?}cL1D+;YesJBV_!jh_r zWtJj}TY>Kcj<*nBfEMIuta6mZqTN=qSk;wfwwG|cr4>~cmd_gi@aXd@(fOi<*%{sn zp~T?Ha%V81A&Qu>u+U<2AfH**3XT_|>@aiVHM@cgL%drn5UQ6%vpE*K#o>14QBPzp zbGv7v`!9{n2Z|~?;|?2?Nm_}u6q&P`*5wetJPXiPfQ@CV&{=nP!7CAg7ezYgGu&Ef#)tMCOA&;)(7{s8MQ~hOh3`u?x55n0paiRdBG0_4oH}$0 zMARadVXee>UXi7O&9op^k)Coil1fA%f9JfQFH&OG%2j&eGf>DKE1NiDyl2H9Fp^mvdBxxp_vdi~2umF}x=7)grQa=!{@8qi*b0{VdB;DuE}~kgBo;;bTnNV8ie(k_ z1ti)7xLjmmv9TlUeZyEW0g@b|n>t#-WJrs>xRlojgp%XMN1qKNOG3p^ zNn^2{*gRS9rf#yHvSnu-pO=QQa#96ksm8mJ#^{$2OVNO*j-Vw>KG)*Gr0%hrNjOl#3ne^9!f+M#_A{hj|7-Q@|Lb}pNXoe)<@{#} zPe}N!gkMVdiG&|Y_>P2cO8AO|4HE8=@L37}D&Z3nJ|f|R68;jux5;>SO1N3VnzuxEf7u+DkDE!H38evDetEtcG1#Vbwd#7#YVf<|1|nTgR@nmoBZq zY{nwCh3#c~*jBa;%i8W|53qgg6?T9fq!=n1J}j~bBS0&>aC6T|m?6cSzb7gy!W0M& zW}``Pw%m%hD=Ux;nJ;2#>U1M0nZ!1*^=u=%i9N*hv3iPGG{pTD$7)#`ANVyFVK~@a zQD`Y+BMb>e7-r^UL3#@f$W6k!Bn~i3QjQ5~@BjnElG-b6n4`joRna1Kc&p61w6tOp zyM^71HGKJ^{1_M38%;B_XVJ?{tQNxf7|jCGh^!p-yRsZrfMGY40ZV~nI#xTC7Ow&U z7~@3o$8{%s7jwR>7fUw%A?QhS;fBE?PKwR7_kv zyJ1Mmu;C-F8hOd+F;`!D-J0ts4V^MASzUj%f)=juRUDWS!8k4WiUCwi;TO@&6OBs7 zVd#t&A#@Ws&sovT1s=y>dH6%~kt9DVe~ftVJ)g_N zpFqhUY~aP!dp;M*ih5C>uIe7Of3JXF@A+JULn?0ws_l!;AL%`xOYleiCH{yrmwM0V zQh7qqTYl(W?caOP=i5MZEa6=X2#%Eh)q9=4Ab7OoCNldAUt^h&_GwQDL;CTz#z-FuV6I5{go6l*WEFkv<dob}BQy?M4fslStY_z23uyuod)Yh@CEt3Y)mlgX(Co^gT=lGprL&*WpZOa z?GD$|4iusViLBTrYNhF7>~N($C$wXMc1sgIv<*noFS#f9%(w2*;&*;T1a@IL^q32_ z10|hcKy#9n)~cl?px?I=P%eSTxWtbADqhD-cyNF|bpxOWk($nP)IxXlF1Y;*@!h1y zsJjM{t4P_Se5vIl{w(F^2DlN}Y5zM`{mT;5eppBhwolp{Bi5k2IyqO=0*1B7P*X0gRyGVJ|X#fmGjKV*a< zu_(@FD`zW~u)OhMm`umUvT>JP7KSwdNh?Pf#;s(POBi;2l-um_0>sf`3F$M!9%pxy zOBX9JFJ)W}6=E?(>2h#{%|af`gbg2)>{z`Jx1_X!6_iw!FPY?^U+$KQi(wO3wh22* zZ8*RHv+UTAj}->cCoDHFeU_dT7&G;3WPXWt#XPKFuusKaP^@^c<1~Rn+K!Dg259vG zxhAn&*=_7Db|;&;N}r3x5s$LeRoM9oavsNVLXVM)RzYCXn$?Eo8`!wcmr1q8MzFY2_v>*VapJ#nSkEqGD!-i7#pXscb&Ev4hduSLUWmA62s=M zl~`y|VJ)dD0wr-+R57~>q+X6C6;RZAGq%_8E$mP-4whbSbF7NN);V?A%!mX!zb2y; z8=-_adWtod7m)Uu(bSHZrbs)s->WaR*-W)fS#K z*o9=TD(}LVIO`ubole#vrQp#ByrHh3r5;S|7p5~Ru;&FI>gB8AIxVq!Ox4vXUG*Qp8iIQRfiLtQHpfe@S)RPFK zM%E&15>g5!d_|gQ)Wub_lU)=|G(AsWGXz;6zFP=L?LfQ4a63t&lz!6M!RUkUQZC6e z-#!e*W28i=yTx%y*#6sDpOC=&X#%-fo)&JY=W@_)M3Hs(@dXFem~vGcOgF;gCH1sD zl@6+s*Du7AwD{ttq}=k1Mag1uY|Bz^BJ$O8IJ*U9#l~D5sDOf5VJO>H=|@-c15XOM zxjI!}$k*}Fwt1Fb!8hx|T7?GUuhb8q16hKTO0YSY6rFyw472m|U%Z&eQSg#beFH7^ zHq?2NO$@QC)I&t1(&N!sXr*r*g{|#;g@uJKg`I|TW6CZ~i=P+2fOjuxCE!1|7$PF2D{$0yyma6M}j~q`^Ba?Bge);4B*l9Y#=Pqipl&D}WbQ%~YI-L%ASH z70du?Bjr}=qRK4Aj(AZYFwFVkG-0Mn^9p`w4Q*ECmOsu;Km$Y7;`?f;#NBmry}7W` z%FhR}Py(2AXpJ!N;==MvN{bzra{1te5@slUIe49aLnU*Yz;R(|j>cE&?m z1rms&vCMHP7jP2bp>|l8WtO45n!G3t3$@M#J4anHN)N6fuhmu@LPQ@->US9u%fl!H zXSjItSiveG5|paI|%NVw{z%!+_5 zO=2rtgTNisIN=LQh_8u`3nL~ssO$7Y|zLmK>XDeA{$Dwd2be_cIpyNf*G9k=3>5R_rp_1`>Ko^#i2{bbdeWjREo0-^>eJK4~M-3 z`T6JJ9&+)Zr$eqPpq}F@FgP$wd`EPj!7?;ubA@%eo_a8J#iP}u{<@(kwQ?0IB+I%A zA~u>9oU7`uoA|TL{CqDMRnT>I-y}Ffs+h2Kp3x+!)gG@}NFQhMA5hL$#;U z=?nTCOVJWqOPZ~Pn?E3U**UdD{xMhMwt?n5PD1PO&jLp)@{@XIYd z6TO7TEjntf&T#l!M(%m+9|BfNI6=bqnuPy165b}EUcytwsXTq`^#Y!_PQd3RTr1&( z8-#!R8UfFj@I#rdR=RT~Y>@D;&i--85AqVD%Xw5_K|2G!==xY5(@BcUEg2I1DZoD6L z{!&@uP~W`g7uEG=>iSM2BK5AHRyig5b!uazr+e2=3w^^`fuFAW_X_y; zuAdeh^4862`|4dktxAsv5}$h4PkZ>GzIn?Jy{r9u@A_$#L!SR%-MfC;!;{|i)5E5| z_pmLQ{>OCh`f04kk^ld*_x~IB{(obSmJn}hA0zDB-v4jx&mVFVk9z;Vac9mDUwZ$) zF?0VpKPsn)PrdUmDmOgPTYf~l6a9Pd{ELT2>iU7+`4)&ffVKZ@Hj%wT}_@ZSVYxKYvsn_0GR^<_yVB@BB;e{L7%zV*JY4{2fb3NT9ih z|5NiXoh7@okFdWx`+NIn;OOh^f%gl!`yl3O#6@v_=@PoQ>sVvSJ7qw+H$D8@vU;q^ zKLzC__C3UR3RB~H<5B%oNMj$29Zc(qW;ISvcvO7dmn$n(;JGKQCp^C!9yP88FGIK^u~V3+_k%v|i_`4f*@=hVdG!=0f#)@+LCv4w z>xa_ZZf`u^asDUXz4M|o?id^3=7A`CjEVRojvR}2hw-TRQR8^y>8b2$Iv%I`?O*2M z*~B@Uy66IrO3VKS^ybe9p5bhFeXIHZTQaXE2IPGlJ7e6Kb~paBhk%oZ$677aHhG#)U@7tosB#jc|u#K z_Ti03yk~VPyPD_!1PlnETm$&`s>DwY;VnG8NmPBj{kp**v3X-wy$JebDFVEZb`k2G zxQlnM#4^;&$McFekHdq8mzRD-Apa$Yn-6L_pTuqlC6p+-#emG*@!c7#86r7?dAQq) zB9X&QLpK=Q$UNab8TmN8Blo`d#DRZ{ZU0uHo~Zb3VO>g;uN-!!xUN8b?AA)hB_E!!P>( zi1W8*C|K4tCnfIAS*X!Pi8wobBKd?P#3#_rJhyLmGzS28tv&r)CF~k1&1o33S&wz(bi}Jg$S9xmKd&g-#EUs7RXj@#(5>8CvPL?X6LBiJL74m@b zSaCuw3+S(%yd48rcOpUkx;Dj$_tSt!0PF8*Q$}MlDtc?1VguX-xE1i={cTD!VAdbn z6axmRRz3)Sz>+_7$m%<{D?nakl08FZJDJ6hefYpFU*1ME?z>*CvrHSAc z#K+-6qwjDjS%6u9ivhO+Rs)9KiTHpk??JwREr3x`p!Z(n4|rs&OUVN)dBmmE0qz3a z1(;Ni_<&oV03GK5?_XSs4KQ>k;sI_1+(qu)E+zC_lmpNJ*wTn_z#|7-%0a-5Z@HA{ zekjlTCHKyj`U1cU+LaW*EWibTTLEo=8!v2Ewh)YNSDFD=UX1vdd>uWoT`2+FIJ#YN0%nbG zS6TrVOlw#4(I_`y3gCj|c4aZ(5x}j0Ek@)EcrdM9VVKwo&1hE)fc1bSfCn?%m0f^I z*~kxYBOtpN=>d}fL#Km2!1`Ih2UwB|d<655KVS=BXn&-e-L7N-Zp}w|0ZR(nmD7Nu zuY~^q@atxz2W$as0bFnk(hYqt2!k;qDKny4qq(XkWJ9p_{Bt6bxaVj@O{D};sS(gg zCZJe{XXWi}iW&J5J`=|WL;_0&A=nfo&}-8J2(=#;#;7=l@YLPWrrZa}j1f`k5z!en z+6@}bridsbWrmCLJBcUy&Nd}Tix*A^(eKW0sds*w;;>Hn8KK*V4^u#I^WAOAbsB*u z(~Isj56NIeYE4LPL{oq^SrgV38-TC~C^i9K6#9Zuk`G{0nqa9uZF3;#OXG}9-4HBL znj-Qve+R;hP87}#FY78FC_l20_17tz#oFxw$j8(vpBdq%ZVE(l zwGez+d|#UamF2#O{|@+w4g6h0Q|xhVW$cRIXu=K>voH5zeL{X(R9?z1OBJ#XI4lcC$&l zS!0aQLsLL%Giri11ZrlIV8O?&dnh`!<3QM4B}jjTq(hVkNm1eHHNhK#sJ?F1Xx?qe?I8#qP!L#zL}sZ{L2fuqIUH(@a#I; zrV#DwMgE82-wJ=u2N^)}^%?xL{@JyB4M%t&Y|Ivflm28gH)v}Dvm;WnHfc1=xQLQ3 z=Ti*gZTYB8c~|nuPku}hwwXRf*cs4`5(2&=Jl6xC9=2$P2OrmW&;;mA(s@Uc8DW6F zn}t?Z6Os|JSaWwbEm(79*Lm^sBcD*%y8EagvVA=+`vc-zAZ+M*gqtZ`UL;oo;Ll(a z-!AFPiipnUA_cif^~iE3i@MmPhsp9FQy zTuGk^U2E1nmy!+Jn(%q|gV0Zz5zQLSY;UC6=!h-}%naw{y^HW!TuLFnF$mvGvMQo8 zZq=gH5DavL!oo;bJHpI}`atcFE>RNyJ_EiIt4sM5@3OpI^{b*&-4L9KZgo45b?)w@ zUQfigQmDQeS4%`&9A-E<)^8y-8T6heC79yVET9;y``p?-AR1-XN zvvyNpPK06lts3oANKL2-DxP17_}zr~HoHr?QOX9x#YRl?H@4MmO z4F8$r2|QUfnzbsuy!;4{qHjkEpSeL(qcuh7OF(31_);|IH@UPzJQf}74A^SNW`%oAtXtIHeM03+V9oA*5Fosh;F5q+C z70)a4FYPe0k*no`*4r zgYaKY5rHRrg9auS`o!ECt@dz`8&Ouc_OujXpv?&99RU>yF12A(y%z!B>Bn8l*OZ5B zUwNW^y`;)v8G<$;o^yvw`Ih<}QNKdZ!yp&Nxu{^0Me$X&6WJ$mPoEE>%y4Z1$n3&0 zT|h;mi|BG8zm&hZlz)+a0NGG@#V|d;3gaaZ`i1y09Ahk@e|IU5p*;~@(06VXFG=Gz zFf@Hrz#Ni1?a{z)2qSzB8nfBwQZAO|blZJU>)z$$9UH_)t35xsOLVAt!q*6VNiRbW zNc!e`*^$2AVVMzI0yXPuLbSs|yF{1~UI2XOp&v_Xaw!9)9HP9W5_tb3KE%LsbUySo zmINYA5!C_ON9fb8bC-cGjbB7(8TF5cUCMlE4+x}$Tz=nmf!3hus)9v7z8mw0Mp(hlmnUSO9KzJ)DHc!Y0@ZWeuAda=25ofXiVYY6jfX zr-97i{ho`;d&Z?qr}{vDqp@SccuC-TFl|V~kdiqTdpr`JgN2QEEO0GzIlq7tpSJ zKOIQ7K-;c7Ci$6h8%iMCml);X6)DC!h>q-F|r-~f!#I-}Z^XQ3xyzro&_ zNmgD#MAKg<&LOi$b2%6cV;@%xMM3<$LG4N)>`f8>s)#KblulTOnpDI_)8H4?*Y${R z7}>5|O+M6L)o2zW%GKeyqCOu$xDDZVQFxB{F4IF;G}lFhCcEZ4g5OkhIx};H{llYI(gX|5#SAr`rvjw5rhfr;@gQt9kL+GN%v@37R zdWLm|ewnmhy2wns$)}!)BgBt|NawtyUAc_%nJw%^X8^1T$q#hNFvSpti}Klo_)RhG z${pl^^33J=WXS?8>9Rm1*NsS*6x*&0lJw2rO!``w4rm@Tgyo=lA9e!_K)2nH9&YMn z&hdWnJPcTc#HyJUACWXu{Y^o9^8Nc_1-PvfN7`0y!n(=Cq@0FlSK#nE|u(SgJzvC zu^dAIezzli()f0zuhbV_dS84FLVrQW3w^=+<2-Fz*Ify>6$vrnbpdbdgm&csc@SN< z5?vXa={qxR6F2-f5aP6&U>bMueBx(Dgc{MPJRT;sdboZo!1!TFQoHh3|9(^u=`nJI z@nF+#reVaiPT&7zLy~-N2fibioB1+M&~Vz4(Wd z0+0e^Lf9t6+lhFSWIa&xLq-_IBlBYUk;&^I`lxj!4FE-}W{fb6Q!BcBQ|h3*$gSx!}7{ ze3O7MZGff=@nzQobrI5!Uf!;p>-nw`c0GzDEC$bH0lu#^A9T|*X`{Lp>a1|h*WJ|* zR3rNg`5#=_u2A;sMRMhWzZ3rNNIim{%592wA}xbHfcKK1b~bXQ9iD@^yu3B-%I(vE z9PKHa%c+k&>M3qc#Li&tri^aHlz*Q+0DN@^+LcRGq5(-xo`(M}_`gcy5XfhGxAwkP zqd`~yhY;ShAVx4V5FdRa@1I=2lkyL#=iv|KjKK;1-HPD}%_*S@#ZU|JD+Y6s)o-;c z39_FN?a)&`p@xJRh)+&@32DCRvMMo15(9kK1E1}1yYd3b74Hm$9?m3IKdDhW2m}iK z`Xu7BciR=3o=`8U-$wX{!hf{t2}u4&;jf23%v|?H?e!%5qv4-HzBx1qfj+59s4$}I zJVeSucsj<7Sqa%+YL`uYxb}VYDsDT5@-ZQP$%pOA4R}{CYWEA_-voa%)zgv)o9R{! z4L#97)HQ0$r}XO(FZy%L#j1$`$^QZPx57Wu&;M!okH(zsm0tc-KZoFNga7qXE?}o% zC>bhE2s3Fj4NOT-W1H7y?eI@`%6|anj_Z!ME9<=SK^80#{?V8t-a-B|BBHK=-f+ks zfaJ3P;q?f=P0ESe&K7jQ`t*>XIof%cpOh4p=K9ZBirXUz}JL1>SKXG4tYm=7a}ZJ1Vo~1G6~IJUK3K)B|7>zBKoFa?%aks zZU^28pZ9mN4@$Ipd{fXU%2K{=slnZ3Pg393EEl^ZI>ZX(ARuo&inDBL;Z$uwT@_LBqi&A{_Jo$eH z|0D3HY}AX|rwjf~@UJD$*)+O$HO7Z)LPTrV%psAc^uzVAzs~VZPySQjZ-774Xs1h& zmm1*jR{g1o(B%&+g}2+kOh!=S{Zkf3C*!qTkiy^SQ;n|ZH_|vHQKu_KlY(Eye(X@J z1h)jH5MZR@=+f&_IHaaVSCb5Szd5q3ilc*;dlu%B%CKkh z7f3i#!toMjNH|ZzVhNW^xIw~uBz#oDXC!=C!gnS7Lc&uL245uemvE$n<0Z_HaGr$4 z5-yi;gM{};_^5=>NcggZ?@IWEgr_77zF6ij;YbO`OPC?yJPC^>TrS}T3Gb2cQ3;=s z@MQ_#mGBD*Pe~ZuU*<32ND0SFm?7aj3E8i_)b^()Q}u=FR@=L9_qzUX^F@1LtWINt zjt@HI7^bQ`#)4V(MTeS`54FZ0+CmC5*wB=m@JYzYa}yLs0umDY#-UFJI<<}&2~VvQ z90*=x(DiE?_f*1wHCzR2bL=7@FmYgrHe_HTT!8=vIPn^6Y8p_~nq1U0z{I0LyK4;1 z@dhS|07-P|`f7O(<4hKAarRn@4X)s7jjoPqM?0D5VuDXMPYg*Ir+q5P#p4DUS{G|| z24@NPbN9_+d{F+e+rB_wum2@iH^Ck(JB?$a7lcnb(t64?Cac-GG# z!%rS&A+3Y835o3@z7mpHt&K=(k_U|te(mAGTDuxf?uO))VFnRj%WQ$1Y!qxjATJlV zjL*l0@czzlr^u7&ZcV0}Ulbl$9l50@67v+eg4?e(+^CHJCyAN(WH}u<(D3C1`+!g5 zLs)x%?#F^1O#?F%3`&AQE0FFpB&D4goR*NN2*OYPBT+k+X>BT@YYhX_5ZN8BjAPo? zaIGOqGD=B^;%;8?AcE2xrg;jA%(N$xwF!nyo?qZV9bK@LS#VQ;&dGGnsJ?4CZ6TQr zi8k$S_LOs{?P*DEh=FP8juOUIsMaue>UEPp9am$};!i{h33**>Z`d@h;dN(1lk_@i zJaBE3&Y*q$AOC<6MprNu#Ga^(m8L<+N#kLP(ts!*3oRC`j7`*@h%a*^$qSdXhwvsUN?UUy_ow#KlxcA34s*r?h3HxjT-KmF!AneG4I{KUZ}GYcYGO6F zB{U3>F%fpauus>-O|-zNAzBbbsgTI|+PH?3+8o0TL>mxJY|z>1OO6Ew4q$ynbqB)6 zN+d!DQJk@FL<~MOR>a}u%AAVmMD+dFPDn@?mnJBHz#kafpiAIpCs7Ai&S8~S3d=ch zfJBeNKBllpgA@3fVeJ8`0ix|d)Re#zLilvLWSwpR)gA(DM-7NCxBvt2km2yr{an2e z6`2X+66_OR=e2{lhS$ff*<|PJCf6au0Y_Sh4r$?P&5enP`JT7Iz$BectJ5U`fo5Dn zLO(2h(CG|19kGnC4y>H;7688jWxc`?8o~y%wM+?6LX^SETBZNKfc{w6pMn^tTa&+w zF}xOTNNq@&tA6oxm!><|)ZZ z+NK00N!#42XsHlTfw%mm>-XT~3CuZ6QEt(akGR5`)>dm{`Z9!^P^KtvYS~d{OLA)3 zLx7UGw5^I$Np>j>^rKZGx#kU1KoFGFlvZcMq$%NVTv~ktYXVM%$nZqxX+%Q&GeeP2 zA|0!hWOYB0Ot%>QhyN^G0PIE}mlsN~9f>wqsU0VF$&7dNeEeoY^ zDUmMF#>*&+BzV88IbQiRei!$n%oU9A|D=94DIY6qPb*Z&lmPTG2ScJ7*x0@d${E5! z%1ZqA#mLCkR_6DEkd&Zm<(5HBaUiJ~tArxiF73{LDVn^1P$fh=NNd*~*E-cdg)bxe zEWWuvl%S&B+xlX_pAwzp!wpA23xSfB-#_)5x*e>3f8-^K_SNKSSEQbcmySVQI74=P zHCTa^(6tut@F9QnhACQN`^hJEU=9)&e(??;_~Yu+p?s=D?wA&KI<9$NwX&l_0gVv& zKCC*h39rx;R+jR`U-ICi#{$AW&B?aKh0f2a_iIBU2bC$Klw|aHh;K5nbB!AVhYVSl zr60EcP^dxZx;|jkK(>-S9nu=_Y-4*hCqvq)Q&B&uQW$u95vym_M2*KEvcp=5Liu5> z#wUM9kBb-HjfeYF0@)EFK585*Ghfp(Mad08kIoeY$KzBYNm7BueF*oqa{jRkZH9=GCC5tlF@RefNDjj zYd{m`?H0&gk?N1Y#Ibo^d0WE|(EvX5X^wAIKHc@r{Xg$Jy>Hv`T`{tvJQ_yP-gHxg zLHFrL0b0ikx&}i`Y~LWsZNln`gc@r)kO-}vGZ=2Tm^N~vlciBfDC{N!{-Gjo>%z5* z4Rgng82_>hmXwIu`WjoC(r=T*()3zXd`^NIvo#V}oQ$fP=Vw^s2}9TNaE!! z*rlW?gHz6jSJ-F4TW${s9&XsuKcnKF=WhQjSQot|B_nuCe~||DqS^n%j%oU4{Al*0 ziUqb%jne>~gig65ylE}l9)LXR@Km!Khexev`r?%H)0b?S+4TLefOexX1R+5PhekWC zLG+GrBt+M~7JCGEK8ft@fTrM-wa_#tL$DWSEo%ZsP}mW^F@8>KUO?E}e_7l9E7I^_ zl{+acDz^H|@V%$cXgb2H<5?c3`m_dG;xF-gn?Ka73}n0`B)-Y=e{%d^@yCUV33HBR zhJchr+Hw*G){(x7?@-!!hk{pR5HfX&vq3xM`X)3dXm03ue_7~t`?ifE7(;ua;wUs*wL9SprhOL{Fd^p%?yFbKnxyP?1~^-+TDP z&KB}=W%8om#Gev}!!{{C-ez4+4}(IL zZ^J@y{zIs8HNs2qMB_auFwjl+Gx$_JjORN%KjXO_&p*${SBnGBKBl-PFy+tidk@bU zJf85K3j z?}NA*c-G-Lj7Pn8<7ES$QamWnjZDF3jl2ARMfz{fL;5ZKkk74%^93HdzEqSS{=d?$ z1xk*pOy5a3vht7#4-*ivT?7Nj&?H7h7p-LSAQ+Na5*Cc^si~>1o~fj}tLW;UOb5h{ z20;NCT~@`FrB_%tD!8*OyG9Ucj~)fi;*PrVID(G4tP08*U1iZDhyDJ?omACy?^%y^ zPIpy(_rL$W_rL$+-s-xyA4L7{!}Wm|U;OaiKBMQ~wj*KIz# z;fL1P^nczW;r+Nk}?_86S%p|jf*tYz@rR$6;~Q&D6EC}ZUj^KF5?Di z5!|I`hJp#VT=%MhJ5fSjduN9HMpREwpqzI3NCZ!>8u}m2BmVnxis@0$- zkLJ-Wf80Somry9d#8QqWj-KUolAIR4b79AviWGVZW%HlB#K9eY+)<#wcZa_64_21*!nAM#&JPSwfXJ)B8~>+q7vri zZ`*%)F28;MB-Z@)eHF@2BC+M${8s=YndlQOW8c5|>B|A)uyk^_c>FtwgmiwR?`PN- zVn(f^CV(@!(z5yN3>&&m!00B3-_HUueZQCEv>|p`LB|7QR9A zFUVitH*z%p#DkVn&V}r)`D@%$`8NN7kF95l10R!;Xz!@>k-IgwAu*kQc!nm=D&{=SR+ zq{|IMle=&#K z{BO$PDo)NrNz3rDWv59W)ABJM${aSo1?fH~B2K#CDXISjuN6xAZR=8etlX?$p&w6r zl|Oxyc)X{NmHhTQU%thAotIK8mpF@(mZHWsPNoy-@xQagNke?S6du~fwR9rA6Jq04 z7JtdYdx%;5aAV_37XK4t<3<*Lsj=}OiyvXEpU>h)F8J>(4$p7>aw=gde!8{(HU&cp zFI#x;GK(K$9QBV`e9&0Gm&KPE>(8?IvBvtTEPkA^{wIqcZ>(R*;wKpEFS7W{jr9Xr ze7UjqoyDPz)^1Y?OYtjWN9{2MLq7RYnb_cA=9e^<&m5%hy>KkugBBibuFt(6cWNK{ zA>adMvE2TQ@x^kxknzQGBO9c0XL99MnI6BIYJ07nU8(qt;?{mYsC)`1JGeS@^sE0z zK|=MP`I7iIo8vadmzmC&)?0|r|HSy>`rikf>Oc4JaE890oH2jyDgVd&;Qy)oM}{0+ z8N+*-;rttXsNC*34z7&(1b-uTk&6L7T67rUy~uF29QXi!p&$K~)>ED2s~KNm9M!j- z7FVk|j1Mj7Wv{w?!IiK0+{*>$y-$F*fzz++bE*&G<*{#u;@uqnF~w&Uw{iPZj2~lWS4h9B7|f@E z_o}DJVTI}bM~UlcV&)p&Pcy7W6?Zq~LQFG@psV5r4hi&iNnDDXf{cojjD?M)c_^sm8IeY;9*-Ji_ zf9z-ZAKr)lWqokl-j4FI@>~vj(zou_!v8RBKtb`*D+RxR0y>VBefXbC^w^j!?}s-r zzQWk|&4mlr-~cyEjy1RE{6^3RpJG0Xa zxlQrz_e)IQeu__q*1+e6Dx7c+)2}cGzAf~YKfM8VEc9*m*ACP19!|LWcje!CQs@uk zRE!gq-h5~sBg+;4vEuV5t!0Gw2*TC#%4bIFY55E+?Oo3k`rv0WezX}pU-)m-a@PPS zxjA187_oAAQy)HC`rxkepI_rJAKo(&SGyFSQ9qC7@Ua&-l{=#Cf|>AfwbGA#U+T$g z$dPiR;-k5E_fh5pfAU?CGnAW;Pcgk*r@#M2>E|95dPfuQQ~t$&lydC=-~q+kMZtNm zALMyL@!7it=e-Vq|AhIUXy#Q9ZGZj3;yHbILHQJq5I(%e7Wf>AjI7Ul+qlD_3U?B4 z(l>LC(AzzURx177IsWG;{roMWZ}Y;F+V6 zpZ=-P->QiX#pA0TMtILQT)kWInI8)M-{78(58_gE4m$vDPWw+MgU^9E&{4xH^Y zXLrRue75z$J>}oge&oG;!M~z-`~xYM_rL(Yw-29dl)iX@(DR;Ip#Q5r^#9NY|Dy64 zQF|E&4?4cuhyGi@S$~$_$aJIU@yR^GIO3-IXB#(vq`32)5)<0-Y@a-y`C_v!<|AmeFDxqfvY{4IU(9m;=ZlkmS>SxzWE{Vu_Ov_ujv zSA68NQh#1^jHD|SpZ%54^WG7_->-Q5J;8Zz7T_ONynB`4yhj!An;FMN?zltg+c!zM zyv7?e2m8=}3pn-H=t#D|9#_2mzBZT8;cvvXK743iungm|?jzEVHvT@ZdF=wResHDG|MP&P z-mG}{)yiKp-42}OQ&2s({_t~s_}{Jc&W+>D!N#?Nigz0m8T?-6gXceIN_}{*Oi({LeG2QAnhr}l_+)k9dN3D`vtL6TYq{DneaH*@3h*3`q#Nmawwo!fJU_1ZXs6A1hrf;aH1pA$)ajl+ zIQ@^vvL(lvZf>6bB-0;l3hHM*puB#exKnW$8PIn9PapoYw2AfP^U|)Tl+Ou@&pavk zM-(q8-aSL)&wKtL?RCH@?#${u&dPta(hur<v<}0mh<1Wg@H0UyAS=^KKKsCk2b~qQh(kX6CD3iaijW)X*D0a6(9VG&_Ad66mZg? zqCUU1`tx3;FANF2?cZspN8HTm3H^T#>4W*8=;!JIDd0B6XSNHUXSCcq6ff=)ocCNs z+7~UKM+LXz%&!BddOoIlZsq?F(<{@|iT=lj>QmJD^=3``4e&wyu95#8WB^sCesOZ+ ztD_X3dqbN!SpR<5I1t|93Js zWA3rIwu}F>18HAXK82h74($Tlo~eDsr>(zgO}0aT4jQz1**S26enGqe^2QvV87obBUJE z_mtk*?=XHpe`BvArJv2U_gST%)A1Fi=Y0HD>2J@C$Ce(`TOXDKCwb1~=wH=`eu#0* zcdl}{ye(3!IS)Abx4GZnsEC~23Y_@2bM@cId@`hb^A4pqIr?#?hd;T-VY)Y{UBrF( z?C*nrybpe-@^^+sAMQ{Ex=-=K8>QT*2e^3i0C2XWoZM!Wep>wo@4bdBk1KsU*YEWI zYh$(Eq;?UQqj8sTEqMc;|R2_s5FwP<(Dq@NJ5ZDn6+8$a^Xxtpc3t>BMcObhID$ zD1Gq~hjISTAzbZO`k7q)rTyIjR&nx}lTOCIEKay}o|7+LFPd=>l z(~nELc&}g3Kh}r-Da(JK@PA~0i!smkp@$H9jt340PV#Bz#yQ6T=YH8M{MQJ3bE4w& z?-hKbmV2u5nNxkU&ri-)`dRgRCo7*}#`Pw3x=iWYIxgZpl94{a{NcBAvXf?Mt@&$6+fW-J2|=Cp?D#O)BhCq?04ng z)pB`HO_cFH<Su_s|y&{!cwPqDSh#0Vi&vz zG14oFkLvH6c0Sdz^w$YJ?|l#YtAW$FtCM>!eLd5s3e?M6nI3kb@z;)rZ|_6@uZ$mU z=2wgU@E)w-buZ(K-|za0(iiTMdeZOEbbJ#y^~+$ce;;Fdp~-yH%kx9Np%cA3k4xXH zRNV1uRCAMtS8o`<-bfnFav4dkJG^7t#qO5P+jqDw?$&4SE*wrJl_Gb%5{-Ekm*28? zz2=m`8}xA{XauF9HE&v7G?d_mr75~wW#mQuQnOlZ*>W~)UC+gAym;+J8(e!w#n|gZ zrSL2LT#6UgQPuIf7f*zKg3D6f+f&B^sUg1-)qSZv6-oXlrvgZfjTit{HK{dRvhP!%D!$L8)G107!EietH z0>9Y^+(}w+A&p*byf}74A4@8BZr{9fgW0)pE%l|Tmevr{F!6DcWoNkXy_#E%CIkGR zQ3DIl5+i?$ixhX$mTl|SZgID5+_-(i4tK}ebz3%&DwLAQo$zXECfBRiy_Spm zWdTttcl|rIuDxjUup#lOqQ%g*#Bftw-}5H|k!KW78h@f1l^kc&md)#i-Bm-YhSr#5 zA}lxDbFBoDa2#Dy3C2C23iZZNk&wWi@<&o!@mfLM#B~U_oMRo<{3ywRSo_g*{iul* zAgE9^fF3lm*~*QeQprL|sp5`74^U6nt%PH~>nBZ@7pXvF8g4bLMRijODkOqxY*Z3S z;9*st8%)J@gZ@i`EZ4B%yVYdez*u5g;3AEzHY<&gr0B*`(lBGquu^gpkGip34+5|X zI#;!G|T`SPvR5FRZCXP|gxD-Ku%1IFH&Qeh?_+FflA|{c4-g$14K*LiV{6?!rezTsSM}ny^*SXEm zg+}_j$D%2h9E$PBSPXCj5GG{8EvkCE19x{&uLTvTn7b#e2WC8Ic%>55tQ=*l6<0m< zI4eUbtU|ZqmSrZUplT47to^w@)?d}&E=Y1YRYQFyr!vw8=aRu9teRhqvn5yILLxtl zm7_SQWg*r{w;3ANRjiL9+h#3hBX-FLWplu*PG%8t94?&lLU&{NR}{0RYzi7XLVtI{ zz2_#AWh$&$gD7)7NNRNn*1P(Q}lLYHA9gtKf(F=H=GP76Lgr(v$^PkAmnc#%e|+qude+q({taYsbo!-#I+kG@K& z3VgUv7^z^4N=m)q8w1a1_oB%nXx3v=6Oux?>P@8-lsuj)8XF%8WSAB2;!W#RCL8Nf zmDG|&pv>7SrNOYtzX(e~bWv0aY}r^V3_FGk7=t%~8c(RBcgq#5(IZ2R!zt*pa-)C( z5ABUZ3*fy_O;iR!iw!vKxRY=%bY=54__I=2bKyJGp-3ErJ-8EaLGZunT$Os$mK1yA z3zdwUaG_WzNItB$B}w-%L00=n?0Y5xY61CI^h2XwS)}IB5E2A}*r8yA_)#lK<9EWM zTeLz^b(xhP5diT35};l~GhyH3a&48&dN=WzCa*5*0~!vo!Ympgz&yyuxM7vVARWX? zyP0$}nrs=Ey5wp$CRCId6SPo|65NA!7nma=pwYd89CNLkD*B;8qW}z1{4gZ_A^zk| z;O@B+G-$vF8LHG^lBv+r73_&e6+|lHg8By~ggo|=?8sbia@=qPnKE8ge6>H})one= zvm_>{*P(Bu`e>ZC0NsLxpww%PDCh4ege`UyIwrN_!-bH`#?8&4exv5p;5!y83pqhG zN6w<-tGy9Si@w|zRmS%)vV%@RabOGx0Skc@S~CtSss5EuqNUQS?#D#=4u zaHSDmjxE|YQO{yz?$Seuox2wedZ-_=87k2@**rWs?^?hS4(4m^ft&~{5jQ-g#v~z@ z@tzhdq-4k77akE|S6n#Ngtd_D*;Nu$5!MR@szn$Lpm#9v$kqv+#x9FvqU&NouMV|j z80PIl&}WN)qKaX=ldDY)F(!bcW0%Vj1boQQ7rF?ZO*#qI52n>om}ixdwaUMif8 z;0CFIZlIVVVT?wgbxcsR91*H$rvPy~7(QElk~}=7C;uk{pOkvSSGnrz%e|s24>#cR zYce&L0-&VOIy;=9Yt|lXo*415zu>@ghylBKO!;g~M1|o$DIzv=9-g9j18q#oQN0Qh z>LQu3%EJ{rYq8x$ePPOet&wBFW`UXMLMO_^5%xJLZJ_W-Vc)OUL`EFpi7gy+R<`M( z9q9tei~1H|8#KZ7Y2HPGki^a>)hxL5}KLxmC M>*nEY>o=JH1zU*+`~Uy| literal 0 HcmV?d00001 From 0a283cee5d112b6f5976f44f3dd52537c8e2d15f Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sun, 29 Aug 2010 12:42:00 +0200 Subject: [PATCH 114/237] removed executable --- powder | Bin 335738 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 powder diff --git a/powder b/powder deleted file mode 100755 index 1dbdac4cef7ff407f16f91e11953c4890263d951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335738 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 M>*nEY>o=JH1zU*+`~Uy| From 1af2d330de825a585c2c5ad8b6f840c639237034 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 29 Aug 2010 13:10:58 +0100 Subject: [PATCH 115/237] Moves and fixes --- Makefile | 2 +- defines.h | 20 ++ graphics.c | 63 +++- graphics.h | 6 + http.c | 2 +- interface.c | 791 ++++++++++++++++++++++++++++++++++++++++++ interface.h | 28 ++ main.c | 978 +--------------------------------------------------- misc.c | 114 ++++++ misc.h | 10 + version.h | 4 +- 11 files changed, 1038 insertions(+), 980 deletions(-) diff --git a/Makefile b/Makefile index c02fb2eb5..1e1860a63 100755 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SOURCES := powder.c http.c md5.c update.c +SOURCES := *.c HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L diff --git a/defines.h b/defines.h index bbce8b243..7a14da2a9 100644 --- a/defines.h +++ b/defines.h @@ -7,10 +7,20 @@ #define PATH_SEP "/" #endif +#define SAVE_VERSION 41 +#define MINOR_VERSION 3 +#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. + #define SERVER "powdertoy.co.uk" #undef PLOSS +#define THUMB_CACHE_SIZE 256 + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + #define MENUSIZE 40 #define BARSIZE 14 #define XRES 612 @@ -18,6 +28,7 @@ #define NPART XRES*YRES #define MAXSIGNS 16 +#define TAG_MAX 256 #define ZSIZE_D 16 #define ZFACTOR_D 8 @@ -81,4 +92,13 @@ extern int stamp_count; extern int itc; extern char itc_msg[64]; +extern int do_open; +extern int sys_pause; +extern int legacy_enable; //Used to disable new features such as heat, will be set by commandline or save. +extern int death, framerender; + +extern unsigned char last_major, last_minor, update_flag; + +extern char http_proxy_string[256]; + #endif \ No newline at end of file diff --git a/graphics.c b/graphics.c index 8f5c6aeb6..c058d439d 100644 --- a/graphics.c +++ b/graphics.c @@ -1893,4 +1893,65 @@ pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) free(tmp); return res; } - \ No newline at end of file + +void draw_image(pixel *vid, pixel *img, int x, int y, int w, int h, int a) +{ + int i, j, r, g, b; + for(j=0; j0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; j #endif -#include "version.h" +#include "defines.h" #include "http.h" #include "md5.h" diff --git a/interface.c b/interface.c index d5d87e548..9a3fe4c45 100644 --- a/interface.c +++ b/interface.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include "http.h" #include "md5.h" @@ -32,8 +33,30 @@ char svf_tags[256] = ""; void *svf_last = NULL; int svf_lsize; +char *search_ids[GRID_X*GRID_Y]; +int search_votes[GRID_X*GRID_Y]; +int search_publish[GRID_X*GRID_Y]; +int search_scoredown[GRID_X*GRID_Y]; +int search_scoreup[GRID_X*GRID_Y]; +char *search_names[GRID_X*GRID_Y]; +char *search_owners[GRID_X*GRID_Y]; +void *search_thumbs[GRID_X*GRID_Y]; +int search_thsizes[GRID_X*GRID_Y]; + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +char *tag_names[TAG_MAX]; +int tag_votes[TAG_MAX]; + int Z_keysym = 'z'; +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; + void menu_count(void) { int i=0; @@ -1636,4 +1659,772 @@ void set_cmode(int cm) strcpy(itc_msg, "Pressure Display"); else strcpy(itc_msg, "Velocity Display"); +} + +char *download_ui(pixel *vid_buf, char *uri, int *len) +{ + int dstate = 0; + void *http = http_async_req_start(NULL, uri, NULL, 0, 0); + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2; + int done, total, i, ret, zlen, ulen; + char str[16], *tmp, *res; + + while(!http_async_req_status(http)) + { + sdl_poll(); + + http_async_get_length(http, &total, &done); + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, "Please wait", 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, "Downloading update...", 255, 255, 255, 255); + + if(total) + { + i = (236*done)/total; + fillrect(vid_buf, x0+1, y0+45, i+1, 14, 255, 216, 32, 255); + i = (100*done)/total; + sprintf(str, "%d%%", i); + if(i<50) + drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 192, 192, 192, 255); + else + drawtext(vid_buf, x0+120-textwidth(str)/2, y0+48, str, 0, 0, 0, 255); + } + else + drawtext(vid_buf, x0+120-textwidth("Waiting...")/2, y0+48, "Waiting...", 255, 216, 32, 255); + + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + } + + tmp = http_async_req_stop(http, &ret, &zlen); + if(ret!=200) + { + error_ui(vid_buf, ret, http_ret_text(ret)); + if(tmp) + free(tmp); + return NULL; + } + if(!tmp) + { + error_ui(vid_buf, 0, "Server did not return data"); + return NULL; + } + + if(zlen<16) + { + printf("ZLen is not 16!\n"); + goto corrupt; + } + if(tmp[0]!=0x42 || tmp[1]!=0x75 || tmp[2]!=0x54 || tmp[3]!=0x54) + { + printf("Tmperr %d, %d, %d, %d\n", tmp[0], tmp[1], tmp[2], tmp[3]); + goto corrupt; + } + + ulen = (unsigned char)tmp[4]; + ulen |= ((unsigned char)tmp[5])<<8; + ulen |= ((unsigned char)tmp[6])<<16; + ulen |= ((unsigned char)tmp[7])<<24; + + res = (char *)malloc(ulen); + if(!res) + { + printf("No res!\n"); + goto corrupt; + } + dstate = BZ2_bzBuffToBuffDecompress((char *)res, (unsigned *)&ulen, (char *)(tmp+8), zlen-8, 0, 0); + if(dstate) + { + printf("Decompression failure: %d!\n", dstate); + free(res); + goto corrupt; + } + + free(tmp); + if(len) + *len = ulen; + return res; + +corrupt: + error_ui(vid_buf, 0, "Downloaded update is corrupted"); + free(tmp); + return NULL; +} + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + int thumb_drawn[GRID_X*GRID_Y]; + pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + + do_open = 0; + + while(!sdl_poll()) + { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) + { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) + { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) + { + if(search_page) + { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) + { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) + { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) + for(gi=0; giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) + { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) + { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } + else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]&&thumb_drawn[pos]==0) + { + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); + thumb_drawn[pos] = 1; + } + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) + { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) + { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) + { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]) + { + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) + { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0) + { + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv) + { + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8) + { + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } + else + { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) + { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) + { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) + { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) + { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) + { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) + { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) + { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) + { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) + { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1) + { + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) + { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) + { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) + { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) + { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) + { + if(data) + { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } + else + svf_tags[0] = 0; + } + else + { + svf_tags[0] = 0; + } + + if(svf_login) + { + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200) + { + if(data) + { + if(!strcmp(data, "Up")) + { + svf_myvote = 1; + } + else if(!strcmp(data, "Down")) + { + svf_myvote = -1; + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + else + { + svf_myvote = 0; + } + } + } + else + { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } + else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + { + search = 1; + } + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) + { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) + { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } + else + search = 0; + + if(search && lasttime>=TIMEOUT) + { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) + { + if(search_page) + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } + else + { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } + else + { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) + { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login) + { + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) + { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + { + page_count = search_results(results, last_own||svf_admin||svf_mod); + memset(thumb_drawn, 0, sizeof(thumb_drawn)); + memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); + } + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) + { + http_async_req_close(http); + http = NULL; + } + + for(i=0; i +#include "graphics.h" struct menu_section { @@ -98,8 +100,30 @@ extern char svf_tags[256]; extern void *svf_last; extern int svf_lsize; +extern char *search_ids[GRID_X*GRID_Y]; +extern int search_votes[GRID_X*GRID_Y]; +extern int search_publish[GRID_X*GRID_Y]; +extern int search_scoredown[GRID_X*GRID_Y]; +extern int search_scoreup[GRID_X*GRID_Y]; +extern char *search_names[GRID_X*GRID_Y]; +extern char *search_owners[GRID_X*GRID_Y]; +extern void *search_thumbs[GRID_X*GRID_Y]; +extern int search_thsizes[GRID_X*GRID_Y]; + +extern int search_own; +extern int search_date; +extern int search_page; +extern char search_expr[256]; + +extern char *tag_names[TAG_MAX]; +extern int tag_votes[TAG_MAX]; + extern int Z_keysym; +extern int zoom_en; +extern int zoom_x, zoom_y; +extern int zoom_wx, zoom_wy; + void menu_count(void); void get_sign_pos(int i, int *x0, int *y0, int *w, int *h); @@ -139,4 +163,8 @@ void menu_ui_v3(pixel *vid_buf, int i, int *sl, int *sr, int b, int bq, int mx, int sdl_poll(void); void set_cmode(int cm); + +char *download_ui(pixel *vid_buf, char *uri, int *len); + +int search_ui(pixel *vid_buf); #endif \ No newline at end of file diff --git a/main.c b/main.c index e30a97260..1d818a84f 100644 --- a/main.c +++ b/main.c @@ -145,7 +145,6 @@ int mousex, mousey = 0; //They contain mouse position * SDL OUTPUT * ***********************************************************/ -#include "icon.h" void sdl_seticon(void) { #ifdef WIN32 @@ -1335,8 +1334,6 @@ void strcaturl(char *dst, char *src) *d = 0; } -#define THUMB_CACHE_SIZE 256 - char *thumb_cache_id[THUMB_CACHE_SIZE]; void *thumb_cache_data[THUMB_CACHE_SIZE]; int thumb_cache_size[THUMB_CACHE_SIZE]; @@ -1402,20 +1399,6 @@ int thumb_cache_find(char *id, void **thumb, int *size) return 1; } -char *search_ids[GRID_X*GRID_Y]; -int search_votes[GRID_X*GRID_Y]; -int search_publish[GRID_X*GRID_Y]; -int search_scoredown[GRID_X*GRID_Y]; -int search_scoreup[GRID_X*GRID_Y]; -char *search_names[GRID_X*GRID_Y]; -char *search_owners[GRID_X*GRID_Y]; -void *search_thumbs[GRID_X*GRID_Y]; -int search_thsizes[GRID_X*GRID_Y]; - -#define TAG_MAX 256 -char *tag_names[TAG_MAX]; -int tag_votes[TAG_MAX]; - int search_results(char *str, int votes) { int i,j; @@ -1616,705 +1599,6 @@ int search_results(char *str, int votes) return i; } -#define IMGCONNS 3 -#define TIMEOUT 100 -#define HTTP_TIMEOUT 10 - -int search_own = 0; -int search_date = 0; -int search_page = 0; -char search_expr[256] = ""; - -int search_ui(pixel *vid_buf) -{ - int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; - int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; - int thumb_drawn[GRID_X*GRID_Y]; - pixel *v_buf = (pixel *)malloc(((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - float ry; - time_t http_last_use=HTTP_TIMEOUT; - ui_edit ed; - - - void *http = NULL; - int active = 0; - char *last = NULL; - int search = 0; - int lasttime = TIMEOUT; - char *uri; - int status; - char *results; - char *tmp, ts[64]; - - void *img_http[IMGCONNS]; - char *img_id[IMGCONNS]; - void *thumb, *data; - int thlen, dlen; - - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - - memset(img_http, 0, sizeof(img_http)); - memset(img_id, 0, sizeof(img_id)); - - memset(search_ids, 0, sizeof(search_ids)); - memset(search_names, 0, sizeof(search_names)); - memset(search_scoreup, 0, sizeof(search_scoreup)); - memset(search_scoredown, 0, sizeof(search_scoredown)); - memset(search_publish, 0, sizeof(search_publish)); - memset(search_owners, 0, sizeof(search_owners)); - memset(search_thumbs, 0, sizeof(search_thumbs)); - memset(search_thsizes, 0, sizeof(search_thsizes)); - - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - - do_open = 0; - - while(!sdl_poll()) - { - b = SDL_GetMouseState(&mx, &my); - if(!b) - break; - } - - ed.x = 65; - ed.y = 13; - ed.w = XRES-200; - ed.nx = 1; - ed.def = "[search terms]"; - ed.focus = 1; - ed.hide = 0; - ed.cursor = strlen(search_expr); - strcpy(ed.str, search_expr); - - sdl_wheel = 0; - - while(!sdl_poll()) - { - uih = 0; - bq = b; - mxq = mx; - myq = my; - b = SDL_GetMouseState(&mx, &my); - mx /= sdl_scale; - my /= sdl_scale; - - if(mx!=mxq || my!=myq || sdl_wheel || b) - mmt = 0; - else if(mmt 9) - { - drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); - drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); - } - - ui_edit_draw(vid_buf, &ed); - - if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) - { - if(search_page) - { - search_page --; - lasttime = TIMEOUT; - } - sdl_wheel = 0; - uih = 1; - } - if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) - { - lasttime = TIMEOUT; - search_page ++; - page_count = exp_res; - } - sdl_wheel = 0; - uih = 1; - } - - tp = -1; - if(is_p1) - { - drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); - for(gj=0; gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14); gj++) - for(gi=0; giTAG_MAX || !tag_names[pos]) - break; - if(tag_votes[0]) - i = 127+(128*tag_votes[pos])/tag_votes[0]; - else - i = 192; - w = textwidth(tag_names[pos]); - if(w>XRES/GRID_X-5) - w = XRES/GRID_X-5; - gx = (XRES/GRID_X)*gi; - gy = gj*14 + 46; - if(mx>=gx && mx=gy && my XRES/GRID_X-10) - { - tmp = malloc(strlen(search_names[pos])+4); - strcpy(tmp, search_names[pos]); - j = textwidthx(tmp, XRES/GRID_X-15); - strcpy(tmp+j, "..."); - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); - free(tmp); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); - j = textwidth(search_owners[pos]); - if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && - my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) - { - st = 1; - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); - } - else - drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); - if(search_thumbs[pos]&&thumb_drawn[pos]==0) - { - render_thumb(search_thumbs[pos], search_thsizes[pos], 1, v_buf, gx, gy, GRID_S); - thumb_drawn[pos] = 1; - } - own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); - if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) - mp = pos; - if(own) - { - if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) - { - mp = -1; - dp = pos; - } - } - if(mp==pos && !st) - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); - else - drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); - if(own) - { - if(dp == pos) - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); - else - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); - drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); - } - if(!search_publish[pos]) - { - drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); - drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); - } - if(view_own || svf_admin || svf_mod) - { - sprintf(ts+1, "%d", search_votes[pos]); - ts[0] = 0xBB; - for(j=1; ts[j]; j++) - ts[j] = 0xBC; - ts[j-1] = 0xB9; - ts[j] = 0xBA; - ts[j+1] = 0; - w = gx+XRES/GRID_S-2-textwidth(ts); - h = gy+YRES/GRID_S-11; - drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); - for(j=0; ts[j]; j++) - ts[j] -= 14; - drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); - sprintf(ts, "%d", search_votes[pos]); - for(j=0; ts[j]; j++) - ts[j] += 127; - drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); - } - if(search_scoreup[pos]>0||search_scoredown[pos]>0) - { - lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); - - if(((YRES/GRID_S+3)/2)>lv) - { - ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); - if(lv<8) - { - ry = ry/(8-lv); - } - nyu = search_scoreup[pos]*ry; - nyd = search_scoredown[pos]*ry; - } - else - { - ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); - nyu = search_scoreup[pos]/ry; - nyd = search_scoredown[pos]/ry; - } - - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); - - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); - } - } - - if(mp!=-1 && mmt>=TIMEOUT/5 && !st) - { - gi = mp % GRID_X; - gj = mp / GRID_X; - if(is_p1) - gj += GRID_Y-GRID_P; - gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; - gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; - i = w = textwidth(search_names[mp]); - h = YRES/GRID_Z+30; - if(w=XRES-2) gx=XRES-3-w; - if(gy<32) gy=32; - if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; - clearrect(vid_buf, gx-2, gy-3, w+4, h); - drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); - if(search_thumbs[mp]) - render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); - drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); - drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); - } - - sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); - - ui_edit_process(mx, my, b, &ed); - - if(sdl_key==SDLK_RETURN) - { - if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) - lasttime = TIMEOUT; - else if(search_ids[0] && !search_ids[1]) - { - bq = 0; - b = 1; - mp = 0; - } - } - if(sdl_key==SDLK_ESCAPE) - goto finish; - - if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) - { - search_own = !search_own; - lasttime = TIMEOUT; - } - if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) - { - search_date = !search_date; - lasttime = TIMEOUT; - } - - if(b && !bq && dp!=-1) - if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) - { - execute_delete(vid_buf, search_ids[dp]); - lasttime = TIMEOUT; - if(last) - { - free(last); - last = NULL; - } - } - - if(b && !bq && tp!=-1) - { - strncpy(ed.str, tag_names[tp], 255); - lasttime = TIMEOUT; - } - - if(b && !bq && mp!=-1 && st) - { - sprintf(ed.str, "user:%s", search_owners[mp]); - lasttime = TIMEOUT; - } - - if(do_open==1) - { - mp = 0; - } - - if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) - { - fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); - info_box(vid_buf, "Loading..."); - - uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); - strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); - strcaturl(uri, search_ids[mp]); - data = http_simple_get(uri, &status, &dlen); - free(uri); - - if(status == 200) - { - status = parse_save(data, dlen, 1, 0, 0); - switch(status) - { - case 1: - error_ui(vid_buf, 0, "Simulation corrupted"); - break; - case 2: - error_ui(vid_buf, 0, "Simulation from a newer version"); - break; - case 3: - error_ui(vid_buf, 0, "Simulation on a too large grid"); - break; - } - if(!status) - { - char *tnames[] = {"ID", NULL}; - char *tparts[1]; - int tplens[1]; - if(svf_last) - free(svf_last); - svf_last = data; - svf_lsize = dlen; - - tparts[0] = search_ids[mp]; - tplens[0] = strlen(search_ids[mp]); - data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); - - svf_open = 1; - svf_own = svf_login && !strcmp(search_owners[mp], svf_user); - svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); - - strcpy(svf_id, search_ids[mp]); - strcpy(svf_name, search_names[mp]); - if(status == 200) - { - if(data) - { - strncpy(svf_tags, data, 255); - svf_tags[255] = 0; - } - else - svf_tags[0] = 0; - } - else - { - svf_tags[0] = 0; - } - - if(svf_login) - { - char *names[] = {"ID", NULL}; - char *parts[1]; - parts[0] = search_ids[mp]; - data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); - if(status == 200) - { - if(data) - { - if(!strcmp(data, "Up")) - { - svf_myvote = 1; - } - else if(!strcmp(data, "Down")) - { - svf_myvote = -1; - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - else - { - svf_myvote = 0; - } - } - } - else - { - svf_open = 0; - svf_publish = 0; - svf_own = 0; - svf_myvote = 0; - svf_id[0] = 0; - svf_name[0] = 0; - svf_tags[0] = 0; - if(svf_last) - free(svf_last); - svf_last = NULL; - } - } - else - error_ui(vid_buf, status, http_ret_text(status)); - - if(data) - free(data); - goto finish; - } - - if(!last) - { - search = 1; - } - else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) - { - search = 1; - if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) - { - search_page = 0; - page_count = 0; - } - free(last); - last = NULL; - } - else - search = 0; - - if(search && lasttime>=TIMEOUT) - { - lasttime = 0; - last = mystrdup(ed.str); - last_own = search_own; - last_date = search_date; - last_page = search_page; - active = 1; - uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); - if(search_own || svf_admin || svf_mod) - tmp = "&ShowVotes=true"; - else - tmp = ""; - if(!search_own && !search_date && !*last) - { - if(search_page) - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); - } - else - { - exp_res = GRID_X*GRID_P; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); - } - } - else - { - exp_res = GRID_X*GRID_Y; - sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); - } - strcaturl(uri, last); - if(search_own) - { - strcaturl(uri, " user:"); - strcaturl(uri, svf_user); - } - if(search_date) - strcaturl(uri, " sort:date"); - - http = http_async_req_start(http, uri, NULL, 0, 1); - if(svf_login) - { - http_auth_headers(http, svf_user, svf_pass); - } - http_last_use = time(NULL); - free(uri); - } - - if(active && http_async_req_status(http)) - { - http_last_use = time(NULL); - results = http_async_req_stop(http, &status, NULL); - view_own = last_own; - if(status == 200) - { - page_count = search_results(results, last_own||svf_admin||svf_mod); - memset(thumb_drawn, 0, sizeof(thumb_drawn)); - memset(v_buf, 0, ((YRES+MENUSIZE)*(XRES+BARSIZE))*PIXELSIZE); - } - is_p1 = (exp_res < GRID_X*GRID_Y); - free(results); - active = 0; - } - - if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) - { - http_async_req_close(http); - http = NULL; - } - - for(i=0; i> 8; - fwrite(lb, 2, 1, f); - fwrite(str, li, 1, f); -} - -int load_string(FILE *f, char *str, int max) -{ - int li; - unsigned char lb[2]; - fread(lb, 2, 1, f); - li = lb[0] | (lb[1] << 8); - if(li > max) - { - str[0] = 0; - return 1; - } - fread(str, li, 1, f); - str[li] = 0; - return 0; -} +char http_proxy_string[256] = ""; unsigned char last_major=0, last_minor=0, update_flag=0; -void save_presets(int do_update) -{ - FILE *f=fopen("powder.def", "wb"); - unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; - unsigned char tmp = sdl_scale; - if(!f) - return; - fwrite(sig, 1, 4, f); - save_string(f, svf_user); - save_string(f, svf_pass); - fwrite(&tmp, 1, 1, f); - tmp = cmode; - fwrite(&tmp, 1, 1, f); - tmp = svf_admin; - fwrite(&tmp, 1, 1, f); - tmp = svf_mod; - fwrite(&tmp, 1, 1, f); - save_string(f, http_proxy); - tmp = SAVE_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = MINOR_VERSION; - fwrite(&tmp, 1, 1, f); - tmp = do_update; - fwrite(&tmp, 1, 1, f); - fclose(f); -} - -void load_presets(void) -{ - FILE *f=fopen("powder.def", "rb"); - unsigned char sig[4], tmp; - if(!f) - return; - fread(sig, 1, 4, f); - if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) - { - if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) - { - if(fseek(f, -3, SEEK_END)) - { - remove("powder.def"); - return; - } - if(fread(sig, 1, 3, f) != 3) - { - remove("powder.def"); - goto fail; - } - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; - } - fclose(f); - remove("powder.def"); - return; - } - if(load_string(f, svf_user, 63)) - goto fail; - if(load_string(f, svf_pass, 63)) - goto fail; - svf_login = !!svf_user[0]; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - sdl_scale = (tmp == 2) ? 2 : 1; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - cmode = tmp%7; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_admin = tmp; - if(fread(&tmp, 1, 1, f) != 1) - goto fail; - svf_mod = tmp; - if(load_string(f, http_proxy, 255)) - goto fail; - if(fread(sig, 1, 3, f) != 3) - goto fail; - last_major = sig[0]; - last_minor = sig[1]; - update_flag = sig[2]; -fail: - fclose(f); -} - -void dim_copy(pixel *dst, pixel *src) -{ - int i,r,g,b; - for(i=0; i0) - r--; - if(g>0) - g--; - if(b>0) - b--; - dst[i] = PIXRGB(r,g,b); - } -} - -int zoom_en = 0; -int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; -int zoom_wx=0, zoom_wy=0; -void render_zoom(pixel *img) -{ - int x, y, i, j; - pixel pix; - drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); - drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); - clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); - for(j=0; j #include #include #include "misc.h" +#include "defines.h" +#include "interface.h" +#include "graphics.h" //Signum function #ifdef WIN32 @@ -80,4 +84,114 @@ void strlist_free(struct strlist **list) *list = (*list)->next; free(item); } +} + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy_string); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66) + { + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F) + { + if(fseek(f, -3, SEEK_END)) + { + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3) + { + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + cmode = tmp%7; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy_string, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) + { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; } \ No newline at end of file diff --git a/misc.h b/misc.h index e27909336..dbc2b8457 100644 --- a/misc.h +++ b/misc.h @@ -1,5 +1,7 @@ #ifndef UTILS_H #define UTILS_H +#include +#include //Signum function #ifdef WIN32 @@ -34,4 +36,12 @@ int strlist_find(struct strlist **list, char *str); void strlist_free(struct strlist **list); +void save_presets(int do_update); + +void load_presets(void); + +void save_string(FILE *f, char *str); + +int load_string(FILE *f, char *str, int max); + #endif \ No newline at end of file diff --git a/version.h b/version.h index 4f3791138..41e9672df 100755 --- a/version.h +++ b/version.h @@ -20,8 +20,6 @@ #ifndef VERSION_H #define VERSION_H -#define SAVE_VERSION 41 -#define MINOR_VERSION 3 -#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. + #endif From 75d3e18fbfb3dfb8f757cbe3d36d5953c2621956 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 29 Aug 2010 15:37:22 +0100 Subject: [PATCH 116/237] Rendering bugfixes, added Thermite --- graphics.c | 7 ++- powder.c | 39 ++++++++++++++- powder.h | 143 +++++++++++++++++++++++++++-------------------------- 3 files changed, 117 insertions(+), 72 deletions(-) diff --git a/graphics.c b/graphics.c index c058d439d..ba13d95d1 100644 --- a/graphics.c +++ b/graphics.c @@ -1112,8 +1112,10 @@ void draw_parts(pixel *vid) float mv, dx, dy, ix, iy, lx, ly, d, pp; float pt = R_TEMP; for(i = 0; i0) + { + parts[i].tmp--; + parts[i].temp = 3500; + } } pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); } @@ -938,7 +948,6 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - //PLANT else if(t==PT_PLNT) { for(nx=-2; nx<3; nx++) @@ -962,6 +971,34 @@ void update_particles_i(pixel *vid, int start, int inc) //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) //t = parts[i].type = PT_WATR; } + } + else if(t==PT_THRM) + { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM || (r&0xFF)==PT_LAVA)) + { + if(1>(rand()%500)){ + t = parts[i].type = PT_LAVA; + parts[i].ctype = PT_BMTL; + pt = parts[i].temp = 3500.0f; + pv[y/CELL][x/CELL] += 50.0f; + } else { + t = parts[i].type = PT_LAVA; + parts[i].life = 400; + parts[i].ctype = PT_THRM; + pt = parts[i].temp = 3500.0f; + parts[i].tmp = 20; + } + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } } else if(t==PT_WATR||t==PT_DSTW) { diff --git a/powder.h b/powder.h index a12c37a84..18ce89639 100644 --- a/powder.h +++ b/powder.h @@ -104,7 +104,8 @@ #define PT_INWR 63 #define PT_YEST 64 #define PT_DYST 65 -#define PT_NUM 66 +#define PT_THRM 66 +#define PT_NUM 67 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -130,6 +131,7 @@ struct particle float temp; float pavg[2]; int flags; + int tmp; }; typedef struct particle particle; @@ -242,6 +244,7 @@ static part_type ptypes[PT_NUM] = {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Yeast, grows when warm (~37C)."}, {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f, 211, "Thermite."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -306,14 +309,15 @@ static part_state pstates[PT_NUM] = /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OIL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OIL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, -190.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 60.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = { @@ -325,72 +329,73 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ -/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ -/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ -/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Watr */ -/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ -/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ -/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Stne */ -/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* Lava */ -/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ -/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ -/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ -/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ -/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ -/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ -/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Icei */ -/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ -/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ -/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Snow */ -/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ -/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,1}, /* Neut */ -/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Plut */ -/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ -/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ -/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ -/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ -/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Cnct */ -/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* Dstw */ -/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Salt */ -/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* Sltw */ -/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dmnd */ -/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ -/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* Brml */ -/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ -/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Uran */ -/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ -/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1}, /* MWax */ -/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ -/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ -/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ -/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ -/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ -/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ -/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ -/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1}, /* LRbd */ -/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ -/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* Sand */ -/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ -/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ -/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, /* BGla */ -/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ -/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ -/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ -/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ -/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ -/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ -/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ -/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ -/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ -/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ -/* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ -/* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ -/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ -/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0}, /* LO2 */ -/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0}, /* O2 */ -/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ -/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* YEST */ -/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ +/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ +/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* Dust */ +/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* Watr */ +/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ +/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ +/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Stne */ +/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* Lava */ +/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ +/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ +/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ +/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ +/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ +/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ +/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Icei */ +/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ +/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ +/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Snow */ +/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ +/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0}, /* Neut */ +/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Plut */ +/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ +/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ +/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ +/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ +/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1}, /* Cnct */ +/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* Dstw */ +/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* Salt */ +/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0}, /* Sltw */ +/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Dmnd */ +/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ +/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* Brml */ +/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ +/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Uran */ +/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ +/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0}, /* MWax */ +/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ +/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ +/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* LN2 */ +/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ +/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ +/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ +/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ +/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* LRbd */ +/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ +/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Sand */ +/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ +/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ +/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* BGla */ +/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ +/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ +/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ +/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* NIce */ +/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ +/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ +/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ +/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ +/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ +/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ +/* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ +/* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ +/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ +/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0}, /* LO2 */ +/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0}, /* O2 */ +/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ +/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* YEST */ +/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* DYST */ +/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* Brml */ /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ From cf85eabee95be1e4947935183d1366cba6f42245 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 1 Sep 2010 11:40:29 +0100 Subject: [PATCH 117/237] Fixed zoom, removed plastic, fixed oil, more moving around. Experimental Neutron behaviour --- defines.h | 15 +- graphics.c | 301 +++++++++++++++++++- graphics.h | 8 + interface.c | 392 ++++++++++++++++++++++++++ interface.h | 10 + main.c | 797 ---------------------------------------------------- misc.c | 74 ++++- misc.h | 23 ++ powder.c | 22 +- powder.h | 164 ++++++----- 10 files changed, 904 insertions(+), 902 deletions(-) diff --git a/defines.h b/defines.h index 7a14da2a9..c38de16dd 100644 --- a/defines.h +++ b/defines.h @@ -32,8 +32,8 @@ #define ZSIZE_D 16 #define ZFACTOR_D 8 -static unsigned char ZFACTOR = 256/ZSIZE_D; -static unsigned char ZSIZE = ZSIZE_D; +extern unsigned char ZFACTOR; +extern unsigned char ZSIZE; #define CELL 4 #define ISTP (CELL/2) @@ -63,6 +63,8 @@ typedef unsigned int pixel; typedef unsigned char uint8; +extern int amd; + extern int legacy_enable; extern int sys_pause; @@ -101,4 +103,13 @@ extern unsigned char last_major, last_minor, update_flag; extern char http_proxy_string[256]; +//Functions in main.c +void thumb_cache_inval(char *id); +void thumb_cache_add(char *id, void *thumb, int size); +int thumb_cache_find(char *id, void **thumb, int *size); +void *build_thumb(int *size, int bzip2); +void *build_save(int *size, int x0, int y0, int w, int h); +int parse_save(void *save, int size, int replace, int x0, int y0); +void del_stamp(int d); +void sdl_seticon(void); #endif \ No newline at end of file diff --git a/graphics.c b/graphics.c index ba13d95d1..fa742bebd 100644 --- a/graphics.c +++ b/graphics.c @@ -1108,8 +1108,8 @@ void xor_rect(pixel *vid, int x, int y, int w, int h) void draw_parts(pixel *vid) { - int i, j, x, y, t, nx, ny, r, a, cr,cg,cb, s, rt, fe, nt, lpv, nearp, pavg; - float mv, dx, dy, ix, iy, lx, ly, d, pp; + int i, x, y, t, nx, ny, r, s; + int cr, cg, cb; float pt = R_TEMP; for(i = 0; iSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) + { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0; y= size) + goto corrupt; + j=d[p++]; + if(j0) + { + if(j==PT_STKM) //Stickman should be drawed another way + { + //Stickman drawing + for(k=-2; k<=1; k++) + { + fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); + fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); + fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); + fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); + } + draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); + draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); + draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); + draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); + } + else + fb[y*w+x] = ptypes[j].pcolors; + } + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) +{ + unsigned char *d,*c=thumb; + int i,j,x,y,a,t,r,g,b,sx,sy; + + if(bzip2) + { + if(size<16) + return 1; + if(c[3]!=0x74 || c[2]!=0x49 || c[1]!=0x68 || c[0]!=0x53) + return 1; + if(c[4]>PT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } + else + d = c; + + if(size < XRES*YRES) + { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0; y+scl<=YRES; y+=scl) + { + sx = 0; + for(x=0; x+scl<=XRES; x+=scl) + { + a = 0; + r = g = b = 0; + for(j=0; j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) + { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +void render_cursor(pixel *vid, int x, int y, int t, int r) +{ + int i,j,c; + if(tr*r || i*i+(j+1)*(j+1)>r*r)) + { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } + else + { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i #include #include +#include #include "http.h" #include "md5.h" #include "font.h" @@ -56,6 +57,8 @@ int Z_keysym = 'z'; int zoom_en = 0; int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; int zoom_wx=0, zoom_wy=0; +unsigned char ZFACTOR = 256/ZSIZE_D; +unsigned char ZSIZE = ZSIZE_D; void menu_count(void) { @@ -2427,4 +2430,393 @@ finish: strcpy(search_expr, ed.str); return 0; +} + +int search_results(char *str, int votes) +{ + int i,j; + char *p,*q,*r,*s,*vu,*vd,*pu; + + for(i=0; i=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + else if(!strncmp(str, "TAG ", 4)) + { + if(j >= TAG_MAX) + { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) + { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } + else + { + if(i>=GRID_X*GRID_Y) + break; + if(votes) + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + else + { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) + { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +void execute_save(pixel *vid_buf) +{ + int status; + char *result; + + char *names[] = {"Name", "Data:save.bin", "Thumb:thumb.bin", "Publish", "ID", NULL}; + char *parts[5]; + int plens[5]; + + parts[0] = svf_name; + plens[0] = strlen(svf_name); + parts[1] = build_save(plens+1, 0, 0, XRES, YRES); + parts[2] = build_thumb(plens+2, 1); + parts[3] = (svf_publish==1)?"Public":"Private"; + plens[3] = strlen((svf_publish==1)?"Public":"Private"); + + if(svf_id[0]) + { + parts[4] = svf_id; + plens[4] = strlen(svf_id); + } + else + names[4] = NULL; + + result = http_multipart_post( + "http://" SERVER "/Save.api", + names, parts, plens, + svf_user, svf_pass, + &status, NULL); + + if(svf_last) + free(svf_last); + svf_last = parts[1]; + svf_lsize = plens[1]; + + free(parts[2]); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result[2]) + { + strncpy(svf_id, result+3, 15); + svf_id[15] = 0; + } + + if(!svf_id[0]) + { + error_ui(vid_buf, 0, "No ID supplied by server"); + free(result); + return; + } + + thumb_cache_inval(svf_id); + + svf_own = 1; + if(result) + free(result); +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) + { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) + { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; } \ No newline at end of file diff --git a/interface.h b/interface.h index 76536eb17..7910c6630 100644 --- a/interface.h +++ b/interface.h @@ -168,5 +168,15 @@ char *download_ui(pixel *vid_buf, char *uri, int *len); int search_ui(pixel *vid_buf); +int search_results(char *str, int votes); + +int execute_tagop(pixel *vid_buf, char *op, char *tag); + +void execute_save(pixel *vid_buf); + +void execute_delete(pixel *vid_buf, char *id); + +int execute_vote(pixel *vid_buf, char *id, char *action); + #endif diff --git a/main.c b/main.c index 1d818a84f..7d20ff24a 100644 --- a/main.c +++ b/main.c @@ -102,10 +102,6 @@ int amd = 1; sign signs[MAXSIGNS]; -/*********************************************************** - * AIR FLOW SIMULATOR * - ***********************************************************/ - int numCores = 4; int core_count() @@ -133,18 +129,8 @@ int core_count() return numCPU; } -/*********************************************************** - * PARTICLE SIMULATOR * - ***********************************************************/ int mousex, mousey = 0; //They contain mouse position - - - -/*********************************************************** - * SDL OUTPUT * - ***********************************************************/ - void sdl_seticon(void) { #ifdef WIN32 @@ -161,30 +147,6 @@ void sdl_seticon(void) #endif } -void sdl_open(void) -{ - if(SDL_Init(SDL_INIT_VIDEO)<0) - { - fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); - exit(1); - } - atexit(SDL_Quit); -#ifdef PIX16 - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); -#else - sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); -#endif - if(!sdl_scrn) - { - fprintf(stderr, "Creating window: %s\n", SDL_GetError()); - exit(1); - } - SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); - sdl_seticon(); - SDL_EnableUNICODE(1); - //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); -} - int frame_idx=0; void dump_frame(pixel *src, int w, int h, int pitch) { @@ -265,93 +227,6 @@ void *build_thumb(int *size, int bzip2) return d; } -int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl) -{ - unsigned char *d,*c=thumb; - int i,j,x,y,a,t,r,g,b,sx,sy; - - if(bzip2) - { - if(size<16) - return 1; - if(c[3]!=0x74 || c[2]!=0x49 || c[1]!=0x68 || c[0]!=0x53) - return 1; - if(c[4]>PT_NUM) - return 2; - if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) - return 3; - i = XRES*YRES; - d = malloc(i); - if(!d) - return 1; - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) - return 1; - size = i; - } - else - d = c; - - if(size < XRES*YRES) - { - if(bzip2) - free(d); - return 1; - } - - sy = 0; - for(y=0; y+scl<=YRES; y+=scl) - { - sx = 0; - for(x=0; x+scl<=XRES; x+=scl) - { - a = 0; - r = g = b = 0; - for(j=0; j=PT_NUM) - goto corrupt; - r += PIXR(ptypes[t].pcolors); - g += PIXG(ptypes[t].pcolors); - b += PIXB(ptypes[t].pcolors); - a ++; - } - } - if(a) - { - a = 256/a; - r = (r*a)>>8; - g = (g*a)>>8; - b = (b*a)>>8; - } - - drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); - sx++; - } - sy++; - } - - if(bzip2) - free(d); - return 0; - -corrupt: - if(bzip2) - free(d); - return 1; -} - void *build_save(int *size, int x0, int y0, int w, int h) { unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; @@ -788,144 +663,6 @@ corrupt: return 1; } -pixel *prerender_save(void *save, int size, int *width, int *height) -{ - unsigned char *d,*c=save; - int i,j,k,x,y,rx,ry,p=0; - int bw,bh,w,h; - pixel *fb; - - if(size<16) - return NULL; - if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) - return NULL; - if(c[4]>SAVE_VERSION) - return NULL; - - bw = c[6]; - bh = c[7]; - w = bw*CELL; - h = bh*CELL; - - if(c[5]!=CELL) - return NULL; - - i = (unsigned)c[8]; - i |= ((unsigned)c[9])<<8; - i |= ((unsigned)c[10])<<16; - i |= ((unsigned)c[11])<<24; - d = malloc(i); - if(!d) - return NULL; - fb = calloc(w*h, PIXELSIZE); - if(!fb) - { - free(d); - return NULL; - } - - if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) - goto corrupt; - size = i; - - if(size < bw*bh) - goto corrupt; - - k = 0; - for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) - goto corrupt; - - for(y=0; y= size) - goto corrupt; - j=d[p++]; - if(j0) - { - if(j==PT_STKM) //Stickman should be drawed another way - { - //Stickman drawing - for(k=-2; k<=1; k++) - { - fb[(y-2)*w+x+k] = PIXRGB(255, 224, 178); - fb[(y+2)*w+x+k+1] = PIXRGB(255, 224, 178); - fb[(y+k+1)*w+x-2] = PIXRGB(255, 224, 178); - fb[(y+k)*w+x+2] = PIXRGB(255, 224, 178); - } - draw_line(fb , x, y+3, x-1, y+6, 255, 255, 255, w); - draw_line(fb , x-1, y+6, x-3, y+12, 255, 255, 255, w); - draw_line(fb , x, y+3, x+1, y+6, 255, 255, 255, w); - draw_line(fb , x+1, y+6, x+3, y+12, 255, 255, 255, w); - } - else - fb[y*w+x] = ptypes[j].pcolors; - } - } - - free(d); - *width = w; - *height = h; - return fb; - -corrupt: - free(d); - free(fb); - return NULL; -} - // stamps library stamp stamps[STAMP_MAX];//[STAMP_X*STAMP_Y]; @@ -948,27 +685,6 @@ void stamp_gen_name(char *fn) sprintf(fn, "%08x%02x", last_time, last_name); } -void *file_load(char *fn, int *size) -{ - FILE *f = fopen(fn, "rb"); - void *s; - - if(!f) - return NULL; - fseek(f, 0, SEEK_END); - *size = ftell(f); - fseek(f, 0, SEEK_SET); - s = malloc(*size); - if(!s) - { - fclose(f); - return NULL; - } - fread(s, *size, 1, f); - fclose(f); - return s; -} - void stamp_update(void) { FILE *f; @@ -1118,222 +834,8 @@ void del_stamp(int d) stamp_init(); } -int execute_tagop(pixel *vid_buf, char *op, char *tag) -{ - int status; - char *result; - - char *names[] = {"ID", "Tag", NULL}; - char *parts[2]; - - char *uri = malloc(strlen(SERVER)+strlen(op)+36); - sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); - - parts[0] = svf_id; - parts[1] = tag; - - result = http_multipart_post( - uri, - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - free(uri); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 1; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 1; - } - - if(result[2]) - { - strncpy(svf_tags, result+3, 255); - svf_id[15] = 0; - } - - if(result) - free(result); - - return 0; -} - void thumb_cache_inval(char *id); -void execute_save(pixel *vid_buf) -{ - int status; - char *result; - - char *names[] = {"Name", "Data:save.bin", "Thumb:thumb.bin", "Publish", "ID", NULL}; - char *parts[5]; - int plens[5]; - - parts[0] = svf_name; - plens[0] = strlen(svf_name); - parts[1] = build_save(plens+1, 0, 0, XRES, YRES); - parts[2] = build_thumb(plens+2, 1); - parts[3] = (svf_publish==1)?"Public":"Private"; - plens[3] = strlen((svf_publish==1)?"Public":"Private"); - - if(svf_id[0]) - { - parts[4] = svf_id; - plens[4] = strlen(svf_id); - } - else - names[4] = NULL; - - result = http_multipart_post( - "http://" SERVER "/Save.api", - names, parts, plens, - svf_user, svf_pass, - &status, NULL); - - if(svf_last) - free(svf_last); - svf_last = parts[1]; - svf_lsize = plens[1]; - - free(parts[2]); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result[2]) - { - strncpy(svf_id, result+3, 15); - svf_id[15] = 0; - } - - if(!svf_id[0]) - { - error_ui(vid_buf, 0, "No ID supplied by server"); - free(result); - return; - } - - thumb_cache_inval(svf_id); - - svf_own = 1; - if(result) - free(result); -} - -void execute_delete(pixel *vid_buf, char *id) -{ - int status; - char *result; - - char *names[] = {"ID", NULL}; - char *parts[1]; - - parts[0] = id; - - result = http_multipart_post( - "http://" SERVER "/Delete.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return; - } - - if(result) - free(result); -} - -int execute_vote(pixel *vid_buf, char *id, char *action) -{ - int status; - char *result; - - char *names[] = {"ID", "Action", NULL}; - char *parts[2]; - - parts[0] = id; - parts[1] = action; - - result = http_multipart_post( - "http://" SERVER "/Vote.api", - names, parts, NULL, - svf_user, svf_pass, - &status, NULL); - - if(status!=200) - { - error_ui(vid_buf, status, http_ret_text(status)); - if(result) - free(result); - return 0; - } - if(result && strncmp(result, "OK", 2)) - { - error_ui(vid_buf, 0, result); - free(result); - return 0; - } - - if(result) - free(result); - return 1; -} - -static char hex[] = "0123456789ABCDEF"; - -void strcaturl(char *dst, char *src) -{ - char *d; - unsigned char *s; - - for(d=dst; *d; d++) ; - - for(s=(unsigned char *)src; *s; s++) - { - if((*s>='0' && *s<='9') || - (*s>='a' && *s<='z') || - (*s>='A' && *s<='Z')) - *(d++) = *s; - else - { - *(d++) = '%'; - *(d++) = hex[*s>>4]; - *(d++) = hex[*s&15]; - } - } - *d = 0; -} - char *thumb_cache_id[THUMB_CACHE_SIZE]; void *thumb_cache_data[THUMB_CACHE_SIZE]; int thumb_cache_size[THUMB_CACHE_SIZE]; @@ -1399,309 +901,10 @@ int thumb_cache_find(char *id, void **thumb, int *size) return 1; } -int search_results(char *str, int votes) -{ - int i,j; - char *p,*q,*r,*s,*vu,*vd,*pu; - - for(i=0; i=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str+5, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str+5); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - else if(!strncmp(str, "TAG ", 4)) - { - if(j >= TAG_MAX) - { - str = p; - continue; - } - q = strchr(str+4, ' '); - if(!q) - { - str = p; - continue; - } - *(q++) = 0; - tag_names[j] = mystrdup(str+4); - tag_votes[j] = atoi(q); - j++; - } - else - { - if(i>=GRID_X*GRID_Y) - break; - if(votes) - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - s = strchr(pu, ' '); - if(!s) - return i; - *(s++) = 0; - vu = strchr(s, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - else - { - pu = strchr(str, ' '); - if(!pu) - return i; - *(pu++) = 0; - vu = strchr(pu, ' '); - if(!vu) - return i; - *(vu++) = 0; - vd = strchr(vu, ' '); - if(!vd) - return i; - *(vd++) = 0; - q = strchr(vd, ' '); - } - if(!q) - return i; - *(q++) = 0; - r = strchr(q, ' '); - if(!r) - return i; - *(r++) = 0; - search_ids[i] = mystrdup(str); - - search_publish[i] = atoi(pu); - search_scoreup[i] = atoi(vu); - search_scoredown[i] = atoi(vd); - - search_owners[i] = mystrdup(q); - search_names[i] = mystrdup(r); - - if(s) - search_votes[i] = atoi(s); - thumb_cache_find(str, search_thumbs+i, search_thsizes+i); - i++; - } - str = p; - } - if(*str) - i++; - return i; -} - -/*********************************************************** - * MESSAGE SIGNS * - ***********************************************************/ - -/*********************************************************** - * CONFIG FILE * - ***********************************************************/ - char http_proxy_string[256] = ""; unsigned char last_major=0, last_minor=0, update_flag=0; -void render_cursor(pixel *vid, int x, int y, int t, int r) -{ - int i,j,c; - if(tr*r || i*i+(j+1)*(j+1)>r*r)) - { - xor_pixel(x+i, y+j, vid); - if(j) xor_pixel(x+i, y-j, vid); - if(i) xor_pixel(x-i, y+j, vid); - if(i&&j) xor_pixel(x-i, y-j, vid); - } - } - else - { - int tc; - c = (r/CELL) * CELL; - x = (x/CELL) * CELL; - y = (y/CELL) * CELL; - - tc = !((c%(CELL*2))==0); - - x -= c/2; - y -= c/2; - - x += tc*(CELL/2); - y += tc*(CELL/2); - - for(i=0; i='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else + { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +void *file_load(char *fn, int *size) +{ + FILE *f = fopen(fn, "rb"); + void *s; + + if(!f) + return NULL; + fseek(f, 0, SEEK_END); + *size = ftell(f); + fseek(f, 0, SEEK_SET); + s = malloc(*size); + if(!s) + { + fclose(f); + return NULL; + } + fread(s, *size, 1, f); + fclose(f); + return s; +} + +int cpu_check(void) +{ +#ifdef MACOSX + return 0; +#else +#ifdef X86 + unsigned af,bf,cf,df; + x86_cpuid(0, af, bf, cf, df); + if(bf==0x68747541 && cf==0x444D4163 && df==0x69746E65) + amd = 1; + x86_cpuid(1, af, bf, cf, df); +#ifdef X86_SSE + if(!(df&(1<<25))) + return 1; +#endif +#ifdef X86_SSE2 + if(!(df&(1<<26))) + return 1; +#endif +#ifdef X86_SSE3 + if(!(cf&1)) + return 1; +#endif +#endif +#endif + return 0; } \ No newline at end of file diff --git a/misc.h b/misc.h index dbc2b8457..106d2161b 100644 --- a/misc.h +++ b/misc.h @@ -3,6 +3,23 @@ #include #include +#ifdef WIN32 +#define x86_cpuid(func,af,bf,cf,df) \ + do {\ + __asm mov eax, func\ + __asm cpuid\ + __asm mov af, eax\ + __asm mov bf, ebx\ + __asm mov cf, ecx\ + __asm mov df, edx\ + } while(0) +#else +#define x86_cpuid(func,af,bf,cf,df) \ +__asm__ __volatile ("cpuid":\ + "=a" (af), "=b" (bf), "=c" (cf), "=d" (df) : "a" (func)); +#endif + +static char hex[] = "0123456789ABCDEF"; //Signum function #ifdef WIN32 extern _inline int isign(float i); @@ -44,4 +61,10 @@ void save_string(FILE *f, char *str); int load_string(FILE *f, char *str, int max); +void strcaturl(char *dst, char *src); + +void *file_load(char *fn, int *size); + +int cpu_check(void); + #endif \ No newline at end of file diff --git a/powder.c b/powder.c index 9b489a11e..706c9622a 100644 --- a/powder.c +++ b/powder.c @@ -454,7 +454,7 @@ int nearest_part(int ci, int t) void update_particles_i(pixel *vid, int start, int inc) { - int i, j, x, y, t, nx, ny, r, a, cr,cg,cb, s, rt, fe, nt, lpv, nearp, pavg; + int i, j, x, y, t, nx, ny, r, a, s, rt, fe, nt, lpv, nearp, pavg; float mv, dx, dy, ix, iy, lx, ly, d, pp; float pt = R_TEMP; float c_heat = 0.0f; @@ -574,14 +574,8 @@ void update_particles_i(pixel *vid, int start, int inc) } else { - if(t==PT_PLAS && pv[y/CELL][x/CELL]>25.0f) - { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; - } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; - } + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; } if(ptypes[t].diffusion) @@ -1170,7 +1164,7 @@ void update_particles_i(pixel *vid, int start, int inc) pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough fe ++; } - if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + /*if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) parts[r>>8].type = PT_DUST; if((r&0xFF)==PT_DYST && 15>(rand()%1000)) parts[r>>8].type = PT_YEST; @@ -1187,16 +1181,14 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].type = PT_GOO; if((r&0xFF)==PT_NITR && 15>(rand()%1000)) parts[r>>8].type = PT_DESL; - if((r&0xFF)==PT_OIL && 5>(rand()%1000)) - parts[r>>8].type = PT_PLAS; if((r&0xFF)==PT_PLNT && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; - if((r&0xFF)==PT_PLAS && 5>(rand()%1000)) - parts[r>>8].type = PT_OIL; if((r&0xFF)==PT_DESL && 15>(rand()%1000)) parts[r>>8].type = PT_GAS; if((r&0xFF)==PT_COAL && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD; + parts[r>>8].type = PT_WOOD;*/ + if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && 15>(rand()%1000)) + parts[r>>8].type--; } } else if(t==PT_PHOT) diff --git a/powder.h b/powder.h index 18ce89639..34f623fae 100644 --- a/powder.h +++ b/powder.h @@ -96,16 +96,15 @@ #define PT_STKM 55 #define PT_SWCH 56 #define PT_SMKE 57 -#define PT_PLAS 58 -#define PT_DESL 59 -#define PT_COAL 60 -#define PT_LO2 61 -#define PT_O2 62 -#define PT_INWR 63 -#define PT_YEST 64 -#define PT_DYST 65 -#define PT_THRM 66 -#define PT_NUM 67 +#define PT_DESL 58 +#define PT_COAL 59 +#define PT_LO2 60 +#define PT_O2 61 +#define PT_INWR 62 +#define PT_YEST 63 +#define PT_DYST 64 +#define PT_THRM 65 +#define PT_NUM 66 #define R_TEMP 22 #define MAX_TEMP 3500 @@ -233,11 +232,10 @@ static part_type ptypes[PT_NUM] = {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0X000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, - {"PLAS", PIXPACK(0x444444), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.0f * CFDS, 0, 0, 0, 1, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms under really high pressure."}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0.01f, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 5.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, @@ -254,7 +252,7 @@ static part_state pstates[PT_NUM] = /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 60.0f, PT_NONE, 0.0f}, /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2500.0f}, /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 710.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* LAVA */ {ST_LIQUID, PT_STNE, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -268,7 +266,7 @@ static part_state pstates[PT_NUM] = /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 300.0f}, @@ -309,7 +307,6 @@ static part_state pstates[PT_NUM] = /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_OIL, 250.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, @@ -317,7 +314,7 @@ static part_state pstates[PT_NUM] = /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 60.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = { @@ -329,73 +326,72 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ -/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ -/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* Dust */ -/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* Watr */ -/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ -/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ -/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Stne */ -/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* Lava */ -/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ -/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ -/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ -/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ -/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ -/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ -/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Icei */ -/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ -/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ -/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, /* Snow */ -/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ -/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0}, /* Neut */ -/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Plut */ -/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ -/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ -/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ -/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ -/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1}, /* Cnct */ -/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}, /* Dstw */ -/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* Salt */ -/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0}, /* Sltw */ -/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* Dmnd */ -/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ -/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* Brml */ -/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ -/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Uran */ -/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ -/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0}, /* MWax */ -/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ -/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ -/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* LN2 */ -/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ -/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ -/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ -/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ -/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* LRbd */ -/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ -/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* Sand */ -/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ -/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ -/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0}, /* BGla */ -/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ -/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ -/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ -/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, /* NIce */ -/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ -/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ -/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ -/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ -/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ -/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ -/* PLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plas */ -/* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ -/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ -/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0}, /* LO2 */ -/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0}, /* O2 */ -/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ -/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* YEST */ -/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0}, /* DYST */ -/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0}, /* Brml */ +/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ +/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Dust */ +/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0}, /* Watr */ +/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Oill */ +/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ +/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0}, /* Stne */ +/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0}, /* Lava */ +/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Gunp */ +/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nitr */ +/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ +/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ +/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ +/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ +/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Icei */ +/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ +/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ +/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Snow */ +/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ +/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0}, /* Neut */ +/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0}, /* Plut */ +/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ +/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ +/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ +/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ +/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1}, /* Cnct */ +/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0}, /* Dstw */ +/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* Salt */ +/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0}, /* Sltw */ +/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dmnd */ +/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ +/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0}, /* Brml */ +/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ +/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0}, /* Uran */ +/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ +/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0}, /* MWax */ +/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ +/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ +/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ +/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ +/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ +/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ +/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ +/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0}, /* LRbd */ +/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ +/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0}, /* Sand */ +/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ +/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ +/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0}, /* BGla */ +/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ +/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ +/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ +/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ +/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ +/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ +/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ +/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* StkM */ +/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ +/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ +/* DESL */ {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ +/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ +/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0}, /* LO2 */ +/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0}, /* O2 */ +/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ +/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* YEST */ +/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* DYST */ +/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0}, /* Brml */ /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ From 33db9e22f70a19b1c1b18f39d023d85d2d133cb4 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 1 Sep 2010 14:49:45 +0100 Subject: [PATCH 118/237] Starting work on OpenGL --- graphics.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++- graphics.h | 6 +++++ main.c | 4 +++ powder.h | 52 ++++++++++++++++++------------------- 4 files changed, 110 insertions(+), 27 deletions(-) diff --git a/graphics.c b/graphics.c index fa742bebd..851e152a1 100644 --- a/graphics.c +++ b/graphics.c @@ -1,6 +1,17 @@ #include #include #include + +#ifdef OpenGL +#ifdef MACOSX +#include +#include +#else +#include +#include +#endif +#endif + #include "defines.h" #include "air.h" #include "powder.h" @@ -105,10 +116,14 @@ void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) { +#ifdef OpenGL + RenderScene(); +#else if(sdl_scale == 2) sdl_blit_2(x, y, w, h, src, pitch); else sdl_blit_1(x, y, w, h, src, pitch); +#endif } void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) @@ -1112,6 +1127,18 @@ void draw_parts(pixel *vid) int cr, cg, cb; float pt = R_TEMP; for(i = 0; i Date: Thu, 2 Sep 2010 15:49:40 +0100 Subject: [PATCH 119/237] More OpenGL work --- graphics.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/graphics.c b/graphics.c index 851e152a1..a6f83f3dc 100644 --- a/graphics.c +++ b/graphics.c @@ -707,6 +707,9 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) { //x = 2+32*(b/2); //y = YRES+2+20*(b%2); +#ifdef OpenGL + fillrect(vid_buf, x, y, 28, 16, PIXR(pc), PIXG(pc), PIXB(pc), 255); +#else for(j=1; j<15; j++) { for(i=1; i<27; i++) @@ -714,6 +717,7 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } +#endif if(b==0) { for(j=4; j<12; j++) @@ -797,6 +801,8 @@ inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) { +#ifdef OpenGL +#else int sx = x; for(; *s; s++) { @@ -834,11 +840,21 @@ int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) else x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); } +#endif return x; } void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) { +#ifdef OpenGL + glBegin(GL_LINE_LOOP); + glColor4ub(r, g, b, a); + glVertex2i(x, y); + glVertex2i(x+w, y); + glVertex2i(x+w, y+h); + glVertex2i(x, y+h); + glEnd(); +#else int i; for(i=0; i<=w; i++) { @@ -850,14 +866,25 @@ void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a drawpixel(vid, x, y+i, r, g, b, a); drawpixel(vid, x+w, y+i, r, g, b, a); } +#endif } void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) { +#ifdef OpenGL + glBegin(GL_QUADS); + glColor4ub(r, g, b, a); + glVertex2i(x, y); + glVertex2i(x+w, y); + glVertex2i(x+w, y+h); + glVertex2i(x, y+h); + glEnd(); +#else int i,j; for(j=1; j Date: Thu, 2 Sep 2010 22:59:48 +0200 Subject: [PATCH 120/237] does not compile at the moment, cause unknown, also. always use // for one line comments --- Makefile | 4 ++-- graphics.c | 10 +++++----- graphics.h | 4 ++-- interface.c | 4 ++-- main.c | 10 ++++++---- powder.c | 18 +----------------- powder.h | 28 ++++++++++++++-------------- 7 files changed, 32 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index 1e1860a63..6db5e87a7 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ SOURCES := *.c -HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h +HEADERS := *.h CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations @@ -11,7 +11,7 @@ MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 -msse2 MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lpthread -lbz2 -COMPILER := gcc +COMPILER := clang LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe diff --git a/graphics.c b/graphics.c index a6f83f3dc..e06122bad 100644 --- a/graphics.c +++ b/graphics.c @@ -756,11 +756,11 @@ void draw_menu(pixel *vid_buf, int i, int hover) } } -#ifdef WIN32 +/*#ifdef WIN32 _inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#else +#else*/ inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#endif +//#endif { pixel t; if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) @@ -799,7 +799,7 @@ inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) return x + w; } -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a) { #ifdef OpenGL #else @@ -2352,4 +2352,4 @@ void ClearScreen() { glClear(GL_COLOR_BUFFER_BIT); } -#endif \ No newline at end of file +#endif diff --git a/graphics.h b/graphics.h index edeab389b..7f1c744a3 100644 --- a/graphics.h +++ b/graphics.h @@ -75,7 +75,7 @@ _inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); #endif -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); +int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a); void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); @@ -141,4 +141,4 @@ void RenderScene (); void ClearScreen(); #endif -#endif \ No newline at end of file +#endif diff --git a/interface.c b/interface.c index f6ef74901..bb9c37c98 100644 --- a/interface.c +++ b/interface.c @@ -11,7 +11,7 @@ #include "powder.h" #include "interface.h" #include "misc.h" - +#include "graphics.h" SDLMod sdl_mod; int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; @@ -2819,4 +2819,4 @@ int execute_vote(pixel *vid_buf, char *id, char *action) if(result) free(result); return 1; -} \ No newline at end of file +} diff --git a/main.c b/main.c index 9b9b4d240..5fc9ac161 100644 --- a/main.c +++ b/main.c @@ -49,7 +49,7 @@ #include "hmap.h" #include "air.h" -char *it_msg = +static const char *it_msg = "\brThe Powder Toy\n" "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" "\n" @@ -129,7 +129,7 @@ int core_count() return numCPU; } -int mousex, mousey = 0; //They contain mouse position +int mousex = 0, mousey = 0; //They contain mouse position void sdl_seticon(void) { @@ -140,10 +140,12 @@ void sdl_seticon(void) #ifdef MACOSX //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -#else +/* Does currently not work #else SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); + SDL_WM_SetIcon(icon, NULLapp_icon_mask)//app_icon mask; +*/ #endif + #endif } diff --git a/powder.c b/powder.c index 706c9622a..78906f65d 100644 --- a/powder.c +++ b/powder.c @@ -4,22 +4,6 @@ #include "air.h" #include "misc.h" -int isplayer = 0; -float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index - -particle *parts; -particle *cb_parts; - -unsigned char bmap[YRES/CELL][XRES/CELL]; -unsigned char emap[YRES/CELL][XRES/CELL]; - -unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -unsigned char cb_emap[YRES/CELL][XRES/CELL]; - -int pfree; - -unsigned pmap[YRES][XRES]; -unsigned cb_pmap[YRES][XRES]; int try_move(int i, int x, int y, int nx, int ny) { @@ -2871,4 +2855,4 @@ void create_line(int x1, int y1, int x2, int y2, int r, int c) e -= 1.0f; } } -} \ No newline at end of file +} diff --git a/powder.h b/powder.h index 7bd2a9c64..b2e70a9db 100644 --- a/powder.h +++ b/powder.h @@ -174,7 +174,7 @@ struct part_state }; typedef struct part_state part_state; -static part_type ptypes[PT_NUM] = +static const part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, @@ -246,7 +246,7 @@ static part_type ptypes[PT_NUM] = //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; -static part_state pstates[PT_NUM] = +static const part_state pstates[PT_NUM] = { // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -316,7 +316,7 @@ static part_state pstates[PT_NUM] = /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; -static unsigned char can_move[PT_NUM][PT_NUM] = +static const unsigned char can_move[PT_NUM][PT_NUM] = { /* A B */ /* A 0 1 | B ligher than A */ @@ -398,21 +398,21 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ }; -extern int isplayer; -extern float player[20]; +int isplayer; +float player[20]; -extern particle *parts; -extern particle *cb_parts; +particle *parts; +particle *cb_parts; -extern unsigned char bmap[YRES/CELL][XRES/CELL]; -extern unsigned char emap[YRES/CELL][XRES/CELL]; +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; -extern unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -extern unsigned char cb_emap[YRES/CELL][XRES/CELL]; +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; -extern int pfree; +int pfree; -extern unsigned pmap[YRES][XRES]; +unsigned pmap[YRES][XRES]; unsigned cb_pmap[YRES][XRES]; int try_move(int i, int x, int y, int nx, int ny); @@ -467,4 +467,4 @@ int create_parts(int x, int y, int r, int c); void create_line(int x1, int y1, int x2, int y2, int r, int c); -#endif \ No newline at end of file +#endif From 274383105a675af4235c250e7c0690a86e71a8c0 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 3 Sep 2010 00:06:18 +0100 Subject: [PATCH 121/237] Revert "does not compile at the moment, cause unknown, also. always use // for one line comments" This reverts commit 32b1a2c3ab928bec980601f257487db39b0b8e33. --- Makefile | 4 ++-- graphics.c | 10 +++++----- graphics.h | 4 ++-- interface.c | 4 ++-- main.c | 10 ++++------ powder.c | 18 +++++++++++++++++- powder.h | 28 ++++++++++++++-------------- 7 files changed, 46 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 6db5e87a7..1e1860a63 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ SOURCES := *.c -HEADERS := *.h +HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations @@ -11,7 +11,7 @@ MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 -msse2 MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lpthread -lbz2 -COMPILER := clang +COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe diff --git a/graphics.c b/graphics.c index e06122bad..a6f83f3dc 100644 --- a/graphics.c +++ b/graphics.c @@ -756,11 +756,11 @@ void draw_menu(pixel *vid_buf, int i, int hover) } } -/*#ifdef WIN32 +#ifdef WIN32 _inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -#else*/ +#else inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) -//#endif +#endif { pixel t; if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) @@ -799,7 +799,7 @@ inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) return x + w; } -int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a) +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) { #ifdef OpenGL #else @@ -2352,4 +2352,4 @@ void ClearScreen() { glClear(GL_COLOR_BUFFER_BIT); } -#endif +#endif \ No newline at end of file diff --git a/graphics.h b/graphics.h index 7f1c744a3..edeab389b 100644 --- a/graphics.h +++ b/graphics.h @@ -75,7 +75,7 @@ _inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); #endif -int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a); +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); @@ -141,4 +141,4 @@ void RenderScene (); void ClearScreen(); #endif -#endif +#endif \ No newline at end of file diff --git a/interface.c b/interface.c index bb9c37c98..f6ef74901 100644 --- a/interface.c +++ b/interface.c @@ -11,7 +11,7 @@ #include "powder.h" #include "interface.h" #include "misc.h" -#include "graphics.h" + SDLMod sdl_mod; int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; @@ -2819,4 +2819,4 @@ int execute_vote(pixel *vid_buf, char *id, char *action) if(result) free(result); return 1; -} +} \ No newline at end of file diff --git a/main.c b/main.c index 5fc9ac161..9b9b4d240 100644 --- a/main.c +++ b/main.c @@ -49,7 +49,7 @@ #include "hmap.h" #include "air.h" -static const char *it_msg = +char *it_msg = "\brThe Powder Toy\n" "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" "\n" @@ -129,7 +129,7 @@ int core_count() return numCPU; } -int mousex = 0, mousey = 0; //They contain mouse position +int mousex, mousey = 0; //They contain mouse position void sdl_seticon(void) { @@ -140,12 +140,10 @@ void sdl_seticon(void) #ifdef MACOSX //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); -/* Does currently not work #else +#else SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); - SDL_WM_SetIcon(icon, NULLapp_icon_mask)//app_icon mask; -*/ + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); #endif - #endif } diff --git a/powder.c b/powder.c index 78906f65d..706c9622a 100644 --- a/powder.c +++ b/powder.c @@ -4,6 +4,22 @@ #include "air.h" #include "misc.h" +int isplayer = 0; +float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index + +particle *parts; +particle *cb_parts; + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; + +unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +unsigned char cb_emap[YRES/CELL][XRES/CELL]; + +int pfree; + +unsigned pmap[YRES][XRES]; +unsigned cb_pmap[YRES][XRES]; int try_move(int i, int x, int y, int nx, int ny) { @@ -2855,4 +2871,4 @@ void create_line(int x1, int y1, int x2, int y2, int r, int c) e -= 1.0f; } } -} +} \ No newline at end of file diff --git a/powder.h b/powder.h index b2e70a9db..7bd2a9c64 100644 --- a/powder.h +++ b/powder.h @@ -174,7 +174,7 @@ struct part_state }; typedef struct part_state part_state; -static const part_type ptypes[PT_NUM] = +static part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, @@ -246,7 +246,7 @@ static const part_type ptypes[PT_NUM] = //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; -static const part_state pstates[PT_NUM] = +static part_state pstates[PT_NUM] = { // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -316,7 +316,7 @@ static const part_state pstates[PT_NUM] = /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; -static const unsigned char can_move[PT_NUM][PT_NUM] = +static unsigned char can_move[PT_NUM][PT_NUM] = { /* A B */ /* A 0 1 | B ligher than A */ @@ -398,21 +398,21 @@ static const unsigned char can_move[PT_NUM][PT_NUM] = /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ }; -int isplayer; -float player[20]; +extern int isplayer; +extern float player[20]; -particle *parts; -particle *cb_parts; +extern particle *parts; +extern particle *cb_parts; -unsigned char bmap[YRES/CELL][XRES/CELL]; -unsigned char emap[YRES/CELL][XRES/CELL]; +extern unsigned char bmap[YRES/CELL][XRES/CELL]; +extern unsigned char emap[YRES/CELL][XRES/CELL]; -unsigned char cb_bmap[YRES/CELL][XRES/CELL]; -unsigned char cb_emap[YRES/CELL][XRES/CELL]; +extern unsigned char cb_bmap[YRES/CELL][XRES/CELL]; +extern unsigned char cb_emap[YRES/CELL][XRES/CELL]; -int pfree; +extern int pfree; -unsigned pmap[YRES][XRES]; +extern unsigned pmap[YRES][XRES]; unsigned cb_pmap[YRES][XRES]; int try_move(int i, int x, int y, int nx, int ny); @@ -467,4 +467,4 @@ int create_parts(int x, int y, int r, int c); void create_line(int x1, int y1, int x2, int y2, int r, int c); -#endif +#endif \ No newline at end of file From 5fef47a1c213870754f2f11ead0ab142400cdb41 Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Thu, 2 Sep 2010 16:09:40 -0700 Subject: [PATCH 122/237] --- defines.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/defines.h b/defines.h index c38de16dd..3599d37a6 100644 --- a/defines.h +++ b/defines.h @@ -7,9 +7,10 @@ #define PATH_SEP "/" #endif -#define SAVE_VERSION 41 -#define MINOR_VERSION 3 -#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. +#define SAVE_VERSION 42 +#define MINOR_VERSION 0 +#define IDENT_VERSION "G" //Change this if you're not Simon! It should be a single letter. +#define BETA #define SERVER "powdertoy.co.uk" From 2f0d0f5d92312fc02dc34d30f99b7cdeb09eccc9 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 3 Sep 2010 10:32:37 +0100 Subject: [PATCH 123/237] Fix for Linux building --- Makefile | 43 +++++-------------------------------------- graphics.h | 4 ++-- 2 files changed, 7 insertions(+), 40 deletions(-) diff --git a/Makefile b/Makefile index 1e1860a63..38608b301 100755 --- a/Makefile +++ b/Makefile @@ -4,13 +4,10 @@ HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations LFLAGS := -lSDL -lm -lbz2 -LFLAGS_MTW32 := -lpthreadGC2 -LFLAGS_MT := $(LFLAGS) -lpthread -MFLAGS_MT := -march=k8 -DX86 -DX86_SSE3 -DMT -msse3 MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 -msse2 MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE -FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lpthread -lbz2 +FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lbz2 COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe @@ -23,9 +20,6 @@ powder-debug: $(SOURCES) $(HEADERS) powder-sse3: $(SOURCES) $(HEADERS) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 strip $@ -powder-mt: $(SOURCES) $(HEADERS) - $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -DLIN32 - strip $@ powder-sse2: $(SOURCES) $(HEADERS) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN32 strip $@ @@ -47,10 +41,6 @@ powder-sse3.exe: $(SOURCES) $(HEADERS) powder-res.o i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 strip $@ chmod 0644 $@ -powder-mt.exe: $(SOURCES) $(HEADERS) powder-res.o - i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_MT) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS_MTW32) -mwindows -DWIN32 - strip $@ - chmod 0644 $@ powder-sse2.exe: $(SOURCES) $(HEADERS) powder-res.o i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 strip $@ @@ -59,33 +49,10 @@ powder-sse.exe: $(SOURCES) $(HEADERS) powder-res.o i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 strip $@ chmod 0644 $@ + powder-x: $(SOURCES) $(HEADERS) gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -ggdb strip $@ -powder-x-mt: $(SOURCES) $(HEADERS) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -powder-src.tar.bz2: *.c *.h *.rc *.ico Makefile - mkdir powder-src - cp *.c *.h *.rc *.ico Makefile powder-src/ - tar cfj powder-src.tar.bz2 powder-src - rm -rf powder-src - -release: $(LINUX_TARG) $(WIN32_TARG) powder-src.tar.bz2 - tar cfz powder-linux.tar.gz $(LINUX_TARG) - cp /usr/i586-mingw32msvc/bin/SDL.dll ./ - zip powder-win32.zip $(WIN32_TARG) SDL.dll - mkdir -p release - mv powder-linux.tar.gz release/ - mv powder-win32.zip release/ - mv powder-src.tar.bz2 release/ - cp powder-sse.exe powder.exe - rm -f release/powder.zip - zip release/powder.zip powder.exe SDL.dll - cp powder-64-sse2 release/powder64 - rm -f release/powder64.gz - gzip release/powder64 - rm -f release/powder.gz - cp powder-sse release/powder - gzip release/powder - cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. - rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe +powder-x-ogl: $(SOURCES) $(HEADERS) + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DOpenGL -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -framework OpenGL -ggdb + strip $@ diff --git a/graphics.h b/graphics.h index edeab389b..2bfacaa2c 100644 --- a/graphics.h +++ b/graphics.h @@ -66,13 +66,13 @@ void draw_menu(pixel *vid_buf, int i, int hover); #ifdef WIN32 _inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); #else -inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); +extern inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a); #endif #ifdef WIN32 _inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); #else -inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); +extern inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); #endif int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); From bda99a105fea992fd530a0788a33b78c6dd25fee Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 3 Sep 2010 10:35:02 +0100 Subject: [PATCH 124/237] Whoop, missed something --- main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/main.c b/main.c index 9b9b4d240..82e407fae 100644 --- a/main.c +++ b/main.c @@ -48,6 +48,7 @@ #include "update.h" #include "hmap.h" #include "air.h" +#include "icon.h" char *it_msg = "\brThe Powder Toy\n" From 62b3d7842493a07947b3f5c0a0e31453ebdea8a6 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 3 Sep 2010 14:26:54 +0200 Subject: [PATCH 125/237] added opengl target for linux --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 38608b301..ccff97d84 100755 --- a/Makefile +++ b/Makefile @@ -26,7 +26,9 @@ powder-sse2: $(SOURCES) $(HEADERS) powder-sse: $(SOURCES) $(HEADERS) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 strip $@ - +powder-64-sse3-opengl : $(SOURCES) $(HEADERS) + $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 -lGL -lGLU -DOpenGL + strip $@ powder-64-sse3: $(SOURCES) $(HEADERS) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 strip $@ From 49ba3f196f706472344a9a10105dad349bf1a0e0 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 3 Sep 2010 14:55:31 +0200 Subject: [PATCH 126/237] added various things --- graphics.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/graphics.c b/graphics.c index a6f83f3dc..ce5e89371 100644 --- a/graphics.c +++ b/graphics.c @@ -884,7 +884,7 @@ void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a for(j=1; j=XRES || y>=YRES) return; @@ -969,6 +979,7 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) b = (a*b + (255-a)*PIXB(t)) >> 8; } vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +#endif //OpenGL } void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) @@ -2352,4 +2363,4 @@ void ClearScreen() { glClear(GL_COLOR_BUFFER_BIT); } -#endif \ No newline at end of file +#endif From aba3109f6f70aeff6353869f53aa9a9876adcc36 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 3 Sep 2010 15:03:37 +0200 Subject: [PATCH 127/237] forgot to remove one thing --- graphics.c | 1 - 1 file changed, 1 deletion(-) diff --git a/graphics.c b/graphics.c index ce5e89371..0cca50763 100644 --- a/graphics.c +++ b/graphics.c @@ -966,7 +966,6 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) #endif { #ifdef OpenGL - gl_ #else pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) From 5b5a80c0af4d66c9a247366fe6aedb34b277b67b Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 3 Sep 2010 16:05:09 +0200 Subject: [PATCH 128/237] Added todo, const correctness. --- graphics.c | 2 +- graphics.h | 4 ++-- main.c | 10 +++++----- powder.h | 23 +++++++++++++---------- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/graphics.c b/graphics.c index 0cca50763..7508c570a 100644 --- a/graphics.c +++ b/graphics.c @@ -799,7 +799,7 @@ inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) return x + w; } -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a) { #ifdef OpenGL #else diff --git a/graphics.h b/graphics.h index 2bfacaa2c..6a1507e94 100644 --- a/graphics.h +++ b/graphics.h @@ -75,7 +75,7 @@ _inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a extern inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a); #endif -int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); +int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a); void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a); @@ -141,4 +141,4 @@ void RenderScene (); void ClearScreen(); #endif -#endif \ No newline at end of file +#endif diff --git a/main.c b/main.c index 82e407fae..30c86e679 100644 --- a/main.c +++ b/main.c @@ -50,7 +50,7 @@ #include "air.h" #include "icon.h" -char *it_msg = +static const char *it_msg = "\brThe Powder Toy\n" "\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" "\n" @@ -90,9 +90,9 @@ typedef struct } upstruc; #ifdef BETA -char *old_ver_msg_beta = "A new beta is available - click here!"; +static const char *old_ver_msg_beta = "A new beta is available - click here!"; #endif -char *old_ver_msg = "A new version is available - click here!"; +static const char *old_ver_msg = "A new version is available - click here!"; float mheat = 0.0f; int do_open = 0; @@ -130,7 +130,7 @@ int core_count() return numCPU; } -int mousex, mousey = 0; //They contain mouse position +int mousex = 0, mousey = 0; //They contain mouse position void sdl_seticon(void) { @@ -964,7 +964,7 @@ int main(int argc, char *argv[]) #ifdef MT numCores = core_count(); #endif - +//TODO: Move out version stuff #ifdef BETA if(is_beta) { diff --git a/powder.h b/powder.h index 7bd2a9c64..6b6610a1c 100644 --- a/powder.h +++ b/powder.h @@ -114,12 +114,15 @@ #define ST_SOLID 1 #define ST_LIQUID 2 #define ST_GAS 3 - -static unsigned char TYPE_PART = 0x01; //1 -static unsigned char TYPE_LIQUID = 0x02; //2 -static unsigned char TYPE_SOLID = 0x04; //4 -static unsigned char TYPE_GAS = 0x08; //8 -static unsigned char PROP_CONDUCTS = 0x10; //16 +/* + We should start to implement these. +*/ +static const unsigned short TYPE_PART = 0x01; //1 +static const unsigned short TYPE_LIQUID = 0x02; //2 +static const unsigned short TYPE_SOLID = 0x04; //4 +static const unsigned short TYPE_GAS = 0x08; //8 +static const unsigned short PROP_CONDUCTS = 0x10; //16 +static const unsigned short PROP_DEADLY = 0x12; //18 Is deadly for stickman. #define FLAG_STAGNANT 1 struct particle @@ -156,7 +159,7 @@ struct part_type float heat; unsigned char hconduct; const char *descs; - unsigned char properties; + const unsigned short properties; }; typedef struct part_type part_type; @@ -173,8 +176,8 @@ struct part_state float btemp; }; typedef struct part_state part_state; - -static part_type ptypes[PT_NUM] = +//Should probably be const. +static const part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, @@ -467,4 +470,4 @@ int create_parts(int x, int y, int r, int c); void create_line(int x1, int y1, int x2, int y2, int r, int c); -#endif \ No newline at end of file +#endif From 8b92a1eb9b2dd91286e70dc72b2ac007fe7db61c Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 3 Sep 2010 22:23:41 +0200 Subject: [PATCH 129/237] fixed http://powdertoy.co.uk/Forum.html?action=vthread&forum=5&topic=783 --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.c b/main.c index 30c86e679..8d37a88d3 100644 --- a/main.c +++ b/main.c @@ -66,7 +66,7 @@ static const char *it_msg = "\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" "Use 'S' to save parts of the window as 'stamps'.\n" "'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" - "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" + "'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 7 will do the same\n" "Use the mouse scroll wheel to change the tool size for particles.\n" "'Q' will quit the application.\n" "The spacebar can be used to pause physics.\n" From 5a65265228b80e976703ec2ac86f9fdc275248d5 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 4 Sep 2010 15:07:01 +0100 Subject: [PATCH 130/237] Thing of the Windows Users --- graphics.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/graphics.c b/graphics.c index 7508c570a..7b9672043 100644 --- a/graphics.c +++ b/graphics.c @@ -896,9 +896,10 @@ void clearrect(pixel *vid, int x, int y, int w, int h) void drawdots(pixel *vid, int x, int y, int h, int r, int g, int b, int a) { #ifdef OpenGL + int i; glBegin(GL_QUADS); glColor4ub(r, g, b, a); - for(int i = 0; i <= h; i +=2) + for(i = 0; i <= h; i +=2) glVertex2i(x, y+i); glEnd(); #else From 81923fae6e048bba268d261f37843d5a0bb46233 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 4 Sep 2010 16:49:08 +0200 Subject: [PATCH 131/237] Changed O2 diffussion, changed description --- powder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.h b/powder.h index 6b6610a1c..5b0900ff2 100644 --- a/powder.h +++ b/powder.h @@ -241,7 +241,7 @@ static const part_type ptypes[PT_NUM] = {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 5.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Yeast, grows when warm (~37C)."}, {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f, 70, "Deat Yeast."}, From 525f87fd6be3e7168eb23ed362f90a44e8992dd7 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 4 Sep 2010 17:25:44 +0200 Subject: [PATCH 132/237] Partly converted into Kelvin scale --- powder.h | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/powder.h b/powder.h index 5b0900ff2..9334ee661 100644 --- a/powder.h +++ b/powder.h @@ -107,8 +107,8 @@ #define PT_NUM 66 #define R_TEMP 22 -#define MAX_TEMP 3500 -#define MIN_TEMP -273 +#define MAX_TEMP 9999 +#define MIN_TEMP 0 #define ST_NONE 0 #define ST_SOLID 1 @@ -241,7 +241,7 @@ static const part_type ptypes[PT_NUM] = {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Oxygen helps make things burn."}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Ignites easily."}, {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Yeast, grows when warm (~37C)."}, {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f, 70, "Deat Yeast."}, @@ -287,36 +287,36 @@ static part_state pstates[PT_NUM] = /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2100.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 46.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* MWAX */ {ST_LIQUID, PT_WAX, 45.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, - /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, -210.0f, PT_NONE, 0.0f, PT_NONE, -195.8f, PT_NONE, 0.0f}, + /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, 75.0f, PT_NONE, 0.0f, PT_NONE, 78.0f, PT_NONE, 0.0f}, /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 39.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, /* LRBD */ {ST_LIQUID, PT_RBDM, 38.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, - /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* CSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BGLA */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* THDR */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLSM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* ETRD */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, -209.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* NICE */ {ST_SOLID, PT_NONE, 0.0f, PT_LNTG, 77.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2000.0f}, - /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, + /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 62.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, -180.0f, PT_NONE, 0.0f}, - /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, -190.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1414.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 60.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 200.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 453.0f, PT_NONE, 0.0f}, + /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 50.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = From a11d64774290b524f0fd4496e47506d654bd66b4 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Sat, 4 Sep 2010 17:40:26 +0200 Subject: [PATCH 133/237] more work on kelvin --- powder.c | 4 ++-- powder.h | 42 +++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/powder.c b/powder.c index 706c9622a..58fed0cb9 100644 --- a/powder.c +++ b/powder.c @@ -1161,7 +1161,7 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; } - pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + pv[y/CELL][x/CELL] += 20.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough fe ++; } /*if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) @@ -2871,4 +2871,4 @@ void create_line(int x1, int y1, int x2, int y2, int r, int c) e -= 1.0f; } } -} \ No newline at end of file +} diff --git a/powder.h b/powder.h index 9334ee661..dc65f16ce 100644 --- a/powder.h +++ b/powder.h @@ -254,47 +254,47 @@ static part_state pstates[PT_NUM] = // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, - /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 60.0f, PT_NONE, 0.0f}, - /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2500.0f}, - /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 710.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LAVA */ {ST_LIQUID, PT_STNE, 700.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, - /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, + /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, + /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LAVA */ {ST_LIQUID, PT_STNE, 973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GUN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* NITR */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* CLNE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 300.0f}, - /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, + /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 600.0f}, + /* WOOD */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 873.0f}, /* NEUT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PLUT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 300.0f}, + /* PLNT */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 573.0f}, /* ACID */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WTRV */ {ST_GAS, PT_ICEI, 0.0f, PT_DSTW, 98.0f, PT_NONE, 100.0f, PT_NONE, 0.0f}, - /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 850.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DSTW */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 100.0f, PT_NONE, 0.0f}, - /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 900.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SLTW */ {ST_LIQUID, PT_ICEI, -40.0f, PT_NONE, 0.0f, PT_WTRV, 110.0f, PT_NONE, 0.0f}, + /* WTRV */ {ST_GAS, PT_ICEI, 0.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, + /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2100.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 46.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* MWAX */ {ST_LIQUID, PT_WAX, 45.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 400.0f}, + /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* LNTG */ {ST_SOLID, PT_NICE, 75.0f, PT_NONE, 0.0f, PT_NONE, 78.0f, PT_NONE, 0.0f}, /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, - /* LRBD */ {ST_LIQUID, PT_RBDM, 38.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 688.0f}, + /* RBDM */ {ST_SOLID, PT_NONE, 0.0f, PT_LRBD, 312.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, + /* LRBD */ {ST_LIQUID, PT_RBDM, 311.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 961.0f}, /* HSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SAND */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GLAS */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1973.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, From 21863c088b5f4c266e33b41813ec697a7d3fa46d Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 4 Sep 2010 17:12:41 -0400 Subject: [PATCH 134/237] made makefile work properly --- Makefile | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index ccff97d84..72e2617b7 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ SOURCES := *.c -HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations @@ -12,49 +11,49 @@ COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 WIN32_TARG := powder-sse.exe powder-sse2.exe -powder: $(SOURCES) $(HEADERS) +powder: $(SOURCES) $(COMPILER) -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 -powder-debug: $(SOURCES) $(HEADERS) +powder-debug: $(SOURCES) $(COMPILER) -m64 -o$@ $(FLAGS_DBUG) -DLIN64 $(SOURCES) -powder-sse3: $(SOURCES) $(HEADERS) +powder-sse3: $(SOURCES) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 strip $@ -powder-sse2: $(SOURCES) $(HEADERS) +powder-sse2: $(SOURCES) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN32 strip $@ -powder-sse: $(SOURCES) $(HEADERS) +powder-sse: $(SOURCES) $(COMPILER) -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 strip $@ -powder-64-sse3-opengl : $(SOURCES) $(HEADERS) +powder-64-sse3-opengl: $(SOURCES) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 -lGL -lGLU -DOpenGL strip $@ -powder-64-sse3: $(SOURCES) $(HEADERS) +powder-64-sse3: $(SOURCES) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 strip $@ -powder-64-sse2: $(SOURCES) $(HEADERS) +powder-64-sse2: $(SOURCES) $(COMPILER) -m64 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 strip $@ powder-res.o: powder-res.rc powder.ico i586-mingw32msvc-windres powder-res.rc powder-res.o -powder-sse3.exe: $(SOURCES) $(HEADERS) powder-res.o +powder-sse3.exe: $(SOURCES) powder-res.o i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 strip $@ chmod 0644 $@ -powder-sse2.exe: $(SOURCES) $(HEADERS) powder-res.o +powder-sse2.exe: $(SOURCES) powder-res.o i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 strip $@ chmod 0644 $@ -powder-sse.exe: $(SOURCES) $(HEADERS) powder-res.o +powder-sse.exe: $(SOURCES) powder-res.o i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 strip $@ chmod 0644 $@ -powder-x: $(SOURCES) $(HEADERS) +powder-x: $(SOURCES) gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -ggdb strip $@ -powder-x-ogl: $(SOURCES) $(HEADERS) +powder-x-ogl: $(SOURCES) gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DOpenGL -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -framework OpenGL -ggdb strip $@ From 240eb4ba33f8720de6d2a40fd0302ad5f927dc79 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 5 Sep 2010 11:35:38 +0100 Subject: [PATCH 135/237] Stickman fixes from savask and temperature fixes --- defines.h | 2 + graphics.c | 6 +- main.c | 36 +++++---- powder.c | 210 ++++++++++++++++++++++++++++++----------------------- powder.h | 154 +++++++++++++++++++-------------------- 5 files changed, 225 insertions(+), 183 deletions(-) diff --git a/defines.h b/defines.h index 3599d37a6..f59eb4ed6 100644 --- a/defines.h +++ b/defines.h @@ -66,6 +66,8 @@ typedef unsigned char uint8; extern int amd; +extern int FPSB; + extern int legacy_enable; extern int sys_pause; diff --git a/graphics.c b/graphics.c index 7b9672043..2cb1a2613 100644 --- a/graphics.c +++ b/graphics.c @@ -1191,7 +1191,7 @@ void draw_parts(pixel *vid) if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP + sprintf(buff, "%3d", parts[i].life); //Show HP drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); } @@ -1796,7 +1796,7 @@ void draw_parts(pixel *vid) if(mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head { - sprintf(buff, "%3d", (int)parts[i].life); //Show HP + sprintf(buff, "%3d", parts[i].life); //Show HP drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255); } @@ -1812,6 +1812,8 @@ void draw_parts(pixel *vid) draw_line(vid , player[3], player[4], player[7], player[8], R, G, B, s); draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); + + isplayer = 1; //It's a secret. Tssss... } else { diff --git a/main.c b/main.c index 8d37a88d3..833a4688d 100644 --- a/main.c +++ b/main.c @@ -98,8 +98,9 @@ float mheat = 0.0f; int do_open = 0; int sys_pause = 0; int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. -int death = 1, framerender = 0; +int death = 0, framerender = 0; int amd = 1; +int FPSB = 0; sign signs[MAXSIGNS]; @@ -533,7 +534,7 @@ int parse_save(void *save, int size, int replace, int x0, int y0) parts[i].vy = (d[p++]-127.0f)/16.0f; if(parts[i].type == PT_STKM) { - player[2] = PT_DUST; + //player[2] = PT_DUST; player[3] = parts[i].x-1; //Setting legs positions player[4] = parts[i].y+6; @@ -588,7 +589,11 @@ int parse_save(void *save, int size, int replace, int x0, int y0) } if(i <= NPART) { - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + if(ver>=42){ + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } else { + parts[i-1].temp = ((d[p++]*(((3500.0f)+(-(-273)))/255))+(-273)) + 273.15f; + } } else { @@ -943,7 +948,7 @@ int main(int argc, char *argv[]) char uitext[48] = ""; char heattext[64] = ""; int currentTime = 0; - int FPS = 0, FPSB = 0; + int FPS = 0; int pastFPS = 0; int past = 0; pixel *vid_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); @@ -1155,9 +1160,10 @@ int main(int argc, char *argv[]) break; } } - if(sdl_key=='d') + if(sdl_key=='d' && isplayer) { - death = !(death); + death = 1; + //death = !(death); } if(sdl_key=='f') { @@ -1355,9 +1361,9 @@ int main(int argc, char *argv[]) if(!((cr>>8)>=NPART || !cr)) { #ifdef BETA - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f, parts[cr>>8].life); #else - sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp-273.15f); #endif } else @@ -2009,11 +2015,15 @@ int main(int argc, char *argv[]) } sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); - //Setting an element for the stick man - if(ptypes[sr].falldown>0) - player[2] = sr; - else - player[2] = PT_DUST; + //Setting an element for the stick man + if(isplayer==0) + { + if(ptypes[sr].falldown>0 || sr == PT_NEUT || sr == PT_PHOT) + player[2] = sr; + else + player[2] = PT_DUST; + } + } http_done(); diff --git a/powder.c b/powder.c index 58fed0cb9..53f84c6fb 100644 --- a/powder.c +++ b/powder.c @@ -5,7 +5,7 @@ #include "misc.h" int isplayer = 0; -float player[20]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index +float player[27]; //[0] is a command cell, [3]-[18] are legs positions, [19] is index, [19]-[26] are accelerations particle *parts; particle *cb_parts; @@ -485,7 +485,7 @@ void update_particles_i(pixel *vid, int start, int inc) { t = parts[i].ctype; if(t!=PT_METL&&t!=PT_BMTL&&t!=PT_BRMT&&t!=PT_LRBD&&t!=PT_RBDM&&t!=PT_BTRY&&t!=PT_NBLE) - parts[i].temp = R_TEMP; + parts[i].temp = R_TEMP + 273.15f; if(!t) t = PT_METL; parts[i].type = t; @@ -819,11 +819,11 @@ void update_particles_i(pixel *vid, int start, int inc) pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); } } - if(t==PT_PTCT&&parts[i].temp>24.0f) + if(t==PT_PTCT&&parts[i].temp>249.0f) { pt = parts[i].temp -= 2.5f; } - if(t==PT_NTCT&&parts[i].temp>24.0f) + if(t==PT_NTCT&&parts[i].temp>249.0f) { pt = parts[i].temp -= 2.5f; } @@ -938,7 +938,7 @@ void update_particles_i(pixel *vid, int start, int inc) continue; if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL) { - parts[i].temp = 200.0f; + parts[i].temp = 473.0f; } } } @@ -1161,7 +1161,7 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; } - pv[y/CELL][x/CELL] += 20.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + pv[y/CELL][x/CELL] += 10.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough fe ++; } /*if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) @@ -1399,19 +1399,19 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_SPRK && (rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN||rt==PT_NBLE) && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) + if(!(rt==PT_PSCN&&parts[i].ctype==PT_NSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp>=373.0f)&&parts[i].ctype==PT_NTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=373.0f)&&parts[i].ctype==PT_PTCT)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN)&&parts[i].ctype==PT_INWR) && pavg != PT_INSL &&!(parts[i].ctype==PT_SWCH&&(rt==PT_PSCN||rt==PT_NSCN)) ) { parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; parts[r>>8].ctype = rt; - if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) + if(parts[r>>8].temp+10.0f<673.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) parts[r>>8].temp = parts[r>>8].temp+10.0f; } } if(t==PT_SPRK && rt==PT_NTCT && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)>8].temp>100.0f))&&pavg != PT_INSL) + if((parts[i].ctype==PT_NSCN||parts[i].ctype==PT_NTCT||(parts[i].ctype==PT_PSCN&&parts[r>>8].temp>373.0f))&&pavg != PT_INSL) { parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; @@ -1421,7 +1421,7 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_SPRK && rt==PT_PTCT && parts[r>>8].life==0 && (parts[i].life<3 || ((r>>8)>8].temp<100.0f))&&pavg != PT_INSL) + if((parts[i].ctype==PT_NSCN||parts[i].ctype==PT_PTCT||(parts[i].ctype==PT_PSCN&&parts[r>>8].temp<373.0f))&&pavg != PT_INSL) { parts[r>>8].type = PT_SPRK; parts[r>>8].life = 4; @@ -1486,15 +1486,17 @@ killed: } if(t==PT_STKM) { + float dt = 0.9;///(FPSB*FPSB); //Delta time in square //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + if(parts[i].temp<243) + parts[i].life -= 1; + if((parts[i].temp<309.6f) && (parts[i].temp>=243)) parts[i].temp += 1; //Death - if(parts[i].life<0 && (death == 1)) //If his HP is less that 0 or there is very big wind... + if(parts[i].life<1 || death == 1 || (pv[y/CELL][x/CELL]>=4.5f && player[2] != SPC_AIR) ) //If his HP is less that 0 or there is very big wind... { + death = 0; for(r=-2; r<=1; r++) { create_part(-1, x+r, y-2, player[2]); @@ -1506,112 +1508,138 @@ killed: goto killed; } + parts[i].vy += -0.7*dt; //Head up! + //Verlet integration - pp = 2*player[3]-player[5]; + pp = 2*player[3]-player[5]+player[19]*dt*dt;; player[5] = player[3]; player[3] = pp; - pp = 2*player[4]-player[6]; + pp = 2*player[4]-player[6]+player[20]*dt*dt;; player[6] = player[4]; player[4] = pp; - pp = 2*player[7]-player[9]; + pp = 2*player[7]-player[9]+player[21]*dt*dt;; player[9] = player[7]; player[7] = pp; - pp = 2*player[8]-player[10]+1; + pp = 2*player[8]-player[10]+(player[22]+1)*dt*dt;; player[10] = player[8]; player[8] = pp; - pp = 2*player[11]-player[13]; + pp = 2*player[11]-player[13]+player[23]*dt*dt;; player[13] = player[11]; player[11] = pp; - pp = 2*player[12]-player[14]; + pp = 2*player[12]-player[14]+player[24]*dt*dt;; player[14] = player[12]; player[12] = pp; - pp = 2*player[15]-player[17]; + pp = 2*player[15]-player[17]+player[25]*dt*dt;; player[17] = player[15]; player[15] = pp; - pp = 2*player[16]-player[18]+1; + pp = 2*player[16]-player[18]+(player[26]+1)*dt*dt;; player[18] = player[16]; player[16] = pp; + //Setting acceleration to 0 + player[19] = 0; + player[20] = 0; + + player[21] = 0; + player[22] = 0; + + player[23] = 0; + player[24] = 0; + + player[25] = 0; + player[26] = 0; + //Go left - if (((int)(player[0])&0x01) == 0x01) + if (((int)(player[0])&0x01) == 0x01 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) { if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { - player[9] += 3; - player[10] += 2; - player[5] += 2; + player[21] = -3; + player[22] = -2; + player[19] = -2; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { - player[17] += 3; - player[18] += 2; - player[13] +=2; + player[25] = -3; + player[26] = -2; + player[23] = -2; } } else { if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids { - player[9] += 1; - player[10] += 1; - player[5] += 1; + player[21] = -1; + player[22] = -1; + player[19] = -1; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { - player[17] += 1; - player[18] += 1; - player[13] +=1; + player[25] = -1; + player[26] = -1; + player[23] = -1; } } } //Go right - if (((int)(player[0])&0x02) == 0x02) + if (((int)(player[0])&0x02) == 0x02 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) { if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; +player[21] = 3; +player[22] = -2; +player[19] = 2; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; +player[25] = 3; +player[26] = -2; +player[23] = 2; } } else { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; +player[21] = 1; +player[22] = -1; +player[19] = 1; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; +player[25] = 1; +player[26] = -1; +player[23] = 1; } } } + //Jump + if (((int)(player[0])&0x04) == 0x04 && (pstates[pmap[(int)(player[8]-0.5)][(int)(player[7])]&0xFF].state != ST_GAS || pstates[pmap[(int)(player[16]-0.5)][(int)(player[15])]&0xFF].state != ST_GAS)) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[22] -= 1; + player[26] -= 1; + } + } + //Charge detector wall if foot inside if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) set_emap((int)player[7]/CELL, (int)player[8]/CELL); @@ -1624,12 +1652,10 @@ killed: { if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } + if(ptypes[pmap[ny+y][nx+x]&0xFF].falldown!=0 || (pmap[ny+y][nx+x]&0xFF) == PT_NEUT || (pmap[ny+y][nx+x]&0xFF) == PT_PHOT) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP { if(parts[i].life<=95) @@ -1644,6 +1670,8 @@ killed: parts[i].life -= (102-parts[i].life)/2; kill_part(pmap[ny+y][nx+x]>>8); } + if(bmap[(ny+y)/CELL][(nx+x)/CELL]==4) + player[2] = SPC_AIR; } //Head position @@ -1663,9 +1691,13 @@ killed: } else { - create_part(-1, nx, ny, player[2]); + if(player[2] == SPC_AIR) + create_parts(nx + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01), ny, 4, SPC_AIR); + else + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2] != PT_PHOT && player[2] != SPC_AIR) parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) { @@ -1686,18 +1718,6 @@ killed: } } - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } - - } - //Simulation of joints d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance player[7] -= (player[3]-player[7])*d; @@ -1726,10 +1746,12 @@ killed: //Side collisions checking for(nx = -3; nx <= 3; nx++) { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + r = pmap[(int)(player[16]-2)][(int)(player[15]+nx)]; + if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) player[15] -= nx; - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + r = pmap[(int)(player[8]-2)][(int)(player[7]+nx)]; + if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) player[7] -= nx; } @@ -1741,19 +1763,22 @@ killed: //For left leg if (r && (r&0xFF)!=PT_STKM) { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + if(pstates[r&0xFF].state == ST_LIQUID || (r&0xFF) == PT_LNTG) //Liquid checks //Liquid checks { if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; + parts[i].vy = 1*dt; else parts[i].vy = 0; if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; + parts[i].vx *= 0.5*dt; } else { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; + if(pstates[r&0xFF].state != ST_GAS) + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy*dt; + } } player[9] = player[7]; } @@ -1763,19 +1788,22 @@ killed: //For right leg if (r && (r&0xFF)!=PT_STKM) { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + if(pstates[r&0xFF].state == ST_LIQUID || (r&0xFF) == PT_LNTG) { if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; + parts[i].vy = 1*dt; else parts[i].vy = 0; if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; + parts[i].vx *= 0.5*dt; } else { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; + if(pstates[r&0xFF].state != ST_GAS) + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy*dt; + } } player[17] = player[15]; } @@ -1783,8 +1811,8 @@ killed: //If it falls too fast if (parts[i].vy>=30) { - parts[i].y -= 10+ny; - parts[i].vy = -10; + parts[i].y -= (10+ny)*dt; + parts[i].vy = -10*dt; } } @@ -1792,14 +1820,14 @@ killed: //Keeping legs distance if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) { - player[7] += 0.2; - player[15] -= 0.2; + player[21] -= 0.2; + player[25] += 0.2; } if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) { - player[3] += 0.2; - player[11] -= 0.2; + player[19] -= 0.2; + player[23] += 0.2; } //If legs touch something @@ -1811,10 +1839,10 @@ killed: if (r>0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + if(parts[r>>8].temp>=323 || parts[r>>8].temp<=243) { parts[i].life -= 2; - player[16] -= 1; + player[26] -= 1; } } @@ -1832,10 +1860,10 @@ killed: if(r>0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + if(parts[r>>8].temp>=323 || parts[r>>8].temp<=243) { parts[i].life -= 2; - player[8] -= 1; + player[22] -= 1; } } @@ -1866,7 +1894,7 @@ killed: } if(t==PT_YEST) { - if(parts[i].temp>30&&parts[i].temp<44){ + if(parts[i].temp>303&&parts[i].temp<317){ create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); } } diff --git a/powder.h b/powder.h index dc65f16ce..6cad71ce1 100644 --- a/powder.h +++ b/powder.h @@ -180,72 +180,72 @@ typedef struct part_state part_state; static const part_type ptypes[PT_NUM] = { //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description - {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Erases particles."}, - {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Very light dust. Flammable."}, - {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, - {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Flammable. Solidifies under pressure"}, - {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f, 88, "Ignites flammable materials. Heats air."}, - {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Heavy particles. Meltable."}, - {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, - {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 97, "Light dust. Explosive."}, - {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 50, "Liquid. Pressure sensitive explosive."}, - {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Solid. Duplicates any particles it touches."}, - {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, - {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 88, "Solid. Pressure sensitive explosive."}, - {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f, 75, "Solid. Deforms and disappears under pressure."}, - {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, - {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Conducts electricity. Meltable."}, - {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electricity. Conducted by metal and water."}, - {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f, 46, "Light particles."}, - {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f, 164, "Solid. Flammable. Can be pressurised into COAL"}, - {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 60, "Neutrons. Interact with matter in odd ways."}, - {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, - {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 65, "Plant, drinks water and grows."}, - {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f, 34, "Dissolves almost everything."}, - {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 251, "Hole, will drain away any particles."}, - {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f, 48, "Steam, heats up air, produced from hot water."}, - {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f, 100, "Concrete, stronger than stone."}, - {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f, 23, "Distilled water, does not conduct electricity."}, - {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 110, "Salt, dissolves in water."}, - {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f, 75, "Saltwater, conducts electricity, difficult to freeze."}, - {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. - {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 251, "Breakable metal."}, - {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f, 211, "Broken metal."}, - {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f, 251, "Photons. Travel in straight lines."}, - {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f, 251, "Heavy particles. Generates heat under pressure."}, - {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f, 44, "Wax. Melts at moderately high temperatures."}, - {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f, 44, "Liquid Wax."}, - {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "P-Type Silicon, Will transfer current to any conductor."}, - {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f, 70, "Liquid Nitrogen. Very cold."}, - {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f, 0, "Insulator, does not conduct heat or electricity."}, - {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f, 255, "Black hole, sucks in other particles and heats up."}, - {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f, 255, "White hole, pushes other particles away."}, - {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, - {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f, 170, "Liquid Rubidium."}, - {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, - {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Sand, Heavy particles. Meltable."}, - {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f, 150, "Solid. Meltable. Shatters under pressure"}, - {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, - {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f, 115, "Plasma, extremely hot."}, - {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, - {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f, 46, "Nitrogen Ice."}, - {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, - {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Generates Electricity."}, - {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, - {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, -0.7f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f, 0, "Stickman. Don't kill him!"}, - {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, - {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f, 88, "Smoke"}, - {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, - {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f, 211, "Thermite."}, + {"", PIXPACK(0x000000), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Erases particles."}, + {"DUST", PIXPACK(0xFFE0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable."}, + {"WATR", PIXPACK(0x2030D0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 29, "Liquid. Conducts electricity. Freezes. Extinguishes fires."}, + {"OIL", PIXPACK(0x404010), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 20, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Flammable. Solidifies under pressure"}, + {"FIRE", PIXPACK(0xFF1000), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_EXPLOSIVE, R_TEMP+400.0f+273.15f, 88, "Ignites flammable materials. Heats air."}, + {"STNE", PIXPACK(0xA0A0A0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Heavy particles. Meltable."}, + {"LAVA", PIXPACK(0xE05010), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.0003f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+1500.0f+273.15f, 60, "Heavy liquid. Ignites flammable materials. Solidifies when cold."}, + {"GUN", PIXPACK(0xC0C0D0), 0.7f, 0.02f * CFDS, 0.94f, 0.80f, -0.1f, 0.1f, 0.00f, 0.000f * CFDS, 1, 600, 1, 0, 10, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 97, "Light dust. Explosive."}, + {"NITR", PIXPACK(0x20E010), 0.5f, 0.02f * CFDS, 0.92f, 0.97f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 2, 1000, 2, 0, 3, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 50, "Liquid. Pressure sensitive explosive."}, + {"CLNE", PIXPACK(0xFFD010), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Solid. Duplicates any particles it touches."}, + {"GAS", PIXPACK(0xE0FF20), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 600, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 42, "Gas. Diffuses. Flammable. Liquifies under pressure."}, + {"C-4", PIXPACK(0xD080E0), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 2, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 88, "Solid. Pressure sensitive explosive."}, + {"GOO", PIXPACK(0x804000), 0.1f, 0.00f * CFDS, 0.97f, 0.50f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 12, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 75, "Solid. Deforms and disappears under pressure."}, + {"ICE", PIXPACK(0xA0C0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+-50.0f+273.15f, 46, "Solid. Freezes water. Crushes under pressure. Cools down air."}, + {"METL", PIXPACK(0x404060), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Conducts electricity. Meltable."}, + {"SPRK", PIXPACK(0xFFFF80), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electricity. Conducted by metal and water."}, + {"SNOW", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, SC_POWDERS, R_TEMP+-30.0f+273.15f, 46, "Light particles."}, + {"WOOD", PIXPACK(0xC0A040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 15, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 164, "Solid. Flammable. Can be pressurised into COAL"}, + {"NEUT", PIXPACK(0x20E0FF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.01f, 0.002f * CFDS, 0, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 60, "Neutrons. Interact with matter in odd ways."}, + {"PLUT", PIXPACK(0x407020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+4.0f +273.15f, 251, "Heavy particles. Fissile. Generates neutrons under pressure."}, + {"PLNT", PIXPACK(0x0CAC00), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 20, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 65, "Plant, drinks water and grows."}, + {"ACID", PIXPACK(0xed55ff), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 40, 0, 0, 1, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 34, "Dissolves almost everything."}, + {"VOID", PIXPACK(0x790B0B), 0.0f, 0.00f * CFDS, 1.00f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0003f* CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 251, "Hole, will drain away any particles."}, + {"WTRV", PIXPACK(0xA0A0FF), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, -0.1f, 0.75f, 0.0003f * CFDS, 0, 0, 0, 0, 4, 1, SC_GAS, R_TEMP+100.0f+273.15f, 48, "Steam, heats up air, produced from hot water."}, + {"CNCT", PIXPACK(0xC0C0C0), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 25, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 100, "Concrete, stronger than stone."}, + {"DSTW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+-2.0f+273.15f, 23, "Distilled water, does not conduct electricity."}, + {"SALT", PIXPACK(0xFFFFFF), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 110, "Salt, dissolves in water."}, + {"SLTW", PIXPACK(0x4050F0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 75, "Saltwater, conducts electricity, difficult to freeze."}, + {"DMND", PIXPACK(0xCCFFFF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 186, "Diamond. Indestructable."}, //ief015 - Added diamond. Because concrete blocks are kinda pointless. + {"BMTL", PIXPACK(0x505070), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Breakable metal."}, + {"BRMT", PIXPACK(0x705060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Broken metal."}, + {"PHOT", PIXPACK(0xFFFFFF), 0.0f, 0.00f * CFDS, 1.00f, 1.00f, -0.99f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, R_TEMP+900.0f+273.15f, 251, "Photons. Travel in straight lines."}, + {"URAN", PIXPACK(0x707020), 0.4f, 0.01f * CFDS, 0.99f, 0.95f, 0.0f, 0.4f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 0, 1, SC_NUCLEAR, R_TEMP+30.0f+273.15f, 251, "Heavy particles. Generates heat under pressure."}, + {"WAX", PIXPACK(0xF0F0BB), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 10, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 44, "Wax. Melts at moderately high temperatures."}, + {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f+273.15f, 44, "Liquid Wax."}, + {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, + {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f +273.15f, 70, "Liquid Nitrogen. Very cold."}, + {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, + {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f+273.15f, 255, "Black hole, sucks in other particles and heats up."}, + {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f+273.15f, 255, "White hole, pushes other particles away."}, + {"RBDM", PIXPACK(0xCCCCCC), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 1000, 1, 50, 1, 1, SC_EXPLOSIVE, R_TEMP+0.0f +273.15f, 240, "Rubidium, explosive, especially on contact with water, low melting point"}, + {"LRBD", PIXPACK(0xAAAAAA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 1000, 1, 0, 2, 1, SC_EXPLOSIVE, R_TEMP+45.0f+273.15f, 170, "Liquid Rubidium."}, + {"NTCT", PIXPACK(0x505040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when hot (More than 100C)"}, + {"SAND", PIXPACK(0xFFD090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 1, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Sand, Heavy particles. Meltable."}, + {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, + {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, + {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f +273.15f, 115, "Plasma, extremely hot."}, + {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, + {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f +273.15f, 46, "Nitrogen Ice."}, + {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, + {"BTRY", PIXPACK(0x858505), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Generates Electricity."}, + {"LCRY", PIXPACK(0x505050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Liquid Crystal. Changes colour when charged. (PSCN Charges, NSCN Discharges)"}, + {"STKM", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+14.6f+273.15f, 0, "Stickman. Don't kill him!"}, + {"SWCH", PIXPACK(0x103B11), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Solid. Only conducts when switched on. (PSCN switches on, NSCN switches off)"}, + {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f+273.15f, 88, "Smoke"}, + {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, + {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f +273.15f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Thermite."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -254,7 +254,7 @@ static part_state pstates[PT_NUM] = // Name Solid Frzp Liquid Mpnt Gas Bpoint /* NONE */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DUST */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WATR */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* WATR */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, /* OIL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_GAS, 333.0f, PT_NONE, 0.0f}, /* FIRE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2773.0f}, /* STNE */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 983.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -265,7 +265,7 @@ static part_state pstates[PT_NUM] = /* GAS */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 50.0f, PT_FIRE, 573.0f}, /* C-4 */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* GOO */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* ICE */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 274.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* METL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SPRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SNOW */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -277,15 +277,15 @@ static part_state pstates[PT_NUM] = /* VOID */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WTRV */ {ST_GAS, PT_ICEI, 0.0f, PT_DSTW, 371.0f, PT_NONE, 373.0f, PT_NONE, 0.0f}, /* CNCT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1123.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DSTW */ {ST_LIQUID, PT_ICEI, 0.0f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, + /* DSTW */ {ST_LIQUID, PT_ICEI, 273.15f, PT_NONE, 0.0f, PT_WTRV, 373.0f, PT_NONE, 0.0f}, /* SALT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1173.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* SLTW */ {ST_LIQUID, PT_ICEI, 233.0f, PT_NONE, 0.0f, PT_WTRV, 483.0f, PT_NONE, 0.0f}, /* DMND */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1000.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BMTL */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRMT */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* PHOT */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* URAN */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 2373.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 46.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* WAX */ {ST_SOLID, PT_NONE, 0.0f, PT_MWAX, 319.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -307,12 +307,12 @@ static part_state pstates[PT_NUM] = /* NBLE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BTRY */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_PLSM, 2273.0f}, /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, - /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, - /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 453.0f, PT_NONE, 0.0f}, + /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 453.0f, PT_NONE, 0.0f}, /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 50.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, @@ -402,7 +402,7 @@ static unsigned char can_move[PT_NUM][PT_NUM] = }; extern int isplayer; -extern float player[20]; +extern float player[27]; extern particle *parts; extern particle *cb_parts; From 719ad7c3595686d817e97e3235cb8eb755d9fc40 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 5 Sep 2010 11:44:22 +0100 Subject: [PATCH 136/237] Fire only turns into smoke when cold, fix neutrons --- powder.c | 8 ++++++-- powder.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/powder.c b/powder.c index 53f84c6fb..550f5b1f0 100644 --- a/powder.c +++ b/powder.c @@ -1187,7 +1187,11 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].type = PT_GAS; if((r&0xFF)==PT_COAL && 5>(rand()%100)) parts[r>>8].type = PT_WOOD;*/ - if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && 15>(rand()%1000)) + if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && + (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| + ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| + ptypes[parts[r>>8].type-1].menusection==SC_GAS|| + ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) parts[r>>8].type--; } } @@ -1903,7 +1907,7 @@ player[23] = 1; parts[i].type = PT_NBLE; parts[i].life = 0; } - if (t==PT_FIRE && parts[i].life <=1) + if (t==PT_FIRE && parts[i].life <=1 && parts[i].temp<673) { t = parts[i].type = PT_SMKE; parts[i].life = rand()%20+250; diff --git a/powder.h b/powder.h index 6cad71ce1..b69ec5b75 100644 --- a/powder.h +++ b/powder.h @@ -309,7 +309,7 @@ static part_state pstates[PT_NUM] = /* LCRY */ {ST_SOLID, PT_NONE, 0.0f, PT_BGLA, 1273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* STKM */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 620.0f}, /* SWCH */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, + /* SMKE */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DESL */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 335.0f}, /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 453.0f, PT_NONE, 0.0f}, From 6409b2ae2cd57674848cadc401ed0a9121e3817c Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 5 Sep 2010 11:58:43 +0100 Subject: [PATCH 137/237] OpenGL Blending --- graphics.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/graphics.c b/graphics.c index 2cb1a2613..62546b737 100644 --- a/graphics.c +++ b/graphics.c @@ -2356,6 +2356,12 @@ void Enable2D () glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); + + glEnable (GL_BLEND); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glHint( GL_LINE_SMOOTH_HINT, GL_NICEST); + glHint( GL_POINT_SMOOTH_HINT, GL_NICEST); } void RenderScene () { From a8e1e336053156e5e4f4339af8a8d18a211d5fb6 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 5 Sep 2010 18:34:25 +0100 Subject: [PATCH 138/237] Heat fix --- main.c | 3 ++- powder.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 833a4688d..854fbf369 100644 --- a/main.c +++ b/main.c @@ -592,7 +592,7 @@ int parse_save(void *save, int size, int replace, int x0, int y0) if(ver>=42){ parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; } else { - parts[i-1].temp = ((d[p++]*(((3500.0f)+(-(-273)))/255))+(-273)) + 273.15f; + parts[i-1].temp = ((d[p++]*((O_MAX_TEMP+(-O_MIN_TEMP))/255))+O_MIN_TEMP)+273; } } else @@ -1985,6 +1985,7 @@ int main(int argc, char *argv[]) { #ifdef BETA sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); + //printf("%s\n", uitext); #else sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); #endif diff --git a/powder.h b/powder.h index b69ec5b75..e2ba4d2a5 100644 --- a/powder.h +++ b/powder.h @@ -109,6 +109,8 @@ #define R_TEMP 22 #define MAX_TEMP 9999 #define MIN_TEMP 0 +#define O_MAX_TEMP 3500 +#define O_MIN_TEMP -273 #define ST_NONE 0 #define ST_SOLID 1 From e4d256a0ee8644d35a16255d9e8c8826e367bd69 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 6 Sep 2010 11:46:11 +0100 Subject: [PATCH 139/237] Added Glow and Brick, fix some oil stuff and fix LCRY --- graphics.c | 80 ++++++++++++++++++++---------- powder.c | 24 ++++----- powder.h | 142 ++++++++++++++++++++++++++++------------------------- 3 files changed, 142 insertions(+), 104 deletions(-) diff --git a/graphics.c b/graphics.c index 62546b737..f576f905f 100644 --- a/graphics.c +++ b/graphics.c @@ -1163,6 +1163,7 @@ void draw_parts(pixel *vid) { int i, x, y, t, nx, ny, r, s; int cr, cg, cb; + float fr, fg, fb; float pt = R_TEMP; for(i = 0; i0){ + fg = 6 * pv[ny/CELL][nx/CELL]; + fb = 4 * pv[ny/CELL][nx/CELL]; + fr = 2 * pv[ny/CELL][nx/CELL]; + } + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB((int)restrict_flt(0x44 + fr*8, 0, 255), (int)restrict_flt(0x88 + fg*8, 0, 255), (int)restrict_flt(0x44 + fb*8, 0, 255)); if(cmode == 3||cmode==4 || cmode==6) { - //cr = R/8; - //cg = G/8; - //cb = B/8; - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(0x50+(parts[i].life*10), 0x50+(parts[i].life*10), 0x50+(parts[i].life*10)); - //x = nx/CELL; - //y = ny/CELL; - //cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; - //cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; - //cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; - } - else - { - cr = 0x50+(parts[i].life*10); - cg = 0x50+(parts[i].life*10); - cb = 0x50+(parts[i].life*10); - blendpixel(vid, nx, ny, cr, cg, cb, 192); - blendpixel(vid, nx+1, ny, cr, cg, cb, 96); - blendpixel(vid, nx-1, ny, cr, cg, cb, 96); - blendpixel(vid, nx, ny+1, cr, cg, cb, 96); - blendpixel(vid, nx, ny-1, cr, cg, cb, 96); - blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); - blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + x = nx/CELL; + y = ny/CELL; + fg += fire_g[y][x]; + if(fg > 255) fg = 255; + fire_g[y][x] = fg; + fb += fire_b[y][x]; + if(fb > 255) fb = 255; + fire_b[y][x] = fb; + fr += fire_r[y][x]; + if(fr > 255) fr = 255; + fire_r[y][x] = fr; } + if(cmode == 4){ + uint8 R = (int)restrict_flt(0x44 + fr*8, 0, 255); + uint8 G = (int)restrict_flt(0x88 + fg*8, 0, 255); + uint8 B = (int)restrict_flt(0x44 + fb*8, 0, 255); + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + } + else if(t==PT_LCRY) + { + uint8 GR = 0x50+(parts[i].life*10); + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, GR); + if(cmode == 4){ + blendpixel(vid, nx+1, ny, GR, GR, GR, 223); + blendpixel(vid, nx-1, ny, GR, GR, GR, 223); + blendpixel(vid, nx, ny+1, GR, GR, GR, 223); + blendpixel(vid, nx, ny-1, GR, GR, GR, 223); + + blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112); + blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112); + blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112); + blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112); + } } else if(t==PT_PLSM) { float ttemp = (float)parts[i].life; @@ -1821,7 +1849,7 @@ void draw_parts(pixel *vid) //blendpixel(vid, nx+1, ny, R, G, B, 255); } } - if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID) + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH) { uint8 R = PIXR(ptypes[t].pcolors); uint8 G = PIXG(ptypes[t].pcolors); diff --git a/powder.c b/powder.c index 550f5b1f0..cbe1fb762 100644 --- a/powder.c +++ b/powder.c @@ -644,21 +644,23 @@ void update_particles_i(pixel *vid, int start, int inc) { if(t==PT_WTRV && pv[y/CELL][x/CELL]>4.0f) t = parts[i].type = PT_DSTW; - if(t==PT_DESL && pv[y/CELL][x/CELL]<-6.0f) + if(t==PT_OIL && pv[y/CELL][x/CELL]<-6.0f) t = parts[i].type = PT_GAS; if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) - t = parts[i].type = PT_DESL; + t = parts[i].type = PT_OIL; if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) t = parts[i].type = PT_FIRE; } - if(t==PT_DESL && pv[y/CELL][x/CELL]<-20.0f) - t = parts[i].type = PT_GAS; - if(t==PT_DESL && pv[y/CELL][x/CELL]>50.0f) // Only way I know to make it + if(t==PT_GAS && pv[y/CELL][x/CELL]<-6.0f) + t = parts[i].type = PT_OIL; + if(t==PT_DESL && pv[y/CELL][x/CELL]>12.0f) // Only way I know to make it t = parts[i].type = PT_FIRE; // combust under pressure. - if(t==PT_GAS && pv[y/CELL][x/CELL]>20.0f) - t = parts[i].type = PT_DESL; + if(t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) + t = parts[i].type = PT_OIL; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; + if(t==PT_BRCK && pv[y/CELL][x/CELL]>2.8f) + t = parts[i].type = PT_STNE; //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) // t = parts[i].type = PT_BGLA; if(t==PT_GLAS) @@ -1164,7 +1166,7 @@ void update_particles_i(pixel *vid, int start, int inc) pv[y/CELL][x/CELL] += 10.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough fe ++; } - /*if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) parts[r>>8].type = PT_DUST; if((r&0xFF)==PT_DYST && 15>(rand()%1000)) parts[r>>8].type = PT_YEST; @@ -1186,13 +1188,13 @@ void update_particles_i(pixel *vid, int start, int inc) if((r&0xFF)==PT_DESL && 15>(rand()%1000)) parts[r>>8].type = PT_GAS; if((r&0xFF)==PT_COAL && 5>(rand()%100)) - parts[r>>8].type = PT_WOOD;*/ - if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && + parts[r>>8].type = PT_WOOD; + /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| ptypes[parts[r>>8].type-1].menusection==SC_GAS|| ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) - parts[r>>8].type--; + parts[r>>8].type--;*/ } } else if(t==PT_PHOT) diff --git a/powder.h b/powder.h index e2ba4d2a5..866015f13 100644 --- a/powder.h +++ b/powder.h @@ -104,7 +104,9 @@ #define PT_YEST 63 #define PT_DYST 64 #define PT_THRM 65 -#define PT_NUM 66 +#define PT_GLOW 66 +#define PT_BRCK 67 +#define PT_NUM 68 #define R_TEMP 22 #define MAX_TEMP 9999 @@ -248,6 +250,8 @@ static const part_type ptypes[PT_NUM] = {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Thermite."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow."}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; @@ -320,6 +324,8 @@ static part_state pstates[PT_NUM] = /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = { @@ -331,72 +337,74 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ -/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ -/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* Dust */ -/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0}, /* Watr */ -/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Oill */ -/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ -/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0}, /* Stne */ -/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0}, /* Lava */ -/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0}, /* Gunp */ -/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* Nitr */ -/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ -/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ -/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ -/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ -/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Icei */ -/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ -/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ -/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0}, /* Snow */ -/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ -/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0}, /* Neut */ -/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0}, /* Plut */ -/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plnt */ -/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ -/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ -/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ -/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1}, /* Cnct */ -/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0}, /* Dstw */ -/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* Salt */ -/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0}, /* Sltw */ -/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Dmnd */ -/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ -/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0}, /* Brml */ -/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ -/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0}, /* Uran */ -/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ -/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0}, /* MWax */ -/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ -/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ -/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0}, /* LN2 */ -/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ -/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ -/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ -/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ -/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0}, /* LRbd */ -/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ -/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0}, /* Sand */ -/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ -/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ -/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0}, /* BGla */ -/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ -/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ -/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ -/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* NIce */ -/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ -/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ -/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ -/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, /* StkM */ -/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ -/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ -/* DESL */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ -/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ -/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0}, /* LO2 */ -/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0}, /* O2 */ -/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ -/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* YEST */ -/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* DYST */ -/* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0}, /* THRM */ +/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ +/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0}, /* Dust */ +/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Watr */ +/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Oill */ +/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ +/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Stne */ +/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Lava */ +/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0}, /* Gunp */ +/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Nitr */ +/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ +/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ +/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ +/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ +/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Icei */ +/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ +/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ +/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* Snow */ +/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ +/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Neut */ +/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Plut */ +/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ +/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ +/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ +/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ +/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,1,0}, /* Cnct */ +/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Dstw */ +/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* Salt */ +/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, /* Sltw */ +/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ +/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ +/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Brml */ +/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ +/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Uran */ +/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ +/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0}, /* MWax */ +/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ +/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ +/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ +/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ +/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ +/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ +/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ +/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0}, /* LRbd */ +/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ +/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Sand */ +/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ +/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ +/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* BGla */ +/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ +/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ +/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ +/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* NIce */ +/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ +/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ +/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ +/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ +/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ +/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ +/* DESL */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ +/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ +/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* LO2 */ +/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0}, /* O2 */ +/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ +/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* YEST */ +/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* DYST */ +/* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* THRM */ +/* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, +/* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ From 6b27bc06ff48b22417193d7ac2ca7609c94100e3 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 6 Sep 2010 14:30:09 +0100 Subject: [PATCH 140/237] Fix METL heating NTCT or PTCT through insulator --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index cbe1fb762..5d1355a96 100644 --- a/powder.c +++ b/powder.c @@ -938,7 +938,7 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL) + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL && pavg(i, r>>8)!=PT_INSL) { parts[i].temp = 473.0f; } From 6abf6602b3d41a257c657d294ce839a6b1f8bebd Mon Sep 17 00:00:00 2001 From: FacialTurd Date: Mon, 6 Sep 2010 15:07:14 -0700 Subject: [PATCH 141/237] --- powder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powder.c b/powder.c index 5d1355a96..bfe432921 100644 --- a/powder.c +++ b/powder.c @@ -938,7 +938,7 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if((r>>8)>=NPART || !r) continue; - if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL && pavg(i, r>>8)!=PT_INSL) + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_METL && parts_avg(i, r>>8)!=PT_INSL) { parts[i].temp = 473.0f; } From 19cf0df2df444f389daf962f1aaa49a9658e127f Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 7 Sep 2010 08:39:16 +0200 Subject: [PATCH 142/237] Astyle --- graphics.c | 254 +++++++++++++++++++++++----------------------- main.c | 52 +++++----- powder.c | 288 ++++++++++++++++++++++++++--------------------------- powder.h | 182 ++++++++++++++++----------------- 4 files changed, 388 insertions(+), 388 deletions(-) diff --git a/graphics.c b/graphics.c index f576f905f..89626986e 100644 --- a/graphics.c +++ b/graphics.c @@ -117,7 +117,7 @@ void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) { #ifdef OpenGL - RenderScene(); + RenderScene(); #else if(sdl_scale == 2) sdl_blit_2(x, y, w, h, src, pitch); @@ -708,7 +708,7 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) //x = 2+32*(b/2); //y = YRES+2+20*(b%2); #ifdef OpenGL - fillrect(vid_buf, x, y, 28, 16, PIXR(pc), PIXG(pc), PIXB(pc), 255); + fillrect(vid_buf, x, y, 28, 16, PIXR(pc), PIXG(pc), PIXB(pc), 255); #else for(j=1; j<15; j++) { @@ -847,13 +847,13 @@ int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) { #ifdef OpenGL - glBegin(GL_LINE_LOOP); - glColor4ub(r, g, b, a); - glVertex2i(x, y); - glVertex2i(x+w, y); - glVertex2i(x+w, y+h); - glVertex2i(x, y+h); - glEnd(); + glBegin(GL_LINE_LOOP); + glColor4ub(r, g, b, a); + glVertex2i(x, y); + glVertex2i(x+w, y); + glVertex2i(x+w, y+h); + glVertex2i(x, y+h); + glEnd(); #else int i; for(i=0; i<=w; i++) @@ -872,13 +872,13 @@ void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) { #ifdef OpenGL - glBegin(GL_QUADS); - glColor4ub(r, g, b, a); - glVertex2i(x, y); - glVertex2i(x+w, y); - glVertex2i(x+w, y+h); - glVertex2i(x, y+h); - glEnd(); + glBegin(GL_QUADS); + glColor4ub(r, g, b, a); + glVertex2i(x, y); + glVertex2i(x+w, y); + glVertex2i(x+w, y+h); + glVertex2i(x, y+h); + glEnd(); #else int i,j; for(j=1; j0){ - fg = 6 * pv[ny/CELL][nx/CELL]; - fb = 4 * pv[ny/CELL][nx/CELL]; - fr = 2 * pv[ny/CELL][nx/CELL]; - } - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB((int)restrict_flt(0x44 + fr*8, 0, 255), (int)restrict_flt(0x88 + fg*8, 0, 255), (int)restrict_flt(0x44 + fb*8, 0, 255)); + fg = 0; + fb = 0; + fr = 0; + if(pv[ny/CELL][nx/CELL]>0) { + fg = 6 * pv[ny/CELL][nx/CELL]; + fb = 4 * pv[ny/CELL][nx/CELL]; + fr = 2 * pv[ny/CELL][nx/CELL]; + } + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB((int)restrict_flt(0x44 + fr*8, 0, 255), (int)restrict_flt(0x88 + fg*8, 0, 255), (int)restrict_flt(0x44 + fb*8, 0, 255)); if(cmode == 3||cmode==4 || cmode==6) { x = nx/CELL; @@ -1634,37 +1634,37 @@ void draw_parts(pixel *vid) if(fr > 255) fr = 255; fire_r[y][x] = fr; } - if(cmode == 4){ - uint8 R = (int)restrict_flt(0x44 + fr*8, 0, 255); - uint8 G = (int)restrict_flt(0x88 + fg*8, 0, 255); - uint8 B = (int)restrict_flt(0x44 + fb*8, 0, 255); - - blendpixel(vid, nx+1, ny, R, G, B, 223); - blendpixel(vid, nx-1, ny, R, G, B, 223); - blendpixel(vid, nx, ny+1, R, G, B, 223); - blendpixel(vid, nx, ny-1, R, G, B, 223); + if(cmode == 4) { + uint8 R = (int)restrict_flt(0x44 + fr*8, 0, 255); + uint8 G = (int)restrict_flt(0x88 + fg*8, 0, 255); + uint8 B = (int)restrict_flt(0x44 + fb*8, 0, 255); - blendpixel(vid, nx+1, ny-1, R, G, B, 112); - blendpixel(vid, nx-1, ny-1, R, G, B, 112); - blendpixel(vid, nx+1, ny+1, R, G, B, 112); - blendpixel(vid, nx-1, ny+1, R, G, B, 112); - } + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } } else if(t==PT_LCRY) { - uint8 GR = 0x50+(parts[i].life*10); - vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, GR); - if(cmode == 4){ - blendpixel(vid, nx+1, ny, GR, GR, GR, 223); - blendpixel(vid, nx-1, ny, GR, GR, GR, 223); - blendpixel(vid, nx, ny+1, GR, GR, GR, 223); - blendpixel(vid, nx, ny-1, GR, GR, GR, 223); + uint8 GR = 0x50+(parts[i].life*10); + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, GR); + if(cmode == 4) { + blendpixel(vid, nx+1, ny, GR, GR, GR, 223); + blendpixel(vid, nx-1, ny, GR, GR, GR, 223); + blendpixel(vid, nx, ny+1, GR, GR, GR, 223); + blendpixel(vid, nx, ny-1, GR, GR, GR, 223); - blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112); - blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112); - blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112); - blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112); - } + blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112); + blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112); + blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112); + blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112); + } } else if(t==PT_PLSM) { float ttemp = (float)parts[i].life; @@ -1841,7 +1841,7 @@ void draw_parts(pixel *vid) draw_line(vid , nx, ny+3, player[11], player[12], R, G, B, s); draw_line(vid , player[11], player[12], player[15], player[16], R, G, B, s); - isplayer = 1; //It's a secret. Tssss... + isplayer = 1; //It's a secret. Tssss... } else { @@ -1869,11 +1869,11 @@ void draw_parts(pixel *vid) blendpixel(vid, nx+1, ny+1, R, G, B, 112); blendpixel(vid, nx-1, ny+1, R, G, B, 112); } - } + } #endif - } + } #ifdef OpenGL - glFlush (); + glFlush (); #endif } @@ -1968,33 +1968,33 @@ void prepare_alpha(void) pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) { - unsigned char *tmp; - pixel *res; - int i; + unsigned char *tmp; + pixel *res; + int i; - tmp = malloc(width*height*3); - if(!tmp) - return NULL; - res = malloc(width*height*PIXELSIZE); - if(!res) - { - free(tmp); - return NULL; - } + tmp = malloc(width*height*3); + if(!tmp) + return NULL; + res = malloc(width*height*PIXELSIZE); + if(!res) + { + free(tmp); + return NULL; + } - i = width*height*3; - if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) - { - free(res); - free(tmp); - return NULL; - } + i = width*height*3; + if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) + { + free(res); + free(tmp); + return NULL; + } - for(i=0; i=42){ - parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; - } else { - parts[i-1].temp = ((d[p++]*((O_MAX_TEMP+(-O_MIN_TEMP))/255))+O_MIN_TEMP)+273; - } + if(ver>=42) { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } else { + parts[i-1].temp = ((d[p++]*((O_MAX_TEMP+(-O_MIN_TEMP))/255))+O_MIN_TEMP)+273; + } } else { @@ -1089,7 +1089,7 @@ int main(int argc, char *argv[]) update_air(); } #ifdef OpenGL - ClearScreen(); + ClearScreen(); #else if(cmode==0 || cmode==1) { @@ -1106,7 +1106,7 @@ int main(int argc, char *argv[]) } #endif update_particles(vid_buf); - draw_parts(vid_buf); + draw_parts(vid_buf); if(cmode==2) { @@ -1160,15 +1160,15 @@ int main(int argc, char *argv[]) break; } } - if(sdl_key=='d' && isplayer) - { - death = 1; - //death = !(death); - } - if(sdl_key=='f') - { - framerender = 1; - } + if(sdl_key=='d' && isplayer) + { + death = 1; + //death = !(death); + } + if(sdl_key=='f') + { + framerender = 1; + } if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) { if(load_mode) @@ -1985,7 +1985,7 @@ int main(int argc, char *argv[]) { #ifdef BETA sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); - //printf("%s\n", uitext); + //printf("%s\n", uitext); #else sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); #endif @@ -2014,16 +2014,16 @@ int main(int argc, char *argv[]) fillrect(vid_buf, 12, 12, textwidth(uitext)+8, 15, 0, 0, 0, 140); drawtext(vid_buf, 16, 16, uitext, 32, 216, 255, 200); } - sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); + sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); - //Setting an element for the stick man - if(isplayer==0) - { - if(ptypes[sr].falldown>0 || sr == PT_NEUT || sr == PT_PHOT) - player[2] = sr; - else - player[2] = PT_DUST; - } + //Setting an element for the stick man + if(isplayer==0) + { + if(ptypes[sr].falldown>0 || sr == PT_NEUT || sr == PT_PHOT) + player[2] = sr; + else + player[2] = PT_DUST; + } } diff --git a/powder.c b/powder.c index bfe432921..770e87747 100644 --- a/powder.c +++ b/powder.c @@ -192,7 +192,7 @@ inline int create_part(int p, int x, int y, int t) (pmap[y][x]&0xFF)!=PT_ETRD && (pmap[y][x]&0xFF)!=PT_BRMT && (pmap[y][x]&0xFF)!=PT_NBLE && - (pmap[y][x]&0xFF)!=PT_INWR) + (pmap[y][x]&0xFF)!=PT_INWR) return -1; parts[pmap[y][x]>>8].type = PT_SPRK; parts[pmap[y][x]>>8].life = 4; @@ -289,10 +289,10 @@ inline int create_part(int p, int x, int y, int t) parts[i].life = 100; parts[i].ctype = 0; parts[i].temp = ptypes[t].heat; - - - player[3] = x-1; //Setting legs positions + + + player[3] = x-1; //Setting legs positions player[4] = y+6; player[5] = x-1; player[6] = y+6; @@ -463,14 +463,14 @@ void update_particles_i(pixel *vid, int start, int inc) for(i=start; i<(NPART-starti); i+=inc) if(parts[i].type) { - //printf("parts[%d].type: %d\n", i, parts[i].type); + //printf("parts[%d].type: %d\n", i, parts[i].type); lx = parts[i].x; ly = parts[i].y; t = parts[i].type; if(sys_pause&&!framerender) - return; + return; if(parts[i].life && t!=PT_ACID && t!=PT_WOOD && t!=PT_NBLE && t!=PT_SWCH && t!=PT_STKM) { @@ -574,8 +574,8 @@ void update_particles_i(pixel *vid, int start, int inc) } else { - parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; - parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; } if(ptypes[t].diffusion) @@ -659,7 +659,7 @@ void update_particles_i(pixel *vid, int start, int inc) t = parts[i].type = PT_OIL; if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) t = parts[i].type = PT_BRMT; - if(t==PT_BRCK && pv[y/CELL][x/CELL]>2.8f) + if(t==PT_BRCK && pv[y/CELL][x/CELL]>2.8f) t = parts[i].type = PT_STNE; //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) // t = parts[i].type = PT_BGLA; @@ -747,11 +747,11 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_LAVA&&parts[i].ctype) { parts[i].life = 0; - if(parts[i].ctype==PT_THRM) - { - parts[i].tmp = 0; - parts[i].ctype = PT_BMTL; - } + if(parts[i].ctype==PT_THRM) + { + parts[i].tmp = 0; + parts[i].ctype = PT_BMTL; + } t = parts[i].type = parts[i].ctype; parts[i].ctype = PT_NONE; } @@ -812,11 +812,11 @@ void update_particles_i(pixel *vid, int start, int inc) if(t==PT_LAVA) { parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); - if(parts[i].ctype==PT_THRM&&parts[i].tmp>0) - { - parts[i].tmp--; - parts[i].temp = 3500; - } + if(parts[i].ctype==PT_THRM&&parts[i].tmp>0) + { + parts[i].tmp--; + parts[i].temp = 3500; + } } pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); } @@ -968,7 +968,7 @@ void update_particles_i(pixel *vid, int start, int inc) //t = parts[i].type = PT_WATR; } } - else if(t==PT_THRM) + else if(t==PT_THRM) { for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) @@ -979,18 +979,18 @@ void update_particles_i(pixel *vid, int start, int inc) continue; if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM || (r&0xFF)==PT_LAVA)) { - if(1>(rand()%500)){ - t = parts[i].type = PT_LAVA; - parts[i].ctype = PT_BMTL; - pt = parts[i].temp = 3500.0f; - pv[y/CELL][x/CELL] += 50.0f; - } else { - t = parts[i].type = PT_LAVA; - parts[i].life = 400; - parts[i].ctype = PT_THRM; - pt = parts[i].temp = 3500.0f; - parts[i].tmp = 20; - } + if(1>(rand()%500)) { + t = parts[i].type = PT_LAVA; + parts[i].ctype = PT_BMTL; + pt = parts[i].temp = 3500.0f; + pv[y/CELL][x/CELL] += 50.0f; + } else { + t = parts[i].type = PT_LAVA; + parts[i].life = 400; + parts[i].ctype = PT_THRM; + pt = parts[i].temp = 3500.0f; + parts[i].tmp = 20; + } } //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) //t = parts[i].type = PT_WATR; @@ -1170,13 +1170,13 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].type = PT_DUST; if((r&0xFF)==PT_DYST && 15>(rand()%1000)) parts[r>>8].type = PT_YEST; - if((r&0xFF)==PT_YEST){ - if(15>(rand()%100000)&&isplayer==0) - parts[r>>8].type = PT_STKM; - else - parts[r>>8].type = PT_DYST; - } - + if((r&0xFF)==PT_YEST) { + if(15>(rand()%100000)&&isplayer==0) + parts[r>>8].type = PT_STKM; + else + parts[r>>8].type = PT_DYST; + } + if((r&0xFF)==PT_WATR && 15>(rand()%100)) parts[r>>8].type = PT_DSTW; if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) @@ -1189,12 +1189,12 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].type = PT_GAS; if((r&0xFF)==PT_COAL && 5>(rand()%100)) parts[r>>8].type = PT_WOOD; - /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && - (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| - ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| - ptypes[parts[r>>8].type-1].menusection==SC_GAS|| - ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) - parts[r>>8].type--;*/ + /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && + (ptypes[parts[r>>8].type-1].menusection==SC_LIQUID|| + ptypes[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| + ptypes[parts[r>>8].type-1].menusection==SC_GAS|| + ptypes[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) + parts[r>>8].type--;*/ } } else if(t==PT_PHOT) @@ -1256,7 +1256,7 @@ void update_particles_i(pixel *vid, int start, int inc) for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) @@ -1272,36 +1272,36 @@ void update_particles_i(pixel *vid, int start, int inc) } } } - }else if(t==PT_SWCH) + } else if(t==PT_SWCH) { rt = 3 + (int)pv[y/CELL][x/CELL]; for(nx=-2; nx<3; nx++) for(ny=-2; ny<3; ny++) if(x+nx>=0 && y+ny>0 && - x+nx>8)>=NPART || !r) continue; rt = parts[r>>8].type; - if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) - { - if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) - { - parts[i].life = 9; - } - else if(parts[i].life==0&&parts[r>>8].life==10) - { - parts[i].life = 10; - } - } - } + if(parts[r>>8].type == PT_SWCH&&parts_avg(i,r>>8)!=PT_INSL) + { + if(parts[i].life==10&&parts[r>>8].life<10&&parts[r>>8].life>0) + { + parts[i].life = 9; + } + else if(parts[i].life==0&&parts[r>>8].life==10) + { + parts[i].life = 10; + } + } + } } - if(t==PT_SWCH) - if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) - { - parts[i].life--; - } + if(t==PT_SWCH) + if((parts[i].life>0&&parts[i].life<10)|| parts[i].life == 11) + { + parts[i].life--; + } if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { for(nx=-2; nx<3; nx++) @@ -1444,7 +1444,7 @@ void update_particles_i(pixel *vid, int start, int inc) parts[r>>8].ctype = rt; } } - if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; @@ -1492,7 +1492,7 @@ killed: } if(t==PT_STKM) { - float dt = 0.9;///(FPSB*FPSB); //Delta time in square + float dt = 0.9;///(FPSB*FPSB); //Delta time in square //Tempirature handling if(parts[i].temp<243) parts[i].life -= 1; @@ -1502,7 +1502,7 @@ killed: //Death if(parts[i].life<1 || death == 1 || (pv[y/CELL][x/CELL]>=4.5f && player[2] != SPC_AIR) ) //If his HP is less that 0 or there is very big wind... { - death = 0; + death = 0; for(r=-2; r<=1; r++) { create_part(-1, x+r, y-2, player[2]); @@ -1514,7 +1514,7 @@ killed: goto killed; } - parts[i].vy += -0.7*dt; //Head up! + parts[i].vy += -0.7*dt; //Head up! //Verlet integration pp = 2*player[3]-player[5]+player[19]*dt*dt;; @@ -1545,18 +1545,18 @@ killed: player[18] = player[16]; player[16] = pp; - //Setting acceleration to 0 - player[19] = 0; - player[20] = 0; + //Setting acceleration to 0 + player[19] = 0; + player[20] = 0; - player[21] = 0; - player[22] = 0; + player[21] = 0; + player[22] = 0; - player[23] = 0; - player[24] = 0; + player[23] = 0; + player[24] = 0; - player[25] = 0; - player[26] = 0; + player[25] = 0; + player[26] = 0; //Go left if (((int)(player[0])&0x01) == 0x01 && pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_GAS) @@ -1566,32 +1566,32 @@ killed: { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { - player[21] = -3; - player[22] = -2; - player[19] = -2; + player[21] = -3; + player[22] = -2; + player[19] = -2; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { player[25] = -3; - player[26] = -2; - player[23] = -2; + player[26] = -2; + player[23] = -2; } } else { if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids { - player[21] = -1; - player[22] = -1; - player[19] = -1; + player[21] = -1; + player[22] = -1; + player[19] = -1; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { - player[25] = -1; - player[26] = -1; - player[23] = -1; + player[25] = -1; + player[26] = -1; + player[23] = -1; } } } @@ -1604,47 +1604,47 @@ killed: { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { -player[21] = 3; -player[22] = -2; -player[19] = 2; + player[21] = 3; + player[22] = -2; + player[19] = 2; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { -player[25] = 3; -player[26] = -2; -player[23] = 2; + player[25] = 3; + player[26] = -2; + player[23] = 2; } } else { if (pmap[(int)(player[8]-1)][(int)(player[7])]) { -player[21] = 1; -player[22] = -1; -player[19] = 1; + player[21] = 1; + player[22] = -1; + player[19] = 1; } if (pmap[(int)(player[16]-1)][(int)(player[15])]) { -player[25] = 1; -player[26] = -1; -player[23] = 1; + player[25] = 1; + player[26] = -1; + player[23] = 1; } } } - //Jump - if (((int)(player[0])&0x04) == 0x04 && (pstates[pmap[(int)(player[8]-0.5)][(int)(player[7])]&0xFF].state != ST_GAS || pstates[pmap[(int)(player[16]-0.5)][(int)(player[15])]&0xFF].state != ST_GAS)) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[22] -= 1; - player[26] -= 1; - } - } + //Jump + if (((int)(player[0])&0x04) == 0x04 && (pstates[pmap[(int)(player[8]-0.5)][(int)(player[7])]&0xFF].state != ST_GAS || pstates[pmap[(int)(player[16]-0.5)][(int)(player[15])]&0xFF].state != ST_GAS)) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[22] -= 1; + player[26] -= 1; + } + } //Charge detector wall if foot inside if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) @@ -1659,9 +1659,9 @@ player[23] = 1; if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) continue; if(ptypes[pmap[ny+y][nx+x]&0xFF].falldown!=0 || (pmap[ny+y][nx+x]&0xFF) == PT_NEUT || (pmap[ny+y][nx+x]&0xFF) == PT_PHOT) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP { if(parts[i].life<=95) @@ -1676,8 +1676,8 @@ player[23] = 1; parts[i].life -= (102-parts[i].life)/2; kill_part(pmap[ny+y][nx+x]>>8); } - if(bmap[(ny+y)/CELL][(nx+x)/CELL]==4) - player[2] = SPC_AIR; + if(bmap[(ny+y)/CELL][(nx+x)/CELL]==4) + player[2] = SPC_AIR; } //Head position @@ -1697,10 +1697,10 @@ player[23] = 1; } else { - if(player[2] == SPC_AIR) - create_parts(nx + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01), ny, 4, SPC_AIR); - else - create_part(-1, nx, ny, player[2]); + if(player[2] == SPC_AIR) + create_parts(nx + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01), ny, 4, SPC_AIR); + else + create_part(-1, nx, ny, player[2]); r = pmap[ny][nx]; if( ((r>>8) < NPART) && (r>>8)>=0 && player[2] != PT_PHOT && player[2] != SPC_AIR) @@ -1753,11 +1753,11 @@ player[23] = 1; for(nx = -3; nx <= 3; nx++) { r = pmap[(int)(player[16]-2)][(int)(player[15]+nx)]; - if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) + if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) player[15] -= nx; r = pmap[(int)(player[8]-2)][(int)(player[7]+nx)]; - if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) + if(r && pstates[r&0xFF].state != ST_GAS && pstates[r&0xFF].state != ST_LIQUID) player[7] -= nx; } @@ -1780,11 +1780,11 @@ player[23] = 1; } else { - if(pstates[r&0xFF].state != ST_GAS) - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy*dt; - } + if(pstates[r&0xFF].state != ST_GAS) + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy*dt; + } } player[9] = player[7]; } @@ -1806,10 +1806,10 @@ player[23] = 1; else { if(pstates[r&0xFF].state != ST_GAS) - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy*dt; - } + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy*dt; + } } player[17] = player[15]; } @@ -1826,14 +1826,14 @@ player[23] = 1; //Keeping legs distance if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) { - player[21] -= 0.2; - player[25] += 0.2; + player[21] -= 0.2; + player[25] += 0.2; } if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) { player[19] -= 0.2; - player[23] += 0.2; + player[23] += 0.2; } //If legs touch something @@ -1900,16 +1900,16 @@ player[23] = 1; } if(t==PT_YEST) { - if(parts[i].temp>303&&parts[i].temp<317){ - create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); - } + if(parts[i].temp>303&&parts[i].temp<317) { + create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_YEST); + } } if(t==PT_PLSM&&parts[i].ctype == PT_NBLE&&parts[i].life <=1) { parts[i].type = PT_NBLE; parts[i].life = 0; } - if (t==PT_FIRE && parts[i].life <=1 && parts[i].temp<673) + if (t==PT_FIRE && parts[i].life <=1 && parts[i].temp<673) { t = parts[i].type = PT_SMKE; parts[i].life = rand()%20+250; @@ -2068,16 +2068,16 @@ player[23] = 1; } } } - if(nx=XRES-CELL || ny=YRES-CELL) - { + if(nx=XRES-CELL || ny=YRES-CELL) + { kill_part(i); continue; } } - if(framerender){ - framerender = 0; - sys_pause = 1; - } + if(framerender) { + framerender = 0; + sys_pause = 1; + } } void update_particles(pixel *vid) diff --git a/powder.h b/powder.h index 866015f13..d4bc90f5f 100644 --- a/powder.h +++ b/powder.h @@ -137,7 +137,7 @@ struct particle float temp; float pavg[2]; int flags; - int tmp; + int tmp; }; typedef struct particle particle; @@ -244,15 +244,15 @@ static const part_type ptypes[PT_NUM] = {"SMKE", PIXPACK(0x222222), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.00f, 0.001f * CFDS, 1, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+400.0f+273.15f, 88, "Smoke"}, {"DESL", PIXPACK(0x440000), 1.0f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.0f, 0.0f * CFDS, 2, 2, 0, 0, 5, 1, SC_LIQUID, R_TEMP+0.0f +273.15f, 42, "Liquid. Vaporises under low pressure, explodes under high pressure and temperatures"}, {"COAL", PIXPACK(0x222222), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.0f, 0.0f * CFDS, 0, 10, 0, 0, 20, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 200, "Solid. Burns slowly."}, - {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f +273.15f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, - {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, - {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, - {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, - {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, - {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Thermite."}, - {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow."}, - {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, - //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description + {"LO2", PIXPACK(0x80A0EF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 5000, 0, 0, 0, 1, SC_LIQUID, -210.0f +273.15f, 70, "Liquid Oxygen. Very cold. Reacts with fire"}, + {"O2", PIXPACK(0x80A0FF), 2.0f, 0.00f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 3.0f, 0.000f * CFDS, 0, 1000, 0, 0, 0, 1, SC_GAS, R_TEMP+0.0f +273.15f, 70, "Gas. Ignites easily."}, + {"INWR", PIXPACK(0x544141), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Insulated Wire. Doesn't conduct to metal or semiconductors."}, + {"YEST", PIXPACK(0xEEE0C0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 15, 0, 0, 30, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Yeast, grows when warm (~37C)."}, + {"DYST", PIXPACK(0xBBB0A0), 0.7f, 0.02f * CFDS, 0.96f, 0.80f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 20, 0, 0, 30, 0, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Deat Yeast."}, + {"THRM", PIXPACK(0xA08090), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 211, "Thermite."}, + {"GLOW", PIXPACK(0x445544), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 2, 1, SC_LIQUID, R_TEMP+20.0f+273.15f, 44, "Glow."}, + {"BRCK", PIXPACK(0x808080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 251, "Brick, breakable building material."}, + //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Section H Ins(real world, by triclops200) Description }; static part_state pstates[PT_NUM] = @@ -320,11 +320,11 @@ static part_state pstates[PT_NUM] = /* COAL */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* LO2 */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_O2, 453.0f, PT_NONE, 0.0f}, /* O2 */ {ST_GAS, PT_NONE, 0.0f, PT_LO2, 50.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* INWR */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* YEST */ {ST_SOLID, PT_NONE, 0.0f, PT_DYST, 273.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* DYST */ {ST_SOLID, PT_NONE, 0.0f, PT_DUST, 473.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* THRM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, + /* GLOW */ {ST_LIQUID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BRCK */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1223.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; static unsigned char can_move[PT_NUM][PT_NUM] = @@ -333,82 +333,82 @@ static unsigned char can_move[PT_NUM][PT_NUM] = /* A 0 1 | B ligher than A */ /* B 1 0 | A heavier than B */ -/* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y */ -/* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ -/* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ -/* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ -/* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ -/* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0}, /* Dust */ -/* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Watr */ -/* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Oill */ -/* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ -/* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Stne */ -/* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Lava */ -/* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0}, /* Gunp */ -/* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Nitr */ -/* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ -/* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ -/* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ -/* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ -/* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Icei */ -/* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ -/* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ -/* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* Snow */ -/* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ -/* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Neut */ -/* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Plut */ -/* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ -/* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ -/* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ -/* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ -/* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,1,0}, /* Cnct */ -/* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Dstw */ -/* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* Salt */ -/* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, /* Sltw */ -/* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ -/* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ -/* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Brml */ -/* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ -/* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Uran */ -/* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ -/* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0}, /* MWax */ -/* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ -/* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ -/* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ -/* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ -/* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ -/* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ -/* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ -/* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0}, /* LRbd */ -/* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ -/* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Sand */ -/* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ -/* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ -/* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* BGla */ -/* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ -/* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ -/* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ -/* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* NIce */ -/* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ -/* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ -/* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ -/* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ -/* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ -/* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ -/* DESL */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ -/* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ -/* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* LO2 */ -/* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0}, /* O2 */ -/* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ -/* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* YEST */ -/* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* DYST */ -/* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* THRM */ -/* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, -/* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ -/* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ -/* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ -/* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ + /* N D W O F S L G N C G P D I M S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y */ + /* o u a i i t a u i l a l f c e p n o e l l c o t n s a l m m r h r a W S S N N H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ + /* n s t l r n v n t n s e r e t r o o u u n i i r c t l t n t m o a x a c c 2 S o o d b C n a c l d s r c L r r K C K a s a X W S*/ + /* e t r l e e a p r e s x m i l k w d t t t d d v t w t w d l t t n x n n U l l m d N d s n a r m d e E y y M H E s l l R T*/ + /* NONE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* None */ + /* DUST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0}, /* Dust */ + /* WATR */ {0,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Watr */ + /* OILL */ {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Oill */ + /* FIRE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Fire */ + /* STNE */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Stne */ + /* LAVA */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Lava */ + /* GUNP */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0}, /* Gunp */ + /* NITR */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* Nitr */ + /* CLNE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Clne */ + /* GASS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Gass */ + /* PLEX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plex */ + /* DFRM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Dfrm */ + /* ICEI */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Icei */ + /* METL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Metl */ + /* SPRK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Sprk */ + /* SNOW */ {0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0}, /* Snow */ + /* WOOD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wood */ + /* NEUT */ {0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Neut */ + /* PLUT */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Plut */ + /* PLNT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, /* Plnt */ + /* ACID */ {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Acid */ + /* VOID */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Void */ + /* WTRV */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wtrv */ + /* CNCT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,1,0}, /* Cnct */ + /* DSTW */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0}, /* Dstw */ + /* SALT */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* Salt */ + /* SLTW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, /* Sltw */ + /* DMND */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* Dmnd */ + /* BMTL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Bmlt */ + /* BRMT */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* Brml */ + /* PHOT */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Phot */ + /* URAN */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Uran */ + /* WAX */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Wax */ + /* MWAX */ {0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0}, /* MWax */ + /* PSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Pscn */ + /* NSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nscn */ + /* LNTG */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0}, /* LN2 */ + /* INSU */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Insu */ + /* BHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* BHol */ + /* WHOL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Whol */ + /* RBDM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Rbdm */ + /* LRBD */ {0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0}, /* LRbd */ + /* HSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* HSCN */ + /* SAND */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* Sand */ + /* GLAS */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Glas */ + /* CSCN */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Cscn */ + /* BGLA */ {0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0}, /* BGla */ + /* THDR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Thdr */ + /* PLSM */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Plsm */ + /* ETRD */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Etrd */ + /* NICE */ {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, /* NIce */ + /* NBLE */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Nble */ + /* BTRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Btry */ + /* LCRY */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* LCry */ + /* STKM */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, /* StkM */ + /* SWCH */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Swch */ + /* SMKE */ {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Smke */ + /* DESL */ {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Desl */ + /* COAL */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* Coal */ + /* LO2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0}, /* LO2 */ + /* O2 */ {0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0}, /* O2 */ + /* INWR */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, /* INWR */ + /* YEST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* YEST */ + /* DYST */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0}, /* DYST */ + /* THRM */ {0,1,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,0}, /* THRM */ + /* GLOW */ {0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0}, + /* BRCK */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* N D W O F M L G N C G P D I W S S W N P P A V W C D S S D B B P U W M P N L I B W R L H S G C B T P E N N B L S S S P D C L O I Y*/ + /* o u a i i e a u i l a l f c i p n o e l l c o t n s a l m m r h r a W S S N n H H b R S a l s G h l t i B t C T W M l e o O 2 N E*/ + /* n s t l r t v n t n s e r e r r o o u u n i i r c t l t n t m o a x a c c 2 s o o d b C n a c l d s r c L r r K C K a s a X W S*/ + /* e t r l e l a p r e s x m i e k w d t t t d d v t w t w d l t t n x n n u l l m d N d s n a r m d e E y y M H E s l l R T*/ }; extern int isplayer; From 17f7caf5d5adee680d511e692bb757afe1402e5d Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Tue, 7 Sep 2010 20:38:08 +0200 Subject: [PATCH 143/237] added auto update and build file.. will see if it works --- script.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100755 script.sh diff --git a/script.sh b/script.sh new file mode 100755 index 000000000..682a4aeed --- /dev/null +++ b/script.sh @@ -0,0 +1,11 @@ +#!/bin/bash +git pull +make powder-64-sse3 +make powder-64-sse2 +make powder-sse3 +make powder-debug +make powder-sse2 +make powder +make powder-sse +tar czf PowderToyGit.tar.gz ./ + From 89dc0c34c1ac946dcc3589f5c6268f7b380ed4b1 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 10 Sep 2010 15:28:53 +0200 Subject: [PATCH 144/237] fixed LN2 freezing. --- powder.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.h b/powder.h index d4bc90f5f..a25951bfb 100644 --- a/powder.h +++ b/powder.h @@ -221,7 +221,7 @@ static const part_type ptypes[PT_NUM] = {"MWAX", PIXPACK(0xE0E0AA), 0.3f, 0.02f * CFDS, 0.95f, 0.80f, 0.0f, 0.15f, 0.00f, 0.000001f* CFDS,2, 5, 0, 0, 2, 1, SC_LIQUID, R_TEMP+28.0f+273.15f, 44, "Liquid Wax."}, {"PSCN", PIXPACK(0x805050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "P-Type Silicon, Will transfer current to any conductor."}, {"NSCN", PIXPACK(0x505080), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "N-Type Silicon, Will only transfer current to P-Type Silicon."}, - {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -205.0f +273.15f, 70, "Liquid Nitrogen. Very cold."}, + {"LN2", PIXPACK(0x80A0DF), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 0, 1, SC_LIQUID, -195.0f +273.15f, 70, "Liquid Nitrogen. Very cold."}, {"INSL", PIXPACK(0x9EA3B6), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 7, 0, 0, 10, 1, SC_SPECIAL, R_TEMP+0.0f +273.15f, 0, "Insulator, does not conduct heat or electricity."}, {"BHOL", PIXPACK(0x202020), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, -0.01f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP+70.0f+273.15f, 255, "Black hole, sucks in other particles and heats up."}, {"WHOL", PIXPACK(0xEFEFEF), 0.0f, 0.00f * CFDS, 0.95f, 0.00f, 0.0f, 0.0f, 0.00f, 0.010f * CFDS, 0, 0, 0, 0, 0, 1, SC_SPECIAL, R_TEMP-16.0f+273.15f, 255, "White hole, pushes other particles away."}, @@ -295,7 +295,7 @@ static part_state pstates[PT_NUM] = /* MWAX */ {ST_LIQUID, PT_WAX, 318.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 673.0f}, /* PSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* NSCN */ {ST_SOLID, PT_NONE, 0.0f, PT_LAVA, 1687.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, - /* LNTG */ {ST_SOLID, PT_NICE, 75.0f, PT_NONE, 0.0f, PT_NONE, 78.0f, PT_NONE, 0.0f}, + /* LNTG */ {ST_SOLID, PT_NICE, 76.0f, PT_NONE, 0.0f, PT_NONE, 78.0f, PT_NONE, 0.0f}, /* FOAM */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* WHOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, From b89be2174921dc4f4e15911ce59546ef16f65dd6 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 10 Sep 2010 15:32:49 +0200 Subject: [PATCH 145/237] changed temperature of THDR and PLSM --- powder.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/powder.h b/powder.h index a25951bfb..469b45d89 100644 --- a/powder.h +++ b/powder.h @@ -232,8 +232,8 @@ static const part_type ptypes[PT_NUM] = {"GLAS", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, SC_SOLIDS, R_TEMP+0.0f +273.15f, 150, "Solid. Meltable. Shatters under pressure"}, {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 120C)"}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels."}, - {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 3500.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 3500.0f +273.15f, 115, "Plasma, extremely hot."}, + {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, SC_ELEC, 9000.0f +273.15f, 251, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals."}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, SC_GAS, 9000.0f +273.15f, 115, "Plasma, extremely hot."}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)"}, {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, SC_SOLIDS, -250.0f +273.15f, 46, "Nitrogen Ice."}, {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when intruduced to electricity"}, From 959f3a24c61f234d7c2cab86072011076b14be17 Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 10 Sep 2010 22:10:41 +0200 Subject: [PATCH 146/237] added a test blendpixel for opengl. No idea if it works --- Makefile | 6 +++--- graphics.c | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 72e2617b7..233d4933a 100755 --- a/Makefile +++ b/Makefile @@ -3,9 +3,9 @@ SOURCES := *.c CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations LFLAGS := -lSDL -lm -lbz2 -MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 -MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 -msse2 -MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE +MFLAGS_SSE3 := -march=native -DX86 -DX86_SSE3 -msse3 +MFLAGS_SSE2 := -march=native-DX86 -DX86_SSE2 -msse2 +MFLAGS_SSE := -march=native -DX86 -DX86_SSE FLAGS_DBUG := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -pg -O2 -march=k8 -DX86 -DX86_SSE3 -msse3 -lSDL -lm -lbz2 COMPILER := gcc LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 diff --git a/graphics.c b/graphics.c index 89626986e..6c1afdbf7 100644 --- a/graphics.c +++ b/graphics.c @@ -967,6 +967,14 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) #endif { #ifdef OpenGL + if(x<0 || y<0 || x>=XRES || r>=YRES) + return; + if(a!=255) + { + glBegin (GL_QUADS); + glColor4ub(r,g,b,a); + glVertex2i(x, y); + } #else pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) From d640bd26d8b7f5b53f0f685e53ce5181f349fad4 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 10 Sep 2010 21:13:29 +0100 Subject: [PATCH 147/237] Some changes --- interface.c | 9 +++++---- powder.c | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/interface.c b/interface.c index f6ef74901..a17cacaa3 100644 --- a/interface.c +++ b/interface.c @@ -2002,6 +2002,7 @@ int search_ui(pixel *vid_buf) dp = pos; } } + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2, 6, YRES/GRID_S+3, 128, 128, 128, 255); if(mp==pos && !st) drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); else @@ -2060,11 +2061,11 @@ int search_ui(pixel *vid_buf) nyd = search_scoredown[pos]/ry; } - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); - fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 57, 187, 57, 255); + fillrect(vid_buf, gx-1+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 57, 57, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); - drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + //drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); } } diff --git a/powder.c b/powder.c index 770e87747..449693ffc 100644 --- a/powder.c +++ b/powder.c @@ -63,7 +63,7 @@ int try_move(int i, int x, int y, int nx, int ny) { return 1; } - if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE) + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) { return 0; } @@ -514,6 +514,7 @@ void update_particles_i(pixel *vid, int start, int inc) (bmap[y/CELL][x/CELL]==2) || (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==13 && ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE) || (bmap[y/CELL][x/CELL]==6 && (t==PT_METL || t==PT_SPRK)) || (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) && (t!=PT_STKM))) { From c083860ea1f3547090b71d18f77bc3527333252e Mon Sep 17 00:00:00 2001 From: Felix Wallin Date: Fri, 10 Sep 2010 22:33:01 +0200 Subject: [PATCH 148/237] added some opengl stuff, strange bug with rendering it tho --- graphics.c | 43 ++++++++++++++++++++++++++++++++++++++++++ powder-64-sse3-opengl | Bin 0 -> 287768 bytes 2 files changed, 43 insertions(+) create mode 100755 powder-64-sse3-opengl diff --git a/graphics.c b/graphics.c index 6c1afdbf7..eeb0d502e 100644 --- a/graphics.c +++ b/graphics.c @@ -975,6 +975,7 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) glColor4ub(r,g,b,a); glVertex2i(x, y); } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); #else pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) @@ -1175,6 +1176,48 @@ void draw_parts(pixel *vid) float pt = R_TEMP; for(i = 0; i;3n<(fG%)+d0B$a?cv0QSIXn-{AYP2Yc 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