From 90fed22627205dde8fdefc36762c918642148b0d Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sun, 22 Dec 2013 17:07:17 +0000 Subject: [PATCH] colormaps: Generate colormaps programatically. This replaces the statically generated colormaps with equivalent colormap lumps that are generated by the colormap.py script (which now has parameters to control the generated colormap). --- .gitignore | 2 +- lumps/bloodmap.lmp | 2 +- lumps/bluemap.lmp | 2 +- lumps/cph/misc-lumps/Makefile | 51 ++++++-- lumps/cph/misc-lumps/colormap.py | 194 ++++++++++++++++++++++++------- lumps/cyb/bloodmap.lmp | Bin 8704 -> 0 bytes lumps/cyb/bluemap.lmp | Bin 8704 -> 0 bytes lumps/cyb/lavamap.lmp | 1 - lumps/cyb/nukemap.lmp | Bin 8704 -> 0 bytes lumps/fogmap.lmp | 2 +- lumps/jond/mfademap.lmp | Bin 8776 -> 0 bytes lumps/lavamap.lmp | 2 +- lumps/mfademap.lmp | 2 +- lumps/nukemap.lmp | 2 +- lumps/oblivion/fogmap.lmp | Bin 8704 -> 0 bytes lumps/oblivion/fogmap.txt | 8 -- 16 files changed, 200 insertions(+), 68 deletions(-) delete mode 100644 lumps/cyb/bloodmap.lmp delete mode 100644 lumps/cyb/bluemap.lmp delete mode 100644 lumps/cyb/lavamap.lmp delete mode 100644 lumps/cyb/nukemap.lmp delete mode 100644 lumps/jond/mfademap.lmp delete mode 100644 lumps/oblivion/fogmap.lmp delete mode 100644 lumps/oblivion/fogmap.txt diff --git a/.gitignore b/.gitignore index a03df09f..e9019424 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ deutex.log graphics/titlepic/freedm.gif graphics/titlepic/freedoom.gif graphics/titlepic/ultdoom.gif -lumps/cph/misc-lumps/colormap.lmp +lumps/cph/misc-lumps/*map.lmp lumps/cph/misc-lumps/playpal.lmp lumps/freedoom.lmp lumps/freedm.lmp diff --git a/lumps/bloodmap.lmp b/lumps/bloodmap.lmp index dd40eab6..935e1f6a 120000 --- a/lumps/bloodmap.lmp +++ b/lumps/bloodmap.lmp @@ -1 +1 @@ -cyb/bloodmap.lmp \ No newline at end of file +cph/misc-lumps/bloodmap.lmp \ No newline at end of file diff --git a/lumps/bluemap.lmp b/lumps/bluemap.lmp index 48d1261e..576a48a4 120000 --- a/lumps/bluemap.lmp +++ b/lumps/bluemap.lmp @@ -1 +1 @@ -cyb/bluemap.lmp \ No newline at end of file +cph/misc-lumps/bluemap.lmp \ No newline at end of file diff --git a/lumps/cph/misc-lumps/Makefile b/lumps/cph/misc-lumps/Makefile index c52c136c..13c2ba92 100644 --- a/lumps/cph/misc-lumps/Makefile +++ b/lumps/cph/misc-lumps/Makefile @@ -1,20 +1,51 @@ -all : playpal.lmp colormap.lmp +COLORMAPS = colormap.lmp \ + bloodmap.lmp bluemap.lmp lavamap.lmp nukemap.lmp \ + fogmap.lmp mfademap.lmp -playpal.lmp : playpal-base.lmp playpal.py +all: playpal.lmp $(COLORMAPS) + +playpal.lmp: playpal-base.lmp playpal.py ./playpal.py playpal-base.lmp > playpal.lmp -colormap.lmp : playpal.lmp colormap.py +colormap.lmp: playpal.lmp colormap.py ./colormap.py playpal.lmp > colormap.lmp -SOURCES=playpal.py colormap.py COPYING Makefile -VERSION=0.0.1 +# Blue colormap applies a full blue tint. The brightness here is +# adjusted slightly because the default is too dark. -dist : doom-misc-lumps-$(VERSION).tar.gz +bluemap.lmp: playpal.lmp colormap.py + ./colormap.py --tint_color='#0000ff' --tint_pct=100 \ + --tint_bright=0.6 playpal.lmp > bluemap.lmp -doom-misc-lumps-$(VERSION).tar.gz : $(SOURCES) - tar czf $@ $(SOURCES) +# "Fog" effect maps that darken to a color other than black: + +fogmap.lmp: playpal.lmp colormap.py + ./colormap.py --dark_color='#505050' playpal.lmp > fogmap.lmp + +mfademap.lmp: playpal.lmp colormap.py + ./colormap.py --dark_color='#2b230f' playpal.lmp > mfademap.lmp + +# "Liquid" colormaps that apply a tint. With a liquid effect we also +# usually want to use --dark_color as well, because we want to darken +# to something like the liquid color instead of black. + +bloodmap.lmp: playpal.lmp colormap.py + ./colormap.py --tint_color='#ff0000' --dark_color='#500000' \ + --tint_pct=100 playpal.lmp > bloodmap.lmp + +# TODO: The current lava effect is just very bright orange. Before the +# change to programatically-generated lavamap we had a better effect. +lavamap.lmp: playpal.lmp colormap.py + ./colormap.py --tint_color='#ff6000' --tint_pct=80 \ + --tint_bright=0.8 --dark_color='#ff6000' \ + playpal.lmp > lavamap.lmp + +nukemap.lmp: playpal.lmp colormap.py + ./colormap.py --tint_color='#00ff00' --tint_pct=70 \ + --dark_color='#005000' playpal.lmp > nukemap.lmp clean: - rm -f playpal.lmp colormap.lmp doom-misc-lumps-$(VERSION).tar.gz + rm -f playpal.lmp $(COLORMAPS) + +.PHONY: clean -.PHONY : dist clean diff --git a/lumps/cph/misc-lumps/colormap.py b/lumps/cph/misc-lumps/colormap.py index 58906838..2633e24d 100755 --- a/lumps/cph/misc-lumps/colormap.py +++ b/lumps/cph/misc-lumps/colormap.py @@ -1,13 +1,7 @@ #!/usr/bin/env python # -# Takes PLAYPAL as input (filename is the only parameter) -# Produces a light graduated COLORMAP on stdout -# O(n^2) -# -# This is a Python version of Colin's original Perl script. -# # Copyright (C) 2001 Colin Phipps -# Copyright (C) 2008 Simon Howard +# Copyright (C) 2008, 2013 Simon Howard # Parts copyright (C) 1999 by id Software (http://www.idsoftware.com/) # # This program is free software; you can redistribute it and/or modify @@ -23,14 +17,44 @@ # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Takes PLAYPAL as input (filename is the only parameter) +# Produces a light graduated COLORMAP on stdout +# O(n^2) +# +# This was originally a Perl script by Colin Phipps; it was converted +# to Python and now is a more generic tool for generating all kinds of +# COLORMAP effects. +# import os import sys import struct -# Return palette read from named file +# Parameters affecting colormap generation: + +# "Darkness" is this color, which is usually black, but can be +# overridden (RGB 0-255): +dark_color = (0, 0, 0) + +# Color to tint the colormap (RGB 0.0-1.0): +tint_color = (255, 255, 255) + +# Fractional balance between tint and normal color. 0 is no tint applied, +# 1.0 is full tint. +tint_frac = 0 + +# Fudge factor to adjust brightness when calculating 'tinted' version +# of colors. Larger values are brighter but may cause color clipping. +# A value of 0.33 is a straight-average of the RGB channels. Maximum +# sensible value is 1.0, though it can be overdriven for fancy +# brightness effects. +tint_bright = 0.5 def read_palette(filename): + """Read palette from file and return a list of tuples containing + RGB values.""" f = open(filename, "rb") colors = [] @@ -43,17 +67,20 @@ def read_palette(filename): return colors -def square(x): - return x * x - # Return closest palette entry to the given RGB triple -def search_palette(colors, target): +def search_palette(palette, target): + """Search the given palette and find the nearest matching + color to the given color, returning an index into the + palette of the color that best matches.""" best_diff = None best_index = None - for i in range(len(colors)): - color = colors[i] + def square(x): + return x * x + + for i in range(len(palette)): + color = palette[i] diff = square(target[0] - color[0]) \ + square(target[1] - color[1]) \ @@ -65,35 +92,78 @@ def search_palette(colors, target): return best_index -def generate_colormap(colors, transform_function): +def generate_colormap(colors, palette): + """Given a list of colors, translate these into indexes into + the given palette, finding the nearest color where an exact + match cannot be found.""" result = [] for color in colors: - transformed_color = transform_function(color) - transformed_index = search_palette(colors, transformed_color) - result.append(transformed_index) + index = search_palette(palette, color) + result.append(index) return result -def generate_darkened_colormap(colors, factor): +def tint_colors(colors, tint, bright=0.5): + """Given a list of colors, tint them a particular color.""" - darken_function = lambda c: ( c[0] * factor, \ - c[1] * factor, \ - c[2] * factor ) + result = [] + for c in colors: + # I've experimented with different methods of calculating + # intensity, but this seems to work the best. This is basically + # doing an average of the full channels, but a straight + # average causes the picture to get darker - eg. (0,0,255) + # maps to (87,87,87). So we have a controllable brightness + # factor that allows the brightness to be adjusted. + intensity = min((c[0] + c[1] + c[2]) * bright, 255) / 255.0 + result.append(( + tint[0] * intensity, + tint[1] * intensity, + tint[2] * intensity, + )) - return generate_colormap(colors, darken_function) + return result + +def blend_colors(colors1, colors2, factor=0.5): + """Blend the two given lists of colors, with 'factor' controlling + the mix between the two. factor=0 is exactly colors1, while + factor=1 is exactly colors2. Returns a list of blended colors.""" + result = [] + + for index, c1 in enumerate(colors1): + c2 = colors2[index] + + result.append(( + c2[0] * factor + c1[0] * (1 - factor), + c2[1] * factor + c1[1] * (1 - factor), + c2[2] * factor + c1[2] * (1 - factor), + )) + + return result + +def invert_colors(colors): + """Given a list of colors, translate them to inverted monochrome.""" + result = [] + + for color in colors: + average = (color[0] + color[1] + color[2]) / 3 + inverse = 255 - average + + result.append((inverse, inverse, inverse)) + + return result + +def solid_color_list(color): + """Generate a 256-entry palette where all entries are the + same color.""" + return [color] * 256 def output_colormap(colormap): + """Output the given palette to stdout.""" for c in colormap: x = struct.pack("B", c) os.write(sys.stdout.fileno(), x) -def inverse_color(color): - average = (color[0] + color[1] + color[2]) / 3 - inverse = 255 - average - - return (inverse, inverse, inverse) - def print_palette(colors): for y in range(16): for x in range(16): @@ -103,25 +173,65 @@ def print_palette(colors): print() -if len(sys.argv) < 2: - print("Usage: %s > output-file.lmp" % sys.argv[0]) +def parse_color_code(s): + """Parse a color code in HTML color code format, into an RGB + 3-tuple value.""" + if not s.startswith('#') or len(s) != 7: + raise Exception('Not in HTML color code form: %s' % s) + return (int(s[1:3], 16), int(s[3:5], 16), int(s[5:7], 16)) + +def set_parameter(name, value): + """Set configuration value, from command line parameters.""" + global dark_color, tint_color, tint_frac, tint_bright + + if name == 'dark_color': + dark_color = parse_color_code(value) + elif name == 'tint_color': + tint_color = parse_color_code(value) + elif name == 'tint_pct': + tint_frac = int(value) / 100.0 + elif name == 'tint_bright': + tint_bright = float(value) + else: + raise Exception("Unknown parameter: '%s'" % name) + +# Parse command line. + +playpal_filename = None + +for arg in sys.argv[1:]: + if arg.startswith('--') and '=' in arg: + key, val = arg[2:].split('=', 2) + set_parameter(key, val) + else: + playpal_filename = arg + +if playpal_filename is None: + print("Usage: %s playpal.lmp > output-file.lmp" % sys.argv[0]) sys.exit(1) -colors = read_palette(sys.argv[1]) +palette = read_palette(playpal_filename) +colors = palette -#print_palette(colors) -#sys.exit(0) +# Apply tint, if enabled. +# The tint is intentionally applied *before* the darkening effect is +# applied. This allows us to darken to a different color than the tint +# color, if so desired. +if tint_frac > 0: + colors = blend_colors(palette, + tint_colors(colors, tint_color, tint_bright), + tint_frac) -# Main color ranges +# Generate colormaps for different darkness levels, by blending between +# the default colors and a palette where every entry is the "dark" color. +dark = solid_color_list(dark_color) for i in range(32): darken_factor = (32 - i) / 32.0 - colormap = generate_darkened_colormap(colors, darken_factor) - output_colormap(colormap) + darkened_colors = blend_colors(dark, colors, darken_factor) + output_colormap(generate_colormap(darkened_colors, palette)) -# Print inverse color map - -inverse_colormap = generate_colormap(colors, inverse_color) - -output_colormap(inverse_colormap) +# Inverse color map for invulnerability effect. +inverse_colors = invert_colors(palette) +output_colormap(generate_colormap(inverse_colors, palette)) diff --git a/lumps/cyb/bloodmap.lmp b/lumps/cyb/bloodmap.lmp deleted file mode 100644 index 9a2bb2acc707238eb925b1c8b565fd77d8de2f10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8704 zcmd^^U6QLf423D4*bH8K0t5(sCr&)oYyRCNGbmh?%oAnC5}$4B1}-Hnei z-H*rPIZe~NEU(wPZri@U-^X#D*Y){~V@jC!17ehd&`ya9)AxPH;+5lA%o(iZQq1;! zDAEl~YJJE-3@fNA9bAMZkLSFs`*DU$ei2s7$g8oN-gbCSMx4+;|&nEwo!C%u~@-KeX zNKQX9TuO)8FX@l`dmTX%#Q?i?nIQcmQjJPWx8$n)KOc{YEOq)XDE-bqwk{@cgGK_+_tDKP&hRhEwIQ940vdeV%^0FA0@6`E5_A_!XGC{DEBfi4T6? zC8&3*7`?2?&vLz4{;dCL1`_P5`f1e4KTYeqsei~(kYU2YZReUNSb=~34ZpG<4C1eM ze@gQrg&BXX_AcDLV=3ZYfhqiGH^C3r&uJmL^IOarp)_Or*ZW`m z^J3Lc{u%hc@Gmpczh4LTf0KWLk)f&nXj&;HPQ6~N5w;W@y%!BXW$&)H$Ru!?k7K=B9i1yKMYnT zt^s1W5;;BW9%ZCys(<2ZFWW9*T3PvC{>VQH9Q?q-rc_??14sVwy{6(fxpmp$?inFZU*N6!v-9cvM%t{`L`P4frWq%X#_>Ka5=9hs_Npy(z&f6;euku3rI#Gei&pctL)6 z&tR|_eDiM=|L*)95Wvrc_=8t4TuPJKhdt3F#b5Z5)kr>9Tk(4)ow&Ulx-b0v+{^m# zdcy>e$o3WjVqTd)2v5z=_!A!h;%6|}3z2?QXvsgvuj^L*SN#1J1*xpikkT((_~_p> zfXu&3kvEUDs`N8{Rq(xWc`y)n%YNA`t7_dekDbc2WE*Zp0P z+A-f6zWJ$$hxh~E;^h5NaiRzeF>^Os(h0B#y8C3mC)E6GT@=MS9v`@hfb2VySo5E6 zIO+Un#n0q>>Y`OK6^u6B!S^@8ODqIE#mXv|$9PVDNx$V^n(zU;Rwc!hUE!s~W5#3y zAMZtY42a6Kd;0l(a;*6w2W)-dJdWqV>tFcQ-!1`x6KPJ6DieLKlpo4XV6{T;*Pt`ae!Snc)#`30~YounYeba6m5~Hbl{p*0m#4!12-HaO(_QAWK zS&mRahWuRGkF0<70Q?xJqr&3Ca0WhM+CyYn&~yW<~lS1ueH)n~qQ zLB}`05R_KT#Wnh4 z{M4S)-=*Kk{EMlpJVu(c#R(#`#2L5P(34x!RsLPhPkEg=RPb#b^kV6d_fPmIrHwy%=QQ55nBr*y zQmb%aAM!hGxk@VP!_E{6SD=?nWEnEp`%xuK=CK!vU`})p@F!;ISc%}sH9vDWyZmr|7N|p)GTV| z!vN)qRE+9uDjESF$_p&b8r2xCnzQs^q|%$$@*?JAu#)3ttgAdUNlwC)#%q4}uSN>h zI;$%GL#UnqspfkmcpD?t4V~m+daDV)lq=P+$1{)M-bnL^T@0c4YyAIq`$mTc>bCPPUWizzCF>1DXnb?obcLQWrE@gETM#~gw`>2vNY|04%&&u0e*U?U7~ d$fq7A0Kqzm;2)Te$JnR$wl2s2E#Kd~{{Ur6HI4uP diff --git a/lumps/cyb/bluemap.lmp b/lumps/cyb/bluemap.lmp deleted file mode 100644 index 71d42ffa542f3b33f148fbb797e080bad172e64d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8704 zcmds+-O{5v4n=wYCrd~I&qDaQp1rmtW0G{&sWVqIt}ZaPENMxyAzu&2u-x|j81!#g zxBc;WKA*4GG)?ooEbsTaYEbRaH0?f)SCJH2w-CFljmTIkRaw^}UE7v=L#>pCttPNe zv*mW(-O+vB_hGo*AJ5nPR`1$w)$XGNrn%(gusyzMcv?0ul7|QCH?c0u?KVEAY53$X z{6Fv~zDxxP_ynor@9{tIzWE*MRE3`Znx8NzPQw4k{P)Vga;Wsb{*wMd{EE<7A=mWp z$2I#s{^B4-SRF7IRq#`5q+9&zP;xP#cxC>b-XHnDXZ|(s{3AC7zjN;AANhaJXZ}zA zeZR0pV*BzR?lL1oefn{`(tlivKk=#Mz=J0W+q+6BLQzzI@T)#mpyro#?kay({e4u> z|IUxKMRHR4&g`@9@to(g{;gj1|7ZTp2p+?K+5H3grvRGMAtaAe?nm(l9?IaVOd~J; zz^}n|jqU%zuS_P_*Zv>R{ImVV|KQf~3%~InhYuC;&x^LdDn+W7Oa9M-jD1b^+v#V1 z>YtoNR$U{I1yFbNDIb|#=>pe&)aU=eKLRzl;wDK-dzmq6pcq@UH%$gS{Y!yziSEB(s9;ZOW3 zl*~D+)UD&s{MO{bP24^v_Erb$zCsh#{e%ArKc^1o-u#yR3qSs#Qz{PlmDR}q`UieC zq|(3I%Pi_vP4>gv`UC&u|G>{<0%#XW;j_T`&q4y9ooPYMwY&In{xAHm+s%7U=@-Ak zuqgjk0m6R?KloM1_#w-~zCJVm$0h&9pIAXl{z$#Ab*RZme)zx@_yRgU@H6|)dGO~s zXMDxA_L0p=O>*NWj&AZH`JI){lju^8llfi#$^Z7AK|=9(p_@MbnO}k5*NIbH`~O&< zt^SY0{5o`Kfkl?i#xA3QZ=t}C02IF~Bs6t=R_92BW=Ri+=Tj8|$$j$A@eK65Gm={Pbh+%Zd!YgI^me`H|3syv8Nd+uUn>e@0UC1fG+j?sM=_JfZ)=C0lh z{{1i$bR0836?2{w#N#Kw_Wv{m|EuEfga(Fb$=D2Lr;_dEqIY%Q}=L(;UeT zwu+xv`OV}vMhFm|Iu9|3Httt`$u|DTSMxK#!dZ!-pN3zMT=1orsGjs+_~uVkNt1^& z(%W(Dnf?QOT+Q^u|K>Td+YP=2qr@Tk<=Q!~VTNfJ}eM^zcRRP=%cG8fr^r&})ph^0C8B=U4+@@rr11`fIM-==kJM;RnC2 z9e->4QA@rCKtP4?IqXaYn5S63(oUKK)Io6~4oi$!*%i7kZn{RUg`Xbvu6Pl1TYccc;VrQImd4`k0je0%F@x%ViMrXwfe%ZGZ2leYRFz^e^~}-oDgQ zn-o@vbV&`D?HlJuv_4E2brWLVrPTT&mV)K5)1aoYC;wtmreA-zG=E{YyNtb8HXPer zK3Oh|SW^tAha!|#o8CKq|2j^89IVb?oXM#xe>s>Ar&RJcct@$Jlj##b_z5QP#+8!9 z_c?`Z^6NW6a$l#PzaR8Rqr{g)$k~bmNqBfFis-87_eI-3@*n&W(mt)Macj}`_gcCf zHZrn^Ns7NK)alTJrL2VLS!dv@-Y)e1je@F-nf$ao{NZiq3ti!@D;3ACR1i=8u)=fc zz`sh4u?jcAn8Nq7sa8l(W6QEWriu_*}%GZ z#HauF@u%N0!dAH@etj=Azj!C0DIJvFFrdl;!uhE4hNbSx_R&ki zVUVu&{b)@RuVk@=SNg6sy0eaEiF)RNk(%(ER_|Aa8owUWta{Z#Pd$ad)}IzU zQ|9pdvt5L1QE3g~NK4FxDld}iQcP}ZP5Hvz>l^*~{ZKMq*DXXZbFR45ND!(?Uv}+5 zw=#wcuH?^%Ugs?rD#~QPr1c}-7W9~U*LzB$uPy32M2&`+c3_2RE8PyV#1;gM+?1-9|G5q)wXCb=evl;`zP&vec= zJ0CfNW diff --git a/lumps/cyb/lavamap.lmp b/lumps/cyb/lavamap.lmp deleted file mode 100644 index 7f1bf011..00000000 --- a/lumps/cyb/lavamap.lmp +++ /dev/null @@ -1 +0,0 @@ -..,.,+)))&&§(++..////,..,,+,§§§§§§§§¦§§§§§§.......,+))))*&§§§),...,,,)§()()§§),,,.///.,,,+*,)¦¦§§§§§§§§§§¦¦§§+.,,,,,+),))§(§(++,,.,,+§),,))§§§+..../..,.,+§))(§)))))+,,,,§§§§))+,+++,,,,)§§(++....,+)(,,,+§§¦¦¦§,§)..,,,,§§))),),),.....,,§§)§§)§)),..,.,()+,,....,.,+)))&&§(++.////,,.,,,,,§§§§§§§§¦§§§§§.......,+)))))&§§§),...,,,,)(()()§§),,.///.,,,+*,)¦¦§§§§§§§§§§.¦¦§§+.,,,,,+),))§(§(++,.,,+§)),,))§§§.+.../..,.,+§))(§)))))+,,,,§.§§))+,++,,,,,)§§(++....,+)(,,,+§§¦¦¦§,.))&,,,§§))))),,),.....,,§§)§§)§)),..,.,()+,,....,¦,+)))&&§()+.///,,..,,+,§§§§§§§§¦§§§§§§.......,+))))&&§§§),...,,,)§()()§§.),,///.,,,+*,))¦§§§§§§§§§§§.¦¦§§+.,,,,+),))§§(§(++,.,,+§),,))§§§+.+).)§§.+)+§)))()).)))+,,,,,//§))++++,,,,)§§(++.../.,+)(,,+§§§¦¦¦§,,))§,,,§§))),),,.,..(..,§§§+.§)§)),..,.,))+,,....,¦.+)))&&§(+.§///,..,,+,§§§§§§§§§¦§§§§§§....../+))//&&§§§),...,,,))§))()§§.,,,//.,,,+*,))¦¦§§§§§§§§§§§¦¦§§++,,,,,+),))§(§((++,,,+§),,))§§§§+++,./§.)+)+§))(§)&)))++,,,.///.))+++,,,,,)§§(++.../,++)(,,+§§¦¦¦¦)./)&§§,§§))),),,.,).))..,§§,+.§)))),..,.,))+,,....,¦/+)))&&§(+.§//,,..,,,§§§§§§§§§¦§§§§§§......././////§§§),....,,,)§()(()§§),,,/.,,,+*,))¦¦§§§§§§§§§§§.¦§§§+.,+,,+)),))§(§((++,,,+),,,))§§§§.++,./..)+)+)))(§)&)))+,,,,/./,.,)+++,,,,)§§§(++.../,+))(,,+§§¦¦¦§)///&§).§)))),),,//.)))..§§§,+.,))),,..,.,)),,,.,.,,¦/+)))&&§(+.§/,,..,,+,§§§§§§§§¦¦§§§§§........,,,,,,/§§)),..,,,,)§§))()§,.),,..,,,+*,)¦¦¦§§§§§§§§§§§..¦§§++.,+,,+),)))§(§(+++,,+§),,))§§§§+.++,)§..,..§)))(§)&)))+,,,,/,/,,+)++,,,,,)§§(+++....,+)((,++§§¦¦¦§)/,,,§,.§))),),,§/..)))).§§,,+§,))),...,..)),,..,.,,§/))))&§§(+.§,,..,..,§§§§§§§§¦¦§§§§§§........,,,,,,.§§),...,,,)§§()(()§§.),,.,,,+*,))¦¦§§§§§§§§§§§§.¦¦§§++.,+,+)),))§((§(++,,+§),,,))§§§+++++./§§.,§,§))(§)&&)))+,,,,/,,.,,§,,,,,,)§§§(++....,++)(,,§§§¦¦¦¦§)/,,,)..))),,,,,§/,,)))).§§,,§§).)),...,..)),,..).,,§,))))&§((..§.,.....§§§§§§§§§¦¦§§§§§.........,+,,,..,),...,,,,)§()(())§§)),,.,+**,))¦¦§§§§§§§§§§§§.¦¦§§§++.++,+),)))§((§(++,,§),,,))§§§§+.+++)§§§)+.,)))(§)&&)))+,,,,,+,.,§§,,,,,))§§§(++....,*))(,,§§§¦¦¦¦§),,,.).+))),),,§§,,,,))))§,,,.§).)),...,..),,,..).,,§,))))&§((.§,.,,....§§§§§§§§¦¦§§§§§..........+,,,..,,,...,,,,)§())())§§.),,,.+*,,)¦¦¦§§§§§§§§§§§§§.¦¦§§++.,+++)),))§§(§((++,,)),,))§§§§+.+++.)§§.)+.,)))(§)&&))+),,,.,,.,+§§,,,,,)§§§(+++....+,¦)(,§§§§¦¦¦¦§),+,,,.+)),),,§§§,,,,)))),,,§.§).)),...,..),,,..).,,§,))))&§((.§,,,....§§)§§(§§¦¦§§§§§§..........*,..,,,,...,,,,)§(()(())§§§),,,.*,))¦¦¦§§§§§§§§§§§§§.¦¦¦§§+..,+++),)))§((§((++,,),,)))§§§++.+++.)§§+,..,))(§)&&&))+)),,.,,,.,§§,,,,)§§§((++.....*)¦§(,§§§¦¦¦¦§§),,.,..+),),,,§§,,,,.)))),,,§.,).),,...,.+)¦,,..§.,)§+))))&§((.§,,.....§)§§((§§¦¦§§§§§...........,.,,,,+...,,,,)§§()(())§§§),§,..,)¦¦¦§§§§§§§§§§§§§§..¦¦§§++..,++),,))§§(§§(+++,,,,)))§§§§+++++..§§§.+.,,)((§)&&,))+)),,.+),.§§§,,,))§§§(+++.....,¦§§§,§§§¦¦¦¦§))+),,.,,,,,,,,§,,+,.,)))),,,§,,..),,..,,.+).,,..§.,)+,))))&§,(,,,.....,)§§())((¦§§§§§............),,,,+...,,,))§§()((()§,§§),§,..)¦¦¦§§§§§§§§§§§§§§§.¦¦§§§++.,+++),)))§((§§(+++,),,))§§§§+..+++..§§+++.,,)((§)&&,).)((,,.,¦+.§§§,,))§§§((++......)¦§§§§§§§¦¦¦¦§)),),..,,,,,,,,,,,,.,,)))+,,,.,,..),...,,.,).,,..§.,)+)))))+§(),,,...,,))§((((((§§§§§.............¦,,++§.).,,))§(()((()§,§§§.,,,..¦¦§§§§§§§§§§§§§§§§.¦¦§§§++..,++),)))§§((§((+++,))))§§§§++.+++..,§§.)..,,)(§)&&&&..))(§§.)¦§.§§§)))§§§((+++......¦§§§§¦¦¦¦¦¦¦¦§),)¦+.,,,,,,,,,,,,),,.))++,,..,,.,,,...,,.,+.,..+§.,)+¦))))+§()§,..,,,))§§§)((()§§§§§............,§++§§),..,))§(())(()),§§§.§,,...§§§§§§§§§§§§§§§§§.¦¦¦§§§+..,,++),)))§((§§((+++,)))§§§§§+.++++.,,§+++.,,,(§§)&&&&..)))§))¦§§,§§§))§§§§(+++......,§§§§§¦¦¦¦¦¦¦§§),¦§§),,,,,,,,,,,,¦¦+..+++,,..,,.,,,...,,.)+.,..+§.,).¦))))+§,),,.,,,)))§§(((())++§§............,,§§§)),,,.))§())(()))§§§§§.§,,..,§§§§§§§§§§§§§§§§.¦¦§§§§++..,++)))))§§(§§((+++,,))§§§§++.++++..,§§.++.,,,(§))&.&+..())§))¦§,,§§§§§§§§(++++......,§§§§§¦¦¦¦¦¦¦§)),¦§),.)§,,,,,,,,,¦§...+++,...,..,,....,,.§+.,...+.)).§))))§,,),,.,,))§§§§§(..+)++..............,,§§),,,,..//())(()))§,§§§.§§,,..,§§§§§§§§§§§§§§§.¦¦¦§§§++..,+++))))§§((§§((+++,,)§§§§++.++++..,,,+++..,,.§))&&,&+./)(§§§)§§,)§§§§§§§(++++.......,§§§§§¦¦¦¦¦¦¦§)),§§,,)§(,,,,,,,,,§§,..++,....,..,,....,,.()§,...+.)).§))))§,,),..)))§§§§§++.+)++§..§.........,,,,§,,,,)))//())((()§,,§§§..§,,,..,§§§§§§§§§§§§§..¦¦¦§§§+++.,,+++)))§§((§§(((+++,,)§§§++.+++++..,,,.++.,,,.§))&.,&+./))§§§)§§,)(§¦§§((++++.......,,§§§§§¦¦¦¦¦¦§§)),§§,)/(),,,,,,,,.§,,..),,....,..,,....,,.))§...,..)),§))).),)),..)§§§§§§+.+++++...§§§)))....,,,,,§§,)))))§§.((())§,§§§§..§§,,..,,§§§§§§§§§§§§.¦¦¦§§§§+++..,+++)))§§(((§§((++++,,)§§++.++++...,,,,+++.,,..))&&,&++/.()§)§)§§)§)¦§§((++++........,,§§§§.¦¦¦¦¦¦§)),.§§))/)(,,,,,,,..§,+.//,,....,.,,....,,..)(§...,+.)),§))).),))...§§§§§++.+++++...§§§))))))),,,,,,§§)))§§§§.(()))§,§§§§.§§§,,...,,§§§§§§§§§§..¦¦¦§§§§+++..,++++)))§§((§§((++++,,))§++.++++...,,,,+++.,,,..)&&.,++./.)§§)))§§§§(¦§§(++++........,,,§§§§¦¦¦¦¦¦§§)),.§§)§.((,,,,,,...§++//)),..)...,,....,,..()§..+,+.))+§))).),))..,§§§+++.+++++..§§§§)))))).,,,,,,,§§§§§§§§§§..),,,§§§..§§§,,)..,,,§§§§§§§§..¦¦¦§§§§§+++..,,+++))))(((§§(((++++,,))+.+++++...,,,,+.+..,,,..+&.,++.)..§§)§))§§§§(§§§++++.........,,,§§§.¦¦¦¦¦§§))),.§§§§.(),,,,,....§§§/..),)))...,,....,,..).§...++.))+§))).))))..,§§++.+++++...§§§))))))).,,,,,,,,§§§§§§§§...),,§+§...§§§,,)...,,,§§§§§..¦¦¦¦¦§§§§+++...,,+++)))))((§§(((+++++,,)).+§§+++...,,,+..+.,,,..,&.,,++.)..§§)§))§§§+.,§§++..........,,,,§§.¦§¦¦¦¦§))),..§§§§.)§,,,§)§.))§))...)))))).,,,....,,..))§...+..))+§))).,))).,,++.+++++....§§§)))))))..,,,,,,,,§§.§§+++.+),++§§..§§§§,,)...,,,)§§...¦¦¦¦§§§§§§+++...,+++++)))))§§§(((+++++,,,))§§§+++...,,,+....,,,...,.,,+++)).§§)§)).§§+.++§.+..........,,,,,§.¦§§§§§§§))),..§§§+.§§§§))§§)))§))).)§§)))).,,)...,,,..§)¦..,+..))+§))..)))),,,.+++++....§§§§))))))..,,,,,,,,,,.¦¦++..++)++§....§§§,,))....,,,).¦¦¦¦¦§§§§§§++++...,,++++)))))))§§(((++++++,,,))§+++...,,,+++...,,,,..,,,,+++))).§.)§)),§¦.++.............,,,,,,.¦§§+§§§§))),,..§.+.)§§))§§§))))§.)(§§§§))).,,,)...,,,..§§¦.+,)§.)))¦))..))).,,,+++++...§§§§)))))....,,,,,,,,,))¦¦¦+++++++§...§§§§,,)).....,,,))¦¦¦§§§§§§++++....,,+++++))))))))((((++++++,,,)))++...,,,+++...),,,,...,,,+++))),§.),,).,¦¦++.............,,,,,,)¦§§++)))))),,...¦¦+++§)§§§))))))¦¦(§§§§§)).,,,))...,,,..§§§..+),.)))¦))..))).,,)++....§§§§)))))....,,,,,,,,,,)))§§§§++++....§§§§,,,).....,,,,)))§§§§§§+++++....,,,+++++)))))))))((++++++++,,,)))...,,,++++...),,,,...,,,+++))),).),,)..,¦§+..§).........,,,,,,))§§++.))))),,....¦§§+..§§))))))))¦§§)..))).,,,,))..,,,,..).§.,+),.).)§))..))).,))+...§§§))))).....,,,,,,,,,,,))))§++++....§§§§,,)).......,,,,))))§§+++++.....,,,++++++)))))))))))++++++++,,,,))).,,,,++++...)),,,+...,,,)+)))))))&,,,..,,§++.§§).......,,,,,,,)))§++.,)))),,.....§§+..§§)))))))..§§)&)),,.,,,,))).,,,,...§,+.++)+.).)+))..))).))).,,,,,))......,,,,,,,,,,,)))))))++....§§§,,,,).......,,,,,,)))))++.....,,,,+++++++))))))))))))))+++++++,,,,,))).,+++++..))),,,))...,,,)))))))))),,,..,,,++.§)))....,,,,,,,,,))))+..,+,,,,,.....,++.,§,)))))...,,++&&,,,,,,,,)))),,,,,...),.,+))..).).)...))..))),++++......,,,,,,,,,,,,))))))))..,,,,,,,,,........,,,,,,,,)))))).,,,,,+++++++++)))))))))))))))))+++++,,,,,))))..+++)))))),,,)))))),,))))))))))))&,..,,,,.,,+...,,,,,,,,,,,)))))..,,++..........,..,,,))....,,,,,..,&&&&&,,,,)))),,,,....),,+))))...),....))..)))++....,,,,,,,,,,,,)))))))))))...++++++.......,,,,,,,,,,)))))))))+++++++++)))))))))))))))))))))))++,,,,,,))))))..)))))),))))))))),,))))))))))))))...,,,,),++..,,,,,,,,,,,))))))..+++))........,,,,++....,,,,,,,,,,++...§§,,,)))).,,,,......+)))),...)+....)...)))))),,,,,,,))))))))))))))))))....)))))))),,,,,,,,,,))))))))))))).))))))))))))))))))))))))))))))).,,,,,))))))))...)))))))))))))))))))))))))))))))).,,,,)))+))),,,,,,,)))))))))....))))).......,,,,+))),,,,,,,,,,,)+))..§§())))))..,,,.....,,))))))...))........)..))))))))))))))))))))))..........))))))))))))))))))))))))))))....))))))))))))))))))))))))))))....))))))))))).....))))))))))))))))))))))).))))))).,)))))).))))))))))))))).........))))),,,,,,,,,,.))))))))))))))))))),,,(())).)...........),))))))....)...........))))))))))))....................))))))))))))))))))..............))))))))))))))))))).............)))))...........))))))))........))......).......))))....))))))).................))))),,,,,,,....))))))))).......))))))))................)))))..),.,+..,,,./.,,,/+§¦.§§§§§§§§¦¦),*+,,,,../////..,)))+,.++§¦¦§§§§§§§§§§¦)),+,,,.//))++.++§¦¦§§§§§§§§§§¦¦),*,,,,.//§¦§§§§§§¦,+,./.,§§§§§§§§§¦¦),*,,§§§¦,+,.§§¦)*+,,)+¦§§¦*,.).¦§§§)+,,,,,../////..,).¦§§¦*,///..,,,.)+.§¦§§§§§§§¦),..))))++,+,,,.//,,,,,,,,.,¦§,,.§................................................................................................................................................................................................................................................................ \ No newline at end of file diff --git a/lumps/cyb/nukemap.lmp b/lumps/cyb/nukemap.lmp deleted file mode 100644 index 115bebca255649dbd426ec425b84b9434e0e5f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8704 zcmd^^+mfR=42HSng{RVl0I$CPL6T+2?9RpBjjOsbvMlM7WJ0HxYdwBl*SZ|%bsfj~ z`q|#^_m1)T92_U)80)%dymI_(sYun*&E*#iQ9-84)^+`&0)1fDaa`B1Vk4B(m?FRx z`WrOQxL%H8{D!eN)=Mt?+W`0#10WX>bLaNjIo+2VzwpO);D6`u_+R-u{=e~$6p8!) z;0J^1$2|TC|EtyiKgz#EeSbQCmY=Y zJXim|UdRA`7+bIZyVZa2pI0_@bo9Ob#s9N?$4@?lFyWJwgRM09DZH-4&mL<0+Qs%~ z|KmFKdGY_?D7F5VZ=Eg^;2uYU{MY#>{D{ZhuZSP`;0OErJ&r8{zVQuwnab{`d-BTw zp*nvW`Nj`?^Y7!FH-4I`b8Yh@DCV2|$o+Tzbv=6h6W>Vp)4#C(?CjCo1HbB=KkKK*ANW=0#I7sk)NJ=GP4Q!&#xLNX^p}cz_J8s-I8?}w zP8BCQ7VHU$wz2%EKmAUejD^FGMbC8)0r>+T=WPT3wt;?~>c5HqbLaPY zJdV%t`6yv?`Iq^@&guuA%YWs%?U26Kl}qHuj~I%BzZA9YS*n(M~` zsLXttIdQ-7=a2bS5Wr&;e>%f8T08JsT@(7k-tEB^%E^?q&5j%m#j!DNeu6 zPcDZ_C`2-={M-oRN>Nz>Kh>dI{6qmiIkAx8*H!#==lWFmC_2*({2kMO=Labj%%63A z;4g-M;v+^C*z2}}&|7+#OXo+45&pF(*3^QHng2Z1^{6|$`WwG0(fL)I@JoK&10Vb< zar_m72j9;6pQ`_x^+#;{QRIow0?p-LWxkX$aFwk1wTxe7h9xCD2IJ9E@=r?mjHWJ> zdF2dNc-4CXu8mYv!~<(hs{7IYC)}x6|Cs++*5$hMPa)L~I$2j4BVbozpayh2 zT%R>!Ip23(AH=hCGc;oA;Kv8j#19`0RRJlPO*pd4n9x7Q-)c+Yi2W ziV^ty3QDVuydgv8H* zQ9rUVCazEX&Mqus8vq->Ah?f1yYPU)^!lj&dfo6B*K2> zM|Ks*p>dff1=%F4?9v78mzzgl|L?3{4>|6{>(?M zo+Jj;`ESbzf&A7`JnaA31pZ9r%6jLw-P>nz`s?EGUvcp-ISyMbeAS<>kPjUKyax^b zTTBQiM)a#JKIo{E=lOOp=p6$J+8WO`IcXL+4zc%|9`5EsGe~E*}gsyddV6kn*)Naxjoqt73wcoANXc)=Xr-=4=jUf%p z^Qwt52}$_n7OnFaZ?w)y4CuAwbD#OWDYf9&hQ(i91&bL>#u3hHV_T1DXhb~EbxMYn zv99okzfiHR;-Ex)oWwp(V>l$qE4pX=SZDc9ZF=afGe6etCw<&^<@z%kSL3!m8Ef%E zZu-X39r0S(6mA?gjIj@c4WqQ@^{2*N zlALAWHpz9{y)EKa@iuYLm&Et&gCkbBuay4c3IAWte`@Lf=D6w$D114z@BHRy+kPPH z!w({VPbIa`<3AZVv>wZSJ?-G*2x6MHKJU7-T%rc|tS9~@{Qh~N(V?2VyqCXMiPJh* e5P)3R$%fMEA&~K5i~c2kTnCNyug?C;F8BxC(#$OY diff --git a/lumps/fogmap.lmp b/lumps/fogmap.lmp index 8e798ece..b574ce95 120000 --- a/lumps/fogmap.lmp +++ b/lumps/fogmap.lmp @@ -1 +1 @@ -oblivion/fogmap.lmp \ No newline at end of file +cph/misc-lumps/fogmap.lmp \ No newline at end of file diff --git a/lumps/jond/mfademap.lmp b/lumps/jond/mfademap.lmp deleted file mode 100644 index 836f6a5fbc44cf4d6601cd367e32023ea89c533d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8776 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 eT#wg1dZ6A4oU*ckRQ#!UHnV-ZWvzPu>;D0uMw8