diff --git a/.gitattributes b/.gitattributes
index 581a5c3ee..176a458f9 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1 @@
-* text eol=lf
-README.md eol=crlf
\ No newline at end of file
+* text=auto
diff --git a/assets/configs/buildables/acid_tube.cfg b/assets/configs/buildables/acid_tube.cfg
index e44ed48fd..f4fee3fb3 100644
--- a/assets/configs/buildables/acid_tube.cfg
+++ b/assets/configs/buildables/acid_tube.cfg
@@ -2,4 +2,4 @@ model 0 models/buildables/acid_tube/acid_tube.md3
modelScale 0.6
mins -15 -15 -15
maxs 15 15 15
-zOffset -8.5
+zOffset -10
diff --git a/assets/configs/buildables/dcc.cfg b/assets/configs/buildables/dcc.cfg
index 932e30239..bdae47c92 100644
--- a/assets/configs/buildables/dcc.cfg
+++ b/assets/configs/buildables/dcc.cfg
@@ -2,4 +2,4 @@ model 0 models/buildables/dcc/dcc.md3
modelScale 1.0
mins -35 -35 -13
maxs 35 35 47
-zOffset 0
+zOffset -1
diff --git a/assets/configs/buildables/eggpod.cfg b/assets/configs/buildables/eggpod.cfg
index 71cb6c707..82ffed26d 100644
--- a/assets/configs/buildables/eggpod.cfg
+++ b/assets/configs/buildables/eggpod.cfg
@@ -2,4 +2,4 @@ model 0 models/buildables/eggpod/eggpod.md3
modelScale 1.0
mins -15 -15 -15
maxs 15 15 15
-zOffset 0
+zOffset -2.5
diff --git a/assets/configs/buildables/overmind.cfg b/assets/configs/buildables/overmind.cfg
index f9baca5dc..9354acb9d 100644
--- a/assets/configs/buildables/overmind.cfg
+++ b/assets/configs/buildables/overmind.cfg
@@ -2,4 +2,4 @@ model 0 models/buildables/overmind/overmind.md3
modelScale 1.0
mins -45 -45 -15
maxs 45 45 95
-zOffset 0
+zOffset -1
diff --git a/assets/configs/buildables/repeater.cfg b/assets/configs/buildables/repeater.cfg
index eec28243b..9b98ad07d 100644
--- a/assets/configs/buildables/repeater.cfg
+++ b/assets/configs/buildables/repeater.cfg
@@ -2,4 +2,4 @@ model 0 models/buildables/repeater/repeater.md3
modelScale 1.0
mins -15 -15 -15
maxs 15 15 25
-zOffset 0
+zOffset -3.2
diff --git a/assets/default.cfg b/assets/default.cfg
new file mode 100644
index 000000000..c4572ac28
--- /dev/null
+++ b/assets/default.cfg
@@ -0,0 +1,99 @@
+//
+// KEY BINDINGS
+//
+
+unbindall
+
+bind - sizedown
+bind _ sizedown
+bind = sizeup
+bind + sizeup
+
+//
+// WEAPONS/UPGRADES
+//
+bind MOUSE1 +attack
+bind MOUSE2 +button5
+
+bind [ weapprev
+bind ] weapnext
+bind mwheelup weapprev
+bind mwheeldown weapnext
+bind ENTER +button2
+bind MOUSE3 +button2
+
+
+//
+// CHARACTER CONTROLS
+//
+
+bind CTRL +attack
+
+bind ALT +strafe
+bind SHIFT +speed
+
+bind DEL +lookdown
+bind PGDN +lookup
+bind END centerview
+
+bind c +movedown
+bind SPACE +moveup
+
+
+bind UPARROW +forward
+bind DOWNARROW +back
+bind LEFTARROW +left
+bind RIGHTARROW +right
+bind w +forward
+bind a +moveleft
+bind s +back
+bind d +moveright
+
+bind x +button8
+bind v +button6
+
+bind \ +mlook
+
+//
+// MISC
+//
+
+bind t messagemode
+bind y messagemode2
+bind u messagemode3
+bind i messagemode4
+
+bind r reload
+bind b "buy ammo"
+bind m "itemact medkit"
+bind g "itemact gren"
+bind j "itemtoggle jetpack"
+bind z "itemtoggle blaster"
+bind q +button7
+bind e deconstruct
+bind , rotatebuildleft
+bind . rotatebuildright
+bind / rotatebuild
+bind f +button3
+bind h scoresUp
+bind n scoresDown
+
+//
+// CLIENT ENVIRONMENT COMMANDS
+//
+
+bind PAUSE pause
+bind ESCAPE togglemenu
+
+bind TAB +scores
+
+bind F1 "vote yes"
+bind F2 "vote no"
+bind F3 "teamvote yes"
+bind F4 "teamvote no"
+
+
+//
+// DEVELOPER KEYS
+//
+bind F11 screenshotJPEG
diff --git a/assets/emoticons/!_1x1.tga b/assets/emoticons/!_1x1.tga
new file mode 100644
index 000000000..72daa8c81
Binary files /dev/null and b/assets/emoticons/!_1x1.tga differ
diff --git a/assets/emoticons/locked_1x1.tga b/assets/emoticons/locked_1x1.tga
new file mode 100644
index 000000000..1928bb7a0
Binary files /dev/null and b/assets/emoticons/locked_1x1.tga differ
diff --git a/assets/emoticons/upgrade_1x1.tga b/assets/emoticons/upgrade_1x1.tga
new file mode 100644
index 000000000..1ad5e7d2f
Binary files /dev/null and b/assets/emoticons/upgrade_1x1.tga differ
diff --git a/assets/gfx/2d/load_screen.jpg b/assets/gfx/2d/load_screen.jpg
new file mode 100644
index 000000000..d12e1bfb9
Binary files /dev/null and b/assets/gfx/2d/load_screen.jpg differ
diff --git a/assets/gfx/misc/creep/creep0.tga b/assets/gfx/misc/creep/creep0.tga
new file mode 100644
index 000000000..07c5ab7de
Binary files /dev/null and b/assets/gfx/misc/creep/creep0.tga differ
diff --git a/assets/gfx/misc/creep/creep1.tga b/assets/gfx/misc/creep/creep1.tga
new file mode 100644
index 000000000..bf5e502ec
Binary files /dev/null and b/assets/gfx/misc/creep/creep1.tga differ
diff --git a/assets/gfx/misc/creep/creep10.tga b/assets/gfx/misc/creep/creep10.tga
new file mode 100644
index 000000000..d41f49dfe
Binary files /dev/null and b/assets/gfx/misc/creep/creep10.tga differ
diff --git a/assets/gfx/misc/creep/creep100.tga b/assets/gfx/misc/creep/creep100.tga
new file mode 100644
index 000000000..dc38c5add
Binary files /dev/null and b/assets/gfx/misc/creep/creep100.tga differ
diff --git a/assets/gfx/misc/creep/creep101.tga b/assets/gfx/misc/creep/creep101.tga
new file mode 100644
index 000000000..021845538
Binary files /dev/null and b/assets/gfx/misc/creep/creep101.tga differ
diff --git a/assets/gfx/misc/creep/creep102.tga b/assets/gfx/misc/creep/creep102.tga
new file mode 100644
index 000000000..51775e7b4
Binary files /dev/null and b/assets/gfx/misc/creep/creep102.tga differ
diff --git a/assets/gfx/misc/creep/creep103.tga b/assets/gfx/misc/creep/creep103.tga
new file mode 100644
index 000000000..6fd52db05
Binary files /dev/null and b/assets/gfx/misc/creep/creep103.tga differ
diff --git a/assets/gfx/misc/creep/creep104.tga b/assets/gfx/misc/creep/creep104.tga
new file mode 100644
index 000000000..e6d0c7abc
Binary files /dev/null and b/assets/gfx/misc/creep/creep104.tga differ
diff --git a/assets/gfx/misc/creep/creep105.tga b/assets/gfx/misc/creep/creep105.tga
new file mode 100644
index 000000000..58c4c303e
Binary files /dev/null and b/assets/gfx/misc/creep/creep105.tga differ
diff --git a/assets/gfx/misc/creep/creep106.tga b/assets/gfx/misc/creep/creep106.tga
new file mode 100644
index 000000000..77614af10
Binary files /dev/null and b/assets/gfx/misc/creep/creep106.tga differ
diff --git a/assets/gfx/misc/creep/creep107.tga b/assets/gfx/misc/creep/creep107.tga
new file mode 100644
index 000000000..8a1d02afb
Binary files /dev/null and b/assets/gfx/misc/creep/creep107.tga differ
diff --git a/assets/gfx/misc/creep/creep108.tga b/assets/gfx/misc/creep/creep108.tga
new file mode 100644
index 000000000..3721bb1a2
Binary files /dev/null and b/assets/gfx/misc/creep/creep108.tga differ
diff --git a/assets/gfx/misc/creep/creep109.tga b/assets/gfx/misc/creep/creep109.tga
new file mode 100644
index 000000000..e6a60d21d
Binary files /dev/null and b/assets/gfx/misc/creep/creep109.tga differ
diff --git a/assets/gfx/misc/creep/creep11.tga b/assets/gfx/misc/creep/creep11.tga
new file mode 100644
index 000000000..380a3d418
Binary files /dev/null and b/assets/gfx/misc/creep/creep11.tga differ
diff --git a/assets/gfx/misc/creep/creep110.tga b/assets/gfx/misc/creep/creep110.tga
new file mode 100644
index 000000000..b5ada58d2
Binary files /dev/null and b/assets/gfx/misc/creep/creep110.tga differ
diff --git a/assets/gfx/misc/creep/creep111.tga b/assets/gfx/misc/creep/creep111.tga
new file mode 100644
index 000000000..9f2893106
Binary files /dev/null and b/assets/gfx/misc/creep/creep111.tga differ
diff --git a/assets/gfx/misc/creep/creep112.tga b/assets/gfx/misc/creep/creep112.tga
new file mode 100644
index 000000000..900cfbd9e
Binary files /dev/null and b/assets/gfx/misc/creep/creep112.tga differ
diff --git a/assets/gfx/misc/creep/creep113.tga b/assets/gfx/misc/creep/creep113.tga
new file mode 100644
index 000000000..ee2b6ef6d
Binary files /dev/null and b/assets/gfx/misc/creep/creep113.tga differ
diff --git a/assets/gfx/misc/creep/creep114.tga b/assets/gfx/misc/creep/creep114.tga
new file mode 100644
index 000000000..3cc4beac1
Binary files /dev/null and b/assets/gfx/misc/creep/creep114.tga differ
diff --git a/assets/gfx/misc/creep/creep115.tga b/assets/gfx/misc/creep/creep115.tga
new file mode 100644
index 000000000..3c147e908
Binary files /dev/null and b/assets/gfx/misc/creep/creep115.tga differ
diff --git a/assets/gfx/misc/creep/creep116.tga b/assets/gfx/misc/creep/creep116.tga
new file mode 100644
index 000000000..8c0d361d8
Binary files /dev/null and b/assets/gfx/misc/creep/creep116.tga differ
diff --git a/assets/gfx/misc/creep/creep117.tga b/assets/gfx/misc/creep/creep117.tga
new file mode 100644
index 000000000..ecd44ba39
Binary files /dev/null and b/assets/gfx/misc/creep/creep117.tga differ
diff --git a/assets/gfx/misc/creep/creep118.tga b/assets/gfx/misc/creep/creep118.tga
new file mode 100644
index 000000000..2e2b0d808
Binary files /dev/null and b/assets/gfx/misc/creep/creep118.tga differ
diff --git a/assets/gfx/misc/creep/creep119.tga b/assets/gfx/misc/creep/creep119.tga
new file mode 100644
index 000000000..308e8631f
Binary files /dev/null and b/assets/gfx/misc/creep/creep119.tga differ
diff --git a/assets/gfx/misc/creep/creep12.tga b/assets/gfx/misc/creep/creep12.tga
new file mode 100644
index 000000000..092e8d4f1
Binary files /dev/null and b/assets/gfx/misc/creep/creep12.tga differ
diff --git a/assets/gfx/misc/creep/creep120.tga b/assets/gfx/misc/creep/creep120.tga
new file mode 100644
index 000000000..2215d7a87
Binary files /dev/null and b/assets/gfx/misc/creep/creep120.tga differ
diff --git a/assets/gfx/misc/creep/creep121.tga b/assets/gfx/misc/creep/creep121.tga
new file mode 100644
index 000000000..7857413af
Binary files /dev/null and b/assets/gfx/misc/creep/creep121.tga differ
diff --git a/assets/gfx/misc/creep/creep122.tga b/assets/gfx/misc/creep/creep122.tga
new file mode 100644
index 000000000..e2ebd7c45
Binary files /dev/null and b/assets/gfx/misc/creep/creep122.tga differ
diff --git a/assets/gfx/misc/creep/creep123.tga b/assets/gfx/misc/creep/creep123.tga
new file mode 100644
index 000000000..90bad1218
Binary files /dev/null and b/assets/gfx/misc/creep/creep123.tga differ
diff --git a/assets/gfx/misc/creep/creep124.tga b/assets/gfx/misc/creep/creep124.tga
new file mode 100644
index 000000000..64f0b6244
Binary files /dev/null and b/assets/gfx/misc/creep/creep124.tga differ
diff --git a/assets/gfx/misc/creep/creep125.tga b/assets/gfx/misc/creep/creep125.tga
new file mode 100644
index 000000000..5092b8644
Binary files /dev/null and b/assets/gfx/misc/creep/creep125.tga differ
diff --git a/assets/gfx/misc/creep/creep126.tga b/assets/gfx/misc/creep/creep126.tga
new file mode 100644
index 000000000..ca5342b2b
Binary files /dev/null and b/assets/gfx/misc/creep/creep126.tga differ
diff --git a/assets/gfx/misc/creep/creep127.tga b/assets/gfx/misc/creep/creep127.tga
new file mode 100644
index 000000000..31c807d9c
Binary files /dev/null and b/assets/gfx/misc/creep/creep127.tga differ
diff --git a/assets/gfx/misc/creep/creep128.tga b/assets/gfx/misc/creep/creep128.tga
new file mode 100644
index 000000000..10fe0a122
Binary files /dev/null and b/assets/gfx/misc/creep/creep128.tga differ
diff --git a/assets/gfx/misc/creep/creep129.tga b/assets/gfx/misc/creep/creep129.tga
new file mode 100644
index 000000000..cc8e14f17
Binary files /dev/null and b/assets/gfx/misc/creep/creep129.tga differ
diff --git a/assets/gfx/misc/creep/creep13.tga b/assets/gfx/misc/creep/creep13.tga
new file mode 100644
index 000000000..8d76ffe46
Binary files /dev/null and b/assets/gfx/misc/creep/creep13.tga differ
diff --git a/assets/gfx/misc/creep/creep130.tga b/assets/gfx/misc/creep/creep130.tga
new file mode 100644
index 000000000..47c36cd1c
Binary files /dev/null and b/assets/gfx/misc/creep/creep130.tga differ
diff --git a/assets/gfx/misc/creep/creep131.tga b/assets/gfx/misc/creep/creep131.tga
new file mode 100644
index 000000000..c3896b79d
Binary files /dev/null and b/assets/gfx/misc/creep/creep131.tga differ
diff --git a/assets/gfx/misc/creep/creep132.tga b/assets/gfx/misc/creep/creep132.tga
new file mode 100644
index 000000000..665b42fd6
Binary files /dev/null and b/assets/gfx/misc/creep/creep132.tga differ
diff --git a/assets/gfx/misc/creep/creep133.tga b/assets/gfx/misc/creep/creep133.tga
new file mode 100644
index 000000000..bc82b47fb
Binary files /dev/null and b/assets/gfx/misc/creep/creep133.tga differ
diff --git a/assets/gfx/misc/creep/creep134.tga b/assets/gfx/misc/creep/creep134.tga
new file mode 100644
index 000000000..4d7ca7fd9
Binary files /dev/null and b/assets/gfx/misc/creep/creep134.tga differ
diff --git a/assets/gfx/misc/creep/creep135.tga b/assets/gfx/misc/creep/creep135.tga
new file mode 100644
index 000000000..7ae02c95c
Binary files /dev/null and b/assets/gfx/misc/creep/creep135.tga differ
diff --git a/assets/gfx/misc/creep/creep136.tga b/assets/gfx/misc/creep/creep136.tga
new file mode 100644
index 000000000..ea5e2f670
Binary files /dev/null and b/assets/gfx/misc/creep/creep136.tga differ
diff --git a/assets/gfx/misc/creep/creep137.tga b/assets/gfx/misc/creep/creep137.tga
new file mode 100644
index 000000000..04d6b7aeb
Binary files /dev/null and b/assets/gfx/misc/creep/creep137.tga differ
diff --git a/assets/gfx/misc/creep/creep138.tga b/assets/gfx/misc/creep/creep138.tga
new file mode 100644
index 000000000..3f6197075
Binary files /dev/null and b/assets/gfx/misc/creep/creep138.tga differ
diff --git a/assets/gfx/misc/creep/creep139.tga b/assets/gfx/misc/creep/creep139.tga
new file mode 100644
index 000000000..7888a3e6f
Binary files /dev/null and b/assets/gfx/misc/creep/creep139.tga differ
diff --git a/assets/gfx/misc/creep/creep14.tga b/assets/gfx/misc/creep/creep14.tga
new file mode 100644
index 000000000..d2114d368
Binary files /dev/null and b/assets/gfx/misc/creep/creep14.tga differ
diff --git a/assets/gfx/misc/creep/creep140.tga b/assets/gfx/misc/creep/creep140.tga
new file mode 100644
index 000000000..3e1df1f11
Binary files /dev/null and b/assets/gfx/misc/creep/creep140.tga differ
diff --git a/assets/gfx/misc/creep/creep141.tga b/assets/gfx/misc/creep/creep141.tga
new file mode 100644
index 000000000..f276272c8
Binary files /dev/null and b/assets/gfx/misc/creep/creep141.tga differ
diff --git a/assets/gfx/misc/creep/creep142.tga b/assets/gfx/misc/creep/creep142.tga
new file mode 100644
index 000000000..6d6261955
Binary files /dev/null and b/assets/gfx/misc/creep/creep142.tga differ
diff --git a/assets/gfx/misc/creep/creep143.tga b/assets/gfx/misc/creep/creep143.tga
new file mode 100644
index 000000000..6eac9f1e3
Binary files /dev/null and b/assets/gfx/misc/creep/creep143.tga differ
diff --git a/assets/gfx/misc/creep/creep144.tga b/assets/gfx/misc/creep/creep144.tga
new file mode 100644
index 000000000..c97b5e76c
Binary files /dev/null and b/assets/gfx/misc/creep/creep144.tga differ
diff --git a/assets/gfx/misc/creep/creep145.tga b/assets/gfx/misc/creep/creep145.tga
new file mode 100644
index 000000000..02e2d909c
Binary files /dev/null and b/assets/gfx/misc/creep/creep145.tga differ
diff --git a/assets/gfx/misc/creep/creep146.tga b/assets/gfx/misc/creep/creep146.tga
new file mode 100644
index 000000000..aa6a1ab97
Binary files /dev/null and b/assets/gfx/misc/creep/creep146.tga differ
diff --git a/assets/gfx/misc/creep/creep147.tga b/assets/gfx/misc/creep/creep147.tga
new file mode 100644
index 000000000..30fe461c8
Binary files /dev/null and b/assets/gfx/misc/creep/creep147.tga differ
diff --git a/assets/gfx/misc/creep/creep148.tga b/assets/gfx/misc/creep/creep148.tga
new file mode 100644
index 000000000..3b558fb85
Binary files /dev/null and b/assets/gfx/misc/creep/creep148.tga differ
diff --git a/assets/gfx/misc/creep/creep149.tga b/assets/gfx/misc/creep/creep149.tga
new file mode 100644
index 000000000..842fb3cf3
Binary files /dev/null and b/assets/gfx/misc/creep/creep149.tga differ
diff --git a/assets/gfx/misc/creep/creep15.tga b/assets/gfx/misc/creep/creep15.tga
new file mode 100644
index 000000000..c7b02cfb7
Binary files /dev/null and b/assets/gfx/misc/creep/creep15.tga differ
diff --git a/assets/gfx/misc/creep/creep150.tga b/assets/gfx/misc/creep/creep150.tga
new file mode 100644
index 000000000..e17f8c7aa
Binary files /dev/null and b/assets/gfx/misc/creep/creep150.tga differ
diff --git a/assets/gfx/misc/creep/creep151.tga b/assets/gfx/misc/creep/creep151.tga
new file mode 100644
index 000000000..5d8f11e57
Binary files /dev/null and b/assets/gfx/misc/creep/creep151.tga differ
diff --git a/assets/gfx/misc/creep/creep152.tga b/assets/gfx/misc/creep/creep152.tga
new file mode 100644
index 000000000..791270447
Binary files /dev/null and b/assets/gfx/misc/creep/creep152.tga differ
diff --git a/assets/gfx/misc/creep/creep153.tga b/assets/gfx/misc/creep/creep153.tga
new file mode 100644
index 000000000..10b68aff2
Binary files /dev/null and b/assets/gfx/misc/creep/creep153.tga differ
diff --git a/assets/gfx/misc/creep/creep154.tga b/assets/gfx/misc/creep/creep154.tga
new file mode 100644
index 000000000..8700f4cd4
Binary files /dev/null and b/assets/gfx/misc/creep/creep154.tga differ
diff --git a/assets/gfx/misc/creep/creep155.tga b/assets/gfx/misc/creep/creep155.tga
new file mode 100644
index 000000000..d04decc6f
Binary files /dev/null and b/assets/gfx/misc/creep/creep155.tga differ
diff --git a/assets/gfx/misc/creep/creep156.tga b/assets/gfx/misc/creep/creep156.tga
new file mode 100644
index 000000000..ea7f4df3e
Binary files /dev/null and b/assets/gfx/misc/creep/creep156.tga differ
diff --git a/assets/gfx/misc/creep/creep157.tga b/assets/gfx/misc/creep/creep157.tga
new file mode 100644
index 000000000..10a995a56
Binary files /dev/null and b/assets/gfx/misc/creep/creep157.tga differ
diff --git a/assets/gfx/misc/creep/creep158.tga b/assets/gfx/misc/creep/creep158.tga
new file mode 100644
index 000000000..c15f6c614
Binary files /dev/null and b/assets/gfx/misc/creep/creep158.tga differ
diff --git a/assets/gfx/misc/creep/creep159.tga b/assets/gfx/misc/creep/creep159.tga
new file mode 100644
index 000000000..7f5ee2df6
Binary files /dev/null and b/assets/gfx/misc/creep/creep159.tga differ
diff --git a/assets/gfx/misc/creep/creep16.tga b/assets/gfx/misc/creep/creep16.tga
new file mode 100644
index 000000000..a13b35dc2
Binary files /dev/null and b/assets/gfx/misc/creep/creep16.tga differ
diff --git a/assets/gfx/misc/creep/creep160.tga b/assets/gfx/misc/creep/creep160.tga
new file mode 100644
index 000000000..6b881250a
Binary files /dev/null and b/assets/gfx/misc/creep/creep160.tga differ
diff --git a/assets/gfx/misc/creep/creep161.tga b/assets/gfx/misc/creep/creep161.tga
new file mode 100644
index 000000000..79f96838a
Binary files /dev/null and b/assets/gfx/misc/creep/creep161.tga differ
diff --git a/assets/gfx/misc/creep/creep162.tga b/assets/gfx/misc/creep/creep162.tga
new file mode 100644
index 000000000..45040aa5c
Binary files /dev/null and b/assets/gfx/misc/creep/creep162.tga differ
diff --git a/assets/gfx/misc/creep/creep163.tga b/assets/gfx/misc/creep/creep163.tga
new file mode 100644
index 000000000..574bf66be
Binary files /dev/null and b/assets/gfx/misc/creep/creep163.tga differ
diff --git a/assets/gfx/misc/creep/creep164.tga b/assets/gfx/misc/creep/creep164.tga
new file mode 100644
index 000000000..4e77db0d3
Binary files /dev/null and b/assets/gfx/misc/creep/creep164.tga differ
diff --git a/assets/gfx/misc/creep/creep165.tga b/assets/gfx/misc/creep/creep165.tga
new file mode 100644
index 000000000..4dc727f2d
Binary files /dev/null and b/assets/gfx/misc/creep/creep165.tga differ
diff --git a/assets/gfx/misc/creep/creep166.tga b/assets/gfx/misc/creep/creep166.tga
new file mode 100644
index 000000000..a5e1d8aa2
Binary files /dev/null and b/assets/gfx/misc/creep/creep166.tga differ
diff --git a/assets/gfx/misc/creep/creep167.tga b/assets/gfx/misc/creep/creep167.tga
new file mode 100644
index 000000000..8468a3a51
Binary files /dev/null and b/assets/gfx/misc/creep/creep167.tga differ
diff --git a/assets/gfx/misc/creep/creep168.tga b/assets/gfx/misc/creep/creep168.tga
new file mode 100644
index 000000000..3c7f41bb4
Binary files /dev/null and b/assets/gfx/misc/creep/creep168.tga differ
diff --git a/assets/gfx/misc/creep/creep169.tga b/assets/gfx/misc/creep/creep169.tga
new file mode 100644
index 000000000..7b02e9cb6
Binary files /dev/null and b/assets/gfx/misc/creep/creep169.tga differ
diff --git a/assets/gfx/misc/creep/creep17.tga b/assets/gfx/misc/creep/creep17.tga
new file mode 100644
index 000000000..aaf9671ef
Binary files /dev/null and b/assets/gfx/misc/creep/creep17.tga differ
diff --git a/assets/gfx/misc/creep/creep170.tga b/assets/gfx/misc/creep/creep170.tga
new file mode 100644
index 000000000..78c96e622
Binary files /dev/null and b/assets/gfx/misc/creep/creep170.tga differ
diff --git a/assets/gfx/misc/creep/creep171.tga b/assets/gfx/misc/creep/creep171.tga
new file mode 100644
index 000000000..cf44c0e25
Binary files /dev/null and b/assets/gfx/misc/creep/creep171.tga differ
diff --git a/assets/gfx/misc/creep/creep172.tga b/assets/gfx/misc/creep/creep172.tga
new file mode 100644
index 000000000..200047d02
Binary files /dev/null and b/assets/gfx/misc/creep/creep172.tga differ
diff --git a/assets/gfx/misc/creep/creep173.tga b/assets/gfx/misc/creep/creep173.tga
new file mode 100644
index 000000000..595c3b23e
Binary files /dev/null and b/assets/gfx/misc/creep/creep173.tga differ
diff --git a/assets/gfx/misc/creep/creep174.tga b/assets/gfx/misc/creep/creep174.tga
new file mode 100644
index 000000000..ae37195a1
Binary files /dev/null and b/assets/gfx/misc/creep/creep174.tga differ
diff --git a/assets/gfx/misc/creep/creep175.tga b/assets/gfx/misc/creep/creep175.tga
new file mode 100644
index 000000000..747766223
Binary files /dev/null and b/assets/gfx/misc/creep/creep175.tga differ
diff --git a/assets/gfx/misc/creep/creep176.tga b/assets/gfx/misc/creep/creep176.tga
new file mode 100644
index 000000000..79dbdbbe4
Binary files /dev/null and b/assets/gfx/misc/creep/creep176.tga differ
diff --git a/assets/gfx/misc/creep/creep177.tga b/assets/gfx/misc/creep/creep177.tga
new file mode 100644
index 000000000..c7673aed9
Binary files /dev/null and b/assets/gfx/misc/creep/creep177.tga differ
diff --git a/assets/gfx/misc/creep/creep178.tga b/assets/gfx/misc/creep/creep178.tga
new file mode 100644
index 000000000..1742eda3d
Binary files /dev/null and b/assets/gfx/misc/creep/creep178.tga differ
diff --git a/assets/gfx/misc/creep/creep179.tga b/assets/gfx/misc/creep/creep179.tga
new file mode 100644
index 000000000..26e8c59a2
Binary files /dev/null and b/assets/gfx/misc/creep/creep179.tga differ
diff --git a/assets/gfx/misc/creep/creep18.tga b/assets/gfx/misc/creep/creep18.tga
new file mode 100644
index 000000000..a73d80272
Binary files /dev/null and b/assets/gfx/misc/creep/creep18.tga differ
diff --git a/assets/gfx/misc/creep/creep180.tga b/assets/gfx/misc/creep/creep180.tga
new file mode 100644
index 000000000..db33deac9
Binary files /dev/null and b/assets/gfx/misc/creep/creep180.tga differ
diff --git a/assets/gfx/misc/creep/creep181.tga b/assets/gfx/misc/creep/creep181.tga
new file mode 100644
index 000000000..7925ca346
Binary files /dev/null and b/assets/gfx/misc/creep/creep181.tga differ
diff --git a/assets/gfx/misc/creep/creep182.tga b/assets/gfx/misc/creep/creep182.tga
new file mode 100644
index 000000000..9ec6be2c2
Binary files /dev/null and b/assets/gfx/misc/creep/creep182.tga differ
diff --git a/assets/gfx/misc/creep/creep183.tga b/assets/gfx/misc/creep/creep183.tga
new file mode 100644
index 000000000..c1105fe74
Binary files /dev/null and b/assets/gfx/misc/creep/creep183.tga differ
diff --git a/assets/gfx/misc/creep/creep184.tga b/assets/gfx/misc/creep/creep184.tga
new file mode 100644
index 000000000..3444a8255
Binary files /dev/null and b/assets/gfx/misc/creep/creep184.tga differ
diff --git a/assets/gfx/misc/creep/creep185.tga b/assets/gfx/misc/creep/creep185.tga
new file mode 100644
index 000000000..dd17c4d19
Binary files /dev/null and b/assets/gfx/misc/creep/creep185.tga differ
diff --git a/assets/gfx/misc/creep/creep186.tga b/assets/gfx/misc/creep/creep186.tga
new file mode 100644
index 000000000..8bf528847
Binary files /dev/null and b/assets/gfx/misc/creep/creep186.tga differ
diff --git a/assets/gfx/misc/creep/creep187.tga b/assets/gfx/misc/creep/creep187.tga
new file mode 100644
index 000000000..1f926aa78
Binary files /dev/null and b/assets/gfx/misc/creep/creep187.tga differ
diff --git a/assets/gfx/misc/creep/creep188.tga b/assets/gfx/misc/creep/creep188.tga
new file mode 100644
index 000000000..0f38d4edc
Binary files /dev/null and b/assets/gfx/misc/creep/creep188.tga differ
diff --git a/assets/gfx/misc/creep/creep189.tga b/assets/gfx/misc/creep/creep189.tga
new file mode 100644
index 000000000..9ea931576
Binary files /dev/null and b/assets/gfx/misc/creep/creep189.tga differ
diff --git a/assets/gfx/misc/creep/creep19.tga b/assets/gfx/misc/creep/creep19.tga
new file mode 100644
index 000000000..114bfbeb8
Binary files /dev/null and b/assets/gfx/misc/creep/creep19.tga differ
diff --git a/assets/gfx/misc/creep/creep190.tga b/assets/gfx/misc/creep/creep190.tga
new file mode 100644
index 000000000..ad8c11490
Binary files /dev/null and b/assets/gfx/misc/creep/creep190.tga differ
diff --git a/assets/gfx/misc/creep/creep191.tga b/assets/gfx/misc/creep/creep191.tga
new file mode 100644
index 000000000..4586d7330
Binary files /dev/null and b/assets/gfx/misc/creep/creep191.tga differ
diff --git a/assets/gfx/misc/creep/creep192.tga b/assets/gfx/misc/creep/creep192.tga
new file mode 100644
index 000000000..4cc6c238c
Binary files /dev/null and b/assets/gfx/misc/creep/creep192.tga differ
diff --git a/assets/gfx/misc/creep/creep193.tga b/assets/gfx/misc/creep/creep193.tga
new file mode 100644
index 000000000..75e94dcf4
Binary files /dev/null and b/assets/gfx/misc/creep/creep193.tga differ
diff --git a/assets/gfx/misc/creep/creep194.tga b/assets/gfx/misc/creep/creep194.tga
new file mode 100644
index 000000000..14eb0cef8
Binary files /dev/null and b/assets/gfx/misc/creep/creep194.tga differ
diff --git a/assets/gfx/misc/creep/creep195.tga b/assets/gfx/misc/creep/creep195.tga
new file mode 100644
index 000000000..8e2b23ed6
Binary files /dev/null and b/assets/gfx/misc/creep/creep195.tga differ
diff --git a/assets/gfx/misc/creep/creep196.tga b/assets/gfx/misc/creep/creep196.tga
new file mode 100644
index 000000000..deae5af8e
Binary files /dev/null and b/assets/gfx/misc/creep/creep196.tga differ
diff --git a/assets/gfx/misc/creep/creep197.tga b/assets/gfx/misc/creep/creep197.tga
new file mode 100644
index 000000000..862222419
Binary files /dev/null and b/assets/gfx/misc/creep/creep197.tga differ
diff --git a/assets/gfx/misc/creep/creep198.tga b/assets/gfx/misc/creep/creep198.tga
new file mode 100644
index 000000000..017259349
Binary files /dev/null and b/assets/gfx/misc/creep/creep198.tga differ
diff --git a/assets/gfx/misc/creep/creep199.tga b/assets/gfx/misc/creep/creep199.tga
new file mode 100644
index 000000000..02f6ed784
Binary files /dev/null and b/assets/gfx/misc/creep/creep199.tga differ
diff --git a/assets/gfx/misc/creep/creep2.tga b/assets/gfx/misc/creep/creep2.tga
new file mode 100644
index 000000000..f48efd058
Binary files /dev/null and b/assets/gfx/misc/creep/creep2.tga differ
diff --git a/assets/gfx/misc/creep/creep20.tga b/assets/gfx/misc/creep/creep20.tga
new file mode 100644
index 000000000..8b8bcc5d1
Binary files /dev/null and b/assets/gfx/misc/creep/creep20.tga differ
diff --git a/assets/gfx/misc/creep/creep200.tga b/assets/gfx/misc/creep/creep200.tga
new file mode 100644
index 000000000..2b421b91a
Binary files /dev/null and b/assets/gfx/misc/creep/creep200.tga differ
diff --git a/assets/gfx/misc/creep/creep201.tga b/assets/gfx/misc/creep/creep201.tga
new file mode 100644
index 000000000..a70b72e9e
Binary files /dev/null and b/assets/gfx/misc/creep/creep201.tga differ
diff --git a/assets/gfx/misc/creep/creep202.tga b/assets/gfx/misc/creep/creep202.tga
new file mode 100644
index 000000000..a05a3c416
Binary files /dev/null and b/assets/gfx/misc/creep/creep202.tga differ
diff --git a/assets/gfx/misc/creep/creep203.tga b/assets/gfx/misc/creep/creep203.tga
new file mode 100644
index 000000000..c6345d3f9
Binary files /dev/null and b/assets/gfx/misc/creep/creep203.tga differ
diff --git a/assets/gfx/misc/creep/creep204.tga b/assets/gfx/misc/creep/creep204.tga
new file mode 100644
index 000000000..2d7f86658
Binary files /dev/null and b/assets/gfx/misc/creep/creep204.tga differ
diff --git a/assets/gfx/misc/creep/creep205.tga b/assets/gfx/misc/creep/creep205.tga
new file mode 100644
index 000000000..a67e698e8
Binary files /dev/null and b/assets/gfx/misc/creep/creep205.tga differ
diff --git a/assets/gfx/misc/creep/creep206.tga b/assets/gfx/misc/creep/creep206.tga
new file mode 100644
index 000000000..f8994cd4e
Binary files /dev/null and b/assets/gfx/misc/creep/creep206.tga differ
diff --git a/assets/gfx/misc/creep/creep207.tga b/assets/gfx/misc/creep/creep207.tga
new file mode 100644
index 000000000..b4f2af1ec
Binary files /dev/null and b/assets/gfx/misc/creep/creep207.tga differ
diff --git a/assets/gfx/misc/creep/creep208.tga b/assets/gfx/misc/creep/creep208.tga
new file mode 100644
index 000000000..ed37b5d79
Binary files /dev/null and b/assets/gfx/misc/creep/creep208.tga differ
diff --git a/assets/gfx/misc/creep/creep209.tga b/assets/gfx/misc/creep/creep209.tga
new file mode 100644
index 000000000..385678c2b
Binary files /dev/null and b/assets/gfx/misc/creep/creep209.tga differ
diff --git a/assets/gfx/misc/creep/creep21.tga b/assets/gfx/misc/creep/creep21.tga
new file mode 100644
index 000000000..3e02eaf60
Binary files /dev/null and b/assets/gfx/misc/creep/creep21.tga differ
diff --git a/assets/gfx/misc/creep/creep210.tga b/assets/gfx/misc/creep/creep210.tga
new file mode 100644
index 000000000..ccd8052de
Binary files /dev/null and b/assets/gfx/misc/creep/creep210.tga differ
diff --git a/assets/gfx/misc/creep/creep211.tga b/assets/gfx/misc/creep/creep211.tga
new file mode 100644
index 000000000..e031182df
Binary files /dev/null and b/assets/gfx/misc/creep/creep211.tga differ
diff --git a/assets/gfx/misc/creep/creep212.tga b/assets/gfx/misc/creep/creep212.tga
new file mode 100644
index 000000000..09c6c656c
Binary files /dev/null and b/assets/gfx/misc/creep/creep212.tga differ
diff --git a/assets/gfx/misc/creep/creep213.tga b/assets/gfx/misc/creep/creep213.tga
new file mode 100644
index 000000000..d964b53f2
Binary files /dev/null and b/assets/gfx/misc/creep/creep213.tga differ
diff --git a/assets/gfx/misc/creep/creep214.tga b/assets/gfx/misc/creep/creep214.tga
new file mode 100644
index 000000000..4769429b1
Binary files /dev/null and b/assets/gfx/misc/creep/creep214.tga differ
diff --git a/assets/gfx/misc/creep/creep215.tga b/assets/gfx/misc/creep/creep215.tga
new file mode 100644
index 000000000..34999806f
Binary files /dev/null and b/assets/gfx/misc/creep/creep215.tga differ
diff --git a/assets/gfx/misc/creep/creep216.tga b/assets/gfx/misc/creep/creep216.tga
new file mode 100644
index 000000000..deff37bb9
Binary files /dev/null and b/assets/gfx/misc/creep/creep216.tga differ
diff --git a/assets/gfx/misc/creep/creep217.tga b/assets/gfx/misc/creep/creep217.tga
new file mode 100644
index 000000000..8c7953fff
Binary files /dev/null and b/assets/gfx/misc/creep/creep217.tga differ
diff --git a/assets/gfx/misc/creep/creep218.tga b/assets/gfx/misc/creep/creep218.tga
new file mode 100644
index 000000000..f6fb60a53
Binary files /dev/null and b/assets/gfx/misc/creep/creep218.tga differ
diff --git a/assets/gfx/misc/creep/creep219.tga b/assets/gfx/misc/creep/creep219.tga
new file mode 100644
index 000000000..ca1d5e8bf
Binary files /dev/null and b/assets/gfx/misc/creep/creep219.tga differ
diff --git a/assets/gfx/misc/creep/creep22.tga b/assets/gfx/misc/creep/creep22.tga
new file mode 100644
index 000000000..64328666c
Binary files /dev/null and b/assets/gfx/misc/creep/creep22.tga differ
diff --git a/assets/gfx/misc/creep/creep220.tga b/assets/gfx/misc/creep/creep220.tga
new file mode 100644
index 000000000..e5a345333
Binary files /dev/null and b/assets/gfx/misc/creep/creep220.tga differ
diff --git a/assets/gfx/misc/creep/creep221.tga b/assets/gfx/misc/creep/creep221.tga
new file mode 100644
index 000000000..cc4797c3d
Binary files /dev/null and b/assets/gfx/misc/creep/creep221.tga differ
diff --git a/assets/gfx/misc/creep/creep222.tga b/assets/gfx/misc/creep/creep222.tga
new file mode 100644
index 000000000..270ae37f6
Binary files /dev/null and b/assets/gfx/misc/creep/creep222.tga differ
diff --git a/assets/gfx/misc/creep/creep223.tga b/assets/gfx/misc/creep/creep223.tga
new file mode 100644
index 000000000..9595be0db
Binary files /dev/null and b/assets/gfx/misc/creep/creep223.tga differ
diff --git a/assets/gfx/misc/creep/creep224.tga b/assets/gfx/misc/creep/creep224.tga
new file mode 100644
index 000000000..19b102f07
Binary files /dev/null and b/assets/gfx/misc/creep/creep224.tga differ
diff --git a/assets/gfx/misc/creep/creep225.tga b/assets/gfx/misc/creep/creep225.tga
new file mode 100644
index 000000000..cf2427219
Binary files /dev/null and b/assets/gfx/misc/creep/creep225.tga differ
diff --git a/assets/gfx/misc/creep/creep226.tga b/assets/gfx/misc/creep/creep226.tga
new file mode 100644
index 000000000..8405fd4a9
Binary files /dev/null and b/assets/gfx/misc/creep/creep226.tga differ
diff --git a/assets/gfx/misc/creep/creep227.tga b/assets/gfx/misc/creep/creep227.tga
new file mode 100644
index 000000000..8dda347fc
Binary files /dev/null and b/assets/gfx/misc/creep/creep227.tga differ
diff --git a/assets/gfx/misc/creep/creep228.tga b/assets/gfx/misc/creep/creep228.tga
new file mode 100644
index 000000000..0486205e0
Binary files /dev/null and b/assets/gfx/misc/creep/creep228.tga differ
diff --git a/assets/gfx/misc/creep/creep229.tga b/assets/gfx/misc/creep/creep229.tga
new file mode 100644
index 000000000..badabcbdf
Binary files /dev/null and b/assets/gfx/misc/creep/creep229.tga differ
diff --git a/assets/gfx/misc/creep/creep23.tga b/assets/gfx/misc/creep/creep23.tga
new file mode 100644
index 000000000..5166ec660
Binary files /dev/null and b/assets/gfx/misc/creep/creep23.tga differ
diff --git a/assets/gfx/misc/creep/creep230.tga b/assets/gfx/misc/creep/creep230.tga
new file mode 100644
index 000000000..ca06de19c
Binary files /dev/null and b/assets/gfx/misc/creep/creep230.tga differ
diff --git a/assets/gfx/misc/creep/creep231.tga b/assets/gfx/misc/creep/creep231.tga
new file mode 100644
index 000000000..7baaa266c
Binary files /dev/null and b/assets/gfx/misc/creep/creep231.tga differ
diff --git a/assets/gfx/misc/creep/creep232.tga b/assets/gfx/misc/creep/creep232.tga
new file mode 100644
index 000000000..29c21a58b
Binary files /dev/null and b/assets/gfx/misc/creep/creep232.tga differ
diff --git a/assets/gfx/misc/creep/creep233.tga b/assets/gfx/misc/creep/creep233.tga
new file mode 100644
index 000000000..0b7d90315
Binary files /dev/null and b/assets/gfx/misc/creep/creep233.tga differ
diff --git a/assets/gfx/misc/creep/creep234.tga b/assets/gfx/misc/creep/creep234.tga
new file mode 100644
index 000000000..6f483edc9
Binary files /dev/null and b/assets/gfx/misc/creep/creep234.tga differ
diff --git a/assets/gfx/misc/creep/creep235.tga b/assets/gfx/misc/creep/creep235.tga
new file mode 100644
index 000000000..2d2f4ea7e
Binary files /dev/null and b/assets/gfx/misc/creep/creep235.tga differ
diff --git a/assets/gfx/misc/creep/creep236.tga b/assets/gfx/misc/creep/creep236.tga
new file mode 100644
index 000000000..b39956f81
Binary files /dev/null and b/assets/gfx/misc/creep/creep236.tga differ
diff --git a/assets/gfx/misc/creep/creep237.tga b/assets/gfx/misc/creep/creep237.tga
new file mode 100644
index 000000000..194c19357
Binary files /dev/null and b/assets/gfx/misc/creep/creep237.tga differ
diff --git a/assets/gfx/misc/creep/creep238.tga b/assets/gfx/misc/creep/creep238.tga
new file mode 100644
index 000000000..4437d7e84
Binary files /dev/null and b/assets/gfx/misc/creep/creep238.tga differ
diff --git a/assets/gfx/misc/creep/creep239.tga b/assets/gfx/misc/creep/creep239.tga
new file mode 100644
index 000000000..54de150b8
Binary files /dev/null and b/assets/gfx/misc/creep/creep239.tga differ
diff --git a/assets/gfx/misc/creep/creep24.tga b/assets/gfx/misc/creep/creep24.tga
new file mode 100644
index 000000000..a6ccc4841
Binary files /dev/null and b/assets/gfx/misc/creep/creep24.tga differ
diff --git a/assets/gfx/misc/creep/creep240.tga b/assets/gfx/misc/creep/creep240.tga
new file mode 100644
index 000000000..8ef527e3c
Binary files /dev/null and b/assets/gfx/misc/creep/creep240.tga differ
diff --git a/assets/gfx/misc/creep/creep241.tga b/assets/gfx/misc/creep/creep241.tga
new file mode 100644
index 000000000..0c139af35
Binary files /dev/null and b/assets/gfx/misc/creep/creep241.tga differ
diff --git a/assets/gfx/misc/creep/creep242.tga b/assets/gfx/misc/creep/creep242.tga
new file mode 100644
index 000000000..7fdfe48c1
Binary files /dev/null and b/assets/gfx/misc/creep/creep242.tga differ
diff --git a/assets/gfx/misc/creep/creep243.tga b/assets/gfx/misc/creep/creep243.tga
new file mode 100644
index 000000000..fc9591723
Binary files /dev/null and b/assets/gfx/misc/creep/creep243.tga differ
diff --git a/assets/gfx/misc/creep/creep244.tga b/assets/gfx/misc/creep/creep244.tga
new file mode 100644
index 000000000..db37fe18c
Binary files /dev/null and b/assets/gfx/misc/creep/creep244.tga differ
diff --git a/assets/gfx/misc/creep/creep245.tga b/assets/gfx/misc/creep/creep245.tga
new file mode 100644
index 000000000..2ee8d4326
Binary files /dev/null and b/assets/gfx/misc/creep/creep245.tga differ
diff --git a/assets/gfx/misc/creep/creep246.tga b/assets/gfx/misc/creep/creep246.tga
new file mode 100644
index 000000000..8ed0acc6c
Binary files /dev/null and b/assets/gfx/misc/creep/creep246.tga differ
diff --git a/assets/gfx/misc/creep/creep247.tga b/assets/gfx/misc/creep/creep247.tga
new file mode 100644
index 000000000..210a123db
Binary files /dev/null and b/assets/gfx/misc/creep/creep247.tga differ
diff --git a/assets/gfx/misc/creep/creep248.tga b/assets/gfx/misc/creep/creep248.tga
new file mode 100644
index 000000000..f40d9e780
Binary files /dev/null and b/assets/gfx/misc/creep/creep248.tga differ
diff --git a/assets/gfx/misc/creep/creep249.tga b/assets/gfx/misc/creep/creep249.tga
new file mode 100644
index 000000000..b39fa514c
Binary files /dev/null and b/assets/gfx/misc/creep/creep249.tga differ
diff --git a/assets/gfx/misc/creep/creep25.tga b/assets/gfx/misc/creep/creep25.tga
new file mode 100644
index 000000000..578c36640
Binary files /dev/null and b/assets/gfx/misc/creep/creep25.tga differ
diff --git a/assets/gfx/misc/creep/creep250.tga b/assets/gfx/misc/creep/creep250.tga
new file mode 100644
index 000000000..7444bae14
Binary files /dev/null and b/assets/gfx/misc/creep/creep250.tga differ
diff --git a/assets/gfx/misc/creep/creep251.tga b/assets/gfx/misc/creep/creep251.tga
new file mode 100644
index 000000000..0211ae2a7
Binary files /dev/null and b/assets/gfx/misc/creep/creep251.tga differ
diff --git a/assets/gfx/misc/creep/creep252.tga b/assets/gfx/misc/creep/creep252.tga
new file mode 100644
index 000000000..5a4550a92
Binary files /dev/null and b/assets/gfx/misc/creep/creep252.tga differ
diff --git a/assets/gfx/misc/creep/creep253.tga b/assets/gfx/misc/creep/creep253.tga
new file mode 100644
index 000000000..3b53474ca
Binary files /dev/null and b/assets/gfx/misc/creep/creep253.tga differ
diff --git a/assets/gfx/misc/creep/creep254.tga b/assets/gfx/misc/creep/creep254.tga
new file mode 100644
index 000000000..6ef5cc963
Binary files /dev/null and b/assets/gfx/misc/creep/creep254.tga differ
diff --git a/assets/gfx/misc/creep/creep255.tga b/assets/gfx/misc/creep/creep255.tga
new file mode 100644
index 000000000..5ef099846
Binary files /dev/null and b/assets/gfx/misc/creep/creep255.tga differ
diff --git a/assets/gfx/misc/creep/creep256.tga b/assets/gfx/misc/creep/creep256.tga
new file mode 100644
index 000000000..967869aac
Binary files /dev/null and b/assets/gfx/misc/creep/creep256.tga differ
diff --git a/assets/gfx/misc/creep/creep257.tga b/assets/gfx/misc/creep/creep257.tga
new file mode 100644
index 000000000..501a29497
Binary files /dev/null and b/assets/gfx/misc/creep/creep257.tga differ
diff --git a/assets/gfx/misc/creep/creep258.tga b/assets/gfx/misc/creep/creep258.tga
new file mode 100644
index 000000000..289a359fc
Binary files /dev/null and b/assets/gfx/misc/creep/creep258.tga differ
diff --git a/assets/gfx/misc/creep/creep259.tga b/assets/gfx/misc/creep/creep259.tga
new file mode 100644
index 000000000..239c98181
Binary files /dev/null and b/assets/gfx/misc/creep/creep259.tga differ
diff --git a/assets/gfx/misc/creep/creep26.tga b/assets/gfx/misc/creep/creep26.tga
new file mode 100644
index 000000000..13be353a2
Binary files /dev/null and b/assets/gfx/misc/creep/creep26.tga differ
diff --git a/assets/gfx/misc/creep/creep260.tga b/assets/gfx/misc/creep/creep260.tga
new file mode 100644
index 000000000..fd7b5e1a1
Binary files /dev/null and b/assets/gfx/misc/creep/creep260.tga differ
diff --git a/assets/gfx/misc/creep/creep261.tga b/assets/gfx/misc/creep/creep261.tga
new file mode 100644
index 000000000..d3332f59d
Binary files /dev/null and b/assets/gfx/misc/creep/creep261.tga differ
diff --git a/assets/gfx/misc/creep/creep262.tga b/assets/gfx/misc/creep/creep262.tga
new file mode 100644
index 000000000..6f1293ba9
Binary files /dev/null and b/assets/gfx/misc/creep/creep262.tga differ
diff --git a/assets/gfx/misc/creep/creep263.tga b/assets/gfx/misc/creep/creep263.tga
new file mode 100644
index 000000000..7ef1a2296
Binary files /dev/null and b/assets/gfx/misc/creep/creep263.tga differ
diff --git a/assets/gfx/misc/creep/creep264.tga b/assets/gfx/misc/creep/creep264.tga
new file mode 100644
index 000000000..6f3568c4a
Binary files /dev/null and b/assets/gfx/misc/creep/creep264.tga differ
diff --git a/assets/gfx/misc/creep/creep265.tga b/assets/gfx/misc/creep/creep265.tga
new file mode 100644
index 000000000..f7cfadb10
Binary files /dev/null and b/assets/gfx/misc/creep/creep265.tga differ
diff --git a/assets/gfx/misc/creep/creep266.tga b/assets/gfx/misc/creep/creep266.tga
new file mode 100644
index 000000000..efec66c37
Binary files /dev/null and b/assets/gfx/misc/creep/creep266.tga differ
diff --git a/assets/gfx/misc/creep/creep267.tga b/assets/gfx/misc/creep/creep267.tga
new file mode 100644
index 000000000..c5e6eac00
Binary files /dev/null and b/assets/gfx/misc/creep/creep267.tga differ
diff --git a/assets/gfx/misc/creep/creep268.tga b/assets/gfx/misc/creep/creep268.tga
new file mode 100644
index 000000000..d9579faea
Binary files /dev/null and b/assets/gfx/misc/creep/creep268.tga differ
diff --git a/assets/gfx/misc/creep/creep269.tga b/assets/gfx/misc/creep/creep269.tga
new file mode 100644
index 000000000..11d7dcea8
Binary files /dev/null and b/assets/gfx/misc/creep/creep269.tga differ
diff --git a/assets/gfx/misc/creep/creep27.tga b/assets/gfx/misc/creep/creep27.tga
new file mode 100644
index 000000000..07f66b918
Binary files /dev/null and b/assets/gfx/misc/creep/creep27.tga differ
diff --git a/assets/gfx/misc/creep/creep270.tga b/assets/gfx/misc/creep/creep270.tga
new file mode 100644
index 000000000..857a7d3cc
Binary files /dev/null and b/assets/gfx/misc/creep/creep270.tga differ
diff --git a/assets/gfx/misc/creep/creep271.tga b/assets/gfx/misc/creep/creep271.tga
new file mode 100644
index 000000000..f94bb220c
Binary files /dev/null and b/assets/gfx/misc/creep/creep271.tga differ
diff --git a/assets/gfx/misc/creep/creep272.tga b/assets/gfx/misc/creep/creep272.tga
new file mode 100644
index 000000000..7941e555f
Binary files /dev/null and b/assets/gfx/misc/creep/creep272.tga differ
diff --git a/assets/gfx/misc/creep/creep273.tga b/assets/gfx/misc/creep/creep273.tga
new file mode 100644
index 000000000..6266a7b05
Binary files /dev/null and b/assets/gfx/misc/creep/creep273.tga differ
diff --git a/assets/gfx/misc/creep/creep274.tga b/assets/gfx/misc/creep/creep274.tga
new file mode 100644
index 000000000..1216ecb7f
Binary files /dev/null and b/assets/gfx/misc/creep/creep274.tga differ
diff --git a/assets/gfx/misc/creep/creep275.tga b/assets/gfx/misc/creep/creep275.tga
new file mode 100644
index 000000000..1e7afb1cd
Binary files /dev/null and b/assets/gfx/misc/creep/creep275.tga differ
diff --git a/assets/gfx/misc/creep/creep276.tga b/assets/gfx/misc/creep/creep276.tga
new file mode 100644
index 000000000..200ddae37
Binary files /dev/null and b/assets/gfx/misc/creep/creep276.tga differ
diff --git a/assets/gfx/misc/creep/creep277.tga b/assets/gfx/misc/creep/creep277.tga
new file mode 100644
index 000000000..c0a8e790e
Binary files /dev/null and b/assets/gfx/misc/creep/creep277.tga differ
diff --git a/assets/gfx/misc/creep/creep278.tga b/assets/gfx/misc/creep/creep278.tga
new file mode 100644
index 000000000..ac84d0a4c
Binary files /dev/null and b/assets/gfx/misc/creep/creep278.tga differ
diff --git a/assets/gfx/misc/creep/creep279.tga b/assets/gfx/misc/creep/creep279.tga
new file mode 100644
index 000000000..3136c2d6e
Binary files /dev/null and b/assets/gfx/misc/creep/creep279.tga differ
diff --git a/assets/gfx/misc/creep/creep28.tga b/assets/gfx/misc/creep/creep28.tga
new file mode 100644
index 000000000..1e23a7ba5
Binary files /dev/null and b/assets/gfx/misc/creep/creep28.tga differ
diff --git a/assets/gfx/misc/creep/creep280.tga b/assets/gfx/misc/creep/creep280.tga
new file mode 100644
index 000000000..91af39381
Binary files /dev/null and b/assets/gfx/misc/creep/creep280.tga differ
diff --git a/assets/gfx/misc/creep/creep281.tga b/assets/gfx/misc/creep/creep281.tga
new file mode 100644
index 000000000..b0ca23834
Binary files /dev/null and b/assets/gfx/misc/creep/creep281.tga differ
diff --git a/assets/gfx/misc/creep/creep282.tga b/assets/gfx/misc/creep/creep282.tga
new file mode 100644
index 000000000..07854dadf
Binary files /dev/null and b/assets/gfx/misc/creep/creep282.tga differ
diff --git a/assets/gfx/misc/creep/creep283.tga b/assets/gfx/misc/creep/creep283.tga
new file mode 100644
index 000000000..b7b322eb1
Binary files /dev/null and b/assets/gfx/misc/creep/creep283.tga differ
diff --git a/assets/gfx/misc/creep/creep284.tga b/assets/gfx/misc/creep/creep284.tga
new file mode 100644
index 000000000..29ef2b7a6
Binary files /dev/null and b/assets/gfx/misc/creep/creep284.tga differ
diff --git a/assets/gfx/misc/creep/creep285.tga b/assets/gfx/misc/creep/creep285.tga
new file mode 100644
index 000000000..932161114
Binary files /dev/null and b/assets/gfx/misc/creep/creep285.tga differ
diff --git a/assets/gfx/misc/creep/creep286.tga b/assets/gfx/misc/creep/creep286.tga
new file mode 100644
index 000000000..1f35da245
Binary files /dev/null and b/assets/gfx/misc/creep/creep286.tga differ
diff --git a/assets/gfx/misc/creep/creep287.tga b/assets/gfx/misc/creep/creep287.tga
new file mode 100644
index 000000000..f21497854
Binary files /dev/null and b/assets/gfx/misc/creep/creep287.tga differ
diff --git a/assets/gfx/misc/creep/creep288.tga b/assets/gfx/misc/creep/creep288.tga
new file mode 100644
index 000000000..131bdda1f
Binary files /dev/null and b/assets/gfx/misc/creep/creep288.tga differ
diff --git a/assets/gfx/misc/creep/creep289.tga b/assets/gfx/misc/creep/creep289.tga
new file mode 100644
index 000000000..6e8eabf24
Binary files /dev/null and b/assets/gfx/misc/creep/creep289.tga differ
diff --git a/assets/gfx/misc/creep/creep29.tga b/assets/gfx/misc/creep/creep29.tga
new file mode 100644
index 000000000..251cb87f3
Binary files /dev/null and b/assets/gfx/misc/creep/creep29.tga differ
diff --git a/assets/gfx/misc/creep/creep290.tga b/assets/gfx/misc/creep/creep290.tga
new file mode 100644
index 000000000..48677545b
Binary files /dev/null and b/assets/gfx/misc/creep/creep290.tga differ
diff --git a/assets/gfx/misc/creep/creep291.tga b/assets/gfx/misc/creep/creep291.tga
new file mode 100644
index 000000000..4de530aa9
Binary files /dev/null and b/assets/gfx/misc/creep/creep291.tga differ
diff --git a/assets/gfx/misc/creep/creep292.tga b/assets/gfx/misc/creep/creep292.tga
new file mode 100644
index 000000000..71e938895
Binary files /dev/null and b/assets/gfx/misc/creep/creep292.tga differ
diff --git a/assets/gfx/misc/creep/creep293.tga b/assets/gfx/misc/creep/creep293.tga
new file mode 100644
index 000000000..bf71099db
Binary files /dev/null and b/assets/gfx/misc/creep/creep293.tga differ
diff --git a/assets/gfx/misc/creep/creep294.tga b/assets/gfx/misc/creep/creep294.tga
new file mode 100644
index 000000000..d2e332513
Binary files /dev/null and b/assets/gfx/misc/creep/creep294.tga differ
diff --git a/assets/gfx/misc/creep/creep295.tga b/assets/gfx/misc/creep/creep295.tga
new file mode 100644
index 000000000..f37494b9b
Binary files /dev/null and b/assets/gfx/misc/creep/creep295.tga differ
diff --git a/assets/gfx/misc/creep/creep296.tga b/assets/gfx/misc/creep/creep296.tga
new file mode 100644
index 000000000..ca5e0cede
Binary files /dev/null and b/assets/gfx/misc/creep/creep296.tga differ
diff --git a/assets/gfx/misc/creep/creep297.tga b/assets/gfx/misc/creep/creep297.tga
new file mode 100644
index 000000000..98d92ba3c
Binary files /dev/null and b/assets/gfx/misc/creep/creep297.tga differ
diff --git a/assets/gfx/misc/creep/creep298.tga b/assets/gfx/misc/creep/creep298.tga
new file mode 100644
index 000000000..9b89f7649
Binary files /dev/null and b/assets/gfx/misc/creep/creep298.tga differ
diff --git a/assets/gfx/misc/creep/creep299.tga b/assets/gfx/misc/creep/creep299.tga
new file mode 100644
index 000000000..243b189bf
Binary files /dev/null and b/assets/gfx/misc/creep/creep299.tga differ
diff --git a/assets/gfx/misc/creep/creep3.tga b/assets/gfx/misc/creep/creep3.tga
new file mode 100644
index 000000000..5533b0e0e
Binary files /dev/null and b/assets/gfx/misc/creep/creep3.tga differ
diff --git a/assets/gfx/misc/creep/creep30.tga b/assets/gfx/misc/creep/creep30.tga
new file mode 100644
index 000000000..4d7682e75
Binary files /dev/null and b/assets/gfx/misc/creep/creep30.tga differ
diff --git a/assets/gfx/misc/creep/creep300.tga b/assets/gfx/misc/creep/creep300.tga
new file mode 100644
index 000000000..a3cebd639
Binary files /dev/null and b/assets/gfx/misc/creep/creep300.tga differ
diff --git a/assets/gfx/misc/creep/creep301.tga b/assets/gfx/misc/creep/creep301.tga
new file mode 100644
index 000000000..bd1bfd283
Binary files /dev/null and b/assets/gfx/misc/creep/creep301.tga differ
diff --git a/assets/gfx/misc/creep/creep302.tga b/assets/gfx/misc/creep/creep302.tga
new file mode 100644
index 000000000..b20ae621e
Binary files /dev/null and b/assets/gfx/misc/creep/creep302.tga differ
diff --git a/assets/gfx/misc/creep/creep303.tga b/assets/gfx/misc/creep/creep303.tga
new file mode 100644
index 000000000..655dcde8e
Binary files /dev/null and b/assets/gfx/misc/creep/creep303.tga differ
diff --git a/assets/gfx/misc/creep/creep304.tga b/assets/gfx/misc/creep/creep304.tga
new file mode 100644
index 000000000..2a6bd5719
Binary files /dev/null and b/assets/gfx/misc/creep/creep304.tga differ
diff --git a/assets/gfx/misc/creep/creep305.tga b/assets/gfx/misc/creep/creep305.tga
new file mode 100644
index 000000000..6d8092d5e
Binary files /dev/null and b/assets/gfx/misc/creep/creep305.tga differ
diff --git a/assets/gfx/misc/creep/creep306.tga b/assets/gfx/misc/creep/creep306.tga
new file mode 100644
index 000000000..3be259f89
Binary files /dev/null and b/assets/gfx/misc/creep/creep306.tga differ
diff --git a/assets/gfx/misc/creep/creep307.tga b/assets/gfx/misc/creep/creep307.tga
new file mode 100644
index 000000000..4553eb689
Binary files /dev/null and b/assets/gfx/misc/creep/creep307.tga differ
diff --git a/assets/gfx/misc/creep/creep308.tga b/assets/gfx/misc/creep/creep308.tga
new file mode 100644
index 000000000..bed6b170e
Binary files /dev/null and b/assets/gfx/misc/creep/creep308.tga differ
diff --git a/assets/gfx/misc/creep/creep309.tga b/assets/gfx/misc/creep/creep309.tga
new file mode 100644
index 000000000..28179c804
Binary files /dev/null and b/assets/gfx/misc/creep/creep309.tga differ
diff --git a/assets/gfx/misc/creep/creep31.tga b/assets/gfx/misc/creep/creep31.tga
new file mode 100644
index 000000000..319fbe44a
Binary files /dev/null and b/assets/gfx/misc/creep/creep31.tga differ
diff --git a/assets/gfx/misc/creep/creep310.tga b/assets/gfx/misc/creep/creep310.tga
new file mode 100644
index 000000000..5a9d094ba
Binary files /dev/null and b/assets/gfx/misc/creep/creep310.tga differ
diff --git a/assets/gfx/misc/creep/creep311.tga b/assets/gfx/misc/creep/creep311.tga
new file mode 100644
index 000000000..eb473080a
Binary files /dev/null and b/assets/gfx/misc/creep/creep311.tga differ
diff --git a/assets/gfx/misc/creep/creep312.tga b/assets/gfx/misc/creep/creep312.tga
new file mode 100644
index 000000000..6163f3b69
Binary files /dev/null and b/assets/gfx/misc/creep/creep312.tga differ
diff --git a/assets/gfx/misc/creep/creep313.tga b/assets/gfx/misc/creep/creep313.tga
new file mode 100644
index 000000000..db2581e46
Binary files /dev/null and b/assets/gfx/misc/creep/creep313.tga differ
diff --git a/assets/gfx/misc/creep/creep314.tga b/assets/gfx/misc/creep/creep314.tga
new file mode 100644
index 000000000..b39020140
Binary files /dev/null and b/assets/gfx/misc/creep/creep314.tga differ
diff --git a/assets/gfx/misc/creep/creep315.tga b/assets/gfx/misc/creep/creep315.tga
new file mode 100644
index 000000000..dcaf1add4
Binary files /dev/null and b/assets/gfx/misc/creep/creep315.tga differ
diff --git a/assets/gfx/misc/creep/creep316.tga b/assets/gfx/misc/creep/creep316.tga
new file mode 100644
index 000000000..f688b6e5d
Binary files /dev/null and b/assets/gfx/misc/creep/creep316.tga differ
diff --git a/assets/gfx/misc/creep/creep317.tga b/assets/gfx/misc/creep/creep317.tga
new file mode 100644
index 000000000..7bce31faf
Binary files /dev/null and b/assets/gfx/misc/creep/creep317.tga differ
diff --git a/assets/gfx/misc/creep/creep318.tga b/assets/gfx/misc/creep/creep318.tga
new file mode 100644
index 000000000..4d648eebe
Binary files /dev/null and b/assets/gfx/misc/creep/creep318.tga differ
diff --git a/assets/gfx/misc/creep/creep319.tga b/assets/gfx/misc/creep/creep319.tga
new file mode 100644
index 000000000..e6989134e
Binary files /dev/null and b/assets/gfx/misc/creep/creep319.tga differ
diff --git a/assets/gfx/misc/creep/creep32.tga b/assets/gfx/misc/creep/creep32.tga
new file mode 100644
index 000000000..463b354bb
Binary files /dev/null and b/assets/gfx/misc/creep/creep32.tga differ
diff --git a/assets/gfx/misc/creep/creep320.tga b/assets/gfx/misc/creep/creep320.tga
new file mode 100644
index 000000000..060d36da5
Binary files /dev/null and b/assets/gfx/misc/creep/creep320.tga differ
diff --git a/assets/gfx/misc/creep/creep321.tga b/assets/gfx/misc/creep/creep321.tga
new file mode 100644
index 000000000..e6c30ae3f
Binary files /dev/null and b/assets/gfx/misc/creep/creep321.tga differ
diff --git a/assets/gfx/misc/creep/creep322.tga b/assets/gfx/misc/creep/creep322.tga
new file mode 100644
index 000000000..69e13b240
Binary files /dev/null and b/assets/gfx/misc/creep/creep322.tga differ
diff --git a/assets/gfx/misc/creep/creep323.tga b/assets/gfx/misc/creep/creep323.tga
new file mode 100644
index 000000000..e389b135e
Binary files /dev/null and b/assets/gfx/misc/creep/creep323.tga differ
diff --git a/assets/gfx/misc/creep/creep324.tga b/assets/gfx/misc/creep/creep324.tga
new file mode 100644
index 000000000..3ba1a0cf6
Binary files /dev/null and b/assets/gfx/misc/creep/creep324.tga differ
diff --git a/assets/gfx/misc/creep/creep325.tga b/assets/gfx/misc/creep/creep325.tga
new file mode 100644
index 000000000..4f460dc08
Binary files /dev/null and b/assets/gfx/misc/creep/creep325.tga differ
diff --git a/assets/gfx/misc/creep/creep326.tga b/assets/gfx/misc/creep/creep326.tga
new file mode 100644
index 000000000..132340fd5
Binary files /dev/null and b/assets/gfx/misc/creep/creep326.tga differ
diff --git a/assets/gfx/misc/creep/creep327.tga b/assets/gfx/misc/creep/creep327.tga
new file mode 100644
index 000000000..5c2515719
Binary files /dev/null and b/assets/gfx/misc/creep/creep327.tga differ
diff --git a/assets/gfx/misc/creep/creep328.tga b/assets/gfx/misc/creep/creep328.tga
new file mode 100644
index 000000000..aa2fa10d6
Binary files /dev/null and b/assets/gfx/misc/creep/creep328.tga differ
diff --git a/assets/gfx/misc/creep/creep329.tga b/assets/gfx/misc/creep/creep329.tga
new file mode 100644
index 000000000..698e37091
Binary files /dev/null and b/assets/gfx/misc/creep/creep329.tga differ
diff --git a/assets/gfx/misc/creep/creep33.tga b/assets/gfx/misc/creep/creep33.tga
new file mode 100644
index 000000000..2e4b6a964
Binary files /dev/null and b/assets/gfx/misc/creep/creep33.tga differ
diff --git a/assets/gfx/misc/creep/creep330.tga b/assets/gfx/misc/creep/creep330.tga
new file mode 100644
index 000000000..8e7cb81fe
Binary files /dev/null and b/assets/gfx/misc/creep/creep330.tga differ
diff --git a/assets/gfx/misc/creep/creep331.tga b/assets/gfx/misc/creep/creep331.tga
new file mode 100644
index 000000000..8029830e3
Binary files /dev/null and b/assets/gfx/misc/creep/creep331.tga differ
diff --git a/assets/gfx/misc/creep/creep332.tga b/assets/gfx/misc/creep/creep332.tga
new file mode 100644
index 000000000..48f46ae41
Binary files /dev/null and b/assets/gfx/misc/creep/creep332.tga differ
diff --git a/assets/gfx/misc/creep/creep333.tga b/assets/gfx/misc/creep/creep333.tga
new file mode 100644
index 000000000..b283dee9f
Binary files /dev/null and b/assets/gfx/misc/creep/creep333.tga differ
diff --git a/assets/gfx/misc/creep/creep334.tga b/assets/gfx/misc/creep/creep334.tga
new file mode 100644
index 000000000..48f46ae41
Binary files /dev/null and b/assets/gfx/misc/creep/creep334.tga differ
diff --git a/assets/gfx/misc/creep/creep335.tga b/assets/gfx/misc/creep/creep335.tga
new file mode 100644
index 000000000..e765fa61c
Binary files /dev/null and b/assets/gfx/misc/creep/creep335.tga differ
diff --git a/assets/gfx/misc/creep/creep336.tga b/assets/gfx/misc/creep/creep336.tga
new file mode 100644
index 000000000..f4530e8ce
Binary files /dev/null and b/assets/gfx/misc/creep/creep336.tga differ
diff --git a/assets/gfx/misc/creep/creep337.tga b/assets/gfx/misc/creep/creep337.tga
new file mode 100644
index 000000000..c92e40e56
Binary files /dev/null and b/assets/gfx/misc/creep/creep337.tga differ
diff --git a/assets/gfx/misc/creep/creep338.tga b/assets/gfx/misc/creep/creep338.tga
new file mode 100644
index 000000000..e672813d1
Binary files /dev/null and b/assets/gfx/misc/creep/creep338.tga differ
diff --git a/assets/gfx/misc/creep/creep339.tga b/assets/gfx/misc/creep/creep339.tga
new file mode 100644
index 000000000..32c71558b
Binary files /dev/null and b/assets/gfx/misc/creep/creep339.tga differ
diff --git a/assets/gfx/misc/creep/creep34.tga b/assets/gfx/misc/creep/creep34.tga
new file mode 100644
index 000000000..7d7ddaa1b
Binary files /dev/null and b/assets/gfx/misc/creep/creep34.tga differ
diff --git a/assets/gfx/misc/creep/creep340.tga b/assets/gfx/misc/creep/creep340.tga
new file mode 100644
index 000000000..862376f6e
Binary files /dev/null and b/assets/gfx/misc/creep/creep340.tga differ
diff --git a/assets/gfx/misc/creep/creep341.tga b/assets/gfx/misc/creep/creep341.tga
new file mode 100644
index 000000000..00da69b55
Binary files /dev/null and b/assets/gfx/misc/creep/creep341.tga differ
diff --git a/assets/gfx/misc/creep/creep342.tga b/assets/gfx/misc/creep/creep342.tga
new file mode 100644
index 000000000..7aeafce02
Binary files /dev/null and b/assets/gfx/misc/creep/creep342.tga differ
diff --git a/assets/gfx/misc/creep/creep343.tga b/assets/gfx/misc/creep/creep343.tga
new file mode 100644
index 000000000..ece8b4ec7
Binary files /dev/null and b/assets/gfx/misc/creep/creep343.tga differ
diff --git a/assets/gfx/misc/creep/creep344.tga b/assets/gfx/misc/creep/creep344.tga
new file mode 100644
index 000000000..de207ef5b
Binary files /dev/null and b/assets/gfx/misc/creep/creep344.tga differ
diff --git a/assets/gfx/misc/creep/creep345.tga b/assets/gfx/misc/creep/creep345.tga
new file mode 100644
index 000000000..01d073f7a
Binary files /dev/null and b/assets/gfx/misc/creep/creep345.tga differ
diff --git a/assets/gfx/misc/creep/creep346.tga b/assets/gfx/misc/creep/creep346.tga
new file mode 100644
index 000000000..d4d375877
Binary files /dev/null and b/assets/gfx/misc/creep/creep346.tga differ
diff --git a/assets/gfx/misc/creep/creep347.tga b/assets/gfx/misc/creep/creep347.tga
new file mode 100644
index 000000000..59cb49450
Binary files /dev/null and b/assets/gfx/misc/creep/creep347.tga differ
diff --git a/assets/gfx/misc/creep/creep348.tga b/assets/gfx/misc/creep/creep348.tga
new file mode 100644
index 000000000..af7e4c2dc
Binary files /dev/null and b/assets/gfx/misc/creep/creep348.tga differ
diff --git a/assets/gfx/misc/creep/creep349.tga b/assets/gfx/misc/creep/creep349.tga
new file mode 100644
index 000000000..b9372ae03
Binary files /dev/null and b/assets/gfx/misc/creep/creep349.tga differ
diff --git a/assets/gfx/misc/creep/creep35.tga b/assets/gfx/misc/creep/creep35.tga
new file mode 100644
index 000000000..c68cf6f9c
Binary files /dev/null and b/assets/gfx/misc/creep/creep35.tga differ
diff --git a/assets/gfx/misc/creep/creep350.tga b/assets/gfx/misc/creep/creep350.tga
new file mode 100644
index 000000000..d9cc744aa
Binary files /dev/null and b/assets/gfx/misc/creep/creep350.tga differ
diff --git a/assets/gfx/misc/creep/creep351.tga b/assets/gfx/misc/creep/creep351.tga
new file mode 100644
index 000000000..bc748661b
Binary files /dev/null and b/assets/gfx/misc/creep/creep351.tga differ
diff --git a/assets/gfx/misc/creep/creep352.tga b/assets/gfx/misc/creep/creep352.tga
new file mode 100644
index 000000000..63e09d6db
Binary files /dev/null and b/assets/gfx/misc/creep/creep352.tga differ
diff --git a/assets/gfx/misc/creep/creep353.tga b/assets/gfx/misc/creep/creep353.tga
new file mode 100644
index 000000000..9bf7c3d35
Binary files /dev/null and b/assets/gfx/misc/creep/creep353.tga differ
diff --git a/assets/gfx/misc/creep/creep354.tga b/assets/gfx/misc/creep/creep354.tga
new file mode 100644
index 000000000..162f0dc09
Binary files /dev/null and b/assets/gfx/misc/creep/creep354.tga differ
diff --git a/assets/gfx/misc/creep/creep355.tga b/assets/gfx/misc/creep/creep355.tga
new file mode 100644
index 000000000..586380d81
Binary files /dev/null and b/assets/gfx/misc/creep/creep355.tga differ
diff --git a/assets/gfx/misc/creep/creep356.tga b/assets/gfx/misc/creep/creep356.tga
new file mode 100644
index 000000000..8f9279065
Binary files /dev/null and b/assets/gfx/misc/creep/creep356.tga differ
diff --git a/assets/gfx/misc/creep/creep357.tga b/assets/gfx/misc/creep/creep357.tga
new file mode 100644
index 000000000..ee76318bb
Binary files /dev/null and b/assets/gfx/misc/creep/creep357.tga differ
diff --git a/assets/gfx/misc/creep/creep358.tga b/assets/gfx/misc/creep/creep358.tga
new file mode 100644
index 000000000..8c79320be
Binary files /dev/null and b/assets/gfx/misc/creep/creep358.tga differ
diff --git a/assets/gfx/misc/creep/creep359.tga b/assets/gfx/misc/creep/creep359.tga
new file mode 100644
index 000000000..b93511400
Binary files /dev/null and b/assets/gfx/misc/creep/creep359.tga differ
diff --git a/assets/gfx/misc/creep/creep36.tga b/assets/gfx/misc/creep/creep36.tga
new file mode 100644
index 000000000..0b97a1087
Binary files /dev/null and b/assets/gfx/misc/creep/creep36.tga differ
diff --git a/assets/gfx/misc/creep/creep360.tga b/assets/gfx/misc/creep/creep360.tga
new file mode 100644
index 000000000..61b704010
Binary files /dev/null and b/assets/gfx/misc/creep/creep360.tga differ
diff --git a/assets/gfx/misc/creep/creep361.tga b/assets/gfx/misc/creep/creep361.tga
new file mode 100644
index 000000000..698e5dab5
Binary files /dev/null and b/assets/gfx/misc/creep/creep361.tga differ
diff --git a/assets/gfx/misc/creep/creep362.tga b/assets/gfx/misc/creep/creep362.tga
new file mode 100644
index 000000000..e290d0e54
Binary files /dev/null and b/assets/gfx/misc/creep/creep362.tga differ
diff --git a/assets/gfx/misc/creep/creep363.tga b/assets/gfx/misc/creep/creep363.tga
new file mode 100644
index 000000000..7178649f3
Binary files /dev/null and b/assets/gfx/misc/creep/creep363.tga differ
diff --git a/assets/gfx/misc/creep/creep364.tga b/assets/gfx/misc/creep/creep364.tga
new file mode 100644
index 000000000..b0ff28b8f
Binary files /dev/null and b/assets/gfx/misc/creep/creep364.tga differ
diff --git a/assets/gfx/misc/creep/creep365.tga b/assets/gfx/misc/creep/creep365.tga
new file mode 100644
index 000000000..e04da415d
Binary files /dev/null and b/assets/gfx/misc/creep/creep365.tga differ
diff --git a/assets/gfx/misc/creep/creep366.tga b/assets/gfx/misc/creep/creep366.tga
new file mode 100644
index 000000000..fbab00c70
Binary files /dev/null and b/assets/gfx/misc/creep/creep366.tga differ
diff --git a/assets/gfx/misc/creep/creep367.tga b/assets/gfx/misc/creep/creep367.tga
new file mode 100644
index 000000000..4e9218d79
Binary files /dev/null and b/assets/gfx/misc/creep/creep367.tga differ
diff --git a/assets/gfx/misc/creep/creep368.tga b/assets/gfx/misc/creep/creep368.tga
new file mode 100644
index 000000000..101e04141
Binary files /dev/null and b/assets/gfx/misc/creep/creep368.tga differ
diff --git a/assets/gfx/misc/creep/creep369.tga b/assets/gfx/misc/creep/creep369.tga
new file mode 100644
index 000000000..efd679be4
Binary files /dev/null and b/assets/gfx/misc/creep/creep369.tga differ
diff --git a/assets/gfx/misc/creep/creep37.tga b/assets/gfx/misc/creep/creep37.tga
new file mode 100644
index 000000000..03a94f1f8
Binary files /dev/null and b/assets/gfx/misc/creep/creep37.tga differ
diff --git a/assets/gfx/misc/creep/creep370.tga b/assets/gfx/misc/creep/creep370.tga
new file mode 100644
index 000000000..792cb5bf3
Binary files /dev/null and b/assets/gfx/misc/creep/creep370.tga differ
diff --git a/assets/gfx/misc/creep/creep371.tga b/assets/gfx/misc/creep/creep371.tga
new file mode 100644
index 000000000..144e30ea9
Binary files /dev/null and b/assets/gfx/misc/creep/creep371.tga differ
diff --git a/assets/gfx/misc/creep/creep372.tga b/assets/gfx/misc/creep/creep372.tga
new file mode 100644
index 000000000..69c6d1ac9
Binary files /dev/null and b/assets/gfx/misc/creep/creep372.tga differ
diff --git a/assets/gfx/misc/creep/creep373.tga b/assets/gfx/misc/creep/creep373.tga
new file mode 100644
index 000000000..4de3d1179
Binary files /dev/null and b/assets/gfx/misc/creep/creep373.tga differ
diff --git a/assets/gfx/misc/creep/creep374.tga b/assets/gfx/misc/creep/creep374.tga
new file mode 100644
index 000000000..7342e530c
Binary files /dev/null and b/assets/gfx/misc/creep/creep374.tga differ
diff --git a/assets/gfx/misc/creep/creep375.tga b/assets/gfx/misc/creep/creep375.tga
new file mode 100644
index 000000000..5a14def3a
Binary files /dev/null and b/assets/gfx/misc/creep/creep375.tga differ
diff --git a/assets/gfx/misc/creep/creep376.tga b/assets/gfx/misc/creep/creep376.tga
new file mode 100644
index 000000000..e5569d511
Binary files /dev/null and b/assets/gfx/misc/creep/creep376.tga differ
diff --git a/assets/gfx/misc/creep/creep377.tga b/assets/gfx/misc/creep/creep377.tga
new file mode 100644
index 000000000..40cdf5165
Binary files /dev/null and b/assets/gfx/misc/creep/creep377.tga differ
diff --git a/assets/gfx/misc/creep/creep378.tga b/assets/gfx/misc/creep/creep378.tga
new file mode 100644
index 000000000..3aa3b1964
Binary files /dev/null and b/assets/gfx/misc/creep/creep378.tga differ
diff --git a/assets/gfx/misc/creep/creep379.tga b/assets/gfx/misc/creep/creep379.tga
new file mode 100644
index 000000000..bea054375
Binary files /dev/null and b/assets/gfx/misc/creep/creep379.tga differ
diff --git a/assets/gfx/misc/creep/creep38.tga b/assets/gfx/misc/creep/creep38.tga
new file mode 100644
index 000000000..c2d17fae1
Binary files /dev/null and b/assets/gfx/misc/creep/creep38.tga differ
diff --git a/assets/gfx/misc/creep/creep380.tga b/assets/gfx/misc/creep/creep380.tga
new file mode 100644
index 000000000..c223eb50f
Binary files /dev/null and b/assets/gfx/misc/creep/creep380.tga differ
diff --git a/assets/gfx/misc/creep/creep381.tga b/assets/gfx/misc/creep/creep381.tga
new file mode 100644
index 000000000..2066940e0
Binary files /dev/null and b/assets/gfx/misc/creep/creep381.tga differ
diff --git a/assets/gfx/misc/creep/creep382.tga b/assets/gfx/misc/creep/creep382.tga
new file mode 100644
index 000000000..d15f93f36
Binary files /dev/null and b/assets/gfx/misc/creep/creep382.tga differ
diff --git a/assets/gfx/misc/creep/creep383.tga b/assets/gfx/misc/creep/creep383.tga
new file mode 100644
index 000000000..b1622d145
Binary files /dev/null and b/assets/gfx/misc/creep/creep383.tga differ
diff --git a/assets/gfx/misc/creep/creep384.tga b/assets/gfx/misc/creep/creep384.tga
new file mode 100644
index 000000000..6208ed078
Binary files /dev/null and b/assets/gfx/misc/creep/creep384.tga differ
diff --git a/assets/gfx/misc/creep/creep385.tga b/assets/gfx/misc/creep/creep385.tga
new file mode 100644
index 000000000..adf24ca54
Binary files /dev/null and b/assets/gfx/misc/creep/creep385.tga differ
diff --git a/assets/gfx/misc/creep/creep386.tga b/assets/gfx/misc/creep/creep386.tga
new file mode 100644
index 000000000..ee6fbceef
Binary files /dev/null and b/assets/gfx/misc/creep/creep386.tga differ
diff --git a/assets/gfx/misc/creep/creep387.tga b/assets/gfx/misc/creep/creep387.tga
new file mode 100644
index 000000000..27c7099d4
Binary files /dev/null and b/assets/gfx/misc/creep/creep387.tga differ
diff --git a/assets/gfx/misc/creep/creep388.tga b/assets/gfx/misc/creep/creep388.tga
new file mode 100644
index 000000000..27c7099d4
Binary files /dev/null and b/assets/gfx/misc/creep/creep388.tga differ
diff --git a/assets/gfx/misc/creep/creep389.tga b/assets/gfx/misc/creep/creep389.tga
new file mode 100644
index 000000000..27c7099d4
Binary files /dev/null and b/assets/gfx/misc/creep/creep389.tga differ
diff --git a/assets/gfx/misc/creep/creep39.tga b/assets/gfx/misc/creep/creep39.tga
new file mode 100644
index 000000000..c31ecd041
Binary files /dev/null and b/assets/gfx/misc/creep/creep39.tga differ
diff --git a/assets/gfx/misc/creep/creep390.tga b/assets/gfx/misc/creep/creep390.tga
new file mode 100644
index 000000000..50a4c6c12
Binary files /dev/null and b/assets/gfx/misc/creep/creep390.tga differ
diff --git a/assets/gfx/misc/creep/creep391.tga b/assets/gfx/misc/creep/creep391.tga
new file mode 100644
index 000000000..21285145c
Binary files /dev/null and b/assets/gfx/misc/creep/creep391.tga differ
diff --git a/assets/gfx/misc/creep/creep392.tga b/assets/gfx/misc/creep/creep392.tga
new file mode 100644
index 000000000..ff69242e5
Binary files /dev/null and b/assets/gfx/misc/creep/creep392.tga differ
diff --git a/assets/gfx/misc/creep/creep393.tga b/assets/gfx/misc/creep/creep393.tga
new file mode 100644
index 000000000..d51c38a64
Binary files /dev/null and b/assets/gfx/misc/creep/creep393.tga differ
diff --git a/assets/gfx/misc/creep/creep394.tga b/assets/gfx/misc/creep/creep394.tga
new file mode 100644
index 000000000..073b2eaae
Binary files /dev/null and b/assets/gfx/misc/creep/creep394.tga differ
diff --git a/assets/gfx/misc/creep/creep395.tga b/assets/gfx/misc/creep/creep395.tga
new file mode 100644
index 000000000..449b8d41d
Binary files /dev/null and b/assets/gfx/misc/creep/creep395.tga differ
diff --git a/assets/gfx/misc/creep/creep396.tga b/assets/gfx/misc/creep/creep396.tga
new file mode 100644
index 000000000..b6626e3fb
Binary files /dev/null and b/assets/gfx/misc/creep/creep396.tga differ
diff --git a/assets/gfx/misc/creep/creep397.tga b/assets/gfx/misc/creep/creep397.tga
new file mode 100644
index 000000000..2175a4230
Binary files /dev/null and b/assets/gfx/misc/creep/creep397.tga differ
diff --git a/assets/gfx/misc/creep/creep398.tga b/assets/gfx/misc/creep/creep398.tga
new file mode 100644
index 000000000..87aa28cb5
Binary files /dev/null and b/assets/gfx/misc/creep/creep398.tga differ
diff --git a/assets/gfx/misc/creep/creep399.tga b/assets/gfx/misc/creep/creep399.tga
new file mode 100644
index 000000000..05d83088b
Binary files /dev/null and b/assets/gfx/misc/creep/creep399.tga differ
diff --git a/assets/gfx/misc/creep/creep4.tga b/assets/gfx/misc/creep/creep4.tga
new file mode 100644
index 000000000..80bf14d95
Binary files /dev/null and b/assets/gfx/misc/creep/creep4.tga differ
diff --git a/assets/gfx/misc/creep/creep40.tga b/assets/gfx/misc/creep/creep40.tga
new file mode 100644
index 000000000..b2e53865e
Binary files /dev/null and b/assets/gfx/misc/creep/creep40.tga differ
diff --git a/assets/gfx/misc/creep/creep400.tga b/assets/gfx/misc/creep/creep400.tga
new file mode 100644
index 000000000..916685141
Binary files /dev/null and b/assets/gfx/misc/creep/creep400.tga differ
diff --git a/assets/gfx/misc/creep/creep401.tga b/assets/gfx/misc/creep/creep401.tga
new file mode 100644
index 000000000..967b7368b
Binary files /dev/null and b/assets/gfx/misc/creep/creep401.tga differ
diff --git a/assets/gfx/misc/creep/creep402.tga b/assets/gfx/misc/creep/creep402.tga
new file mode 100644
index 000000000..dc61e2f65
Binary files /dev/null and b/assets/gfx/misc/creep/creep402.tga differ
diff --git a/assets/gfx/misc/creep/creep403.tga b/assets/gfx/misc/creep/creep403.tga
new file mode 100644
index 000000000..7c7b59c38
Binary files /dev/null and b/assets/gfx/misc/creep/creep403.tga differ
diff --git a/assets/gfx/misc/creep/creep404.tga b/assets/gfx/misc/creep/creep404.tga
new file mode 100644
index 000000000..1290e848f
Binary files /dev/null and b/assets/gfx/misc/creep/creep404.tga differ
diff --git a/assets/gfx/misc/creep/creep405.tga b/assets/gfx/misc/creep/creep405.tga
new file mode 100644
index 000000000..92e7121b2
Binary files /dev/null and b/assets/gfx/misc/creep/creep405.tga differ
diff --git a/assets/gfx/misc/creep/creep406.tga b/assets/gfx/misc/creep/creep406.tga
new file mode 100644
index 000000000..c14090ad4
Binary files /dev/null and b/assets/gfx/misc/creep/creep406.tga differ
diff --git a/assets/gfx/misc/creep/creep407.tga b/assets/gfx/misc/creep/creep407.tga
new file mode 100644
index 000000000..f24a72bb1
Binary files /dev/null and b/assets/gfx/misc/creep/creep407.tga differ
diff --git a/assets/gfx/misc/creep/creep408.tga b/assets/gfx/misc/creep/creep408.tga
new file mode 100644
index 000000000..92b49c4d8
Binary files /dev/null and b/assets/gfx/misc/creep/creep408.tga differ
diff --git a/assets/gfx/misc/creep/creep409.tga b/assets/gfx/misc/creep/creep409.tga
new file mode 100644
index 000000000..96e99702e
Binary files /dev/null and b/assets/gfx/misc/creep/creep409.tga differ
diff --git a/assets/gfx/misc/creep/creep41.tga b/assets/gfx/misc/creep/creep41.tga
new file mode 100644
index 000000000..b418c5a81
Binary files /dev/null and b/assets/gfx/misc/creep/creep41.tga differ
diff --git a/assets/gfx/misc/creep/creep410.tga b/assets/gfx/misc/creep/creep410.tga
new file mode 100644
index 000000000..d2683b3f2
Binary files /dev/null and b/assets/gfx/misc/creep/creep410.tga differ
diff --git a/assets/gfx/misc/creep/creep411.tga b/assets/gfx/misc/creep/creep411.tga
new file mode 100644
index 000000000..0eb2ac66d
Binary files /dev/null and b/assets/gfx/misc/creep/creep411.tga differ
diff --git a/assets/gfx/misc/creep/creep412.tga b/assets/gfx/misc/creep/creep412.tga
new file mode 100644
index 000000000..c9401e85a
Binary files /dev/null and b/assets/gfx/misc/creep/creep412.tga differ
diff --git a/assets/gfx/misc/creep/creep413.tga b/assets/gfx/misc/creep/creep413.tga
new file mode 100644
index 000000000..5b9a963de
Binary files /dev/null and b/assets/gfx/misc/creep/creep413.tga differ
diff --git a/assets/gfx/misc/creep/creep414.tga b/assets/gfx/misc/creep/creep414.tga
new file mode 100644
index 000000000..233b850af
Binary files /dev/null and b/assets/gfx/misc/creep/creep414.tga differ
diff --git a/assets/gfx/misc/creep/creep415.tga b/assets/gfx/misc/creep/creep415.tga
new file mode 100644
index 000000000..e2509ad9d
Binary files /dev/null and b/assets/gfx/misc/creep/creep415.tga differ
diff --git a/assets/gfx/misc/creep/creep416.tga b/assets/gfx/misc/creep/creep416.tga
new file mode 100644
index 000000000..af92c0ff3
Binary files /dev/null and b/assets/gfx/misc/creep/creep416.tga differ
diff --git a/assets/gfx/misc/creep/creep417.tga b/assets/gfx/misc/creep/creep417.tga
new file mode 100644
index 000000000..046273ccb
Binary files /dev/null and b/assets/gfx/misc/creep/creep417.tga differ
diff --git a/assets/gfx/misc/creep/creep418.tga b/assets/gfx/misc/creep/creep418.tga
new file mode 100644
index 000000000..30d4efd0f
Binary files /dev/null and b/assets/gfx/misc/creep/creep418.tga differ
diff --git a/assets/gfx/misc/creep/creep419.tga b/assets/gfx/misc/creep/creep419.tga
new file mode 100644
index 000000000..f7b828b18
Binary files /dev/null and b/assets/gfx/misc/creep/creep419.tga differ
diff --git a/assets/gfx/misc/creep/creep42.tga b/assets/gfx/misc/creep/creep42.tga
new file mode 100644
index 000000000..b08db8062
Binary files /dev/null and b/assets/gfx/misc/creep/creep42.tga differ
diff --git a/assets/gfx/misc/creep/creep420.tga b/assets/gfx/misc/creep/creep420.tga
new file mode 100644
index 000000000..26ff1b725
Binary files /dev/null and b/assets/gfx/misc/creep/creep420.tga differ
diff --git a/assets/gfx/misc/creep/creep421.tga b/assets/gfx/misc/creep/creep421.tga
new file mode 100644
index 000000000..f59204bae
Binary files /dev/null and b/assets/gfx/misc/creep/creep421.tga differ
diff --git a/assets/gfx/misc/creep/creep422.tga b/assets/gfx/misc/creep/creep422.tga
new file mode 100644
index 000000000..54b952975
Binary files /dev/null and b/assets/gfx/misc/creep/creep422.tga differ
diff --git a/assets/gfx/misc/creep/creep423.tga b/assets/gfx/misc/creep/creep423.tga
new file mode 100644
index 000000000..48ce585a6
Binary files /dev/null and b/assets/gfx/misc/creep/creep423.tga differ
diff --git a/assets/gfx/misc/creep/creep424.tga b/assets/gfx/misc/creep/creep424.tga
new file mode 100644
index 000000000..48ce585a6
Binary files /dev/null and b/assets/gfx/misc/creep/creep424.tga differ
diff --git a/assets/gfx/misc/creep/creep425.tga b/assets/gfx/misc/creep/creep425.tga
new file mode 100644
index 000000000..d08ae76a9
Binary files /dev/null and b/assets/gfx/misc/creep/creep425.tga differ
diff --git a/assets/gfx/misc/creep/creep426.tga b/assets/gfx/misc/creep/creep426.tga
new file mode 100644
index 000000000..d08ae76a9
Binary files /dev/null and b/assets/gfx/misc/creep/creep426.tga differ
diff --git a/assets/gfx/misc/creep/creep427.tga b/assets/gfx/misc/creep/creep427.tga
new file mode 100644
index 000000000..d08ae76a9
Binary files /dev/null and b/assets/gfx/misc/creep/creep427.tga differ
diff --git a/assets/gfx/misc/creep/creep428.tga b/assets/gfx/misc/creep/creep428.tga
new file mode 100644
index 000000000..ad1a91070
Binary files /dev/null and b/assets/gfx/misc/creep/creep428.tga differ
diff --git a/assets/gfx/misc/creep/creep429.tga b/assets/gfx/misc/creep/creep429.tga
new file mode 100644
index 000000000..70d8889fc
Binary files /dev/null and b/assets/gfx/misc/creep/creep429.tga differ
diff --git a/assets/gfx/misc/creep/creep43.tga b/assets/gfx/misc/creep/creep43.tga
new file mode 100644
index 000000000..19529512a
Binary files /dev/null and b/assets/gfx/misc/creep/creep43.tga differ
diff --git a/assets/gfx/misc/creep/creep430.tga b/assets/gfx/misc/creep/creep430.tga
new file mode 100644
index 000000000..fbeec5579
Binary files /dev/null and b/assets/gfx/misc/creep/creep430.tga differ
diff --git a/assets/gfx/misc/creep/creep431.tga b/assets/gfx/misc/creep/creep431.tga
new file mode 100644
index 000000000..35eaa173f
Binary files /dev/null and b/assets/gfx/misc/creep/creep431.tga differ
diff --git a/assets/gfx/misc/creep/creep432.tga b/assets/gfx/misc/creep/creep432.tga
new file mode 100644
index 000000000..96ff0736e
Binary files /dev/null and b/assets/gfx/misc/creep/creep432.tga differ
diff --git a/assets/gfx/misc/creep/creep433.tga b/assets/gfx/misc/creep/creep433.tga
new file mode 100644
index 000000000..fe12c5f2b
Binary files /dev/null and b/assets/gfx/misc/creep/creep433.tga differ
diff --git a/assets/gfx/misc/creep/creep434.tga b/assets/gfx/misc/creep/creep434.tga
new file mode 100644
index 000000000..496358e35
Binary files /dev/null and b/assets/gfx/misc/creep/creep434.tga differ
diff --git a/assets/gfx/misc/creep/creep435.tga b/assets/gfx/misc/creep/creep435.tga
new file mode 100644
index 000000000..7b838e5e2
Binary files /dev/null and b/assets/gfx/misc/creep/creep435.tga differ
diff --git a/assets/gfx/misc/creep/creep436.tga b/assets/gfx/misc/creep/creep436.tga
new file mode 100644
index 000000000..4ce48c49c
Binary files /dev/null and b/assets/gfx/misc/creep/creep436.tga differ
diff --git a/assets/gfx/misc/creep/creep437.tga b/assets/gfx/misc/creep/creep437.tga
new file mode 100644
index 000000000..767af6ed9
Binary files /dev/null and b/assets/gfx/misc/creep/creep437.tga differ
diff --git a/assets/gfx/misc/creep/creep438.tga b/assets/gfx/misc/creep/creep438.tga
new file mode 100644
index 000000000..f5dcb224f
Binary files /dev/null and b/assets/gfx/misc/creep/creep438.tga differ
diff --git a/assets/gfx/misc/creep/creep439.tga b/assets/gfx/misc/creep/creep439.tga
new file mode 100644
index 000000000..4e7c14352
Binary files /dev/null and b/assets/gfx/misc/creep/creep439.tga differ
diff --git a/assets/gfx/misc/creep/creep44.tga b/assets/gfx/misc/creep/creep44.tga
new file mode 100644
index 000000000..1dad36f9f
Binary files /dev/null and b/assets/gfx/misc/creep/creep44.tga differ
diff --git a/assets/gfx/misc/creep/creep440.tga b/assets/gfx/misc/creep/creep440.tga
new file mode 100644
index 000000000..2d1ca5372
Binary files /dev/null and b/assets/gfx/misc/creep/creep440.tga differ
diff --git a/assets/gfx/misc/creep/creep441.tga b/assets/gfx/misc/creep/creep441.tga
new file mode 100644
index 000000000..cec61c228
Binary files /dev/null and b/assets/gfx/misc/creep/creep441.tga differ
diff --git a/assets/gfx/misc/creep/creep442.tga b/assets/gfx/misc/creep/creep442.tga
new file mode 100644
index 000000000..298b29490
Binary files /dev/null and b/assets/gfx/misc/creep/creep442.tga differ
diff --git a/assets/gfx/misc/creep/creep443.tga b/assets/gfx/misc/creep/creep443.tga
new file mode 100644
index 000000000..c77654acc
Binary files /dev/null and b/assets/gfx/misc/creep/creep443.tga differ
diff --git a/assets/gfx/misc/creep/creep444.tga b/assets/gfx/misc/creep/creep444.tga
new file mode 100644
index 000000000..5feb9b942
Binary files /dev/null and b/assets/gfx/misc/creep/creep444.tga differ
diff --git a/assets/gfx/misc/creep/creep445.tga b/assets/gfx/misc/creep/creep445.tga
new file mode 100644
index 000000000..2e92d03cf
Binary files /dev/null and b/assets/gfx/misc/creep/creep445.tga differ
diff --git a/assets/gfx/misc/creep/creep446.tga b/assets/gfx/misc/creep/creep446.tga
new file mode 100644
index 000000000..edaa7f47b
Binary files /dev/null and b/assets/gfx/misc/creep/creep446.tga differ
diff --git a/assets/gfx/misc/creep/creep447.tga b/assets/gfx/misc/creep/creep447.tga
new file mode 100644
index 000000000..81d4c1c9a
Binary files /dev/null and b/assets/gfx/misc/creep/creep447.tga differ
diff --git a/assets/gfx/misc/creep/creep448.tga b/assets/gfx/misc/creep/creep448.tga
new file mode 100644
index 000000000..8a627dff0
Binary files /dev/null and b/assets/gfx/misc/creep/creep448.tga differ
diff --git a/assets/gfx/misc/creep/creep449.tga b/assets/gfx/misc/creep/creep449.tga
new file mode 100644
index 000000000..8e5cb15c0
Binary files /dev/null and b/assets/gfx/misc/creep/creep449.tga differ
diff --git a/assets/gfx/misc/creep/creep45.tga b/assets/gfx/misc/creep/creep45.tga
new file mode 100644
index 000000000..53af844f0
Binary files /dev/null and b/assets/gfx/misc/creep/creep45.tga differ
diff --git a/assets/gfx/misc/creep/creep450.tga b/assets/gfx/misc/creep/creep450.tga
new file mode 100644
index 000000000..40f95aba4
Binary files /dev/null and b/assets/gfx/misc/creep/creep450.tga differ
diff --git a/assets/gfx/misc/creep/creep451.tga b/assets/gfx/misc/creep/creep451.tga
new file mode 100644
index 000000000..b29ace3a5
Binary files /dev/null and b/assets/gfx/misc/creep/creep451.tga differ
diff --git a/assets/gfx/misc/creep/creep452.tga b/assets/gfx/misc/creep/creep452.tga
new file mode 100644
index 000000000..045689e18
Binary files /dev/null and b/assets/gfx/misc/creep/creep452.tga differ
diff --git a/assets/gfx/misc/creep/creep453.tga b/assets/gfx/misc/creep/creep453.tga
new file mode 100644
index 000000000..6dd15e519
Binary files /dev/null and b/assets/gfx/misc/creep/creep453.tga differ
diff --git a/assets/gfx/misc/creep/creep454.tga b/assets/gfx/misc/creep/creep454.tga
new file mode 100644
index 000000000..4fb59635e
Binary files /dev/null and b/assets/gfx/misc/creep/creep454.tga differ
diff --git a/assets/gfx/misc/creep/creep455.tga b/assets/gfx/misc/creep/creep455.tga
new file mode 100644
index 000000000..fabadf053
Binary files /dev/null and b/assets/gfx/misc/creep/creep455.tga differ
diff --git a/assets/gfx/misc/creep/creep456.tga b/assets/gfx/misc/creep/creep456.tga
new file mode 100644
index 000000000..35e0f72da
Binary files /dev/null and b/assets/gfx/misc/creep/creep456.tga differ
diff --git a/assets/gfx/misc/creep/creep457.tga b/assets/gfx/misc/creep/creep457.tga
new file mode 100644
index 000000000..656bb606f
Binary files /dev/null and b/assets/gfx/misc/creep/creep457.tga differ
diff --git a/assets/gfx/misc/creep/creep458.tga b/assets/gfx/misc/creep/creep458.tga
new file mode 100644
index 000000000..7c86233cd
Binary files /dev/null and b/assets/gfx/misc/creep/creep458.tga differ
diff --git a/assets/gfx/misc/creep/creep459.tga b/assets/gfx/misc/creep/creep459.tga
new file mode 100644
index 000000000..6594acf12
Binary files /dev/null and b/assets/gfx/misc/creep/creep459.tga differ
diff --git a/assets/gfx/misc/creep/creep46.tga b/assets/gfx/misc/creep/creep46.tga
new file mode 100644
index 000000000..cc8bfa63b
Binary files /dev/null and b/assets/gfx/misc/creep/creep46.tga differ
diff --git a/assets/gfx/misc/creep/creep460.tga b/assets/gfx/misc/creep/creep460.tga
new file mode 100644
index 000000000..9c359c6f3
Binary files /dev/null and b/assets/gfx/misc/creep/creep460.tga differ
diff --git a/assets/gfx/misc/creep/creep461.tga b/assets/gfx/misc/creep/creep461.tga
new file mode 100644
index 000000000..a54faefeb
Binary files /dev/null and b/assets/gfx/misc/creep/creep461.tga differ
diff --git a/assets/gfx/misc/creep/creep462.tga b/assets/gfx/misc/creep/creep462.tga
new file mode 100644
index 000000000..4eccc1999
Binary files /dev/null and b/assets/gfx/misc/creep/creep462.tga differ
diff --git a/assets/gfx/misc/creep/creep463.tga b/assets/gfx/misc/creep/creep463.tga
new file mode 100644
index 000000000..d2025132f
Binary files /dev/null and b/assets/gfx/misc/creep/creep463.tga differ
diff --git a/assets/gfx/misc/creep/creep464.tga b/assets/gfx/misc/creep/creep464.tga
new file mode 100644
index 000000000..f2f3acd5b
Binary files /dev/null and b/assets/gfx/misc/creep/creep464.tga differ
diff --git a/assets/gfx/misc/creep/creep465.tga b/assets/gfx/misc/creep/creep465.tga
new file mode 100644
index 000000000..0ed6826aa
Binary files /dev/null and b/assets/gfx/misc/creep/creep465.tga differ
diff --git a/assets/gfx/misc/creep/creep466.tga b/assets/gfx/misc/creep/creep466.tga
new file mode 100644
index 000000000..0ed6826aa
Binary files /dev/null and b/assets/gfx/misc/creep/creep466.tga differ
diff --git a/assets/gfx/misc/creep/creep467.tga b/assets/gfx/misc/creep/creep467.tga
new file mode 100644
index 000000000..0ed6826aa
Binary files /dev/null and b/assets/gfx/misc/creep/creep467.tga differ
diff --git a/assets/gfx/misc/creep/creep468.tga b/assets/gfx/misc/creep/creep468.tga
new file mode 100644
index 000000000..7308538d2
Binary files /dev/null and b/assets/gfx/misc/creep/creep468.tga differ
diff --git a/assets/gfx/misc/creep/creep469.tga b/assets/gfx/misc/creep/creep469.tga
new file mode 100644
index 000000000..02a827263
Binary files /dev/null and b/assets/gfx/misc/creep/creep469.tga differ
diff --git a/assets/gfx/misc/creep/creep47.tga b/assets/gfx/misc/creep/creep47.tga
new file mode 100644
index 000000000..28b1da137
Binary files /dev/null and b/assets/gfx/misc/creep/creep47.tga differ
diff --git a/assets/gfx/misc/creep/creep470.tga b/assets/gfx/misc/creep/creep470.tga
new file mode 100644
index 000000000..ffa21bf9d
Binary files /dev/null and b/assets/gfx/misc/creep/creep470.tga differ
diff --git a/assets/gfx/misc/creep/creep471.tga b/assets/gfx/misc/creep/creep471.tga
new file mode 100644
index 000000000..ffa21bf9d
Binary files /dev/null and b/assets/gfx/misc/creep/creep471.tga differ
diff --git a/assets/gfx/misc/creep/creep472.tga b/assets/gfx/misc/creep/creep472.tga
new file mode 100644
index 000000000..9b0bb114a
Binary files /dev/null and b/assets/gfx/misc/creep/creep472.tga differ
diff --git a/assets/gfx/misc/creep/creep473.tga b/assets/gfx/misc/creep/creep473.tga
new file mode 100644
index 000000000..ffa21bf9d
Binary files /dev/null and b/assets/gfx/misc/creep/creep473.tga differ
diff --git a/assets/gfx/misc/creep/creep474.tga b/assets/gfx/misc/creep/creep474.tga
new file mode 100644
index 000000000..ffa21bf9d
Binary files /dev/null and b/assets/gfx/misc/creep/creep474.tga differ
diff --git a/assets/gfx/misc/creep/creep475.tga b/assets/gfx/misc/creep/creep475.tga
new file mode 100644
index 000000000..682c7b3db
Binary files /dev/null and b/assets/gfx/misc/creep/creep475.tga differ
diff --git a/assets/gfx/misc/creep/creep476.tga b/assets/gfx/misc/creep/creep476.tga
new file mode 100644
index 000000000..87f1a9199
Binary files /dev/null and b/assets/gfx/misc/creep/creep476.tga differ
diff --git a/assets/gfx/misc/creep/creep477.tga b/assets/gfx/misc/creep/creep477.tga
new file mode 100644
index 000000000..363451c89
Binary files /dev/null and b/assets/gfx/misc/creep/creep477.tga differ
diff --git a/assets/gfx/misc/creep/creep478.tga b/assets/gfx/misc/creep/creep478.tga
new file mode 100644
index 000000000..17b3a3b2a
Binary files /dev/null and b/assets/gfx/misc/creep/creep478.tga differ
diff --git a/assets/gfx/misc/creep/creep479.tga b/assets/gfx/misc/creep/creep479.tga
new file mode 100644
index 000000000..ff44873df
Binary files /dev/null and b/assets/gfx/misc/creep/creep479.tga differ
diff --git a/assets/gfx/misc/creep/creep48.tga b/assets/gfx/misc/creep/creep48.tga
new file mode 100644
index 000000000..8a9377f18
Binary files /dev/null and b/assets/gfx/misc/creep/creep48.tga differ
diff --git a/assets/gfx/misc/creep/creep480.tga b/assets/gfx/misc/creep/creep480.tga
new file mode 100644
index 000000000..971685dfe
Binary files /dev/null and b/assets/gfx/misc/creep/creep480.tga differ
diff --git a/assets/gfx/misc/creep/creep481.tga b/assets/gfx/misc/creep/creep481.tga
new file mode 100644
index 000000000..826317a32
Binary files /dev/null and b/assets/gfx/misc/creep/creep481.tga differ
diff --git a/assets/gfx/misc/creep/creep482.tga b/assets/gfx/misc/creep/creep482.tga
new file mode 100644
index 000000000..d4306d71c
Binary files /dev/null and b/assets/gfx/misc/creep/creep482.tga differ
diff --git a/assets/gfx/misc/creep/creep483.tga b/assets/gfx/misc/creep/creep483.tga
new file mode 100644
index 000000000..58fea2710
Binary files /dev/null and b/assets/gfx/misc/creep/creep483.tga differ
diff --git a/assets/gfx/misc/creep/creep484.tga b/assets/gfx/misc/creep/creep484.tga
new file mode 100644
index 000000000..a5f4d5c17
Binary files /dev/null and b/assets/gfx/misc/creep/creep484.tga differ
diff --git a/assets/gfx/misc/creep/creep485.tga b/assets/gfx/misc/creep/creep485.tga
new file mode 100644
index 000000000..b214faca4
Binary files /dev/null and b/assets/gfx/misc/creep/creep485.tga differ
diff --git a/assets/gfx/misc/creep/creep486.tga b/assets/gfx/misc/creep/creep486.tga
new file mode 100644
index 000000000..5bfa4b0d5
Binary files /dev/null and b/assets/gfx/misc/creep/creep486.tga differ
diff --git a/assets/gfx/misc/creep/creep487.tga b/assets/gfx/misc/creep/creep487.tga
new file mode 100644
index 000000000..295a0340c
Binary files /dev/null and b/assets/gfx/misc/creep/creep487.tga differ
diff --git a/assets/gfx/misc/creep/creep488.tga b/assets/gfx/misc/creep/creep488.tga
new file mode 100644
index 000000000..291a0b4a3
Binary files /dev/null and b/assets/gfx/misc/creep/creep488.tga differ
diff --git a/assets/gfx/misc/creep/creep489.tga b/assets/gfx/misc/creep/creep489.tga
new file mode 100644
index 000000000..bc0199604
Binary files /dev/null and b/assets/gfx/misc/creep/creep489.tga differ
diff --git a/assets/gfx/misc/creep/creep49.tga b/assets/gfx/misc/creep/creep49.tga
new file mode 100644
index 000000000..35b4377fc
Binary files /dev/null and b/assets/gfx/misc/creep/creep49.tga differ
diff --git a/assets/gfx/misc/creep/creep490.tga b/assets/gfx/misc/creep/creep490.tga
new file mode 100644
index 000000000..c6d1ae246
Binary files /dev/null and b/assets/gfx/misc/creep/creep490.tga differ
diff --git a/assets/gfx/misc/creep/creep491.tga b/assets/gfx/misc/creep/creep491.tga
new file mode 100644
index 000000000..7c5be58d2
Binary files /dev/null and b/assets/gfx/misc/creep/creep491.tga differ
diff --git a/assets/gfx/misc/creep/creep492.tga b/assets/gfx/misc/creep/creep492.tga
new file mode 100644
index 000000000..ec23a77eb
Binary files /dev/null and b/assets/gfx/misc/creep/creep492.tga differ
diff --git a/assets/gfx/misc/creep/creep493.tga b/assets/gfx/misc/creep/creep493.tga
new file mode 100644
index 000000000..2abe25c8e
Binary files /dev/null and b/assets/gfx/misc/creep/creep493.tga differ
diff --git a/assets/gfx/misc/creep/creep494.tga b/assets/gfx/misc/creep/creep494.tga
new file mode 100644
index 000000000..c7302db38
Binary files /dev/null and b/assets/gfx/misc/creep/creep494.tga differ
diff --git a/assets/gfx/misc/creep/creep495.tga b/assets/gfx/misc/creep/creep495.tga
new file mode 100644
index 000000000..94c95fcbe
Binary files /dev/null and b/assets/gfx/misc/creep/creep495.tga differ
diff --git a/assets/gfx/misc/creep/creep496.tga b/assets/gfx/misc/creep/creep496.tga
new file mode 100644
index 000000000..d6502733c
Binary files /dev/null and b/assets/gfx/misc/creep/creep496.tga differ
diff --git a/assets/gfx/misc/creep/creep497.tga b/assets/gfx/misc/creep/creep497.tga
new file mode 100644
index 000000000..3f2a116c3
Binary files /dev/null and b/assets/gfx/misc/creep/creep497.tga differ
diff --git a/assets/gfx/misc/creep/creep498.tga b/assets/gfx/misc/creep/creep498.tga
new file mode 100644
index 000000000..3f2a116c3
Binary files /dev/null and b/assets/gfx/misc/creep/creep498.tga differ
diff --git a/assets/gfx/misc/creep/creep499.tga b/assets/gfx/misc/creep/creep499.tga
new file mode 100644
index 000000000..3f2a116c3
Binary files /dev/null and b/assets/gfx/misc/creep/creep499.tga differ
diff --git a/assets/gfx/misc/creep/creep5.tga b/assets/gfx/misc/creep/creep5.tga
new file mode 100644
index 000000000..9dc2a62ea
Binary files /dev/null and b/assets/gfx/misc/creep/creep5.tga differ
diff --git a/assets/gfx/misc/creep/creep50.tga b/assets/gfx/misc/creep/creep50.tga
new file mode 100644
index 000000000..7151350b7
Binary files /dev/null and b/assets/gfx/misc/creep/creep50.tga differ
diff --git a/assets/gfx/misc/creep/creep500.tga b/assets/gfx/misc/creep/creep500.tga
new file mode 100644
index 000000000..3f2a116c3
Binary files /dev/null and b/assets/gfx/misc/creep/creep500.tga differ
diff --git a/assets/gfx/misc/creep/creep501.tga b/assets/gfx/misc/creep/creep501.tga
new file mode 100644
index 000000000..3f2a116c3
Binary files /dev/null and b/assets/gfx/misc/creep/creep501.tga differ
diff --git a/assets/gfx/misc/creep/creep502.tga b/assets/gfx/misc/creep/creep502.tga
new file mode 100644
index 000000000..3f2a116c3
Binary files /dev/null and b/assets/gfx/misc/creep/creep502.tga differ
diff --git a/assets/gfx/misc/creep/creep503.tga b/assets/gfx/misc/creep/creep503.tga
new file mode 100644
index 000000000..3f2a116c3
Binary files /dev/null and b/assets/gfx/misc/creep/creep503.tga differ
diff --git a/assets/gfx/misc/creep/creep504.tga b/assets/gfx/misc/creep/creep504.tga
new file mode 100644
index 000000000..4f2d27d52
Binary files /dev/null and b/assets/gfx/misc/creep/creep504.tga differ
diff --git a/assets/gfx/misc/creep/creep505.tga b/assets/gfx/misc/creep/creep505.tga
new file mode 100644
index 000000000..7d858ea21
Binary files /dev/null and b/assets/gfx/misc/creep/creep505.tga differ
diff --git a/assets/gfx/misc/creep/creep506.tga b/assets/gfx/misc/creep/creep506.tga
new file mode 100644
index 000000000..15a1d3a6b
Binary files /dev/null and b/assets/gfx/misc/creep/creep506.tga differ
diff --git a/assets/gfx/misc/creep/creep507.tga b/assets/gfx/misc/creep/creep507.tga
new file mode 100644
index 000000000..e2b1b9644
Binary files /dev/null and b/assets/gfx/misc/creep/creep507.tga differ
diff --git a/assets/gfx/misc/creep/creep508.tga b/assets/gfx/misc/creep/creep508.tga
new file mode 100644
index 000000000..33fa73753
Binary files /dev/null and b/assets/gfx/misc/creep/creep508.tga differ
diff --git a/assets/gfx/misc/creep/creep509.tga b/assets/gfx/misc/creep/creep509.tga
new file mode 100644
index 000000000..c812a8a29
Binary files /dev/null and b/assets/gfx/misc/creep/creep509.tga differ
diff --git a/assets/gfx/misc/creep/creep51.tga b/assets/gfx/misc/creep/creep51.tga
new file mode 100644
index 000000000..3d2daea5d
Binary files /dev/null and b/assets/gfx/misc/creep/creep51.tga differ
diff --git a/assets/gfx/misc/creep/creep510.tga b/assets/gfx/misc/creep/creep510.tga
new file mode 100644
index 000000000..9f035a6dc
Binary files /dev/null and b/assets/gfx/misc/creep/creep510.tga differ
diff --git a/assets/gfx/misc/creep/creep511.tga b/assets/gfx/misc/creep/creep511.tga
new file mode 100644
index 000000000..9f035a6dc
Binary files /dev/null and b/assets/gfx/misc/creep/creep511.tga differ
diff --git a/assets/gfx/misc/creep/creep512.tga b/assets/gfx/misc/creep/creep512.tga
new file mode 100644
index 000000000..68b84fa6c
Binary files /dev/null and b/assets/gfx/misc/creep/creep512.tga differ
diff --git a/assets/gfx/misc/creep/creep513.tga b/assets/gfx/misc/creep/creep513.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep513.tga differ
diff --git a/assets/gfx/misc/creep/creep514.tga b/assets/gfx/misc/creep/creep514.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep514.tga differ
diff --git a/assets/gfx/misc/creep/creep515.tga b/assets/gfx/misc/creep/creep515.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep515.tga differ
diff --git a/assets/gfx/misc/creep/creep516.tga b/assets/gfx/misc/creep/creep516.tga
new file mode 100644
index 000000000..4bd081efa
Binary files /dev/null and b/assets/gfx/misc/creep/creep516.tga differ
diff --git a/assets/gfx/misc/creep/creep517.tga b/assets/gfx/misc/creep/creep517.tga
new file mode 100644
index 000000000..4bd081efa
Binary files /dev/null and b/assets/gfx/misc/creep/creep517.tga differ
diff --git a/assets/gfx/misc/creep/creep518.tga b/assets/gfx/misc/creep/creep518.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep518.tga differ
diff --git a/assets/gfx/misc/creep/creep519.tga b/assets/gfx/misc/creep/creep519.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep519.tga differ
diff --git a/assets/gfx/misc/creep/creep52.tga b/assets/gfx/misc/creep/creep52.tga
new file mode 100644
index 000000000..620460d25
Binary files /dev/null and b/assets/gfx/misc/creep/creep52.tga differ
diff --git a/assets/gfx/misc/creep/creep520.tga b/assets/gfx/misc/creep/creep520.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep520.tga differ
diff --git a/assets/gfx/misc/creep/creep521.tga b/assets/gfx/misc/creep/creep521.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep521.tga differ
diff --git a/assets/gfx/misc/creep/creep522.tga b/assets/gfx/misc/creep/creep522.tga
new file mode 100644
index 000000000..41247ef5c
Binary files /dev/null and b/assets/gfx/misc/creep/creep522.tga differ
diff --git a/assets/gfx/misc/creep/creep523.tga b/assets/gfx/misc/creep/creep523.tga
new file mode 100644
index 000000000..9eab07c9d
Binary files /dev/null and b/assets/gfx/misc/creep/creep523.tga differ
diff --git a/assets/gfx/misc/creep/creep524.tga b/assets/gfx/misc/creep/creep524.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep524.tga differ
diff --git a/assets/gfx/misc/creep/creep525.tga b/assets/gfx/misc/creep/creep525.tga
new file mode 100644
index 000000000..0869c8a7c
Binary files /dev/null and b/assets/gfx/misc/creep/creep525.tga differ
diff --git a/assets/gfx/misc/creep/creep526.tga b/assets/gfx/misc/creep/creep526.tga
new file mode 100644
index 000000000..d106665da
Binary files /dev/null and b/assets/gfx/misc/creep/creep526.tga differ
diff --git a/assets/gfx/misc/creep/creep527.tga b/assets/gfx/misc/creep/creep527.tga
new file mode 100644
index 000000000..0869c8a7c
Binary files /dev/null and b/assets/gfx/misc/creep/creep527.tga differ
diff --git a/assets/gfx/misc/creep/creep528.tga b/assets/gfx/misc/creep/creep528.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep528.tga differ
diff --git a/assets/gfx/misc/creep/creep529.tga b/assets/gfx/misc/creep/creep529.tga
new file mode 100644
index 000000000..4a98a89e5
Binary files /dev/null and b/assets/gfx/misc/creep/creep529.tga differ
diff --git a/assets/gfx/misc/creep/creep53.tga b/assets/gfx/misc/creep/creep53.tga
new file mode 100644
index 000000000..debc15cba
Binary files /dev/null and b/assets/gfx/misc/creep/creep53.tga differ
diff --git a/assets/gfx/misc/creep/creep530.tga b/assets/gfx/misc/creep/creep530.tga
new file mode 100644
index 000000000..28d5f1176
Binary files /dev/null and b/assets/gfx/misc/creep/creep530.tga differ
diff --git a/assets/gfx/misc/creep/creep531.tga b/assets/gfx/misc/creep/creep531.tga
new file mode 100644
index 000000000..b95d2eb89
Binary files /dev/null and b/assets/gfx/misc/creep/creep531.tga differ
diff --git a/assets/gfx/misc/creep/creep532.tga b/assets/gfx/misc/creep/creep532.tga
new file mode 100644
index 000000000..b31b5f0b6
Binary files /dev/null and b/assets/gfx/misc/creep/creep532.tga differ
diff --git a/assets/gfx/misc/creep/creep533.tga b/assets/gfx/misc/creep/creep533.tga
new file mode 100644
index 000000000..731b47ed3
Binary files /dev/null and b/assets/gfx/misc/creep/creep533.tga differ
diff --git a/assets/gfx/misc/creep/creep534.tga b/assets/gfx/misc/creep/creep534.tga
new file mode 100644
index 000000000..a966219c8
Binary files /dev/null and b/assets/gfx/misc/creep/creep534.tga differ
diff --git a/assets/gfx/misc/creep/creep535.tga b/assets/gfx/misc/creep/creep535.tga
new file mode 100644
index 000000000..eadb19d18
Binary files /dev/null and b/assets/gfx/misc/creep/creep535.tga differ
diff --git a/assets/gfx/misc/creep/creep536.tga b/assets/gfx/misc/creep/creep536.tga
new file mode 100644
index 000000000..0e706d46c
Binary files /dev/null and b/assets/gfx/misc/creep/creep536.tga differ
diff --git a/assets/gfx/misc/creep/creep537.tga b/assets/gfx/misc/creep/creep537.tga
new file mode 100644
index 000000000..ade53e307
Binary files /dev/null and b/assets/gfx/misc/creep/creep537.tga differ
diff --git a/assets/gfx/misc/creep/creep538.tga b/assets/gfx/misc/creep/creep538.tga
new file mode 100644
index 000000000..ba576bd39
Binary files /dev/null and b/assets/gfx/misc/creep/creep538.tga differ
diff --git a/assets/gfx/misc/creep/creep539.tga b/assets/gfx/misc/creep/creep539.tga
new file mode 100644
index 000000000..97614d30a
Binary files /dev/null and b/assets/gfx/misc/creep/creep539.tga differ
diff --git a/assets/gfx/misc/creep/creep54.tga b/assets/gfx/misc/creep/creep54.tga
new file mode 100644
index 000000000..4121804e0
Binary files /dev/null and b/assets/gfx/misc/creep/creep54.tga differ
diff --git a/assets/gfx/misc/creep/creep540.tga b/assets/gfx/misc/creep/creep540.tga
new file mode 100644
index 000000000..22fb855bb
Binary files /dev/null and b/assets/gfx/misc/creep/creep540.tga differ
diff --git a/assets/gfx/misc/creep/creep541.tga b/assets/gfx/misc/creep/creep541.tga
new file mode 100644
index 000000000..2e0e08f4f
Binary files /dev/null and b/assets/gfx/misc/creep/creep541.tga differ
diff --git a/assets/gfx/misc/creep/creep542.tga b/assets/gfx/misc/creep/creep542.tga
new file mode 100644
index 000000000..2e0e08f4f
Binary files /dev/null and b/assets/gfx/misc/creep/creep542.tga differ
diff --git a/assets/gfx/misc/creep/creep543.tga b/assets/gfx/misc/creep/creep543.tga
new file mode 100644
index 000000000..2e0e08f4f
Binary files /dev/null and b/assets/gfx/misc/creep/creep543.tga differ
diff --git a/assets/gfx/misc/creep/creep544.tga b/assets/gfx/misc/creep/creep544.tga
new file mode 100644
index 000000000..2e0e08f4f
Binary files /dev/null and b/assets/gfx/misc/creep/creep544.tga differ
diff --git a/assets/gfx/misc/creep/creep545.tga b/assets/gfx/misc/creep/creep545.tga
new file mode 100644
index 000000000..2e0e08f4f
Binary files /dev/null and b/assets/gfx/misc/creep/creep545.tga differ
diff --git a/assets/gfx/misc/creep/creep546.tga b/assets/gfx/misc/creep/creep546.tga
new file mode 100644
index 000000000..2e0e08f4f
Binary files /dev/null and b/assets/gfx/misc/creep/creep546.tga differ
diff --git a/assets/gfx/misc/creep/creep547.tga b/assets/gfx/misc/creep/creep547.tga
new file mode 100644
index 000000000..fea77f8a7
Binary files /dev/null and b/assets/gfx/misc/creep/creep547.tga differ
diff --git a/assets/gfx/misc/creep/creep548.tga b/assets/gfx/misc/creep/creep548.tga
new file mode 100644
index 000000000..7a3964817
Binary files /dev/null and b/assets/gfx/misc/creep/creep548.tga differ
diff --git a/assets/gfx/misc/creep/creep549.tga b/assets/gfx/misc/creep/creep549.tga
new file mode 100644
index 000000000..bd3d13a17
Binary files /dev/null and b/assets/gfx/misc/creep/creep549.tga differ
diff --git a/assets/gfx/misc/creep/creep55.tga b/assets/gfx/misc/creep/creep55.tga
new file mode 100644
index 000000000..12f7fdef1
Binary files /dev/null and b/assets/gfx/misc/creep/creep55.tga differ
diff --git a/assets/gfx/misc/creep/creep56.tga b/assets/gfx/misc/creep/creep56.tga
new file mode 100644
index 000000000..3863a9a66
Binary files /dev/null and b/assets/gfx/misc/creep/creep56.tga differ
diff --git a/assets/gfx/misc/creep/creep57.tga b/assets/gfx/misc/creep/creep57.tga
new file mode 100644
index 000000000..d6aa91a53
Binary files /dev/null and b/assets/gfx/misc/creep/creep57.tga differ
diff --git a/assets/gfx/misc/creep/creep58.tga b/assets/gfx/misc/creep/creep58.tga
new file mode 100644
index 000000000..ebb4b95b9
Binary files /dev/null and b/assets/gfx/misc/creep/creep58.tga differ
diff --git a/assets/gfx/misc/creep/creep59.tga b/assets/gfx/misc/creep/creep59.tga
new file mode 100644
index 000000000..fa7ba3c24
Binary files /dev/null and b/assets/gfx/misc/creep/creep59.tga differ
diff --git a/assets/gfx/misc/creep/creep6.tga b/assets/gfx/misc/creep/creep6.tga
new file mode 100644
index 000000000..055fb7ec0
Binary files /dev/null and b/assets/gfx/misc/creep/creep6.tga differ
diff --git a/assets/gfx/misc/creep/creep60.tga b/assets/gfx/misc/creep/creep60.tga
new file mode 100644
index 000000000..d4892b991
Binary files /dev/null and b/assets/gfx/misc/creep/creep60.tga differ
diff --git a/assets/gfx/misc/creep/creep61.tga b/assets/gfx/misc/creep/creep61.tga
new file mode 100644
index 000000000..0c92bc5d1
Binary files /dev/null and b/assets/gfx/misc/creep/creep61.tga differ
diff --git a/assets/gfx/misc/creep/creep62.tga b/assets/gfx/misc/creep/creep62.tga
new file mode 100644
index 000000000..cff853269
Binary files /dev/null and b/assets/gfx/misc/creep/creep62.tga differ
diff --git a/assets/gfx/misc/creep/creep63.tga b/assets/gfx/misc/creep/creep63.tga
new file mode 100644
index 000000000..ef6f9e7a9
Binary files /dev/null and b/assets/gfx/misc/creep/creep63.tga differ
diff --git a/assets/gfx/misc/creep/creep64.tga b/assets/gfx/misc/creep/creep64.tga
new file mode 100644
index 000000000..67481ae69
Binary files /dev/null and b/assets/gfx/misc/creep/creep64.tga differ
diff --git a/assets/gfx/misc/creep/creep65.tga b/assets/gfx/misc/creep/creep65.tga
new file mode 100644
index 000000000..27f6891e1
Binary files /dev/null and b/assets/gfx/misc/creep/creep65.tga differ
diff --git a/assets/gfx/misc/creep/creep66.tga b/assets/gfx/misc/creep/creep66.tga
new file mode 100644
index 000000000..74e0bc15c
Binary files /dev/null and b/assets/gfx/misc/creep/creep66.tga differ
diff --git a/assets/gfx/misc/creep/creep67.tga b/assets/gfx/misc/creep/creep67.tga
new file mode 100644
index 000000000..808508422
Binary files /dev/null and b/assets/gfx/misc/creep/creep67.tga differ
diff --git a/assets/gfx/misc/creep/creep68.tga b/assets/gfx/misc/creep/creep68.tga
new file mode 100644
index 000000000..14a9db8fe
Binary files /dev/null and b/assets/gfx/misc/creep/creep68.tga differ
diff --git a/assets/gfx/misc/creep/creep69.tga b/assets/gfx/misc/creep/creep69.tga
new file mode 100644
index 000000000..09dc7d0b5
Binary files /dev/null and b/assets/gfx/misc/creep/creep69.tga differ
diff --git a/assets/gfx/misc/creep/creep7.tga b/assets/gfx/misc/creep/creep7.tga
new file mode 100644
index 000000000..8df16a5f5
Binary files /dev/null and b/assets/gfx/misc/creep/creep7.tga differ
diff --git a/assets/gfx/misc/creep/creep70.tga b/assets/gfx/misc/creep/creep70.tga
new file mode 100644
index 000000000..95796fdd4
Binary files /dev/null and b/assets/gfx/misc/creep/creep70.tga differ
diff --git a/assets/gfx/misc/creep/creep71.tga b/assets/gfx/misc/creep/creep71.tga
new file mode 100644
index 000000000..3a9ad4826
Binary files /dev/null and b/assets/gfx/misc/creep/creep71.tga differ
diff --git a/assets/gfx/misc/creep/creep72.tga b/assets/gfx/misc/creep/creep72.tga
new file mode 100644
index 000000000..c8a097acd
Binary files /dev/null and b/assets/gfx/misc/creep/creep72.tga differ
diff --git a/assets/gfx/misc/creep/creep73.tga b/assets/gfx/misc/creep/creep73.tga
new file mode 100644
index 000000000..49bb670f1
Binary files /dev/null and b/assets/gfx/misc/creep/creep73.tga differ
diff --git a/assets/gfx/misc/creep/creep74.tga b/assets/gfx/misc/creep/creep74.tga
new file mode 100644
index 000000000..c0acd77dc
Binary files /dev/null and b/assets/gfx/misc/creep/creep74.tga differ
diff --git a/assets/gfx/misc/creep/creep75.tga b/assets/gfx/misc/creep/creep75.tga
new file mode 100644
index 000000000..b180f5770
Binary files /dev/null and b/assets/gfx/misc/creep/creep75.tga differ
diff --git a/assets/gfx/misc/creep/creep76.tga b/assets/gfx/misc/creep/creep76.tga
new file mode 100644
index 000000000..1946c3e32
Binary files /dev/null and b/assets/gfx/misc/creep/creep76.tga differ
diff --git a/assets/gfx/misc/creep/creep77.tga b/assets/gfx/misc/creep/creep77.tga
new file mode 100644
index 000000000..fa85e4cea
Binary files /dev/null and b/assets/gfx/misc/creep/creep77.tga differ
diff --git a/assets/gfx/misc/creep/creep78.tga b/assets/gfx/misc/creep/creep78.tga
new file mode 100644
index 000000000..68154041a
Binary files /dev/null and b/assets/gfx/misc/creep/creep78.tga differ
diff --git a/assets/gfx/misc/creep/creep79.tga b/assets/gfx/misc/creep/creep79.tga
new file mode 100644
index 000000000..c3e436716
Binary files /dev/null and b/assets/gfx/misc/creep/creep79.tga differ
diff --git a/assets/gfx/misc/creep/creep8.tga b/assets/gfx/misc/creep/creep8.tga
new file mode 100644
index 000000000..7298ba467
Binary files /dev/null and b/assets/gfx/misc/creep/creep8.tga differ
diff --git a/assets/gfx/misc/creep/creep80.tga b/assets/gfx/misc/creep/creep80.tga
new file mode 100644
index 000000000..2f37f9555
Binary files /dev/null and b/assets/gfx/misc/creep/creep80.tga differ
diff --git a/assets/gfx/misc/creep/creep81.tga b/assets/gfx/misc/creep/creep81.tga
new file mode 100644
index 000000000..2abf76547
Binary files /dev/null and b/assets/gfx/misc/creep/creep81.tga differ
diff --git a/assets/gfx/misc/creep/creep82.tga b/assets/gfx/misc/creep/creep82.tga
new file mode 100644
index 000000000..2dbc7559a
Binary files /dev/null and b/assets/gfx/misc/creep/creep82.tga differ
diff --git a/assets/gfx/misc/creep/creep83.tga b/assets/gfx/misc/creep/creep83.tga
new file mode 100644
index 000000000..7b059a523
Binary files /dev/null and b/assets/gfx/misc/creep/creep83.tga differ
diff --git a/assets/gfx/misc/creep/creep84.tga b/assets/gfx/misc/creep/creep84.tga
new file mode 100644
index 000000000..ecc700f6a
Binary files /dev/null and b/assets/gfx/misc/creep/creep84.tga differ
diff --git a/assets/gfx/misc/creep/creep85.tga b/assets/gfx/misc/creep/creep85.tga
new file mode 100644
index 000000000..f58169967
Binary files /dev/null and b/assets/gfx/misc/creep/creep85.tga differ
diff --git a/assets/gfx/misc/creep/creep86.tga b/assets/gfx/misc/creep/creep86.tga
new file mode 100644
index 000000000..69ff3f729
Binary files /dev/null and b/assets/gfx/misc/creep/creep86.tga differ
diff --git a/assets/gfx/misc/creep/creep87.tga b/assets/gfx/misc/creep/creep87.tga
new file mode 100644
index 000000000..a9949a4cb
Binary files /dev/null and b/assets/gfx/misc/creep/creep87.tga differ
diff --git a/assets/gfx/misc/creep/creep88.tga b/assets/gfx/misc/creep/creep88.tga
new file mode 100644
index 000000000..3c549c239
Binary files /dev/null and b/assets/gfx/misc/creep/creep88.tga differ
diff --git a/assets/gfx/misc/creep/creep89.tga b/assets/gfx/misc/creep/creep89.tga
new file mode 100644
index 000000000..16e5f8342
Binary files /dev/null and b/assets/gfx/misc/creep/creep89.tga differ
diff --git a/assets/gfx/misc/creep/creep9.tga b/assets/gfx/misc/creep/creep9.tga
new file mode 100644
index 000000000..2a1205024
Binary files /dev/null and b/assets/gfx/misc/creep/creep9.tga differ
diff --git a/assets/gfx/misc/creep/creep90.tga b/assets/gfx/misc/creep/creep90.tga
new file mode 100644
index 000000000..6ee9b365f
Binary files /dev/null and b/assets/gfx/misc/creep/creep90.tga differ
diff --git a/assets/gfx/misc/creep/creep91.tga b/assets/gfx/misc/creep/creep91.tga
new file mode 100644
index 000000000..feadf2023
Binary files /dev/null and b/assets/gfx/misc/creep/creep91.tga differ
diff --git a/assets/gfx/misc/creep/creep92.tga b/assets/gfx/misc/creep/creep92.tga
new file mode 100644
index 000000000..9b854e0e6
Binary files /dev/null and b/assets/gfx/misc/creep/creep92.tga differ
diff --git a/assets/gfx/misc/creep/creep93.tga b/assets/gfx/misc/creep/creep93.tga
new file mode 100644
index 000000000..69073b8dc
Binary files /dev/null and b/assets/gfx/misc/creep/creep93.tga differ
diff --git a/assets/gfx/misc/creep/creep94.tga b/assets/gfx/misc/creep/creep94.tga
new file mode 100644
index 000000000..0734b2f46
Binary files /dev/null and b/assets/gfx/misc/creep/creep94.tga differ
diff --git a/assets/gfx/misc/creep/creep95.tga b/assets/gfx/misc/creep/creep95.tga
new file mode 100644
index 000000000..3f8c0fba4
Binary files /dev/null and b/assets/gfx/misc/creep/creep95.tga differ
diff --git a/assets/gfx/misc/creep/creep96.tga b/assets/gfx/misc/creep/creep96.tga
new file mode 100644
index 000000000..cd15260d7
Binary files /dev/null and b/assets/gfx/misc/creep/creep96.tga differ
diff --git a/assets/gfx/misc/creep/creep97.tga b/assets/gfx/misc/creep/creep97.tga
new file mode 100644
index 000000000..7a9522df4
Binary files /dev/null and b/assets/gfx/misc/creep/creep97.tga differ
diff --git a/assets/gfx/misc/creep/creep98.tga b/assets/gfx/misc/creep/creep98.tga
new file mode 100644
index 000000000..f7b9244b0
Binary files /dev/null and b/assets/gfx/misc/creep/creep98.tga differ
diff --git a/assets/gfx/misc/creep/creep99.tga b/assets/gfx/misc/creep/creep99.tga
new file mode 100644
index 000000000..ca253696b
Binary files /dev/null and b/assets/gfx/misc/creep/creep99.tga differ
diff --git a/assets/gfx/sprites/aliens_chatballoon.png b/assets/gfx/sprites/aliens_chatballoon.png
new file mode 100644
index 000000000..fdd66f9de
Binary files /dev/null and b/assets/gfx/sprites/aliens_chatballoon.png differ
diff --git a/assets/gfx/sprites/humans_chatballoon.png b/assets/gfx/sprites/humans_chatballoon.png
new file mode 100644
index 000000000..8d30fe8c7
Binary files /dev/null and b/assets/gfx/sprites/humans_chatballoon.png differ
diff --git a/assets/models/buildables/booster/booster.md3000 b/assets/models/buildables/booster/booster.md3000
new file mode 100644
index 000000000..66d1e860c
Binary files /dev/null and b/assets/models/buildables/booster/booster.md3000 differ
diff --git a/assets/models/buildables/hive/hive.md3000 b/assets/models/buildables/hive/hive.md3000
new file mode 100644
index 000000000..63d0984c1
Binary files /dev/null and b/assets/models/buildables/hive/hive.md3000 differ
diff --git a/assets/models/buildables/overmind/animation.cfg b/assets/models/buildables/overmind/animation.cfg
new file mode 100644
index 000000000..61071a9d6
--- /dev/null
+++ b/assets/models/buildables/overmind/animation.cfg
@@ -0,0 +1,15 @@
+//hivemind
+72 13 0 12 // CONSTRUCT1
+72 13 0 12 // CONSTRUCT2
+0 33 33 12 // IDLE1
+0 0 0 0 // IDLE2
+0 0 0 0 // IDLE3
+43 13 0 24 // ATTACK1
+0 0 0 0 // ATTACK2
+0 0 0 0 // SPAWN1
+0 0 0 0 // SPAWN2
+34 9 0 18 // PAIN1
+0 0 0 0 // PAIN2
+56 13 0 12 // DESTROY1
+0 0 0 0 // DESTROY2
+69 1 1 1 // DESTROYED
diff --git a/assets/models/buildables/overmind/over_body.jpg b/assets/models/buildables/overmind/over_body.jpg
new file mode 100644
index 000000000..da90a5718
Binary files /dev/null and b/assets/models/buildables/overmind/over_body.jpg differ
diff --git a/assets/models/buildables/overmind/overmind.md3000 b/assets/models/buildables/overmind/overmind.md3000
new file mode 100644
index 000000000..2bbee8040
Binary files /dev/null and b/assets/models/buildables/overmind/overmind.md3000 differ
diff --git a/assets/models/players/builder/nonseg.md3000 b/assets/models/players/builder/nonseg.md3000
new file mode 100644
index 000000000..c6604e19e
Binary files /dev/null and b/assets/models/players/builder/nonseg.md3000 differ
diff --git a/assets/models/players/level0/nonseg.md3000 b/assets/models/players/level0/nonseg.md3000
new file mode 100644
index 000000000..9f712bc24
Binary files /dev/null and b/assets/models/players/level0/nonseg.md3000 differ
diff --git a/assets/models/players/level1/nonseg.md3000 b/assets/models/players/level1/nonseg.md3000
new file mode 100644
index 000000000..09d4d4b2f
Binary files /dev/null and b/assets/models/players/level1/nonseg.md3000 differ
diff --git a/assets/models/players/level2/nonseg.md3000 b/assets/models/players/level2/nonseg.md3000
new file mode 100644
index 000000000..2eb981bf1
Binary files /dev/null and b/assets/models/players/level2/nonseg.md3000 differ
diff --git a/assets/models/players/level3/nonseg.md3000 b/assets/models/players/level3/nonseg.md3000
new file mode 100644
index 000000000..c53b0d602
Binary files /dev/null and b/assets/models/players/level3/nonseg.md3000 differ
diff --git a/assets/models/players/level4/nonseg.md3000 b/assets/models/players/level4/nonseg.md3000
new file mode 100644
index 000000000..241a25f5a
Binary files /dev/null and b/assets/models/players/level4/nonseg.md3000 differ
diff --git a/assets/models/splash/bright_star.jpg b/assets/models/splash/bright_star.jpg
new file mode 100644
index 000000000..05d203614
Binary files /dev/null and b/assets/models/splash/bright_star.jpg differ
diff --git a/assets/models/splash/bright_star_2.jpg b/assets/models/splash/bright_star_2.jpg
new file mode 100644
index 000000000..db7444498
Binary files /dev/null and b/assets/models/splash/bright_star_2.jpg differ
diff --git a/assets/models/splash/circles.png b/assets/models/splash/circles.png
new file mode 100644
index 000000000..87c849a4c
Binary files /dev/null and b/assets/models/splash/circles.png differ
diff --git a/assets/models/splash/loading_screen.md3 b/assets/models/splash/loading_screen.md3
new file mode 100644
index 000000000..a113873f3
Binary files /dev/null and b/assets/models/splash/loading_screen.md3 differ
diff --git a/assets/models/splash/nebula.jpg b/assets/models/splash/nebula.jpg
new file mode 100644
index 000000000..1ae08b94e
Binary files /dev/null and b/assets/models/splash/nebula.jpg differ
diff --git a/assets/models/splash/nebula_2.jpg b/assets/models/splash/nebula_2.jpg
new file mode 100644
index 000000000..bbf4f829a
Binary files /dev/null and b/assets/models/splash/nebula_2.jpg differ
diff --git a/assets/models/splash/splash_screen.md3 b/assets/models/splash/splash_screen.md3
new file mode 100644
index 000000000..0ed7312d2
Binary files /dev/null and b/assets/models/splash/splash_screen.md3 differ
diff --git a/assets/models/weapons/abuildupg/weapon.cfg b/assets/models/weapons/abuildupg/weapon.cfg
index 0646359b6..d532aafa9 100644
--- a/assets/models/weapons/abuildupg/weapon.cfg
+++ b/assets/models/weapons/abuildupg/weapon.cfg
@@ -14,6 +14,7 @@ tertiary
{
missileModel models/weapons/level3upg/missile.md3
+ impactParticleSystem models/weapons/builderupg/impactPS
impactMark 64 creep
impactSound 0 sound/misc/organic_bounce.wav
}
diff --git a/assets/scripts/acidtube.shader b/assets/scripts/acidtube.shader
new file mode 100644
index 000000000..51f6df844
--- /dev/null
+++ b/assets/scripts/acidtube.shader
@@ -0,0 +1,53 @@
+models/buildables/acid_tube/acid_tube
+{
+ {
+ map models/buildables/acid_tube/acid_tube.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/acid_tube/acid_tube.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/acid_tube/acid_tube_inside
+{
+ {
+ map models/buildables/acid_tube/acid_tube_inside.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/acid_tube/acid_tube_inside.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/acid_tube/pod_strands
+{
+ cull disable
+ {
+ map models/buildables/eggpod/pod_strands.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/eggpod/pod_strands.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
diff --git a/assets/scripts/armory.shader b/assets/scripts/armory.shader
new file mode 100644
index 000000000..83978862d
--- /dev/null
+++ b/assets/scripts/armory.shader
@@ -0,0 +1,41 @@
+models/buildables/arm/arm_body
+{
+ {
+ map models/buildables/arm/arm_body.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/arm/arm_body.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/arm/arm_parts
+{
+ {
+ map models/buildables/arm/arm_parts.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map $whiteimage
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/atcs.mtr b/assets/scripts/atcs.mtr
new file mode 100644
index 000000000..ce12f0ecd
--- /dev/null
+++ b/assets/scripts/atcs.mtr
@@ -0,0 +1,433 @@
+textures/atcs/skybox_s
+{
+ qer_editorimage textures/atcs/mars.jpg
+ surfaceparm noimpact
+ surfaceparm nolightmap
+ surfaceparm sky
+ q3map_lightimage textures/atcs/skylight.tga
+// q3map_sun 0.95 0.95 1.0 150 120 25 //lilacisles
+// q3map_sun 1.00 1.00 0.965 75 90 30 //siege
+// q3map_sun 1.00 0.90 0.80 110 180 35 //orangecream
+// q3map_sun 1.00 0.80 0.70 100 0 20 //cottoncandy
+// q3map_sun 0.934 0.835 1.00 75 230 35 //desertsky
+// q3map_sun 1.00 1.00 1.00 50 90 90 //comablack
+// q3map_sun 4 3 3 150 135 50 //mars
+// q3map_sun 1.00 0.949 0.977 100 200 45 //desert
+ q3map_sun 1.00 0.949 0.977 150 135 45
+ q3map_skylight 250 3
+ q3map_globaltexture
+ skyparms env/atcs/mars - -
+}
+
+textures/atcs/burst_red_s
+{
+ entityMergable
+ cull none
+ {
+ map textures/atcs/sparkle_red.tga
+ blendFunc add
+ alphaGen vertex
+ }
+}
+
+textures/atcs/burst_blue_s
+{
+ entityMergable
+ cull none
+ {
+ map textures/atcs/sparkle_blue.tga
+ blendFunc add
+ alphaGen vertex
+ }
+}
+
+textures/atcs/force_field_s
+ {
+ qer_editorimage textures/atcs/force_field_gtk.tga
+ surfaceparm trans
+ surfaceparm nomarks
+ surfaceparm nolightmap
+ cull none
+ {
+ map textures/atcs/force_field.tga
+ tcMod Scroll .1 0
+ blendFunc add
+ }
+ {
+ map textures/atcs/force_grid.tga
+ tcMod Scroll -.01 0
+ blendFunc add
+ rgbgen wave sin .2 .2 0 .4
+ }
+}
+
+textures/atcs/bulb_red_s
+{
+ qer_editorimage textures/atcs/bulb_red.tga
+ surfaceparm trans
+ cull disable
+ qer_trans 0.5
+ {
+ map textures/atcs/bulb_red.tga
+ blendfunc gl_dst_color gl_src_alpha
+ }
+ {
+ map textures/atcs/bulb_red.tga
+ blendfunc gl_dst_color gl_src_alpha
+ }
+}
+
+textures/atcs/eq2_bounce
+{
+ qer_editorimage textures/atcs/eq2_bounce.tga
+
+ {
+ map textures/atcs/eq2_bounce.tga
+ rgbGen identity
+ }
+ {
+ clampmap textures/atcs/eq2_bouncefan.tga
+ tcMod rotate 512
+ blendFunc blend
+ depthWrite
+ rgbGen identity
+
+ }
+ {
+ map textures/atcs/eq2_bounce.tga
+ blendfunc blend
+ rgbGen identity
+ }
+ {
+ map $lightmap
+ rgbGen identity
+ blendFunc GL_DST_COLOR GL_ZERO
+ depthFunc equal
+ }
+
+}
+
+textures/atcs/cubelight_32_blue_invis_s_15k
+{
+ surfaceparm nodraw
+ surfaceparm nolightmap
+ surfaceparm nonsolid
+ surfaceparm trans
+ surfaceparm noimpact
+ q3map_surfacelight 15000
+ q3map_lightimage textures/atcs/cubelight_32_blue.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_blue.blend.tga
+}
+
+textures/atcs/cubelight_32_red_invis_s_15k
+{
+ surfaceparm nodraw
+ surfaceparm nolightmap
+ surfaceparm nonsolid
+ surfaceparm trans
+ surfaceparm noimpact
+ q3map_surfacelight 15000
+ q3map_lightimage textures/atcs/cubelight_32_red.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_red.blend.tga
+}
+
+textures/atcs/cubelight_32_white_s_20k
+{
+ q3map_surfacelight 20000
+ q3map_lightimage textures/atcs/cubelight_32_white.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_white.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_white.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_white.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/cubelight_32_blue_s_20k
+{
+ q3map_surfacelight 20000
+ q3map_lightimage textures/atcs/cubelight_32_blue.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/cubelight_32_blue_s_15k
+{
+ q3map_surfacelight 15000
+ q3map_lightimage textures/atcs/cubelight_32_blue.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/cubelight_32_blue_s_10k
+{
+ q3map_surfacelight 10000
+ q3map_lightimage textures/atcs/cubelight_32_blue.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/cubelight_32_red_s_20k
+{
+ q3map_surfacelight 20000
+ q3map_lightimage textures/atcs/cubelight_32_red.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_red.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_red.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_red.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/cubelight_32_red_s_15k
+{
+ q3map_surfacelight 15000
+ q3map_lightimage textures/atcs/cubelight_32_red.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_red.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_red.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_red.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/cubelight_32_red_s_10k
+{
+ q3map_surfacelight 10000
+ q3map_lightimage textures/atcs/cubelight_32_red.blend.tga
+ qer_editorimage textures/atcs/cubelight_32_red.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_red.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/cubelight_32_red.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2lt_baselt03b_blue_s_3000
+{
+ q3map_surfacelight 3000
+ q3map_lightimage textures/atcs/eq2_baselt03b_blue.blend.tga
+ qer_editorimage textures/atcs/eq2_baselt03b_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2lt_baselt03b_blue_s_2000
+{
+ q3map_surfacelight 2000
+ q3map_lightimage textures/atcs/eq2_baselt03b_blue.blend.tga
+ qer_editorimage textures/atcs/eq2_baselt03b_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2lt_baselt03b_blue_s_1500
+{
+ q3map_surfacelight 1500
+ q3map_lightimage textures/atcs/eq2_baselt03b_blue.blend.tga
+ qer_editorimage textures/atcs/eq2_baselt03b_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2lt_baselt03b_s_2000
+{
+ q3map_surfacelight 2000
+ q3map_lightimage textures/atcs/eq2_baselt03b.blend.tga
+ qer_editorimage textures/atcs/eq2_baselt03b.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2lt_baselt03b_s_1500
+{
+ q3map_surfacelight 1500
+ q3map_lightimage textures/atcs/eq2_baselt03b.blend.tga
+ qer_editorimage textures/atcs/eq2_baselt03b.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03b.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2_baselt03_blue_s_5000
+{
+ q3map_surfacelight 5000
+ q3map_lightimage textures/atcs/eq2_baselt03_blue.blend.tga
+ qer_editorimage textures/atcs/eq2_baselt03_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2_baselt03_blue_s_3000
+{
+ q3map_surfacelight 3000
+ q3map_lightimage textures/atcs/eq2_baselt03_blue.blend.tga
+ qer_editorimage textures/atcs/eq2_baselt03_blue.tga
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03_blue.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_baselt03_blue.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
+
+textures/atcs/eq2lt_bmtl03light_300
+{
+ q3map_surfacelight 300
+ qer_editorimage textures/atcs/eq2_bmtl_03_light.tga
+ q3map_lightimage textures/atcs/eq2_bmtl_03_light.blend.tga
+
+ {
+ map $lightmap
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_bmtl_03_light.tga
+ blendFunc GL_DST_COLOR GL_ZERO
+ rgbGen identity
+ }
+ {
+ map textures/atcs/eq2_bmtl_03_light.blend.tga
+ blendfunc GL_ONE GL_ONE
+ }
+}
diff --git a/assets/scripts/barricade.shader b/assets/scripts/barricade.shader
new file mode 100644
index 000000000..2aa9d9e35
--- /dev/null
+++ b/assets/scripts/barricade.shader
@@ -0,0 +1,45 @@
+models/buildables/barricade/pod_strands
+{
+ cull disable
+ {
+ map models/buildables/barricade/pod_strands.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/barricade/pod_strands.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+models/buildables/barricade/alien_spike
+{
+ {
+ map models/buildables/barricade/alien_spike.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/barricade/alien_spike.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/blaster.shader b/assets/scripts/blaster.shader
new file mode 100644
index 000000000..715ec5659
--- /dev/null
+++ b/assets/scripts/blaster.shader
@@ -0,0 +1,21 @@
+models/weapons/blaster/blaster
+{
+ cull disable
+ {
+ map models/weapons/blaster/blaster.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/blaster/blaster.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/booster.shader b/assets/scripts/booster.shader
new file mode 100644
index 000000000..0d8dee62f
--- /dev/null
+++ b/assets/scripts/booster.shader
@@ -0,0 +1,65 @@
+models/buildables/booster/booster_head
+{
+ {
+ map models/buildables/booster/booster_head.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/booster/booster_head.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/booster/ref_map.tga
+ blendfunc filter
+ rgbGen identity
+ tcMod rotate 5
+ tcGen environment
+ }
+}
+
+models/buildables/booster/booster_sac
+{
+ {
+ map models/buildables/booster/booster_sac.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/booster/poison.tga
+ blendfunc add
+ rgbGen wave sin 0 1 0 0.1
+ tcMod scroll -0.05 -0.05
+ }
+ {
+ map models/buildables/booster/booster_sac.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+models/buildables/booster/pod_strands
+{
+ cull disable
+ {
+ map models/buildables/barricade/pod_strands.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/barricade/pod_strands.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
diff --git a/assets/scripts/buildables.particle b/assets/scripts/buildables.particle
new file mode 100644
index 000000000..cfc37e366
--- /dev/null
+++ b/assets/scripts/buildables.particle
@@ -0,0 +1,445 @@
+humanBuildableDamagedPS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/smoke
+
+ displacement ~8 ~8 3~5 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 50
+ velocity 0 0 1 ~60
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 50
+ acceleration 0 0 1 0
+
+ radius 0 6.0 30.0
+ alpha 0 0.125 0.0
+ rotation 0 ~360 -
+ bounce 0.5
+
+ lifeTime 1500~50%
+ }
+
+ count infinite
+ delay 0
+ period 10 - ~0%
+ }
+
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/spark
+
+ displacement 0 0 11 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 200
+ velocity 0 0 1 ~60
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 4.0 2.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.6
+
+ lifeTime 1500~50%
+ }
+
+ count infinite
+ delay 0
+ period 700 - ~0%
+ }
+}
+
+humanBuildableDestroyedTrailPS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync flame1 flame2 flame3 flame4 flame5 flame6 flame7 flame8 flame9 flame10 flame11 flame12 flame13 flame14 flame15 flame16 flame17 flame18 flame19 flame20 flame21 flame22 flame23 flame24 flame25
+
+ displacement 0 0 40 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 30
+ velocity 0 0 -1 ~60
+
+ radius 0 20.0 15.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.2
+
+ lifeTime 1000
+ }
+
+ count 10
+ delay 0
+ period 80 - ~0%
+ }
+}
+
+humanBuildableDestroyedPS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/spark
+
+ displacement 0 0 8 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 350~75%
+ velocity 0 0 1 ~60
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 4.0 2.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.4~100%
+
+ lifeTime 5000~100%
+ }
+
+ count 80
+ delay 0
+ period 0 - ~0%
+ }
+
+ ejector
+ {
+ particle
+ {
+ shader sync flame1 flame2 flame3 flame4 flame5 flame6 flame7 flame8 flame9 flame10 flame11 flame12 flame13 flame14 flame15 flame16 flame17 flame18 flame19 flame20 flame21 flame22 flame23 flame24 flame25
+
+ displacement 0 0 40 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 300~75%
+ velocity 0 0 1 ~60
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 20.0 30.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.2
+
+ lifeTime 1000
+
+ childSystem humanBuildableDestroyedTrailPS
+ }
+
+ count 10
+ delay 0
+ period 10 - ~0%
+ }
+
+ ejector
+ {
+ particle
+ {
+ model models/fx/metal_gibs/m_gib1.md3 models/fx/metal_gibs/m_gib2.md3 models/fx/metal_gibs/m_gib3.md3 models/fx/metal_gibs/m_gib4.md3 models/fx/metal_gibs/m_gib5.md3 models/fx/metal_gibs/m_gib6.md3 models/fx/metal_gibs/m_gib7.md3 models/fx/metal_gibs/m_gib8.md3
+
+ displacement 0 0 40 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 300~75%
+ velocity 0 0 1 ~60
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 1.0 -
+ bounce 0.2
+ bounceMark 1~1 16 gfx/marks/burn_mrk
+ bounceSound ~1 sound/buildables/human/fragmentbounce.wav
+
+ lifeTime 7000~1000
+ }
+
+ count 8
+ delay 0
+ period 10 - ~0%
+ }
+
+ ejector
+ {
+ particle
+ {
+ dynamicLight 0 300 0 { 1.0 0.75 0.0 }
+
+ lifeTime 600~100
+ }
+
+ count 1
+ delay 0
+ period 0 - ~0%
+ }
+}
+
+alienBuildableDamagedPS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/green_acid
+
+ velocityType normal
+ velocityDir linear
+ velocityMagnitude 100
+ velocity 0 0 0 ~40
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 200
+ acceleration 0 0 -1 0
+
+ radius 0 4.0 20.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.1
+ bounceMark 3 16 gfx/sprites/green_acid_mark
+
+ lifeTime 1000~50%
+ }
+
+ count infinite
+ delay 0
+ period 750 - ~0%
+ }
+}
+
+alienBuildableDestroyedPS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/green_acid
+
+ displacement 0 0 0 ~70
+ normalDisplacement 80
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 30
+ velocity 0 0 -1 ~0
+
+ radius 0 20.0 15.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.0
+ bounceMark 3 16 gfx/sprites/green_acid_mark
+
+ lifeTime 1000~50%
+ }
+
+ count 16
+ delay 0
+ period 0 - ~0%
+ }
+
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/green_acid
+
+ displacement 0 0 40 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 300~75%
+ velocity 0 0 1 ~60
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 20.0 30.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.2
+ bounceMark 3 16 gfx/sprites/green_acid_mark
+
+ lifeTime 1000
+ }
+
+ count 10
+ delay 0
+ period 10 - ~0%
+ }
+
+ ejector
+ {
+ particle
+ {
+ model models/fx/alien_gibs/a_gib1.md3 models/fx/alien_gibs/a_gib2.md3 models/fx/alien_gibs/a_gib3.md3 models/fx/alien_gibs/a_gib4.md3
+
+ displacement 0 0 40 ~0
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 300~75%
+ velocity 0 0 1 ~60
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 1.0 -
+ bounce 0.2
+ bounceMark 1~1 16 creep
+ bounceSound ~1 sound/misc/organic_bounce.wav
+
+ lifeTime 5000~1000
+ }
+
+ count 8
+ delay 0
+ period 10 - ~0%
+ }
+ ejector
+ {
+ particle
+ {
+ dynamicLight 0 300 0 { 0.5 1.0 0.156 }
+
+ lifeTime 600~100
+ }
+
+ count 1
+ delay 0
+ period 0 - ~0%
+ }
+}
+
+alienAcideTubeAcidTrailPS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/green_acid
+
+ displacement -4 -4 -4 ~8
+
+ velocityType static
+ velocityDir linear
+ velocityMagnitude 300~75%
+ velocity 0 0 0 ~1
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 ~30
+
+ radius 0 10 5
+ alpha 500~50% 0.4 0
+ rotation 0 360~200% 360~200%
+ bounce 0.2
+
+ lifeTime 1000~100%
+ }
+
+ count 1
+ delay 350~100%
+ }
+}
+
+alienAcidTubePS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/green_acid
+
+ displacement 0 0 -5 ~2
+ normalDisplacement 20
+
+ velocityType normal
+ velocityDir linear
+ velocityMagnitude 300~75%
+ velocity 0 0 1 ~10
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 ~30
+
+ radius 0 8.0 20.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.2
+ bounceMark 1 16 gfx/sprites/green_acid_mark
+ // should add child particle system to get better "acid" effect with sound
+ // Marks limit is reached easily with only one acid tube
+
+ lifeTime 1000~100%
+
+ childSystem alienAcideTubeAcidTrailPS
+ }
+
+ count 35
+ delay 120
+ period 17 17 ~0%
+ }
+ ejector
+ {
+ particle
+ {
+ dynamicLight 0 400 0 { 0.16 0.32 0.05 }
+
+ displacement 0 0 -5 0
+ normalDisplacement 20
+
+ velocityType normal
+ velocityDir linear
+ velocityMagnitude 113
+ velocity 0 0 1 5
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 15
+
+ bounce 0.2
+
+ lifeTime 4500~20%
+ }
+
+ count 1
+ delay 200
+ }
+}
diff --git a/assets/scripts/builder.shader b/assets/scripts/builder.shader
new file mode 100644
index 000000000..db5d62995
--- /dev/null
+++ b/assets/scripts/builder.shader
@@ -0,0 +1,13 @@
+models/players/builder/builder
+{
+ {
+ map models/players/builder/builder.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/builder/builder.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/chaingun.shader b/assets/scripts/chaingun.shader
new file mode 100644
index 000000000..1523dc118
--- /dev/null
+++ b/assets/scripts/chaingun.shader
@@ -0,0 +1,43 @@
+models/weapons/chaingun/chaingun
+{
+ cull disable
+ {
+ map models/weapons/chaingun/chaingun.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/chaingun/chaingun.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/weapons/chaingun/barrels
+{
+ cull disable
+ {
+ map models/weapons/chaingun/barrels.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/chaingun/barrels.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/conkit.shader b/assets/scripts/conkit.shader
new file mode 100644
index 000000000..b4ff15e00
--- /dev/null
+++ b/assets/scripts/conkit.shader
@@ -0,0 +1,93 @@
+models/weapons/ckit/ckit
+{
+ cull disable
+ {
+ map models/weapons/ckit/ckit.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/ckit/ckit.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/weapons/ckit/rep_cyl
+{
+ cull disable
+ {
+ map models/weapons/ckit/rep_cyl.jpg
+ blendfunc add
+ rgbGen lightingDiffuse
+ tcMod scroll 0.2 0
+ }
+ {
+ map models/weapons/ckit/lines2.jpg
+ blendfunc add
+ rgbGen identity
+ tcMod scroll 0 -0.2
+ }
+}
+
+models/weapons/ckit/screen
+{
+ noPicMip
+ {
+ map models/weapons/ckit/screen.jpg
+ }
+ {
+ map models/weapons/ckit/scroll.jpg
+ blendfunc add
+ tcMod scroll 10 -0.4
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ }
+}
+
+models/weapons/ackit/rep_cyl
+{
+ cull disable
+ {
+ map models/weapons/ackit/rep_cyl.jpg
+ blendfunc add
+ rgbGen lightingDiffuse
+ tcMod scroll 0.2 0
+ }
+ {
+ map models/weapons/ackit/lines2.jpg
+ blendfunc add
+ rgbGen identity
+ tcMod scroll 0 -0.2
+ }
+}
+
+models/weapons/ackit/advscreen
+{
+ noPicMip
+ {
+ map models/weapons/ackit/advscreen.jpg
+ }
+ {
+ map models/weapons/ackit/scroll.jpg
+ blendfunc add
+ tcMod scroll 10 -0.4
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ }
+}
diff --git a/assets/scripts/core.shader b/assets/scripts/core.shader
index a640d9b33..d5be848df 100644
--- a/assets/scripts/core.shader
+++ b/assets/scripts/core.shader
@@ -1,209 +1,200 @@
-// the REGION shader is generated by the map editor on temporary
-// brushes around a selected area for testing parts of maps
-textures/REGION
-{
- surfaceparm nolightmap
-}
-
-white
-{
- {
- map $whiteimage
- blendfunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-
-outline
-{
- cull none
- nopicmip
- nomipmaps
- {
- map gfx/2d/outline.tga
- blendfunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-
-console
-{
- nopicmip
- nomipmaps
- {
- map ui/assets/console1.tga
- blendFunc GL_ONE GL_ZERO
- tcMod scroll .02 0
- tcmod scale 4 1
- }
- {
- map ui/assets/console2.jpg
- blendFunc add
- tcMod turb 0 .1 0 .1
- tcMod scale 4 1
- tcmod scroll 0.2 .1
- }
-}
-
-gfx/misc/detail
-{
- nopicmip
- {
- map gfx/misc/detail.jpg
- blendFunc GL_DST_COLOR GL_SRC_COLOR
- rgbgen identity
- }
-}
-
-// The console font
-gfx/2d/bigchars
-{
- nopicmip
- nomipmaps
- {
- map gfx/2d/bigchars.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-
-gfx/2d/cursor
-{
- nopicmip
- nomipmaps
- {
- map gfx/2d/cursor.tga
- }
-}
-
-// projectionShadow is used for cheap squashed model shadows
-projectionShadow
-{
- polygonOffset
- deformVertexes projectionShadow
- {
- map $whiteimage
- blendFunc GL_ONE GL_ZERO
- rgbGen wave square 0 0 0 0
- }
-}
-
-// blinked on top of lagometer when connection is interrupted
-gfx/2d/net
-{
- nopicmip
- {
- map gfx/2d/net.jpg
- }
-}
-
-//===============================================================
-
-gfx/2d/numbers/zero_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/zero_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/one_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/one_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/two_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/two_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/three_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/three_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/four_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/four_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/five_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/five_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/six_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/six_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/seven_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/seven_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/eight_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/eight_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/nine_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/nine_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/minus_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/minus_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
-gfx/2d/numbers/infinity_32b
-{
- nopicmip
- {
- map gfx/2d/numbers/infinity_32b.tga
- blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
- rgbgen vertex
- }
-}
+// the REGION shader is generated by the map editor on temporary
+// brushes around a selected area for testing parts of maps
+textures/REGION
+{
+ surfaceparm nolightmap
+}
+
+white
+{
+ {
+ map $whiteimage
+ blendfunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+
+outline
+{
+ cull none
+ nopicmip
+ nomipmaps
+ {
+ map gfx/2d/outline.tga
+ blendfunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+
+console
+{
+ nopicmip
+ nomipmaps
+ {
+ map ui/assets/console1.tga
+ blendFunc GL_ONE GL_ZERO
+ tcMod scroll .02 0
+ tcmod scale 4 1
+ }
+ {
+ map ui/assets/console2.jpg
+ blendFunc add
+ tcMod turb 0 .1 0 .1
+ tcMod scale 4 1
+ tcmod scroll 0.2 .1
+ }
+}
+
+gfx/misc/detail
+{
+ nopicmip
+ {
+ map gfx/misc/detail.jpg
+ blendFunc GL_DST_COLOR GL_SRC_COLOR
+ rgbgen identity
+ }
+}
+
+// The console font
+gfx/2d/bigchars
+{
+ nopicmip
+ nomipmaps
+ {
+ map gfx/2d/bigchars.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+
+// projectionShadow is used for cheap squashed model shadows
+projectionShadow
+{
+ polygonOffset
+ deformVertexes projectionShadow
+ {
+ map $whiteimage
+ blendFunc GL_ONE GL_ZERO
+ rgbGen wave square 0 0 0 0
+ }
+}
+
+// blinked on top of lagometer when connection is interrupted
+gfx/2d/net
+{
+ nopicmip
+ {
+ map gfx/2d/net.jpg
+ }
+}
+
+//===============================================================
+
+gfx/2d/numbers/zero_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/zero_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/one_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/one_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/two_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/two_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/three_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/three_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/four_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/four_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/five_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/five_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/six_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/six_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/seven_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/seven_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/eight_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/eight_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/nine_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/nine_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/minus_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/minus_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
+gfx/2d/numbers/infinity_32b
+{
+ nopicmip
+ {
+ map gfx/2d/numbers/infinity_32b.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbgen vertex
+ }
+}
diff --git a/assets/scripts/creep.shader b/assets/scripts/creep.shader
new file mode 100644
index 000000000..07339d31e
--- /dev/null
+++ b/assets/scripts/creep.shader
@@ -0,0 +1,10469 @@
+creep
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep549.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep549.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep0
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep0.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep0.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep1
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep1.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep1.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep2
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep2.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep2.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep3
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep3.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep3.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep4
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep4.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep4.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep5
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep5.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep5.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep6
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep6.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep6.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep7
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep7.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep7.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep8
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep8.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep8.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep9
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep9.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep9.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep10
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep10.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep10.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep11
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep11.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep11.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep12
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep12.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep12.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep13
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep13.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep13.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep14
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep14.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep14.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep15
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep15.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep15.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep16
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep16.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep16.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep17
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep17.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep17.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep18
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep18.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep18.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep19
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep19.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep19.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep20
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep20.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep20.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep21
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep21.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep21.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep22
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep22.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep22.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep23
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep23.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep23.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep24
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep24.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep24.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep25
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep25.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep25.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep26
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep26.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep26.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep27
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep27.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep27.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep28
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep28.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep28.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep29
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep29.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep29.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep30
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep30.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep30.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep31
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep31.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep31.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep32
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep32.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep32.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep33
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep33.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep33.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep34
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep34.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep34.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep35
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep35.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep35.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep36
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep36.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep36.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep37
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep37.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep37.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep38
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep38.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep38.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep39
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep39.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep39.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep40
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep40.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep40.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep41
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep41.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep41.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep42
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep42.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep42.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep43
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep43.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep43.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep44
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep44.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep44.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep45
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep45.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep45.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep46
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep46.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep46.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep47
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep47.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep47.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep48
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep48.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep48.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep49
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep49.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep49.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep50
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep50.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep50.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep51
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep51.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep51.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep52
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep52.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep52.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep53
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep53.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep53.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep54
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep54.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep54.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep55
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep55.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep55.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep56
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep56.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep56.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep57
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep57.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep57.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep58
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep58.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep58.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep59
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep59.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep59.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep60
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep60.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep60.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep61
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep61.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep61.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep62
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep62.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep62.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep63
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep63.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep63.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep64
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep64.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep64.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep65
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep65.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep65.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep66
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep66.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep66.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep67
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep67.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep67.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep68
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep68.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep68.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep69
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep69.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep69.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep70
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep70.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep70.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep71
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep71.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep71.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep72
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep72.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep72.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep73
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep73.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep73.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep74
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep74.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep74.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep75
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep75.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep75.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep76
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep76.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep76.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep77
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep77.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep77.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep78
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep78.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep78.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep79
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep79.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep79.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep80
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep80.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep80.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep81
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep81.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep81.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep82
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep82.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep82.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep83
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep83.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep83.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep84
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep84.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep84.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep85
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep85.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep85.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep86
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep86.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep86.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep87
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep87.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep87.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep88
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep88.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep88.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep89
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep89.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep89.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep90
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep90.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep90.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep91
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep91.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep91.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep92
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep92.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep92.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep93
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep93.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep93.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep94
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep94.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep94.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep95
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep95.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep95.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep96
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep96.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep96.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep97
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep97.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep97.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep98
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep98.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep98.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep99
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep99.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep99.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep100
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep100.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep100.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep101
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep101.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep101.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep102
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep102.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep102.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep103
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep103.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep103.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep104
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep104.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep104.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep105
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep105.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep105.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep106
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep106.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep106.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep107
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep107.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep107.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep108
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep108.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep108.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep109
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep109.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep109.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep110
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep110.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep110.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep111
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep111.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep111.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep112
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep112.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep112.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep113
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep113.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep113.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep114
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep114.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep114.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep115
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep115.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep115.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep116
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep116.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep116.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep117
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep117.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep117.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep118
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep118.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep118.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep119
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep119.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep119.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep120
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep120.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep120.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep121
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep121.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep121.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep122
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep122.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep122.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep123
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep123.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep123.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep124
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep124.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep124.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep125
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep125.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep125.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep126
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep126.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep126.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep127
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep127.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep127.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep128
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep128.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep128.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep129
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep129.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep129.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep130
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep130.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep130.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep131
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep131.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep131.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep132
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep132.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep132.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep133
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep133.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep133.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep134
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep134.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep134.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep135
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep135.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep135.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep136
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep136.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep136.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep137
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep137.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep137.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep138
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep138.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep138.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep139
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep139.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep139.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep140
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep140.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep140.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep141
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep141.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep141.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep142
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep142.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep142.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep143
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep143.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep143.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep144
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep144.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep144.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep145
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep145.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep145.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep146
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep146.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep146.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep147
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep147.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep147.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep148
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep148.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep148.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep149
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep149.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep149.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep150
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep150.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep150.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep151
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep151.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep151.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep152
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep152.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep152.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep153
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep153.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep153.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep154
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep154.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep154.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep155
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep155.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep155.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep156
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep156.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep156.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep157
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep157.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep157.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep158
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep158.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep158.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep159
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep159.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep159.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep160
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep160.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep160.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep161
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep161.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep161.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep162
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep162.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep162.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep163
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep163.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep163.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep164
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep164.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep164.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep165
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep165.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep165.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep166
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep166.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep166.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep167
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep167.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep167.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep168
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep168.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep168.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep169
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep169.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep169.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep170
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep170.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep170.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep171
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep171.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep171.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep172
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep172.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep172.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep173
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep173.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep173.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep174
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep174.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep174.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep175
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep175.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep175.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep176
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep176.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep176.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep177
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep177.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep177.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep178
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep178.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep178.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep179
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep179.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep179.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep180
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep180.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep180.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep181
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep181.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep181.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep182
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep182.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep182.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep183
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep183.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep183.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep184
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep184.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep184.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep185
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep185.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep185.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep186
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep186.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep186.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep187
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep187.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep187.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep188
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep188.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep188.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep189
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep189.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep189.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep190
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep190.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep190.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep191
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep191.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep191.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep192
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep192.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep192.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep193
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep193.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep193.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep194
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep194.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep194.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep195
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep195.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep195.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep196
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep196.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep196.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep197
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep197.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep197.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep198
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep198.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep198.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep199
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep199.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep199.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep200
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep200.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep200.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep201
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep201.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep201.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep202
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep202.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep202.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep203
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep203.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep203.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep204
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep204.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep204.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep205
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep205.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep205.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep206
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep206.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep206.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep207
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep207.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep207.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep208
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep208.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep208.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep209
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep209.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep209.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep210
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep210.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep210.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep211
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep211.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep211.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep212
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep212.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep212.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep213
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep213.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep213.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep214
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep214.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep214.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep215
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep215.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep215.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep216
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep216.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep216.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep217
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep217.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep217.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep218
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep218.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep218.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep219
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep219.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep219.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep220
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep220.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep220.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep221
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep221.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep221.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep222
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep222.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep222.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep223
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep223.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep223.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep224
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep224.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep224.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep225
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep225.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep225.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep226
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep226.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep226.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep227
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep227.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep227.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep228
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep228.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep228.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep229
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep229.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep229.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep230
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep230.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep230.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep231
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep231.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep231.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep232
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep232.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep232.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep233
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep233.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep233.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep234
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep234.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep234.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep235
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep235.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep235.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep236
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep236.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep236.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep237
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep237.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep237.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep238
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep238.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep238.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep239
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep239.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep239.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep240
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep240.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep240.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep241
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep241.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep241.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep242
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep242.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep242.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep243
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep243.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep243.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep244
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep244.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep244.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep245
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep245.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep245.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep246
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep246.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep246.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep247
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep247.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep247.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep248
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep248.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep248.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep249
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep249.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep249.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep250
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep250.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep250.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep251
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep251.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep251.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep252
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep252.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep252.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep253
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep253.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep253.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep254
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep254.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep254.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep255
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep255.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep255.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep256
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep256.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep256.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep257
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep257.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep257.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep258
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep258.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep258.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep259
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep259.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep259.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep260
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep260.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep260.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep261
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep261.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep261.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep262
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep262.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep262.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep263
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep263.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep263.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep264
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep264.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep264.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep265
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep265.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep265.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep266
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep266.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep266.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep267
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep267.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep267.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep268
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep268.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep268.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep269
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep269.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep269.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep270
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep270.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep270.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep271
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep271.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep271.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep272
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep272.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep272.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep273
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep273.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep273.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep274
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep274.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep274.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep275
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep275.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep275.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep276
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep276.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep276.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep277
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep277.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep277.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep278
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep278.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep278.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep279
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep279.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep279.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep280
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep280.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep280.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep281
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep281.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep281.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep282
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep282.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep282.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep283
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep283.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep283.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep284
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep284.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep284.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep285
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep285.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep285.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep286
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep286.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep286.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep287
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep287.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep287.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep288
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep288.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep288.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep289
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep289.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep289.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep290
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep290.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep290.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep291
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep291.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep291.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep292
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep292.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep292.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep293
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep293.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep293.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep294
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep294.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep294.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep295
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep295.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep295.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep296
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep296.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep296.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep297
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep297.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep297.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep298
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep298.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep298.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep299
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep299.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep299.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep300
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep300.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep300.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep301
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep301.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep301.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep302
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep302.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep302.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep303
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep303.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep303.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep304
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep304.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep304.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep305
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep305.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep305.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep306
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep306.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep306.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep307
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep307.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep307.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep308
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep308.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep308.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep309
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep309.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep309.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep310
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep310.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep310.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep311
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep311.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep311.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep312
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep312.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep312.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep313
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep313.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep313.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep314
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep314.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep314.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep315
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep315.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep315.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep316
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep316.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep316.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep317
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep317.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep317.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep318
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep318.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep318.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep319
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep319.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep319.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep320
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep320.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep320.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep321
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep321.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep321.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep322
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep322.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep322.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep323
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep323.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep323.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep324
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep324.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep324.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep325
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep325.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep325.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep326
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep326.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep326.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep327
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep327.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep327.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep328
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep328.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep328.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep329
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep329.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep329.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep330
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep330.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep330.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep331
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep331.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep331.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep332
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep332.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep332.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep333
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep333.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep333.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep334
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep334.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep334.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep335
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep335.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep335.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep336
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep336.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep336.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep337
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep337.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep337.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep338
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep338.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep338.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep339
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep339.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep339.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep340
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep340.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep340.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep341
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep341.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep341.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep342
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep342.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep342.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep343
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep343.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep343.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep344
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep344.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep344.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep345
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep345.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep345.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep346
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep346.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep346.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep347
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep347.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep347.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep348
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep348.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep348.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep349
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep349.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep349.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep350
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep350.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep350.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep351
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep351.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep351.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep352
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep352.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep352.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep353
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep353.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep353.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep354
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep354.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep354.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep355
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep355.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep355.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep356
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep356.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep356.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep357
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep357.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep357.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep358
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep358.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep358.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep359
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep359.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep359.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep360
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep360.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep360.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep361
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep361.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep361.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep362
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep362.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep362.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep363
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep363.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep363.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep364
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep364.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep364.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep365
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep365.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep365.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep366
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep366.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep366.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep367
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep367.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep367.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep368
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep368.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep368.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep369
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep369.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep369.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep370
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep370.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep370.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep371
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep371.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep371.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep372
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep372.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep372.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep373
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep373.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep373.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep374
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep374.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep374.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep375
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep375.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep375.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep376
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep376.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep376.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep377
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep377.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep377.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep378
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep378.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep378.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep379
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep379.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep379.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep380
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep380.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep380.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep381
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep381.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep381.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep382
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep382.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep382.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep383
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep383.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep383.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep384
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep384.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep384.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep385
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep385.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep385.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep386
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep386.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep386.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep387
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep387.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep387.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep388
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep388.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep388.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep389
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep389.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep389.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep390
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep390.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep390.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep391
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep391.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep391.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep392
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep392.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep392.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep393
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep393.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep393.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep394
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep394.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep394.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep395
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep395.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep395.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep396
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep396.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep396.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep397
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep397.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep397.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep398
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep398.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep398.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep399
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep399.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep399.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep400
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep400.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep400.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep401
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep401.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep401.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep402
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep402.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep402.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep403
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep403.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep403.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep404
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep404.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep404.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep405
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep405.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep405.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep406
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep406.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep406.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep407
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep407.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep407.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep408
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep408.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep408.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep409
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep409.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep409.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep410
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep410.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep410.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep411
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep411.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep411.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep412
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep412.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep412.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep413
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep413.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep413.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep414
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep414.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep414.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep415
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep415.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep415.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep416
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep416.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep416.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep417
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep417.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep417.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep418
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep418.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep418.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep419
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep419.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep419.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep420
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep420.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep420.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep421
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep421.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep421.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep422
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep422.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep422.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep423
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep423.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep423.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep424
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep424.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep424.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep425
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep425.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep425.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep426
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep426.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep426.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep427
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep427.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep427.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep428
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep428.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep428.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep429
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep429.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep429.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep430
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep430.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep430.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep431
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep431.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep431.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep432
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep432.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep432.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep433
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep433.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep433.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep434
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep434.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep434.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep435
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep435.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep435.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep436
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep436.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep436.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep437
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep437.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep437.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep438
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep438.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep438.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep439
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep439.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep439.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep440
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep440.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep440.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep441
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep441.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep441.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep442
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep442.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep442.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep443
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep443.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep443.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep444
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep444.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep444.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep445
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep445.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep445.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep446
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep446.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep446.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep447
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep447.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep447.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep448
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep448.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep448.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep449
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep449.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep449.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep450
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep450.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep450.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep451
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep451.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep451.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep452
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep452.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep452.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep453
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep453.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep453.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep454
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep454.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep454.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep455
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep455.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep455.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep456
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep456.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep456.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep457
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep457.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep457.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep458
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep458.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep458.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep459
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep459.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep459.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep460
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep460.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep460.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep461
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep461.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep461.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep462
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep462.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep462.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep463
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep463.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep463.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep464
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep464.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep464.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep465
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep465.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep465.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep466
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep466.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep466.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep467
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep467.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep467.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep468
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep468.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep468.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep469
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep469.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep469.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep470
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep470.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep470.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep471
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep471.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep471.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep472
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep472.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep472.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep473
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep473.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep473.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep474
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep474.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep474.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep475
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep475.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep475.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep476
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep476.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep476.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep477
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep477.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep477.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep478
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep478.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep478.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep479
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep479.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep479.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep480
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep480.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep480.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep481
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep481.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep481.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep482
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep482.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep482.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep483
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep483.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep483.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep484
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep484.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep484.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep485
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep485.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep485.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep486
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep486.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep486.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep487
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep487.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep487.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep488
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep488.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep488.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep489
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep489.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep489.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep490
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep490.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep490.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep491
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep491.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep491.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep492
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep492.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep492.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep493
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep493.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep493.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep494
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep494.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep494.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep495
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep495.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep495.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep496
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep496.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep496.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep497
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep497.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep497.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep498
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep498.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep498.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep499
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep499.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep499.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep500
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep500.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep500.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep501
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep501.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep501.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep502
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep502.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep502.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep503
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep503.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep503.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep504
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep504.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep504.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep505
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep505.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep505.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep506
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep506.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep506.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep507
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep507.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep507.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep508
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep508.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep508.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep509
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep509.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep509.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep510
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep510.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep510.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep511
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep511.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep511.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep512
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep512.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep512.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep513
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep513.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep513.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep514
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep514.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep514.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep515
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep515.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep515.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep516
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep516.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep516.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep517
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep517.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep517.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep518
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep518.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep518.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep519
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep519.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep519.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep520
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep520.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep520.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep521
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep521.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep521.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep522
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep522.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep522.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep523
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep523.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep523.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep524
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep524.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep524.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep525
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep525.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep525.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep526
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep526.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep526.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep527
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep527.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep527.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep528
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep528.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep528.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep529
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep529.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep529.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep530
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep530.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep530.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep531
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep531.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep531.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep532
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep532.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep532.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep533
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep533.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep533.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep534
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep534.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep534.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep535
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep535.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep535.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep536
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep536.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep536.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep537
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep537.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep537.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep538
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep538.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep538.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep539
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep539.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep539.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep540
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep540.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep540.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep541
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep541.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep541.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep542
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep542.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep542.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep543
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep543.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep543.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep544
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep544.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep544.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep545
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep545.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep545.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep546
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep546.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep546.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep547
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep547.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep547.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep548
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep548.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep548.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+creep549
+{
+ nopicmip
+ polygonOffset
+ {
+ map gfx/misc/creep/creep549.tga
+ blendfunc blend
+ rgbGen lightingDiffuse
+ alphaGen vertex
+ }
+ {
+ map gfx/misc/creep/creep549.tga
+ blendfunc blend
+ rgbGen identityLighting
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
diff --git a/assets/scripts/dcc.shader b/assets/scripts/dcc.shader
new file mode 100644
index 000000000..1ce58060e
--- /dev/null
+++ b/assets/scripts/dcc.shader
@@ -0,0 +1,123 @@
+models/buildables/dcc/comp_pipes
+{
+ {
+ map models/buildables/dcc/comp_pipes.tga
+ tcGen environment
+ rgbGen lightingDiffuse
+ }
+ {
+ map $whiteimage
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/dcc/comp_front
+{
+ {
+ map models/buildables/dcc/comp_front.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/dcc/comp_front.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/dcc/comp_key
+{
+ {
+ map models/buildables/dcc/comp_key.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/dcc/comp_key.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/dcc/comp_parts
+{
+ {
+ map models/buildables/dcc/comp_parts.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/dcc/comp_parts.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/dcc/comp_top
+{
+ {
+ map models/buildables/dcc/comp_top.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/dcc/comp_top.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/dcc/comp_display
+{
+ {
+ map models/buildables/dcc/comp_grad.tga
+ tcMod scroll 0 1
+ }
+ {
+ map models/buildables/dcc/comp_display.tga
+ blendfunc gl_one gl_src_alpha
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ }
+}
diff --git a/assets/scripts/eggpod.shader b/assets/scripts/eggpod.shader
new file mode 100644
index 000000000..9bd87828e
--- /dev/null
+++ b/assets/scripts/eggpod.shader
@@ -0,0 +1,88 @@
+models/buildables/eggpod/pod_body
+{
+ cull disable
+ {
+ map models/buildables/eggpod/pod_body.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/eggpod/pod_body.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/eggpod/pod_tip
+{
+ cull disable
+ {
+ map models/buildables/eggpod/pod_tip.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/eggpod/pod_tip.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/buildables/eggpod/pod_tendrils
+{
+ cull disable
+ {
+ map models/buildables/eggpod/pod_tendrils.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/eggpod/pod_tendrils.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/eggpod/pod_strands
+{
+ cull disable
+ {
+ map models/buildables/eggpod/pod_strands.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/eggpod/pod_strands.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
diff --git a/assets/scripts/flamer.shader b/assets/scripts/flamer.shader
new file mode 100644
index 000000000..aa186edf1
--- /dev/null
+++ b/assets/scripts/flamer.shader
@@ -0,0 +1,50 @@
+models/weapons/flamer/pilot
+{
+ sort additive
+ cull disable
+ {
+ map models/weapons/flamer/pilot.jpg
+ blendfunc GL_ONE GL_ONE
+ tcMod scroll 9.0 0
+ }
+}
+
+models/weapons/flamer/gas
+{
+ sort additive
+ cull disable
+ {
+ map models/weapons/flamer/gas.jpg
+ blendfunc GL_ONE GL_ONE
+ tcMod scroll 0.04 0.02
+ }
+}
+
+models/weapons/flamer/flamer
+{
+ sort additive
+// cull disable
+ surfaceparm trans
+ {
+ map models/weapons/flamer/flamer.tga
+ depthWrite
+ alphaFunc GE128
+ rgbGen lightingDiffuse
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ }
+ {
+ map models/weapons/flamer/flamer.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
diff --git a/assets/scripts/generic.shader b/assets/scripts/generic.shader
new file mode 100644
index 000000000..654987662
--- /dev/null
+++ b/assets/scripts/generic.shader
@@ -0,0 +1,44 @@
+models/generic/sphere
+{
+ cull disable
+ {
+ map $whiteimage
+ rgbGen const ( 0.5 0.5 0.5 )
+ alphaGen const 0.3
+ blendFunc blend
+ }
+}
+
+models/generic/sphericalCone64
+{
+ cull disable
+ {
+ map $whiteimage
+ rgbGen const ( 0.5 0.5 0.5 )
+ alphaGen const 0.3
+ blendFunc blend
+ }
+}
+
+models/generic/sphericalCone240
+{
+ cull disable
+ {
+ map $whiteimage
+ rgbGen const ( 0.5 0.5 0.5 )
+ alphaGen const 0.3
+ blendFunc blend
+ }
+}
+
+gfx/plainColor
+{
+ cull disable
+ {
+ map $whiteimage
+ rgbGen entity
+ alphaGen entity
+ blendFunc GL_SRC_ALPHA GL_ONE
+ }
+}
+
diff --git a/assets/scripts/grenade.shader b/assets/scripts/grenade.shader
new file mode 100644
index 000000000..39e50a41c
--- /dev/null
+++ b/assets/scripts/grenade.shader
@@ -0,0 +1,39 @@
+models/weapons/grenade/grenade
+{
+ cull disable
+ {
+ map models/weapons/grenade/grenade.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/grenade/grenade.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/weapons/grenade/grenade_s
+{
+ {
+ map models/weapons/grenade/energy.jpg
+ rgbGen wave sawtooth 0.3 1 0 0.5
+ tcMod scale 2 1
+ tcMod scroll 0 1
+ }
+}
+
+gfx/grenade/flare_01
+{
+ {
+ map gfx/grenade/flare_01.tga
+ blendfunc add
+ }
+}
diff --git a/assets/scripts/hive.shader b/assets/scripts/hive.shader
new file mode 100644
index 000000000..e6f95478a
--- /dev/null
+++ b/assets/scripts/hive.shader
@@ -0,0 +1,39 @@
+models/buildables/hive/hive
+{
+ {
+ map models/buildables/hive/hive.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/hive/hive.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/hive/hive_strands_s
+{
+ cull disable
+ {
+ map models/buildables/hive/hive_strands.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/hive/hive_strands.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
diff --git a/assets/scripts/hovel.shader b/assets/scripts/hovel.shader
new file mode 100644
index 000000000..53831473b
--- /dev/null
+++ b/assets/scripts/hovel.shader
@@ -0,0 +1,53 @@
+models/buildables/hovel/hovel
+{
+ {
+ map models/buildables/hovel/hovel.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/hovel/hovel.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/hovel/hovel_front
+{
+ {
+ map models/buildables/hovel/hovel_front.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/hovel/hovel_front.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/hovel/pod_strands
+{
+ cull disable
+ {
+ map models/buildables/barricade/pod_strands.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/barricade/pod_strands.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
diff --git a/assets/scripts/human.shader b/assets/scripts/human.shader
new file mode 100644
index 000000000..037fd1fb0
--- /dev/null
+++ b/assets/scripts/human.shader
@@ -0,0 +1,198 @@
+models/players/human_base/h_base
+{
+ cull disable
+ {
+ map models/players/human_base/h_base.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_base/h_base.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/players/human_base/h_helmet
+{
+ cull disable
+ {
+ map models/players/human_base/h_helmet.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_base/h_helmet.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ { // TODO: Should separate metalics parts
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+models/players/human_base/battpack
+{
+ cull disable
+ {
+ map models/players/human_base/battpack.jpg
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ models/players/human_base/battpack.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/players/human_base/base
+{
+ cull disable
+ {
+ map models/players/human_base/base.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_base/base.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ // { // TODO: Should separate metalics parts
+ // map models/buildables/mgturret/ref_map.jpg
+ // blendFunc GL_DST_COLOR GL_ONE
+ // detail
+ // tcGen environment
+ // alphaGen lightingSpecular
+ // depthFunc equal
+ // }
+}
+
+models/players/human_base/light
+{
+ cull disable
+ {
+ map models/players/human_base/light.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_base/light.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ // { // TODO: Should separate metalics parts
+ // map models/buildables/mgturret/ref_map.jpg
+ // blendFunc GL_DST_COLOR GL_ONE
+ // detail
+ // tcGen environment
+ // alphaGen lightingSpecular
+ // depthFunc equal
+ // }
+}
+
+models/players/human_base/armour
+{
+ cull disable
+ {
+ map models/players/human_base/armour.jpg
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_base/armour.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/players/human_base/shoulderpads
+{
+ cull disable
+ {
+ map models/players/human_base/shoulderpads.jpg
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_base/shoulderpads.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/players/human_bsuit/human_bsuit
+{
+ cull disable
+ {
+ map models/players/human_bsuit/human_bsuit.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_bsuit/human_bsuit.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
diff --git a/assets/scripts/jetpack.shader b/assets/scripts/jetpack.shader
new file mode 100644
index 000000000..cc9b8f271
--- /dev/null
+++ b/assets/scripts/jetpack.shader
@@ -0,0 +1,35 @@
+models/players/human_base/jetpack
+{
+ cull disable
+ {
+ map models/players/human_base/jetpack.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/players/human_base/jetpack.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/players/human_base/jetpack_flash
+{
+ sort additive
+ {
+ map models/players/human_base/jetpack_flash.jpg
+ blendfunc GL_ONE GL_ONE
+ tcMod scroll 10.0 0.0
+ }
+}
diff --git a/assets/scripts/lcannon.shader b/assets/scripts/lcannon.shader
new file mode 100644
index 000000000..b587ae15b
--- /dev/null
+++ b/assets/scripts/lcannon.shader
@@ -0,0 +1,21 @@
+models/weapons/lcannon/lcannon
+{
+ cull disable
+ {
+ map models/weapons/lcannon/lcannon.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/lcannon/lcannon.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/level0.shader b/assets/scripts/level0.shader
new file mode 100644
index 000000000..140e7d857
--- /dev/null
+++ b/assets/scripts/level0.shader
@@ -0,0 +1,13 @@
+models/players/level0/level0
+{
+ {
+ map models/players/level0/level0.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level0/level0.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/level1.shader b/assets/scripts/level1.shader
new file mode 100644
index 000000000..bb5375be0
--- /dev/null
+++ b/assets/scripts/level1.shader
@@ -0,0 +1,27 @@
+models/players/level1/level1
+{
+ {
+ map models/players/level1/level1.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level1/level1.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/players/level1/level1upg
+{
+ {
+ map models/players/level1/level1upg.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level1/level1upg.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/level2.shader b/assets/scripts/level2.shader
new file mode 100644
index 000000000..87ef8f94f
--- /dev/null
+++ b/assets/scripts/level2.shader
@@ -0,0 +1,46 @@
+models/players/level2/default
+{
+ {
+ map models/players/level2/default.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level2/default.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/players/level2/level2adv
+{
+ {
+ map models/players/level2/lvl2_fx.tga
+ blendFunc GL_ONE GL_ZERO
+ tcmod scale 7 7
+ tcMod scroll 5 -5
+ tcmod rotate 360
+ rgbGen identity
+ }
+
+ {
+ map models/players/level2/adv.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level2/adv.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/players/level2/electric_s
+{
+ {
+ map models/players/level2/electric.jpg
+ blendfunc add
+ tcMod scroll 10.0 0.5
+ }
+}
diff --git a/assets/scripts/level3.shader b/assets/scripts/level3.shader
new file mode 100644
index 000000000..65b09e9bc
--- /dev/null
+++ b/assets/scripts/level3.shader
@@ -0,0 +1,27 @@
+models/players/level3/level3
+{
+ {
+ map models/players/level3/level3.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level3/level3.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
+
+models/players/level3/level3adv
+{
+ {
+ map models/players/level3/level3adv.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level3/level3adv.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/level4.shader b/assets/scripts/level4.shader
new file mode 100644
index 000000000..d38789a49
--- /dev/null
+++ b/assets/scripts/level4.shader
@@ -0,0 +1,13 @@
+models/players/level4/level4
+{
+ {
+ map models/players/level4/level4.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/players/level4/level4.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/lgun.shader b/assets/scripts/lgun.shader
new file mode 100644
index 000000000..e113c47e2
--- /dev/null
+++ b/assets/scripts/lgun.shader
@@ -0,0 +1,21 @@
+models/weapons/lgun/lgun
+{
+ cull disable
+ {
+ map models/weapons/lgun/lgun.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/lgun/lgun.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/marks.shader b/assets/scripts/marks.shader
new file mode 100644
index 000000000..6db2f1b94
--- /dev/null
+++ b/assets/scripts/marks.shader
@@ -0,0 +1,75 @@
+// markShadow is the very cheap blurry blob underneath the player
+gfx/marks/shadow
+{
+ polygonOffset
+ {
+ map gfx/marks/shadow.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
+
+// wake is the mark on water surfaces for paddling players
+gfx/marks/wake
+{
+ polygonOffset
+ {
+ clampmap gfx/marks/splash.tga
+ blendFunc GL_ONE GL_ONE
+ rgbGen vertex
+ tcmod rotate 250
+ tcMod stretch sin .9 0.1 0 0.7
+ rgbGen wave sin .7 .3 .25 .5
+ }
+ {
+ clampmap gfx/marks/splash.tga
+ blendFunc GL_ONE GL_ONE
+ rgbGen vertex
+ tcmod rotate -230
+ tcMod stretch sin .9 0.05 0 0.9
+ rgbGen wave sin .7 .3 .25 .4
+ }
+}
+
+gfx/marks/bullet_mrk
+{
+ polygonOffset
+ {
+ map gfx/marks/bullet_mrk.tga
+ blendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
+ rgbGen exactVertex
+ }
+}
+
+gfx/marks/burn_mrk
+{
+ polygonOffset
+ {
+ map gfx/marks/burn_mrk.tga
+ blendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
+ rgbGen exactVertex
+ }
+}
+
+gfx/marks/plasma_mrk
+{
+ polygonOffset
+ {
+ map gfx/marks/plasma_mrk.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
+
+gfx/sprites/green_acid_mark
+{
+ polygonOffset
+ {
+ map gfx/sprites/green_acid
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
diff --git a/assets/scripts/mdriver.shader b/assets/scripts/mdriver.shader
new file mode 100644
index 000000000..bbd68edb6
--- /dev/null
+++ b/assets/scripts/mdriver.shader
@@ -0,0 +1,31 @@
+models/weapons/mdriver/mdriver
+{
+ cull disable
+ {
+ map models/weapons/mdriver/mdriver.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/mdriver/mdriver.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/weapons/mdriver/glow
+{
+ cull disable
+ {
+ map models/weapons/mdriver/glow.jpg
+ blendfunc GL_ONE GL_ONE
+ tcMod scroll -9.0 9.0
+ }
+}
diff --git a/assets/scripts/medistat.shader b/assets/scripts/medistat.shader
new file mode 100644
index 000000000..cd4822e9e
--- /dev/null
+++ b/assets/scripts/medistat.shader
@@ -0,0 +1,48 @@
+models/buildables/medistat/medi_base
+{
+ {
+ map models/buildables/medistat/medi_base.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/medistat/medi_base.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/medistat/red_cross
+{
+ {
+ map models/buildables/medistat/red_cross.tga
+ blendfunc gl_one_minus_dst_color gl_one
+ }
+}
+
+models/buildables/medistat/medi_cone
+{
+ cull none
+
+ {
+ clampMap models/buildables/medistat/medi_cone.jpg
+ blendfunc add
+ rgbGen lightingDiffuse
+ tcMod scroll 1 0
+ }
+ {
+ clampMap models/buildables/telenode/sparkles.tga
+ blendfunc add
+ rgbGen identity
+ rgbGen wave noise 0 1 35 1
+ tcMod scale 2 2
+ tcMod scroll 1 0.5
+ }
+}
diff --git a/assets/scripts/mgturret.shader b/assets/scripts/mgturret.shader
new file mode 100644
index 000000000..a4bf63125
--- /dev/null
+++ b/assets/scripts/mgturret.shader
@@ -0,0 +1,117 @@
+models/buildables/mgturret/t_flash
+{
+ cull disable
+ {
+ map models/buildables/mgturret/t_flash.tga
+ blendfunc add
+ rgbGen wave square 0 1 0 10
+ }
+}
+
+models/buildables/mgturret/turret_coil
+{
+ cull disable
+ {
+ map models/buildables/mgturret/turret_coil.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/mgturret/turret_coil.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/buildables/mgturret/turret_shiny
+{
+ {
+ map models/buildables/mgturret/turret_shiny.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/mgturret/turret_shiny.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ }
+}
+
models/buildables/mgturret/turret_barrel
+{
+ {
+ map models/buildables/mgturret/turret_barrel.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/mgturret/turret_barrel.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/mgturret/turret_base
+{
+ {
+ map models/buildables/mgturret/turret_base.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/mgturret/turret_base.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/mgturret/turret_top
+{
+ {
+ map models/buildables/mgturret/turret_top.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/mgturret/turret_top.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/misc.particle b/assets/scripts/misc.particle
index 40f3cc04d..364be66fa 100644
--- a/assets/scripts/misc.particle
+++ b/assets/scripts/misc.particle
@@ -86,6 +86,7 @@ alienEvolvePS
alpha 0 1.0 0.0
rotation 0 ~360 -
bounce 0.2
+ bounceMark 1 16 gfx/sprites/green_acid_mark
lifeTime 1000
}
@@ -94,6 +95,19 @@ alienEvolvePS
delay 0
period 5 - ~0%
}
+ ejector
+ {
+ particle
+ {
+ dynamicLight 0 300 0 { 0.16 0.32 0.05 }
+
+ lifeTime 1000~100
+ }
+
+ count 1
+ delay 0
+ period 0 - ~0%
+ }
}
alienBleedPS
diff --git a/assets/scripts/overmind.shader b/assets/scripts/overmind.shader
new file mode 100644
index 000000000..fcdd74fec
--- /dev/null
+++ b/assets/scripts/overmind.shader
@@ -0,0 +1,66 @@
+models/buildables/overmind/pod_strands
+{
+ cull disable
+ {
+ map models/buildables/eggpod/pod_strands.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ depthWrite
+ }
+ {
+ map models/buildables/eggpod/pod_strands.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ depthFunc equal
+ }
+}
+
+models/buildables/overmind/over_spike
+{
+ {
+ map models/buildables/overmind/over_spike.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/overmind/over_spike.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/overmind/ref2.tga
+ blendfunc filter
+ rgbGen identity
+ tcGen environment
+ }
+}
+
+models/buildables/overmind/over_body
+{
+ {
+ map models/buildables/overmind/over_body.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/overmind/over_body.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/prifle.shader b/assets/scripts/prifle.shader
new file mode 100644
index 000000000..0a926ef81
--- /dev/null
+++ b/assets/scripts/prifle.shader
@@ -0,0 +1,21 @@
+models/weapons/prifle/prifle
+{
+ cull disable
+ {
+ map models/weapons/prifle/prifle.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/prifle/prifle.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/psaw.shader b/assets/scripts/psaw.shader
new file mode 100644
index 000000000..24257066c
--- /dev/null
+++ b/assets/scripts/psaw.shader
@@ -0,0 +1,53 @@
+models/weapons/psaw/psaw
+{
+ cull disable
+ {
+ map models/weapons/psaw/psaw.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/psaw/psaw.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/weapons/psaw/chain
+{
+ sort additive
+ cull disable
+ {
+ map models/weapons/psaw/chain.jpg
+ blendfunc GL_ONE GL_ONE
+ tcMod scroll 1.0 -4.0
+ }
+}
+
+models/weapons/psaw/battery
+{
+ sort additive
+ cull disable
+ {
+ map models/weapons/psaw/chain.jpg
+ blendfunc GL_ONE GL_ONE
+ tcMod scroll 0.04 -0.02
+ }
+}
+
+models/weapons/psaw/glow
+{
+ cull disable
+ {
+ map models/weapons/psaw/glow.jpg
+ blendfunc GL_ONE GL_ONE
+ tcMod scroll -9.0 9.0
+ }
+}
diff --git a/assets/scripts/reactor.shader b/assets/scripts/reactor.shader
new file mode 100644
index 000000000..bf93aff18
--- /dev/null
+++ b/assets/scripts/reactor.shader
@@ -0,0 +1,150 @@
+models/buildables/reactor/reactor_main
+{
+ {
+ map models/buildables/reactor/reactor_main.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/reactor/reactor_glow.tga
+ blendfunc add
+ rgbGen wave sin 0 1 0 0.5
+ }
+ {
+ map models/buildables/reactor/reactor_main.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+models/buildables/reactor/reactor_body
+{
+ {
+ map models/buildables/reactor/reactor_body.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/reactor/reactor_body.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+models/buildables/reactor/reactor_parts
+{
+ {
+ map models/buildables/reactor/reactor_parts.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/reactor/reactor_parts.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+models/buildables/reactor/reactor_top
+{
+ {
+ map models/buildables/reactor/reactor_top.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/reactor/reactor_top.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+models/buildables/reactor/reactor_control
+{
+ {
+ map models/buildables/reactor/reactor_control.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/reactor/reactor_control.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/reactor/reactor_meter
+{
+ {
+ map models/buildables/reactor/reactor_meter.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/reactor/reactor_meter.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/reactor/reactor_display
+{
+ {
+ map models/buildables/reactor/reactor_display.tga
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ }
+}
+
+models/buildables/reactor/reactor_bolt
+{
+ cull disable
+ {
+ map models/buildables/reactor/reactor_bolt.tga
+ blendfunc add
+ rgbGen identity
+ tcMod scroll 2 0
+ }
+}
diff --git a/assets/scripts/repeater.shader b/assets/scripts/repeater.shader
new file mode 100644
index 000000000..108fb4f67
--- /dev/null
+++ b/assets/scripts/repeater.shader
@@ -0,0 +1,37 @@
+models/buildables/repeater/repeator_body
+{
+ {
+ map models/buildables/repeater/repeator_body.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/repeater/repeator_body.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+models/buildables/repeater/energy
+{
+ {
+ map models/buildables/repeater/energy.tga
+ rgbGen wave sawtooth 0.3 1 0 0.5
+ tcMod scale 2 1
+ tcMod scroll 0 1
+ }
+}
+
+models/buildables/repeater/repeator_panel
+{
+ {
+ map models/buildables/repeater/repeator_panel.tga
+ rgbGen identity
+ }
+}
diff --git a/assets/scripts/rifle.shader b/assets/scripts/rifle.shader
new file mode 100644
index 000000000..6d8d59533
--- /dev/null
+++ b/assets/scripts/rifle.shader
@@ -0,0 +1,21 @@
+models/weapons/rifle/rifle
+{
+ cull disable
+ {
+ map models/weapons/rifle/rifle.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/rifle/rifle.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/shells.shader b/assets/scripts/shells.shader
new file mode 100644
index 000000000..14e351449
--- /dev/null
+++ b/assets/scripts/shells.shader
@@ -0,0 +1,21 @@
+models/weapons/shells/rifle-shell
+{
+ cull disable
+ {
+ map models/weapons/shells/rifle-shell.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/shells/rifle-shell.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/shotgun.shader b/assets/scripts/shotgun.shader
new file mode 100644
index 000000000..ef19f6c0b
--- /dev/null
+++ b/assets/scripts/shotgun.shader
@@ -0,0 +1,21 @@
+models/weapons/shotgun/shotgun
+{
+ cull disable
+ {
+ map models/weapons/shotgun/shotgun.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/weapons/shotgun/shotgun.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/splash.shader b/assets/scripts/splash.shader
new file mode 100644
index 000000000..6e7616d3a
--- /dev/null
+++ b/assets/scripts/splash.shader
@@ -0,0 +1,58 @@
+models/splash/bright_star
+{
+ nopicmip
+ {
+ map models/splash/bright_star.tga
+ blendfunc add
+ rgbGen identity
+ }
+ {
+ map models/splash/bright_star_2.tga
+ blendfunc add
+ rgbGen wave sin 0 0.5 0 0.09
+ }
+}
+
+models/splash/nebula
+{
+ nopicmip
+ {
+ map models/splash/nebula.tga
+ blendfunc add
+ rgbGen wave sin 0.5 1 5 0.05
+ tcMod scale -1 1
+ }
+ {
+ map models/splash/nebula_2.tga
+ blendfunc add
+ rgbGen wave sin 0.3 1 2.5 0.05
+ tcMod scale -1 1
+ }
+}
+
+models/splash/circles
+{
+ nopicmip
+ {
+ map models/splash/circles.png
+ blendfunc blend
+ }
+}
+
+models/splash/trem_black
+{
+ nopicmip
+// {
+// map models/splash/highlights.tga
+// blendfunc add
+// rgbGen wave sin 0 0.2 0 0.2
+// tcMod scroll -0.2 0
+// }
+
+ {
+ map ui/assets/title.tga
+ blendfunc blend
+ //alphaFunc GE128
+ rgbGen identity
+ }
+}
diff --git a/assets/scripts/sprites.shader b/assets/scripts/sprites.shader
new file mode 100644
index 000000000..dd66f1123
--- /dev/null
+++ b/assets/scripts/sprites.shader
@@ -0,0 +1,82 @@
+gfx/sprites/smoke
+{
+ cull none
+ entityMergable
+ {
+ map gfx/sprites/smoke.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
+
+gfx/sprites/green_acid
+{
+ nopicmip
+ {
+ clampmap gfx/sprites/green_acid.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
+
+gfx/sprites/spark
+{
+ cull none
+ {
+ map gfx/sprites/spark.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
+
+gfx/sprites/bubble
+{
+ sort underwater
+ cull none
+ entityMergable
+ {
+ map gfx/sprites/bubble.jpg
+ blendFunc GL_ONE GL_ONE
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
+
+gfx/sprites/poisoncloud
+{
+ cull none
+ entityMergable
+ {
+ map gfx/sprites/poisoncloud.tga
+ blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ rgbGen vertex
+ alphaGen vertex
+ }
+}
+
+gfx/sprites/chatballoon
+{
+ {
+ map gfx/sprites/chatballoon.tga
+ blendfunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ }
+}
+
+gfx/sprites/aliens_chatballoon
+{
+ {
+ map gfx/sprites/aliens_chatballoon.png
+ blendfunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ }
+}
+
+gfx/sprites/humans_chatballoon
+{
+ {
+ map gfx/sprites/humans_chatballoon.png
+ blendfunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+ }
+}
diff --git a/assets/scripts/telenode.shader b/assets/scripts/telenode.shader
new file mode 100644
index 000000000..aa9642698
--- /dev/null
+++ b/assets/scripts/telenode.shader
@@ -0,0 +1,67 @@
+models/buildables/telenode/telenode_top
+{
+ {
+ map models/buildables/telenode/telenode_top.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/telenode/telenode_top.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/telenode/energy
+{
+ {
+ map models/buildables/telenode/energy.tga
+ rgbGen wave inversesawtooth 0.2 0.4 0 1
+ tcMod rotate 10
+ }
+}
+
+models/buildables/telenode/rep_cyl
+{
+ cull disable
+ {
+ map models/buildables/telenode/rep_cyl.jpg
+ blendfunc add
+ rgbGen lightingDiffuse
+ tcMod scroll 0.2 0
+ }
+ {
+ map models/buildables/telenode/lines2.tga
+ blendfunc add
+ rgbGen identity
+ tcMod scroll 0 0.2
+ }
+}
+
+models/buildables/telenode/telenode_parts
+{
+ {
+ map models/buildables/telenode/telenode_parts.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/telenode/telenode_parts.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/tesla.shader b/assets/scripts/tesla.shader
new file mode 100644
index 000000000..57bdfdb70
--- /dev/null
+++ b/assets/scripts/tesla.shader
@@ -0,0 +1,80 @@
+models/buildables/tesla/tesla_main
+{
+ {
+ map models/buildables/tesla/tesla_main.tga
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/tesla/tesla_main.tga
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/tesla/tesla_ball
+{
+ {
+ map models/buildables/tesla/tesla_ball.tga
+ rgbGen lightingDiffuse
+ tcMod scroll -0.2 0.2
+ }
+ {
+ map models/buildables/tesla/tesla_ball.tga
+ rgbGen lightingDiffuse
+ blendfunc add
+ detail
+ tcMod scroll 0.35 -0.45
+ tcMod scale -1 1
+ }
+ {
+ map models/buildables/tesla/tesla_ball.tga
+ tcGen environment
+ blendFunc GL_SRC_ALPHA GL_ONE
+ alphaGen lightingSpecular
+ }
+}
+
+models/buildables/tesla/tesla_grill
+{
+ {
+ map models/buildables/tesla/tesla_grill.tga
+ rgbGen wave sin 0 1 0 0.4
+ }
+}
+
+models/buildables/tesla/tesla_spark
+{
+ cull disable
+ {
+ map models/buildables/tesla/tesla_spark.tga
+ blendfunc add
+ rgbGen identity
+ }
+}
+
+
+models/ammo/tesla/tesla_bolt
+{
+ cull disable
+ {
+ map models/ammo/tesla/tesla_bolt.tga
+ blendfunc add
+ rgbGen vertex
+ tcMod scroll 0.2 0
+ }
+ {
+ map models/ammo/tesla/tesla_bolt.tga
+ blendfunc add
+ rgbGen wave sin 0 1 0 5
+ tcMod scroll 0.5 0
+ tcMod scale -1 1
+ }
+}
diff --git a/assets/scripts/trapper.shader b/assets/scripts/trapper.shader
new file mode 100644
index 000000000..f1f228e53
--- /dev/null
+++ b/assets/scripts/trapper.shader
@@ -0,0 +1,59 @@
+models/buildables/trapper/trapper_gills
+{
+cull disable
+ {
+ map models/buildables/trapper/trapper_gills.tga
+ rgbGen lightingDiffuse
+ alphaFunc GE128
+ }
+ {
+ map models/buildables/trapper/trapper_gills.tga
+ rgbGen lightingDiffuse
+ tcMod scroll -0.01 0
+ tcMod scale -1 1
+ alphaFunc GE128
+ }
+}
+
+models/buildables/trapper/trapper_body
+{
+ {
+ map models/buildables/trapper/trapper_body.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/trapper/trapper_body.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
+
+
+models/buildables/trapper/trapper_tent
+{
+ {
+ map models/buildables/trapper/trapper_tent.jpg
+ rgbGen lightingDiffuse
+ }
+ {
+ map models/buildables/trapper/trapper_tent.jpg
+ blendFunc GL_SRC_ALPHA GL_ONE
+ detail
+ alphaGen lightingSpecular
+ }
+ {
+ map models/buildables/mgturret/ref_map.jpg
+ blendFunc GL_DST_COLOR GL_ONE
+ detail
+ tcGen environment
+ alphaGen lightingSpecular
+ }
+}
diff --git a/assets/scripts/ui.shader b/assets/scripts/ui.shader
index a99d4f72d..d9a2cfa10 100644
--- a/assets/scripts/ui.shader
+++ b/assets/scripts/ui.shader
@@ -17,3 +17,63 @@ ui/assets/neutral/squad_v
rgbgen vertex
}
}
+
+ui/assets/cornerOut_square
+{
+ nomipmaps
+ {
+ map ui/assets/corner_square.tga
+ blendfunc blend
+ rgbgen vertex
+ }
+}
+
+ui/assets/cornerIn_square
+{
+ nomipmaps
+ {
+ map ui/assets/cornerinv_square.tga
+ blendfunc blend
+ rgbgen vertex
+ }
+}
+
+ui/assets/cornerOut_rounded
+{
+ nopicmip
+ {
+ map ui/assets/corner_rounded.tga
+ blendfunc blend
+ rgbgen vertex
+ }
+}
+
+ui/assets/cornerIn_rounded
+{
+ nopicmip
+ {
+ map ui/assets/cornerinv_rounded.tga
+ blendfunc blend
+ rgbgen vertex
+ }
+}
+
+ui/assets/cornerOut_fold
+{
+ nopicmip
+ {
+ map ui/assets/corner_fold.tga
+ blendfunc blend
+ rgbgen vertex
+ }
+}
+
+ui/assets/cornerIn_fold
+{
+ nopicmip
+ {
+ map ui/assets/cornerinv_fold.tga
+ blendfunc blend
+ rgbgen vertex
+ }
+}
diff --git a/assets/scripts/weapons.particle b/assets/scripts/weapons.particle
index 5851fc656..8f3b86980 100644
--- a/assets/scripts/weapons.particle
+++ b/assets/scripts/weapons.particle
@@ -392,7 +392,7 @@ models/weapons/prifle/impactPS
particle
{
shader sync gfx/prifle/red_blob
-
+
radius 0 3.0 6.0
alpha 70 1.0 0.0
rotation 0 ~360 -
@@ -526,11 +526,11 @@ models/weapons/lcannon/impactPS
particle
{
shader sync gfx/blaster/orange_particle
-
+
radius 0 8.0 16.0
alpha 0 1.0 0.0
rotation 0 ~360 -
-
+
scaleWithCharge 0.10
lifeTime 250
@@ -598,7 +598,7 @@ models/weapons/lcannon/impactPS
alpha 0 1.0 0.0
rotation 0 ~360 -
bounce 1.0
-
+
scaleWithCharge 0.10
lifeTime 1000~1000
@@ -617,7 +617,7 @@ models/weapons/lcannon/secondaryImpactPS
particle
{
shader sync gfx/blaster/orange_particle
-
+
radius 0 8.0 16.0
alpha 0 1.0 0.0
rotation 0 ~360 -
@@ -855,6 +855,40 @@ models/weapons/grenade/impactPS
}
}
+models/weapons/builderupg/impactPS
+{
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/green_acid
+
+ displacement 0 0 0 ~6
+
+ velocityType normal
+ velocityDir linear
+ velocityMagnitude 300
+ velocity 0 0 1 ~80
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 5.0~2.0 0.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.4~100%
+
+ lifeTime 275
+ }
+
+ count 4
+ delay 0
+ period 0 - ~0%
+ }
+}
+
models/weapons/level3upg/impactPS
{
ejector
@@ -887,4 +921,35 @@ models/weapons/level3upg/impactPS
delay 0
period 0 - ~0%
}
+
+ ejector
+ {
+ particle
+ {
+ shader sync gfx/sprites/green_acid
+
+ displacement 0 0 0 ~6
+
+ velocityType normal
+ velocityDir linear
+ velocityMagnitude 300
+ velocity 0 0 1 ~80
+
+ accelerationType static
+ accelerationDir linear
+ accelerationMagnitude 800
+ acceleration 0 0 -1 0
+
+ radius 0 5.0~2.0 0.0
+ alpha 0 1.0 0.0
+ rotation 0 ~360 -
+ bounce 0.4~100%
+
+ lifeTime 275
+ }
+
+ count 8
+ delay 0
+ period 0 - ~0%
+ }
}
diff --git a/assets/ui/assets/alien/buildstat.cfg b/assets/ui/assets/alien/buildstat.cfg
index 318d401d6..97642059e 100644
--- a/assets/ui/assets/alien/buildstat.cfg
+++ b/assets/ui/assets/alien/buildstat.cfg
@@ -9,6 +9,8 @@ frameWidth 150
frameHeight 30
healthPadding 2
+
+// Homeworld Security Advisory System
healthSevereColor 0.24 0.02 0.02 1
healthHighColor 0.32 0.04 0.04 1
healthElevatedColor 0.40 0.06 0.06 1
@@ -17,8 +19,8 @@ healthLowColor 0.56 0.10 0.10 1
// this gets drawn over frame and health, but numbers and icons go on top of it
overlayShader "ui/assets/alien/buildstat/overlay"
-overlayWidth 156
-overlayHeight 36
+overlayWidth 164
+overlayHeight 40
// PERCENT of frameHeight to use for top/bottom margin of icons/text
// value is for total of top and bottom margins
diff --git a/assets/ui/assets/alien/buildstat/overlay.tga b/assets/ui/assets/alien/buildstat/overlay.tga
new file mode 100644
index 000000000..90f27e0aa
Binary files /dev/null and b/assets/ui/assets/alien/buildstat/overlay.tga differ
diff --git a/assets/ui/assets/backarrow.png b/assets/ui/assets/backarrow.png
new file mode 100644
index 000000000..13fdb5b76
Binary files /dev/null and b/assets/ui/assets/backarrow.png differ
diff --git a/assets/ui/assets/backarrow_alt.png b/assets/ui/assets/backarrow_alt.png
new file mode 100644
index 000000000..de0b8e82a
Binary files /dev/null and b/assets/ui/assets/backarrow_alt.png differ
diff --git a/assets/ui/assets/corner_fold.tga b/assets/ui/assets/corner_fold.tga
new file mode 100644
index 000000000..f8175549e
Binary files /dev/null and b/assets/ui/assets/corner_fold.tga differ
diff --git a/assets/ui/assets/corner_rounded.tga b/assets/ui/assets/corner_rounded.tga
new file mode 100644
index 000000000..00b5cf516
Binary files /dev/null and b/assets/ui/assets/corner_rounded.tga differ
diff --git a/assets/ui/assets/corner_square.tga b/assets/ui/assets/corner_square.tga
new file mode 100644
index 000000000..e1c384200
Binary files /dev/null and b/assets/ui/assets/corner_square.tga differ
diff --git a/assets/ui/assets/cornerinv_fold.tga b/assets/ui/assets/cornerinv_fold.tga
new file mode 100644
index 000000000..d01131859
Binary files /dev/null and b/assets/ui/assets/cornerinv_fold.tga differ
diff --git a/assets/ui/assets/cornerinv_rounded.tga b/assets/ui/assets/cornerinv_rounded.tga
new file mode 100644
index 000000000..4e12b208c
Binary files /dev/null and b/assets/ui/assets/cornerinv_rounded.tga differ
diff --git a/assets/ui/assets/cornerinv_square.tga b/assets/ui/assets/cornerinv_square.tga
new file mode 100644
index 000000000..4a7330c6b
Binary files /dev/null and b/assets/ui/assets/cornerinv_square.tga differ
diff --git a/assets/ui/assets/credits_splash.jpg b/assets/ui/assets/credits_splash.jpg
new file mode 100644
index 000000000..6f28391ab
Binary files /dev/null and b/assets/ui/assets/credits_splash.jpg differ
diff --git a/assets/ui/assets/cursor.png b/assets/ui/assets/cursor.png
new file mode 100644
index 000000000..809b5a1f2
Binary files /dev/null and b/assets/ui/assets/cursor.png differ
diff --git a/assets/ui/assets/forwardarrow.png b/assets/ui/assets/forwardarrow.png
new file mode 100644
index 000000000..e9074cc88
Binary files /dev/null and b/assets/ui/assets/forwardarrow.png differ
diff --git a/assets/ui/assets/forwardarrow_alt.png b/assets/ui/assets/forwardarrow_alt.png
new file mode 100644
index 000000000..58ab157b5
Binary files /dev/null and b/assets/ui/assets/forwardarrow_alt.png differ
diff --git a/assets/ui/assets/human/buildstat.cfg b/assets/ui/assets/human/buildstat.cfg
index c66b618d2..c001a3ebf 100644
--- a/assets/ui/assets/human/buildstat.cfg
+++ b/assets/ui/assets/human/buildstat.cfg
@@ -18,8 +18,8 @@ healthGuardedColor 0.19 0.65 0.00 1
healthLowColor 0.27 0.49 0.55 1
// this gets drawn over frame and health, but numbers and icons go on top of it
-overlayShader ""
-overlayWidth 160
+overlayShader "ui/assets/human/buildstat/overlay"
+overlayWidth 164
overlayHeight 40
// PERCENT of frameHeight to use for top/bottom margin of icons/text
diff --git a/assets/ui/assets/human/buildstat/frame.tga b/assets/ui/assets/human/buildstat/frame.tga
new file mode 100644
index 000000000..88d1e2d98
Binary files /dev/null and b/assets/ui/assets/human/buildstat/frame.tga differ
diff --git a/assets/ui/assets/human/buildstat/overlay.tga b/assets/ui/assets/human/buildstat/overlay.tga
new file mode 100644
index 000000000..c478be112
Binary files /dev/null and b/assets/ui/assets/human/buildstat/overlay.tga differ
diff --git a/assets/ui/assets/mainmenu.jpg b/assets/ui/assets/mainmenu.jpg
new file mode 100644
index 000000000..17f779f23
Binary files /dev/null and b/assets/ui/assets/mainmenu.jpg differ
diff --git a/assets/ui/assets/scrollbar.tga b/assets/ui/assets/scrollbar.tga
new file mode 100644
index 000000000..a3fbfd7e4
Binary files /dev/null and b/assets/ui/assets/scrollbar.tga differ
diff --git a/assets/ui/assets/scrollbar_arrow_dwn_a.tga b/assets/ui/assets/scrollbar_arrow_dwn_a.tga
new file mode 100644
index 000000000..7b94c6fef
Binary files /dev/null and b/assets/ui/assets/scrollbar_arrow_dwn_a.tga differ
diff --git a/assets/ui/assets/scrollbar_arrow_left.tga b/assets/ui/assets/scrollbar_arrow_left.tga
new file mode 100644
index 000000000..303cefb7f
Binary files /dev/null and b/assets/ui/assets/scrollbar_arrow_left.tga differ
diff --git a/assets/ui/assets/scrollbar_arrow_right.tga b/assets/ui/assets/scrollbar_arrow_right.tga
new file mode 100644
index 000000000..6a7d2094c
Binary files /dev/null and b/assets/ui/assets/scrollbar_arrow_right.tga differ
diff --git a/assets/ui/assets/scrollbar_arrow_up_a.tga b/assets/ui/assets/scrollbar_arrow_up_a.tga
new file mode 100644
index 000000000..c9c30fc2b
Binary files /dev/null and b/assets/ui/assets/scrollbar_arrow_up_a.tga differ
diff --git a/assets/ui/assets/scrollbar_thumb.tga b/assets/ui/assets/scrollbar_thumb.tga
new file mode 100644
index 000000000..2a05c6426
Binary files /dev/null and b/assets/ui/assets/scrollbar_thumb.tga differ
diff --git a/assets/ui/assets/showmore_arrow.tga b/assets/ui/assets/showmore_arrow.tga
new file mode 100644
index 000000000..532831635
Binary files /dev/null and b/assets/ui/assets/showmore_arrow.tga differ
diff --git a/assets/ui/assets/slider.png b/assets/ui/assets/slider.png
new file mode 100644
index 000000000..986c678ae
Binary files /dev/null and b/assets/ui/assets/slider.png differ
diff --git a/assets/ui/assets/sliderbutt.png b/assets/ui/assets/sliderbutt.png
new file mode 100644
index 000000000..2438453d1
Binary files /dev/null and b/assets/ui/assets/sliderbutt.png differ
diff --git a/assets/ui/connect.menu b/assets/ui/connect.menu
index 108e33c84..e6032f217 100644
--- a/assets/ui/connect.menu
+++ b/assets/ui/connect.menu
@@ -1,14 +1,54 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
+
+#define W 640
+#define H 480
+#define BORDER 10
+
+#define BAR_H ((H-((6*BORDER)+(H/2)))/4)
+#define BAR_W (W-(2*BORDER))
+#define BAR_X BORDER
+#define OVER_Y (H-(BORDER+BAR_H))
{
menuDef
{
name "Connect"
- background "gfx/2d/load_screen"
rect 0 0 640 480
fullScreen MENU_FALSE
visible MENU_FALSE
style WINDOW_STYLE_SHADER
- aspectBias ASPECT_NONE
+ background "ui/assets/mainmenu.jpg"
+ aspectbias ASPECT_NONE
+
+ itemDef
+ {
+ name splashmodel
+ rect -320 0 1280 480
+ type ITEM_TYPE_MODEL
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER // Allow our HD model to be "responsive"
+ asset_model "models/splash/loading_screen.md3"
+ model_fovx 60.0
+ model_fovy 24.0
+ model_angle 180
+ visible MENU_TRUE
+ decoration
+ }
+
+ itemDef
+ {
+ name "overall"
+ rect BAR_X OVER_Y BAR_W BAR_H
+ visible MENU_TRUE
+ decoration
+ forecolor 0.0 0.8 1 1
+ backcolor 0.0 0.8 1 0.5
+ ownerdraw UI_DOWNLOAD_OVERALL
+ textalign ALIGN_CENTER
+ textstyle ITEM_TEXTSTYLE_NEON
+ textscale 0.5
+ borderSize 1.0
+ }
}
}
diff --git a/assets/ui/createfavorite.menu b/assets/ui/createfavorite.menu
index c66ecff46..d1d30a950 100644
--- a/assets/ui/createfavorite.menu
+++ b/assets/ui/createfavorite.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ CREATE FAVORITE POPUP MENU \\
@@ -16,7 +17,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -30,13 +31,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
// ENTER NAME AND ADDRESS //
diff --git a/assets/ui/createserver.menu b/assets/ui/createserver.menu
index f64ba1d5b..82d9f2b4d 100644
--- a/assets/ui/createserver.menu
+++ b/assets/ui/createserver.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ Server Creation \\
@@ -38,9 +39,10 @@
visible MENU_FALSE
fullscreen MENU_TRUE
rect 0 0 W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
outOfBoundsClick
- style WINDOW_STYLE_EMPTY
+ style WINDOW_STYLE_SHADER
+ background "ui/assets/mainmenu.jpg"
aspectBias ASPECT_NONE
onOpen
@@ -57,15 +59,6 @@
close createserver
}
- itemDef
- {
- name background
- rect 0 0 W H
- style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
- visible MENU_TRUE
- decoration
- }
// map selection
@@ -85,16 +78,17 @@
name maplist
rect MAPS_X MAPS_Y MAPS_W MAPS_H
type ITEM_TYPE_LISTBOX
- style WINDOW_STYLE_EMPTY
+ style WINDOW_STYLE_FILLED
elementwidth 120
elementheight 20
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_MAPS
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 1
+ borderStyle BORDER_SQUARE BORDER_SQUARE BORDER_SQUARE BORDER_STYLE
forecolor 1 1 1 1
- backcolor 0.2 0.2 0.2 1
+ backcolor 0 0 0 0.5
outlinecolor 0.1 0.1 0.1 0.5
visible MENU_TRUE
columns 1
@@ -109,13 +103,14 @@
name window
rect OPTIONS_X OPTIONS_Y OPTIONS_W OPTIONS_H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor 0 0 0 0.5
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
borderColor 0.5 0.5 0.5 1
+ borderStyle BORDER_SQUARE BORDER_STYLE BORDER_STYLE BORDER_SQUARE
}
itemDef
@@ -391,7 +386,7 @@
{
name back
style WINDOW_STYLE_SHADER
- background "ui/assets/backarrow.tga"
+ background "ui/assets/backarrow.png"
rect BC_X BC_Y ARROW_H ARROW_W
aspectBias ALIGN_LEFT
visible MENU_TRUE
@@ -412,7 +407,7 @@
{
name back_alt
style WINDOW_STYLE_SHADER
- background "ui/assets/backarrow_alt.tga"
+ background "ui/assets/backarrow_alt.png"
rect BC_X BC_Y ARROW_H ARROW_W
aspectBias ALIGN_LEFT
backcolor 0 0 0 0
@@ -448,7 +443,7 @@
style WINDOW_STYLE_SHADER
rect ((BC_X+BC_W)-ARROW_W) BC_Y ARROW_H ARROW_W
aspectBias ALIGN_RIGHT
- background "ui/assets/forwardarrow.tga"
+ background "ui/assets/forwardarrow.png"
backcolor 0 0 0 0
forecolor 1 1 1 1
visible MENU_TRUE
@@ -471,7 +466,7 @@
style WINDOW_STYLE_SHADER
rect ((BC_X+BC_W)-ARROW_W) BC_Y ARROW_H ARROW_W
aspectBias ALIGN_RIGHT
- background "ui/assets/forwardarrow_alt.tga"
+ background "ui/assets/forwardarrow_alt.png"
backcolor 0 0 0 0
type ITEM_TYPE_BUTTON
forecolor 1 1 1 1
diff --git a/assets/ui/demo.menu b/assets/ui/demo.menu
index bec3a057f..428dded17 100644
--- a/assets/ui/demo.menu
+++ b/assets/ui/demo.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ DEMO \\
@@ -15,7 +16,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -33,13 +34,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
@@ -55,8 +57,9 @@
feeder FEEDER_DEMOS
textalign 3
textaligny 14
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_STYLE BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
diff --git a/assets/ui/demo_error.menu b/assets/ui/demo_error.menu
index 1427a280f..4744baee0 100644
--- a/assets/ui/demo_error.menu
+++ b/assets/ui/demo_error.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,7 +21,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -42,9 +43,10 @@
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
borderColor 0.5 0.5 0.5 1
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
diff --git a/assets/ui/download.menu b/assets/ui/download.menu
index dc8247f47..d094360f1 100644
--- a/assets/ui/download.menu
+++ b/assets/ui/download.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ DOWNLOAD \\
@@ -9,7 +10,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect 158 80 320 320
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -30,13 +31,14 @@
name window
rect 10 15 300 320
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
diff --git a/assets/ui/drop.menu b/assets/ui/drop.menu
index 162a01923..3e47313f2 100644
--- a/assets/ui/drop.menu
+++ b/assets/ui/drop.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,7 +21,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -38,13 +39,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
@@ -118,5 +120,3 @@
}
}
}
-
-
diff --git a/assets/ui/error.menu b/assets/ui/error.menu
index 2c54d2da3..68c579c0b 100644
--- a/assets/ui/error.menu
+++ b/assets/ui/error.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,7 +21,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -38,13 +39,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
@@ -98,5 +100,3 @@
}
}
}
-
-
diff --git a/assets/ui/findplayer.menu b/assets/ui/findplayer.menu
index 09d715a49..ecb76b1a6 100644
--- a/assets/ui/findplayer.menu
+++ b/assets/ui/findplayer.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ FIND PLAYER POPUP MENU \\
@@ -21,7 +22,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -41,13 +42,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
@@ -169,5 +171,3 @@
}
}
}
-
-
diff --git a/assets/ui/folders.menu b/assets/ui/folders.menu
index 176f3d6de..bda693618 100644
--- a/assets/ui/folders.menu
+++ b/assets/ui/folders.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ FOR OPENING FOLDERS IN A DEFAULT FILE MANAGER \\
@@ -21,7 +22,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -36,13 +37,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
diff --git a/assets/ui/ingame.menu b/assets/ui/ingame.menu
index 808287ea0..722d5b7f2 100644
--- a/assets/ui/ingame.menu
+++ b/assets/ui/ingame.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
#define BUTT_BAR_X 25
@@ -14,7 +15,7 @@
font "fonts/font" 26 // font
smallFont "fonts/smallfont" 20 // font
bigFont "fonts/bigfont" 34 // font
- cursor "ui/assets/3_cursor3" // cursor
+ cursor "ui/assets/cursor" // cursor
gradientBar "ui/assets/gradientbar2.tga" // gradient bar
itemFocusSound "sound/misc/menu2.wav" // sound for item getting focus (via keyboard or mouse )
@@ -36,7 +37,7 @@
fullScreen 0
outOfBoundsClick // this closes the window if it gets a click out of the rectangle
rect 0 0 1280 56
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
disableColor .5 .5 .5 1
backColor 0 0 0 1
aspectBias ALIGN_LEFT
@@ -49,11 +50,11 @@
itemDef
{
name splashmodel
- rect 0 -10 640 66
+ rect -340 -10 1280 66 // Readjust model pos
type ITEM_TYPE_MODEL
style WINDOW_STYLE_FILLED
asset_model "models/splash/splash_screen.md3"
- model_fovx 32.0
+ model_fovx 64.0 // Enlarge view
model_fovy 3.8
model_angle 180
visible MENU_TRUE
diff --git a/assets/ui/ingame_game.menu b/assets/ui/ingame_game.menu
index d7d7dd6a9..e08189276 100644
--- a/assets/ui/ingame_game.menu
+++ b/assets/ui/ingame_game.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ INGAME GAME BOX \\
@@ -64,7 +65,7 @@
fullscreen MENU_FALSE
outOfBoundsClick // this closes the window if it gets a click out of the rectangle
rect X Y W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
aspectBias ALIGN_LEFT
onopen
{
@@ -85,13 +86,13 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor 0 0 0 .925
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_KCGRADIENT
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
}
//Section menus
diff --git a/assets/ui/ingame_help.menu b/assets/ui/ingame_help.menu
index 4c8065bd0..8e957f69d 100644
--- a/assets/ui/ingame_help.menu
+++ b/assets/ui/ingame_help.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -26,7 +27,7 @@
fullscreen MENU_FALSE
outOfBoundsClick // this closes the window if it gets a click out of the rectangle
rect X Y W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
aspectBias ALIGN_LEFT
onOpen {
setFocus list;
@@ -37,13 +38,13 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor 0 0 0 .925
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_KCGRADIENT
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
}
itemDef
diff --git a/assets/ui/ingame_leave.menu b/assets/ui/ingame_leave.menu
index d07e3ce42..765b956b1 100644
--- a/assets/ui/ingame_leave.menu
+++ b/assets/ui/ingame_leave.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ INGAME_LEAVE MENU \\
@@ -24,7 +25,7 @@
fullScreen 0
outOfBoundsClick // this closes the window if it gets a click out of the rectangle
rect X Y W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
aspectBias ALIGN_LEFT
onOpen
{
@@ -37,13 +38,13 @@
name leave
style WINDOW_STYLE_FILLED
rect 0 0 W H
- backcolor 0 0 0 1
+ backcolor 0 0 0 .925
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_KCGRADIENT
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
}
itemDef
diff --git a/assets/ui/ingame_options.menu b/assets/ui/ingame_options.menu
index d3e788044..2b4a2e2e2 100644
--- a/assets/ui/ingame_options.menu
+++ b/assets/ui/ingame_options.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ INGAME OPTIONS BOX \\
@@ -35,7 +36,7 @@
fullscreen MENU_FALSE
outOfBoundsClick // this closes the window if it gets a click out of the rectangle
rect X Y W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
aspectBias ALIGN_LEFT
onopen
{
@@ -53,13 +54,13 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor 0 0 0 .925
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_KCGRADIENT
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
}
//Section menus
@@ -832,7 +833,7 @@
type ITEM_TYPE_MULTI
text "Wallwalking Speed:"
cvar "cg_wwSmoothTime"
- cvarFloatList { "Medium" 300 "Fast" 150 "Instant" 0 "Slow" 600 }
+ cvarFloatList { "Slower" 450 "Slow" 300 "Medium" 225 "Fast" 150 "Faster" 75 "Instant" 0}
rect SCONTENT_X (SCONTENT_Y+(2*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
@@ -1272,6 +1273,66 @@
}
}
+ itemDef
+ {
+ name upgrades
+ group optionsGrp
+ type ITEM_TYPE_BIND
+ text "Rotate build left:"
+ cvar "rotatebuildleft"
+ rect SCONTENT_X (SCONTENT_Y+(8*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name upgrades
+ group optionsGrp
+ type ITEM_TYPE_BIND
+ text "Rotate build right:"
+ cvar "rotatebuildright"
+ rect SCONTENT_X (SCONTENT_Y+(9*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name upgrades
+ group optionsGrp
+ type ITEM_TYPE_BIND
+ text "Reset build rotation:"
+ cvar "rotatebuild"
+ rect SCONTENT_X (SCONTENT_Y+(10*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
//////// MISC
itemDef
@@ -1641,7 +1702,7 @@
action
{
play "sound/misc/menu1.wav";
- uiScript glCuston
+ uiScript glCustom
}
}
@@ -1900,6 +1961,386 @@
}
}
+ //////// OpenGL2 Options
+
+ itemDef
+ {
+ name system
+ text "OpenGL2"
+ group optionsGrp
+ style WINDOW_STYLE_EMPTY
+ rect 0 ((2*BORDER)+TOPBUTT_H+(1*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
+ type ITEM_TYPE_BUTTON
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ hide optionsGrp;
+ show system;
+ show gl2options
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_MULTI
+ text "Enabled Renderer:"
+ cvar "cl_renderer"
+ cvarStrList { "OpenGL2 (new)", "opengl2",
+ "OpenGL1 (old)", "opengl1" }
+ rect SCONTENT_X (SCONTENT_Y+(0*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Post Processing:"
+ cvar "r_postProcess"
+ rect SCONTENT_X (SCONTENT_Y+(1*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Screen Tone Mapping:"
+ cvar "r_toneMap"
+ rect SCONTENT_X (SCONTENT_Y+(2*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_MULTI
+ text "Multisample Anti-aliasing:"
+ cvar "r_ext_framebuffer_multisample"
+ cvarStrList { "No", "",
+ "x2", "2",
+ "x4", "4",
+ "x8", "8",
+ "x16", "16" }
+ rect SCONTENT_X (SCONTENT_Y+(3*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Physically Based Rendering:"
+ cvar "r_pbr"
+ rect SCONTENT_X (SCONTENT_Y+(4*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Normal (Bump) Maps:"
+ cvar "r_normalMapping"
+ rect SCONTENT_X (SCONTENT_Y+(5*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ // itemDef // No utility
+ // {
+ // name gl2options
+ // group optionsGrp
+ // type ITEM_TYPE_YESNO
+ // text "Naively Generate Normal Maps:"
+ // cvar "r_genNormalMaps"
+ // rect SCONTENT_X (SCONTENT_Y+(3*ELEM_H)) SCONTENT_W ELEM_H
+ // textalign ALIGN_RIGHT
+ // textvalign VALIGN_CENTER
+ // textalignx SCONTENT_OFF
+ // textscale .25
+ // forecolor 1 1 1 1
+ // visible MENU_TRUE
+ // action
+ // {
+ // play "sound/misc/menu1.wav";
+ // }
+ // }
+ //
+ // itemDef // Not ready
+ // {
+ // name gl2options
+ // group optionsGrp
+ // type ITEM_TYPE_YESNO
+ // text "Ambient Occlusion (SSAO):"
+ // cvar "r_ssao"
+ // rect SCONTENT_X (SCONTENT_Y+(4*ELEM_H)) SCONTENT_W ELEM_H
+ // textalign ALIGN_RIGHT
+ // textvalign VALIGN_CENTER
+ // textalignx SCONTENT_OFF
+ // textscale .25
+ // forecolor 1 1 1 1
+ // visible MENU_TRUE
+ // action
+ // {
+ // play "sound/misc/menu1.wav";
+ // }
+ // }
+
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Specular Surface Lighting:"
+ cvar "r_specularMapping"
+ rect SCONTENT_X (SCONTENT_Y+(6*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_MULTI
+ text "Parallax Height Maps:"
+ cvar "r_parallaxMapping"
+
+ cvarFloatList { "No" 0 "Use Parallax Occlusion" 1 "Use Relief (Slower)" 2 }
+ rect SCONTENT_X (SCONTENT_Y+(7*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ // itemDef // Drain FPS
+ // {
+ // name gl2options
+ // group optionsGrp
+ // type ITEM_TYPE_YESNO
+ // text "Cube mapped environments:"
+ // cvar "r_cubeMapping"
+ // rect SCONTENT_X (SCONTENT_Y+(9*ELEM_H)) SCONTENT_W ELEM_H
+ // textalign ALIGN_RIGHT
+ // textvalign VALIGN_CENTER
+ // textalignx SCONTENT_OFF
+ // textscale .25
+ // forecolor 1 1 1 1
+ // visible MENU_TRUE
+ // action
+ // {
+ // play "sound/misc/menu1.wav";
+ // }
+ // }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Draw Sun Rays:"
+ cvar "r_drawSunRays"
+ rect SCONTENT_X (SCONTENT_Y+(8*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Draw Sun:"
+ cvar "r_drawSun"
+ rect SCONTENT_X (SCONTENT_Y+(9*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_YESNO
+ text "Sun Shadows:"
+ cvar "r_sunShadows"
+ rect SCONTENT_X (SCONTENT_Y+(10*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_MULTI
+ text "Sunlight Mode:"
+ cvar "r_sunlightMode"
+
+ cvarFloatList { "None" 0 "Multiply (Good Quality)" 1 "Add (Best Quality)" 2 }
+ rect SCONTENT_X (SCONTENT_Y+(11*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_MULTI
+ text "Dynamic Lights Mode:"
+ cvar "r_dlightMode"
+
+ cvarFloatList { "Off" 0 "Lighting, No Shadows" 1 "Light & Shadows" 2 }
+ rect SCONTENT_X (SCONTENT_Y+(12*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gl2options
+ group optionsGrp
+ type ITEM_TYPE_BUTTON
+ text "APPLY"
+ textscale .25
+ style WINDOW_STYLE_EMPTY
+ rect SCONTENT_X (SCONTENT_Y+(13*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_CENTER
+ textvalign VALIGN_CENTER
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ exec "vid_restart"
+ }
+ }
+
//////// GFX SOFTWARE
itemDef
@@ -1908,7 +2349,7 @@
text "GFX Software"
group optionsGrp
style WINDOW_STYLE_EMPTY
- rect 0 ((2*BORDER)+TOPBUTT_H+(1*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
+ rect 0 ((2*BORDER)+TOPBUTT_H+(2*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
type ITEM_TYPE_BUTTON
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
@@ -1956,6 +2397,24 @@
visible MENU_FALSE
}
+ itemDef
+ {
+ name gsoftware
+ group optionsGrp
+ type ITEM_TYPE_EDITFIELD
+ style WINDOW_STYLE_EMPTY
+ text "FOV offset:"
+ cvar "cg_fovOffset"
+ maxchars 3
+ rect CONTENT_X (CONTENT_Y+(2*ELEM_H)) CONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_FALSE
+ }
+
itemDef
{
name gsoftware
@@ -1963,7 +2422,28 @@
type ITEM_TYPE_YESNO
text "Marks On Walls:"
cvar "cg_marks"
- rect SCONTENT_X (SCONTENT_Y+(2*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(3*ELEM_H)) SCONTENT_W ELEM_H
+ textalign ALIGN_RIGHT
+ textvalign VALIGN_CENTER
+ textalignx SCONTENT_OFF
+ textscale .25
+ forecolor 1 1 1 1
+ visible MENU_TRUE
+ action
+ {
+ play "sound/misc/menu1.wav";
+ }
+ }
+
+ itemDef
+ {
+ name gsoftware
+ group optionsGrp
+ type ITEM_TYPE_MULTI
+ text "Animated creep tag:"
+ cvar "cg_animatedCreep"
+ cvarFloatList { "No" 0 "Full frame ^0(Need reload)" 1 "Half frame ^0(Need reload)" 2 "1/4 frame ^0(Need reload)" 4}
+ rect SCONTENT_X (SCONTENT_Y+(4*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -1983,7 +2463,7 @@
type ITEM_TYPE_YESNO
text "Dynamic Lights:"
cvar "r_dynamiclight"
- rect SCONTENT_X (SCONTENT_Y+(3*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(5*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2003,7 +2483,7 @@
type ITEM_TYPE_YESNO
text "Draw Gun:"
cvar "cg_drawGun"
- rect SCONTENT_X (SCONTENT_Y+(4*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(6*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2023,7 +2503,7 @@
type ITEM_TYPE_YESNO
text "Low Quality Sky:"
cvar "r_fastsky"
- rect SCONTENT_X (SCONTENT_Y+(5*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(7*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2043,7 +2523,7 @@
type ITEM_TYPE_YESNO
text "Sync Every Frame:"
cvar "r_finish"
- rect SCONTENT_X (SCONTENT_Y+(6*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(8*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2063,7 +2543,7 @@
type ITEM_TYPE_YESNO
text "In Game Videos:"
cvar "r_inGameVideo"
- rect SCONTENT_X (SCONTENT_Y+(7*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(9*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2083,7 +2563,7 @@
type ITEM_TYPE_YESNO
text "Depth Sort Particles:"
cvar "cg_depthSortParticles"
- rect SCONTENT_X (SCONTENT_Y+(8*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(10*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2104,7 +2584,7 @@
text "Particle Physics:"
cvar "cg_bounceParticles"
cvarFloatList { "Low Quality" 0 "High Quality" 1 }
- rect SCONTENT_X (SCONTENT_Y+(9*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(11*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2125,7 +2605,7 @@
text "Light Flares:"
cvar "cg_lightFlare"
cvarFloatList { "Off" 0 "No Fade" 1 "Timed Fade" 2 "Real Fade" 3 }
- rect SCONTENT_X (SCONTENT_Y+(10*ELEM_H)) SCONTENT_W ELEM_H
+ rect SCONTENT_X (SCONTENT_Y+(12*ELEM_H)) SCONTENT_W ELEM_H
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
textalignx SCONTENT_OFF
@@ -2137,7 +2617,6 @@
play "sound/misc/menu1.wav";
}
}
-
//////// GL INFO
itemDef
@@ -2146,7 +2625,7 @@
text "OpenGL Info"
group optionsGrp
style WINDOW_STYLE_EMPTY
- rect 0 ((2*BORDER)+TOPBUTT_H+(2*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
+ rect 0 ((2*BORDER)+TOPBUTT_H+(3*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
type ITEM_TYPE_BUTTON
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
@@ -2186,7 +2665,7 @@
text "Net & Sound"
group optionsGrp
style WINDOW_STYLE_EMPTY
- rect 0 ((2*BORDER)+TOPBUTT_H+(3*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
+ rect 0 ((2*BORDER)+TOPBUTT_H+(4*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
type ITEM_TYPE_BUTTON
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
@@ -2384,7 +2863,7 @@
text "Range Markers"
group optionsGrp
style WINDOW_STYLE_EMPTY
- rect 0 ((2*BORDER)+TOPBUTT_H+(4*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
+ rect 0 ((2*BORDER)+TOPBUTT_H+(5*SIDEBUTT_H)) SIDEBUTT_W SIDEBUTT_H
type ITEM_TYPE_BUTTON
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
@@ -2573,5 +3052,5 @@
forecolor 1 1 1 1
visible MENU_FALSE
}
- }
+
}
diff --git a/assets/ui/install_update.menu b/assets/ui/install_update.menu
index 8c811336f..e8a404659 100644
--- a/assets/ui/install_update.menu
+++ b/assets/ui/install_update.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -31,7 +32,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen
@@ -49,12 +50,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 .75
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_KCGRADIENT
+
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
@@ -95,7 +98,7 @@
// {
// play "sound/misc/menu1.wav";
// uiScript DownloadUpdate;
-// close install_update
+// close install_update
// }
// }
//
@@ -118,7 +121,7 @@
// {
// play "sound/misc/menu1.wav";
// uiScript InstallUpdate;
-// close install_update
+// close install_update
// }
// }
diff --git a/assets/ui/joinserver.menu b/assets/ui/joinserver.menu
index ad3e04d70..c76010bab 100644
--- a/assets/ui/joinserver.menu
+++ b/assets/ui/joinserver.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -51,9 +52,10 @@
visible MENU_FALSE
fullscreen MENU_TRUE
rect 0 0 W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
outOfBoundsClick
- style WINDOW_STYLE_EMPTY
+ style WINDOW_STYLE_SHADER
+ background "ui/assets/mainmenu.jpg"
aspectBias ASPECT_NONE
onOpen
{
@@ -67,16 +69,6 @@
onEsc { uiScript closeJoin }
- itemDef
- {
- name background
- rect 0 0 W H
- style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
- visible MENU_TRUE
- decoration
- }
-
// VIEW OPTIONS //
@@ -244,7 +236,7 @@
border WINDOW_BORDER_FULL
bordercolor 0.5 0.5 0.5 1
forecolor 1 1 1 1
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
outlinecolor 0.1 0.1 0.1 0.5
visible MENU_TRUE
action
@@ -252,10 +244,10 @@
play "sound/misc/menu1.wav";
uiScript ServerSort 0;
- setitemcolor grpColumn backcolor 0 0 0 0;
- setitemcolor grpTabs backcolor 0 0 0 0;
+ setitemcolor grpColumn backcolor 0 0 0 0.5;
+ setitemcolor grpTabs backcolor 0 0 0 0.5;
setitemcolor server backcolor 0.3 1 1 0.3;
- setitemcolor serverColumn backcolor 0.2 0.6 0.6 0.1;
+ setitemcolor serverColumn backcolor 0.2 0.6 0.6 0.2;
}
}
@@ -266,7 +258,7 @@
rect LIST_X (LIST_Y+HEADFOOT_H) (SERVER_C*LIST_W) (LIST_H-(2*HEADFOOT_H))
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
bordersize 1
bordercolor .5 .5 .5 1
visible MENU_TRUE
@@ -288,7 +280,7 @@
border WINDOW_BORDER_FULL
bordercolor 0.5 0.5 0.5 1
forecolor 1 1 1 1
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
outlinecolor 0.1 0.1 0.1 0.5
visible MENU_TRUE
action
@@ -296,10 +288,10 @@
play "sound/misc/menu1.wav";
uiScript ServerSort 1;
- setitemcolor grpColumn backcolor 0 0 0 0;
- setitemcolor grpTabs backcolor 0 0 0 0;
+ setitemcolor grpColumn backcolor 0 0 0 0.5;
+ setitemcolor grpTabs backcolor 0 0 0 0.5;
setitemcolor game backcolor 0.3 1 1 0.3;
- setitemcolor gameColumn backcolor 0.2 0.6 0.6 0.1;
+ setitemcolor gameColumn backcolor 0.2 0.6 0.6 0.2;
}
}
@@ -310,7 +302,7 @@
rect (LIST_X+(SERVER_C*LIST_W)) (LIST_Y+HEADFOOT_H) (GAME_C*LIST_W) (LIST_H-(2*HEADFOOT_H))
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
bordersize 1
bordercolor .5 .5 .5 1
visible MENU_TRUE
@@ -332,7 +324,7 @@
border WINDOW_BORDER_FULL
bordercolor 0.5 0.5 0.5 1
forecolor 1 1 1 1
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
outlinecolor 0.1 0.1 0.1 0.5
visible MENU_TRUE
action
@@ -340,10 +332,10 @@
play "sound/misc/menu1.wav";
uiScript ServerSort 2;
- setitemcolor grpColumn backcolor 0 0 0 0;
- setitemcolor grpTabs backcolor 0 0 0 0;
+ setitemcolor grpColumn backcolor 0 0 0 0.5;
+ setitemcolor grpTabs backcolor 0 0 0 0.5;
setitemcolor map backcolor 0.3 1 1 0.3;
- setitemcolor mapColumn backcolor 0.2 0.6 0.6 0.1;
+ setitemcolor mapColumn backcolor 0.2 0.6 0.6 0.2;
}
}
@@ -354,7 +346,7 @@
rect (LIST_X+((SERVER_C+GAME_C)*LIST_W)) (LIST_Y+HEADFOOT_H) (MAP_C*LIST_W) (LIST_H-(2*HEADFOOT_H))
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
bordersize 1
bordercolor .5 .5 .5 1
visible MENU_TRUE
@@ -376,7 +368,7 @@
border WINDOW_BORDER_FULL
bordercolor 0.5 0.5 0.5 1
forecolor 1 1 1 1
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
outlinecolor 0.1 0.1 0.1 0.5
visible MENU_TRUE
action
@@ -384,10 +376,10 @@
play "sound/misc/menu1.wav";
uiScript ServerSort 3;
- setitemcolor grpColumn backcolor 0 0 0 0;
- setitemcolor grpTabs backcolor 0 0 0 0;
+ setitemcolor grpColumn backcolor 0 0 0 0.5;
+ setitemcolor grpTabs backcolor 0 0 0 0.5;
setitemcolor players backcolor 0.3 1 1 0.3;
- setitemcolor playerColumn backcolor 0.2 0.6 0.6 0.1;
+ setitemcolor playerColumn backcolor 0.2 0.6 0.6 0.2;
}
}
@@ -398,7 +390,7 @@
rect (LIST_X+((SERVER_C+GAME_C+MAP_C)*LIST_W)) (LIST_Y+HEADFOOT_H) (PLAYERS_C*LIST_W) (LIST_H-(2*HEADFOOT_H))
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
- backcolor 0 0 0 0
+ backcolor 0 0 0 0.5
bordersize 1
bordercolor .5 .5 .5 1
visible MENU_TRUE
@@ -428,10 +420,10 @@
play "sound/misc/menu1.wav";
uiScript ServerSort 4;
- setitemcolor grpColumn backcolor 0 0 0 0;
- setitemcolor grpTabs backcolor 0 0 0 0;
+ setitemcolor grpColumn backcolor 0 0 0 0.5;
+ setitemcolor grpTabs backcolor 0 0 0 0.5;
setitemcolor ping backcolor 0.3 1 1 0.3;
- setitemcolor pingColumn backcolor 0.2 0.6 0.6 0.1;
+ setitemcolor pingColumn backcolor 0.2 0.6 0.6 0.2;
}
}
@@ -442,7 +434,7 @@
rect (LIST_X+((SERVER_C+GAME_C+MAP_C+PLAYERS_C)*LIST_W)) (LIST_Y+HEADFOOT_H) (PING_C*LIST_W) (LIST_H-(2*HEADFOOT_H))
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
- backcolor 0.2 0.6 0.6 0.1
+ backcolor 0.2 0.6 0.6 0.2
bordersize 1
bordercolor .5 .5 .5 1
visible MENU_TRUE
@@ -487,12 +479,14 @@
ownerdraw UI_SERVERREFRESHDATE
textscale .33
rect LIST_X (LIST_Y+(LIST_H-HEADFOOT_H)) (LIST_W/2) HEADFOOT_H
+ style WINDOW_STYLE_FILLED
textalign ALIGN_LEFT
textvalign VALIGN_CENTER
textalignx LIST_TOFF
forecolor 1 1 1 1
border WINDOW_BORDER_FULL
bordercolor .5 .5 .5 1
+ backcolor 0 0 0 .5
visible MENU_TRUE
decoration
}
@@ -503,12 +497,14 @@
ownerdraw UI_SERVERMOTD
textscale .33
rect (LIST_X+(LIST_W/2)) (LIST_Y+(LIST_H-HEADFOOT_H)) (LIST_W/2) HEADFOOT_H
+ style WINDOW_STYLE_FILLED
textalign ALIGN_LEFT
textvalign VALIGN_CENTER
textalignx LIST_TOFF
forecolor 1 1 1 1
border WINDOW_BORDER_FULL
bordercolor .5 .5 .5 1
+ backcolor 0 0 0 .5
visible MENU_TRUE
decoration
}
@@ -661,7 +657,7 @@
{
name back
style WINDOW_STYLE_SHADER
- background "ui/assets/backarrow.tga"
+ background "ui/assets/backarrow.png"
rect BCJ_X BCJ_Y ARROW_H ARROW_W
aspectBias ALIGN_LEFT
visible MENU_TRUE
@@ -682,7 +678,7 @@
{
name back_alt
style WINDOW_STYLE_SHADER
- background "ui/assets/backarrow_alt.tga"
+ background "ui/assets/backarrow_alt.png"
rect BCJ_X BCJ_Y ARROW_H ARROW_W
aspectBias ALIGN_LEFT
backcolor 0 0 0 0
@@ -718,7 +714,7 @@
style WINDOW_STYLE_SHADER
rect ((BCJ_X+BCJ_W)-ARROW_W) BCJ_Y ARROW_H ARROW_W
aspectBias ALIGN_RIGHT
- background "ui/assets/forwardarrow.tga"
+ background "ui/assets/forwardarrow.png"
backcolor 0 0 0 0
forecolor 1 1 1 1
visible MENU_TRUE
@@ -741,7 +737,7 @@
style WINDOW_STYLE_SHADER
rect ((BCJ_X+BCJ_W)-ARROW_W) BCJ_Y ARROW_H ARROW_W
aspectBias ALIGN_RIGHT
- background "ui/assets/forwardarrow_alt.tga"
+ background "ui/assets/forwardarrow_alt.png"
backcolor 0 0 0 0
type ITEM_TYPE_BUTTON
forecolor 1 1 1 1
diff --git a/assets/ui/loading.menu b/assets/ui/loading.menu
index b877ce9ce..1c7140932 100644
--- a/assets/ui/loading.menu
+++ b/assets/ui/loading.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -33,7 +34,7 @@
assetGlobalDef
{
- cursor "ui/assets/3_cursor3" // cursor
+ cursor "ui/assets/cursor" // cursor
gradientBar "ui/assets/gradientbar2.tga" // gradient bar
fadeClamp 1.0 // sets the fadeup alpha
fadeCycle 1 // how often fade happens in milliseconds
@@ -54,16 +55,8 @@
rect 0 0 W H
fullScreen MENU_TRUE
aspectBias ASPECT_NONE
-
- itemDef
- {
- name background
- rect 0 0 W H
- style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
- visible MENU_TRUE
- decoration
- }
+ style WINDOW_STYLE_SHADER
+ background "ui/assets/mainmenu.jpg"
itemDef
{
@@ -128,6 +121,7 @@
visible MENU_TRUE
decoration
forecolor 0.0 0.8 1 1
+ backcolor 0.0 0.8 1 0.5
ownerdraw CG_LOAD_MEDIA
textalign ALIGN_CENTER
textstyle ITEM_TEXTSTYLE_NEON
@@ -157,6 +151,7 @@
visible MENU_TRUE
decoration
forecolor 0.0 0.8 1 1
+ backcolor 0.0 0.8 1 0.5
ownerdraw CG_LOAD_BUILDABLES
textalign ALIGN_CENTER
textstyle ITEM_TEXTSTYLE_NEON
@@ -185,6 +180,7 @@
visible MENU_TRUE
decoration
forecolor 0.0 0.8 1 1
+ backcolor 0.0 0.8 1 0.5
ownerdraw CG_LOAD_CHARMODEL
textalign ALIGN_CENTER
textstyle ITEM_TEXTSTYLE_NEON
@@ -213,6 +209,7 @@
visible MENU_TRUE
decoration
forecolor 0.0 0.8 1 1
+ backcolor 0.0 0.8 1 0.5
ownerdraw CG_LOAD_OVERALL
textalign ALIGN_CENTER
textstyle ITEM_TEXTSTYLE_NEON
diff --git a/assets/ui/main.menu b/assets/ui/main.menu
index fddc0d91e..38e812cdc 100644
--- a/assets/ui/main.menu
+++ b/assets/ui/main.menu
@@ -1,5 +1,6 @@
-// vim:ft=menu
+focusColor WINDOW_FOCUSCOLOR// vim:ft=menu
#include "ui/menudef.h"
+#include "ui/menustyle.h"
#include "ui/menu_bool.h"
{
@@ -8,7 +9,7 @@
font "fonts/font" 26// font
smallFont "fonts/smallfont" 20// font
bigFont "fonts/bigfont" 34// font
- cursor "ui/assets/3_cursor3" // cursor
+ cursor "ui/assets/cursor" // cursor
gradientBar "ui/assets/gradientbar2.tga" // gradient bar
itemFocusSound "sound/misc/menu2.wav" // sound for item getting focus (via keyboard or mouse )
@@ -26,7 +27,7 @@
fullscreen true
rect 0 0 640 480// Size and position of the menu
visible true // Visible on open
- focuscolor 1 .75 0 1// Menu focus color for text and items
+ focusColor WINDOW_FOCUSCOLOR// Menu focus color for text and items
background "ui/assets/mainmenu.jpg"
aspectbias ASPECT_NONE
@@ -44,11 +45,12 @@
itemDef
{
name splashmodel
- rect 0 0 640 480
+ rect -320 0 1280 480
type ITEM_TYPE_MODEL
style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER // Allow our HD model to be "responsive"
asset_model "models/splash/splash_screen.md3"
- model_fovx 32.0
+ model_fovx 60.0
model_fovy 24.0
model_angle 180
visible MENU_TRUE
diff --git a/assets/ui/menudef.h b/assets/ui/menudef.h
index f83ba536e..0a6ef5c93 100644
--- a/assets/ui/menudef.h
+++ b/assets/ui/menudef.h
@@ -51,11 +51,19 @@ enum
enum
{
- WINDOW_BORDER_NONE, // no border
- WINDOW_BORDER_FULL, // full border based on border color (single pixel)
- WINDOW_BORDER_HORZ, // horizontal borders only
- WINDOW_BORDER_VERT, // vertical borders only
- WINDOW_BORDER_KCGRADIENT // horizontal border using the gradient bars
+ WINDOW_BORDER_NONE, // no border
+ WINDOW_BORDER_FULL, // full border based on border color (single pixel)
+ WINDOW_BORDER_HORZ, // horizontal borders only
+ WINDOW_BORDER_VERT, // vertical borders only
+ WINDOW_BORDER_KCGRADIENT, // horizontal border using the gradient bars
+ WINDOW_BORDER_ROUNDED // full rounded
+};
+
+enum
+{
+ BORDER_SQUARE, // as WINDOW_BORDER_FULL
+ BORDER_ROUNDED, // rounded
+ BORDER_FOLD // fold paper
};
enum
@@ -112,7 +120,7 @@ enum
FEEDER_HELP_LIST, // help topics
FEEDER_RESOLUTIONS, // display resolutions
FEEDER_TREMVOICECMD, // voice commands
- FEEDER_GITHUB_RELEASE // latest update info
+ FEEDER_GITHUB_RELEASE // latest update info
};
// display flags
@@ -187,6 +195,7 @@ enum
CG_LAGOMETER,
CG_SPEEDOMETER,
CG_PLAYER_CROSSHAIRNAMES,
+ CG_TEAM_STATUS,
CG_STAGE_REPORT_TEXT,
CG_ALIENS_SCORE_LABEL,
CG_HUMANS_SCORE_LABEL,
@@ -199,6 +208,8 @@ enum
CG_KILLFEED,
CG_PLAYER_THZ_SCANNER,
+ UI_DOWNLOAD_OVERALL,
+
UI_NETSOURCE,
UI_NETMAPPREVIEW,
UI_NETMAPCINEMATIC,
@@ -210,13 +221,20 @@ enum
UI_SELECTEDMAPNAME,
UI_TEAMINFOPANE,
+ UI_TEAMINFOPANEMODEL,
UI_ACLASSINFOPANE,
+ UI_ACLASSINFOPANEMODEL,
UI_AUPGRADEINFOPANE,
+ UI_AUPGRADEINFOPANEMODEL,
UI_HITEMINFOPANE,
+ UI_HITEMINFOPANEMODEL,
UI_HBUYINFOPANE,
+ UI_HBUYINFOPANEMODEL,
UI_HSELLINFOPANE,
UI_ABUILDINFOPANE,
+ UI_ABUILDINFOPANEMODEL,
UI_HBUILDINFOPANE,
+ UI_HBUILDINFOPANEMODEL,
UI_HELPINFOPANE,
UI_VOICECMDINFOPANE
diff --git a/assets/ui/menustyle.h b/assets/ui/menustyle.h
new file mode 100644
index 000000000..eceac9942
--- /dev/null
+++ b/assets/ui/menustyle.h
@@ -0,0 +1,33 @@
+#ifndef MENUSTYLE_H
+# define MENUSTYLE_H
+
+# define BORDER_STYLE_FULL_ROUNDED BORDER_ROUNDED BORDER_ROUNDED BORDER_ROUNDED BORDER_ROUNDED
+# define BORDER_STYLE_FULL_FOLD BORDER_FOLD BORDER_FOLD BORDER_FOLD BORDER_FOLD
+# define WINDOW_OPACITY .85
+# define WINDOW_BACKCOLOR 0 0 0 WINDOW_OPACITY
+# define WINDOW_FOCUSCOLOR 1 .75 0 1
+# define WINDOW_BORDER 0.5 0.5 0.5 (WINDOW_OPACITY/2)
+# define WINDOW_BORDER_STYLE BORDER_STYLE_FULL_ROUNDED
+# define BORDER_STYLE BORDER_ROUNDED
+
+# define ALIENS_WINDOW_BACKCOLOR .05 0 0 WINDOW_OPACITY
+# define ALIENS_WINDOW_FOCUSCOLOR 1 .25 .25 1
+# define ALIENS_WINDOW_BORDER 0.6 0.5 0.5 (WINDOW_OPACITY/2)
+# define ALIENS_WINDOW_BORDER_STYLE BORDER_STYLE_FULL_ROUNDED
+# define ALIENS_BORDER_STYLE BORDER_ROUNDED
+# define ALIENS_TEXT_COLOR 1 .2 .2 1
+# define ALIENS_TEXT_SECONDARY_COLOR .8 .3 .3 .8
+# define ALIENS_BACKGROUND_COLOR .1 0 0
+# define ALIENS_BORDER_COLOR .6 .45 .45
+
+# define HUMANS_WINDOW_BACKCOLOR 0 .025 .05 WINDOW_OPACITY
+# define HUMANS_WINDOW_FOCUSCOLOR 0.4 .7 1 1
+# define HUMANS_WINDOW_BORDER 0.5 0.55 0.6 (WINDOW_OPACITY/2)
+# define HUMANS_WINDOW_BORDER_STYLE BORDER_STYLE_FULL_FOLD
+# define HUMANS_BORDER_STYLE BORDER_FOLD
+# define HUMANS_TEXT_COLOR .2 .6 1 1
+# define HUMANS_TEXT_SECONDARY_COLOR .3 .55 .8 .8
+# define HUMANS_BACKGROUND_COLOR 0 .05 .1
+# define HUMANS_BORDER_COLOR .45 .525 .6
+
+#endif
diff --git a/assets/ui/mod.menu b/assets/ui/mod.menu
index 38bee621c..b028f92de 100644
--- a/assets/ui/mod.menu
+++ b/assets/ui/mod.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ MOD \\
@@ -15,7 +16,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -33,13 +34,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
diff --git a/assets/ui/news.menu b/assets/ui/news.menu
index 99d8d68fb..b9e40b72a 100644
--- a/assets/ui/news.menu
+++ b/assets/ui/news.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ NEWS POPUP MENU \\
@@ -17,7 +18,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -33,13 +34,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
@@ -98,5 +100,3 @@
}
}
}
-
-
diff --git a/assets/ui/options.menu b/assets/ui/options.menu
index 6427f6c9b..6ced50df9 100644
--- a/assets/ui/options.menu
+++ b/assets/ui/options.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ FRONT END OPTIONS BOX \\
@@ -21,7 +22,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -36,13 +37,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
diff --git a/assets/ui/password.menu b/assets/ui/password.menu
index d6ac4cd43..10adcaea8 100644
--- a/assets/ui/password.menu
+++ b/assets/ui/password.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ PASSWORD POPUP MENU \\
@@ -16,7 +17,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -36,13 +37,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
// PASSWORD //
diff --git a/assets/ui/quit.menu b/assets/ui/quit.menu
index 0bd2e903f..ef67b3506 100644
--- a/assets/ui/quit.menu
+++ b/assets/ui/quit.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ QUIT POPUP MENU \\
@@ -12,7 +13,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -28,13 +29,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
@@ -95,5 +97,3 @@
}
}
}
-
-
diff --git a/assets/ui/quitcredit.menu b/assets/ui/quitcredit.menu
index 14a8f4fcf..0f4e46527 100644
--- a/assets/ui/quitcredit.menu
+++ b/assets/ui/quitcredit.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ QUIT CREDIT \\
@@ -9,7 +10,7 @@
visible MENU_FALSE
fullscreen MENU_TRUE
rect 0 0 640 480
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_NONE
aspectBias ASPECT_NONE
diff --git a/assets/ui/say.menu b/assets/ui/say.menu
index 2bd3015f4..50cf9cf31 100644
--- a/assets/ui/say.menu
+++ b/assets/ui/say.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
#include "ui/menu_bool.h"
{
diff --git a/assets/ui/serverinfo.menu b/assets/ui/serverinfo.menu
index 596712c71..983ad5486 100644
--- a/assets/ui/serverinfo.menu
+++ b/assets/ui/serverinfo.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ SERVER INFO POPUP MENU \\
@@ -19,7 +20,7 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
border WINDOW_BORDER_FULL
popup
@@ -35,13 +36,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
@@ -53,9 +55,10 @@
elementwidth 120
elementheight 16
textscale .25
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordersize 1
bordercolor .5 .5 .5 1
+ borderStyle BORDER_STYLE BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
elementtype LISTBOX_TEXT
feeder FEEDER_SERVERSTATUS
notselectable
@@ -108,5 +111,3 @@
}
}
}
-
-
diff --git a/assets/ui/teamscore.menu b/assets/ui/teamscore.menu
index 65893a049..ff253e680 100644
--- a/assets/ui/teamscore.menu
+++ b/assets/ui/teamscore.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
\\ score_menu \\
@@ -6,6 +7,7 @@
#define W 500
#define H 338
#define BORDER 10
+#define SPACE 1
#define TOFF 10
#define SPEC_W 75
@@ -22,9 +24,26 @@
visible MENU_FALSE
fullscreen MENU_FALSE
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor .75 .75 .75 1 // Avoid focus
style WINDOW_STYLE_EMPTY
+
+ // TEAM STATUS //
+
+ itemDef
+ {
+ name teamStatus
+ textalign ALIGN_CENTER
+ textvalign VALIGN_CENTER
+ textscale 0.38
+ rect 0 (-BAR_H - SPACE) W BAR_H
+ forecolor 1 1 1 1
+ decoration
+ visible MENU_TRUE
+ textstyle ITEM_TEXTSTYLE_SHADOWED
+ ownerdraw CG_TEAM_STATUS
+ }
+
// TEAM NAME //
itemDef
@@ -32,7 +51,7 @@
name teamNameWindow
rect 0 0 W BAR_H
style WINDOW_STYLE_FILLED
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_KCGRADIENT
borderSize 1.0
bordercolor .5 .5 .5 1
forecolor 1 1 1 1
@@ -49,7 +68,7 @@
textalignx TOFF
textscale 0.4
rect 0 0 (W/3) BAR_H
- forecolor 1 1 1 1
+ forecolor ALIENS_TEXT_COLOR
decoration
visible MENU_TRUE
ownerdraw CG_ALIENS_SCORE_LABEL
@@ -76,7 +95,7 @@
textalignx -TOFF
textscale 0.4
rect ((2*W)/3) 0 (W/3) BAR_H
- forecolor 1 1 1 1
+ forecolor HUMANS_TEXT_COLOR
decoration
visible MENU_TRUE
ownerdraw CG_HUMANS_SCORE_LABEL
@@ -86,26 +105,12 @@
itemDef
{
- name leftteambar
- rect 0 (BAR_H+BORDER) (W/2) BAR_H
+ name teambar
+ rect 0 (BAR_H+BORDER) W BAR_H
style WINDOW_STYLE_FILLED
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_KCGRADIENT
borderSize 1.0
- bordercolor .5 .5 .5 1
- forecolor 1 1 1 1
- backcolor 0 0 0 .8
- visible MENU_TRUE
- decoration
- }
-
- itemDef
- {
- name rightteambar
- rect (W/2) (BAR_H+BORDER) (W/2) BAR_H
- style WINDOW_STYLE_FILLED
- border WINDOW_BORDER_FULL
- borderSize 1.0
- bordercolor .5 .5 .5 1
+ bordercolor .5 .5 .5 .5
forecolor 1 1 1 1
backcolor 0 0 0 .8
visible MENU_TRUE
@@ -125,7 +130,7 @@
textalign ALIGN_LEFT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor ALIENS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -140,7 +145,7 @@
textalign ALIGN_LEFT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor ALIENS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -155,7 +160,7 @@
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor ALIENS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -170,7 +175,7 @@
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor ALIENS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -185,7 +190,7 @@
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor ALIENS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -200,7 +205,7 @@
textalign ALIGN_LEFT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor HUMANS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -215,7 +220,7 @@
textalign ALIGN_LEFT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor HUMANS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -230,7 +235,7 @@
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor HUMANS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -245,7 +250,7 @@
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor HUMANS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -260,7 +265,7 @@
textalign ALIGN_RIGHT
textvalign VALIGN_CENTER
backcolor 0 0 0 0
- forecolor 1 .75 0 1
+ forecolor HUMANS_TEXT_SECONDARY_COLOR
decoration
visible MENU_TRUE
}
@@ -268,12 +273,13 @@
itemDef
{
name leftlist
- rect 0 ((2*BAR_H)+BORDER) (W/2) (H-((3*BAR_H)+(2*BORDER)))
+ rect 0 ((2*BAR_H)+BORDER+SPACE) (W/2) (H-((3*BAR_H)+(2*BORDER)+SPACE))
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 .6
- border WINDOW_BORDER_FULL
+ backcolor ALIENS_BACKGROUND_COLOR .6
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- bordercolor .5 .5 .5 1
+ bordercolor ALIENS_BORDER_COLOR 0
+ borderStyle BORDER_SQUARE BORDER_SQUARE BORDER_SQUARE ALIENS_BORDER_STYLE
forecolor .75 .75 .75 1
visible MENU_TRUE
type ITEM_TYPE_LISTBOX
@@ -297,12 +303,13 @@
itemDef
{
name rightlist
- rect (W/2) ((2*BAR_H)+BORDER) (W/2) (H-((3*BAR_H)+(2*BORDER)))
+ rect (W/2) ((2*BAR_H)+BORDER+SPACE) (W/2) (H-((3*BAR_H)+(2*BORDER)+SPACE))
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 .6
- border WINDOW_BORDER_FULL
+ backcolor HUMANS_BACKGROUND_COLOR .6
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- bordercolor .5 .5 .5 1
+ bordercolor HUMANS_BORDER_COLOR 0
+ borderStyle BORDER_SQUARE BORDER_SQUARE HUMANS_BORDER_STYLE BORDER_SQUARE
forecolor .75 .75 .75 1
visible MENU_TRUE
type ITEM_TYPE_LISTBOX
@@ -330,7 +337,7 @@
name window
rect 0 (H-BAR_H) W BAR_H
style WINDOW_STYLE_FILLED
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_KCGRADIENT
borderSize 1.0
bordercolor .5 .5 .5 1
backcolor 0 0 0 .8
diff --git a/assets/ui/tremulous_alien_builder_hud.menu b/assets/ui/tremulous_alien_builder_hud.menu
index b5322646a..2ef8fe894 100644
--- a/assets/ui/tremulous_alien_builder_hud.menu
+++ b/assets/ui/tremulous_alien_builder_hud.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
diff --git a/assets/ui/tremulous_alien_general_hud.menu b/assets/ui/tremulous_alien_general_hud.menu
index df1352d1e..87c64501b 100644
--- a/assets/ui/tremulous_alien_general_hud.menu
+++ b/assets/ui/tremulous_alien_general_hud.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
diff --git a/assets/ui/tremulous_alienbuild.menu b/assets/ui/tremulous_alienbuild.menu
index 127b769d9..9c41da3d3 100644
--- a/assets/ui/tremulous_alienbuild.menu
+++ b/assets/ui/tremulous_alienbuild.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,6 +21,9 @@
#define INFO_Y BORDER
#define INFO_TOFF 6
+#define MODEL_W (32*4+2*BORDER)
+#define MODEL_H (24*4)
+
menuDef
{
name "tremulous_alienbuild"
@@ -27,7 +31,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor ALIENS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen { uiScript LoadAlienBuilds; setFocus list }
@@ -38,12 +42,14 @@
rect 0 0 W H
style WINDOW_STYLE_FILLED
backcolor 0 0 0 1
+ backcolor ALIENS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor ALIENS_WINDOW_BORDER
+ borderStyle ALIENS_WINDOW_BORDER_STYLE
}
itemDef
@@ -57,8 +63,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMALIENBUILD
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle ALIENS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE ALIENS_BORDER_STYLE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -71,6 +78,17 @@
}
}
+ itemDef
+ {
+ name infopane_model
+ ownerdraw UI_ABUILDINFOPANEMODEL
+ rect (INFO_X+INFO_W-MODEL_W+1) (INFO_Y+INFO_H-MODEL_H+1) MODEL_W MODEL_H
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER
+ visible MENU_TRUE
+ decoration
+ }
+
itemDef
{
name infopane
@@ -83,8 +101,9 @@
textvalign VALIGN_TOP
textalignx INFO_TOFF
textaligny INFO_TOFF
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_SQUARE ALIENS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
diff --git a/assets/ui/tremulous_alienclass.menu b/assets/ui/tremulous_alienclass.menu
index 441e27fd8..6a10e6c61 100644
--- a/assets/ui/tremulous_alienclass.menu
+++ b/assets/ui/tremulous_alienclass.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,6 +21,9 @@
#define INFO_Y BORDER
#define INFO_TOFF 6
+#define MODEL_W (32*4+2*BORDER)
+#define MODEL_H (24*4)
+
menuDef
{
name "tremulous_alienclass"
@@ -27,7 +31,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor ALIENS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen { uiScript LoadAlienClasses; setFocus list }
@@ -37,13 +41,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor ALIENS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor ALIENS_WINDOW_BORDER
+ borderStyle ALIENS_WINDOW_BORDER_STYLE
}
itemDef
@@ -57,8 +62,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMALIENCLASSES
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle ALIENS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE ALIENS_BORDER_STYLE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -71,6 +77,17 @@
}
}
+ itemDef
+ {
+ name infopane_model
+ ownerdraw UI_ACLASSINFOPANEMODEL
+ rect (INFO_X+INFO_W-MODEL_W+1) (INFO_Y+INFO_H-MODEL_H+1) MODEL_W MODEL_H
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER
+ visible MENU_TRUE
+ decoration
+ }
+
itemDef
{
name infopane
@@ -83,8 +100,9 @@
textvalign VALIGN_TOP
textalignx INFO_TOFF
textaligny INFO_TOFF
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_SQUARE ALIENS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
diff --git a/assets/ui/tremulous_aliendialogs.menu b/assets/ui/tremulous_aliendialogs.menu
index 921d2c850..b3e25dd8d 100644
--- a/assets/ui/tremulous_aliendialogs.menu
+++ b/assets/ui/tremulous_aliendialogs.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -21,7 +22,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor ALIENS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_EMPTY
popup
@@ -30,13 +31,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor ALIENS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor ALIENS_WINDOW_BORDER
+ borderStyle ALIENS_WINDOW_BORDER_STYLE
}
itemDef
diff --git a/assets/ui/tremulous_alienupgrade.menu b/assets/ui/tremulous_alienupgrade.menu
index 2ef7bcb2d..10d664766 100644
--- a/assets/ui/tremulous_alienupgrade.menu
+++ b/assets/ui/tremulous_alienupgrade.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,6 +21,9 @@
#define INFO_Y BORDER
#define INFO_TOFF 6
+#define MODEL_W (32*4+2*BORDER)
+#define MODEL_H (24*4)
+
menuDef
{
name "tremulous_alienupgrade"
@@ -27,7 +31,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor ALIENS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen { uiScript LoadAlienUpgrades; setFocus list }
@@ -37,13 +41,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor ALIENS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor ALIENS_WINDOW_BORDER
+ borderStyle ALIENS_WINDOW_BORDER_STYLE
}
itemDef
@@ -57,8 +62,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMALIENUPGRADE
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle ALIENS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE ALIENS_BORDER_STYLE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -71,6 +77,17 @@
}
}
+ itemDef
+ {
+ name infopane_model
+ ownerdraw UI_AUPGRADEINFOPANEMODEL
+ rect (INFO_X+INFO_W-MODEL_W+1) (INFO_Y+INFO_H-MODEL_H+1) MODEL_W MODEL_H
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER
+ visible MENU_TRUE
+ decoration
+ }
+
itemDef
{
name infopane
@@ -83,8 +100,9 @@
textvalign VALIGN_TOP
textalignx INFO_TOFF
textaligny INFO_TOFF
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_SQUARE ALIENS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
diff --git a/assets/ui/tremulous_common_hud.h b/assets/ui/tremulous_common_hud.h
index 4fb857b02..6fb32aec0 100644
--- a/assets/ui/tremulous_common_hud.h
+++ b/assets/ui/tremulous_common_hud.h
@@ -168,7 +168,7 @@ itemDef
forecolor 1 1 1 1
textscale 0.3
ownerdraw CG_DEMO_PLAYBACK
- background "ui/assets/forwardarrow.tga"
+ background "ui/assets/forwardarrow.png"
}
//SNAPSHOT
diff --git a/assets/ui/tremulous_default_hud.menu b/assets/ui/tremulous_default_hud.menu
index 8d1034b0f..61bafd56c 100644
--- a/assets/ui/tremulous_default_hud.menu
+++ b/assets/ui/tremulous_default_hud.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
diff --git a/assets/ui/tremulous_dialogs.menu b/assets/ui/tremulous_dialogs.menu
index 63109dc0e..b744e5436 100644
--- a/assets/ui/tremulous_dialogs.menu
+++ b/assets/ui/tremulous_dialogs.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -22,7 +23,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_EMPTY
popup
@@ -31,13 +32,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
diff --git a/assets/ui/tremulous_human_hud.menu b/assets/ui/tremulous_human_hud.menu
index f2b4ca991..7c58494d8 100644
--- a/assets/ui/tremulous_human_hud.menu
+++ b/assets/ui/tremulous_human_hud.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
diff --git a/assets/ui/tremulous_humanarmoury.menu b/assets/ui/tremulous_humanarmoury.menu
index 2df829fe6..df13efcda 100644
--- a/assets/ui/tremulous_humanarmoury.menu
+++ b/assets/ui/tremulous_humanarmoury.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -21,6 +22,9 @@
#define INFO_Y BORDER
#define INFO_TOFF 6
+#define MODEL_W (32*4+2*BORDER)
+#define MODEL_H (24*4)
+
#define BUTT_X INFO_X
#define BUTT_W (INFO_W/3)
@@ -31,7 +35,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor HUMANS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen
@@ -46,13 +50,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor HUMANS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor HUMANS_WINDOW_BORDER
+ borderStyle HUMANS_WINDOW_BORDER_STYLE
}
itemDef
@@ -66,8 +71,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMHUMANARMOURYBUY
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle HUMANS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE HUMANS_BORDER_STYLE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -91,8 +97,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMHUMANARMOURYSELL
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_SQUARE HUMANS_BORDER_STYLE HUMANS_BORDER_STYLE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -105,6 +112,17 @@
}
}
+ itemDef
+ {
+ name infopane_model
+ ownerdraw UI_HBUYINFOPANEMODEL
+ rect (INFO_X+INFO_W-MODEL_W+1) (INFO_Y+INFO_H-MODEL_H+1) MODEL_W MODEL_H
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER
+ visible MENU_TRUE
+ decoration
+ }
+
itemDef
{
name infopane
diff --git a/assets/ui/tremulous_humanbuild.menu b/assets/ui/tremulous_humanbuild.menu
index 572957bbf..031841040 100644
--- a/assets/ui/tremulous_humanbuild.menu
+++ b/assets/ui/tremulous_humanbuild.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,6 +21,9 @@
#define INFO_Y BORDER
#define INFO_TOFF 6
+#define MODEL_W (32*4+2*BORDER)
+#define MODEL_H (24*4)
+
menuDef
{
name "tremulous_humanbuild"
@@ -27,7 +31,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor HUMANS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen { uiScript LoadHumanBuilds; setFocus list }
@@ -37,13 +41,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor HUMANS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor HUMANS_WINDOW_BORDER
+ borderStyle HUMANS_WINDOW_BORDER_STYLE
}
itemDef
@@ -57,8 +62,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMHUMANBUILD
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle HUMANS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE HUMANS_BORDER_STYLE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -71,6 +77,17 @@
}
}
+ itemDef
+ {
+ name infopane_model
+ ownerdraw UI_HBUILDINFOPANEMODEL
+ rect (INFO_X+INFO_W-MODEL_W+1) (INFO_Y+INFO_H-MODEL_H+1) MODEL_W MODEL_H
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER
+ visible MENU_TRUE
+ decoration
+ }
+
itemDef
{
name infopane
@@ -83,8 +100,9 @@
textvalign VALIGN_TOP
textalignx INFO_TOFF
textaligny INFO_TOFF
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_SQUARE HUMANS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
visible MENU_TRUE
diff --git a/assets/ui/tremulous_humandialogs.menu b/assets/ui/tremulous_humandialogs.menu
index 96ba08a80..228b867da 100644
--- a/assets/ui/tremulous_humandialogs.menu
+++ b/assets/ui/tremulous_humandialogs.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -22,7 +23,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor HUMANS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_EMPTY
popup
@@ -31,13 +32,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor HUMANS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor HUMANS_WINDOW_BORDER
+ borderStyle HUMANS_WINDOW_BORDER_STYLE
}
itemDef
diff --git a/assets/ui/tremulous_humanitem.menu b/assets/ui/tremulous_humanitem.menu
index 551334beb..885b95d67 100644
--- a/assets/ui/tremulous_humanitem.menu
+++ b/assets/ui/tremulous_humanitem.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,6 +21,9 @@
#define INFO_Y BORDER
#define INFO_TOFF 6
+#define MODEL_W (32*4+2*BORDER)
+#define MODEL_H (24*4)
+
menuDef
{
name "tremulous_humanitem"
@@ -27,7 +31,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor HUMANS_WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen { uiScript LoadHumanItems; setFocus list }
@@ -37,13 +41,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor HUMANS_WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor HUMANS_WINDOW_BORDER
+ borderStyle HUMANS_WINDOW_BORDER_STYLE
}
itemDef
@@ -57,8 +62,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMHUMANITEMS
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle HUMANS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE HUMANS_BORDER_STYLE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -71,6 +77,17 @@
}
}
+ itemDef
+ {
+ name infopane_model
+ ownerdraw UI_HITEMINFOPANEMODEL
+ rect (INFO_X+INFO_W-MODEL_W+1) (INFO_Y+INFO_H-MODEL_H+1) MODEL_W MODEL_H
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER
+ visible MENU_TRUE
+ decoration
+ }
+
itemDef
{
name infopane
@@ -83,8 +100,9 @@
textvalign VALIGN_TOP
textalignx INFO_TOFF
textaligny INFO_TOFF
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_SQUARE HUMANS_BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
diff --git a/assets/ui/tremulous_spectator_hud.menu b/assets/ui/tremulous_spectator_hud.menu
index b4a5ff1af..c085233c3 100644
--- a/assets/ui/tremulous_spectator_hud.menu
+++ b/assets/ui/tremulous_spectator_hud.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
diff --git a/assets/ui/tremulous_teamselect.menu b/assets/ui/tremulous_teamselect.menu
index 70512748c..bf511a451 100644
--- a/assets/ui/tremulous_teamselect.menu
+++ b/assets/ui/tremulous_teamselect.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -20,6 +21,9 @@
#define INFO_Y BORDER
#define INFO_TOFF 6
+#define MODEL_W (32*4+2*BORDER)
+#define MODEL_H (24*4)
+
menuDef
{
name "tremulous_teamselect"
@@ -27,7 +31,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen { uiScript LoadTeams; setFocus list }
@@ -37,13 +41,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 1
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
@@ -57,8 +62,9 @@
textscale .33
elementtype LISTBOX_TEXT
feeder FEEDER_TREMTEAMS
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_STYLE BORDER_SQUARE BORDER_SQUARE BORDER_STYLE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
@@ -71,6 +77,17 @@
}
}
+ itemDef
+ {
+ name infopane_model
+ ownerdraw UI_TEAMINFOPANEMODEL
+ rect (INFO_X+INFO_W-MODEL_W+1) (INFO_Y+INFO_H-MODEL_H+1) MODEL_W MODEL_H
+ style WINDOW_STYLE_EMPTY
+ aspectBias ALIGN_CENTER
+ visible MENU_TRUE
+ decoration
+ }
+
itemDef
{
name infopane
@@ -83,8 +100,9 @@
textvalign VALIGN_TOP
textalignx INFO_TOFF
textaligny INFO_TOFF
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
bordercolor 0.5 0.5 0.5 0.5
+ borderStyle BORDER_SQUARE BORDER_STYLE BORDER_SQUARE BORDER_SQUARE
forecolor 1 1 1 1
backcolor 0.2 0.2 0.2 1
outlinecolor 0.1 0.1 0.1 0.5
diff --git a/assets/ui/tremulous_voicecmd.menu b/assets/ui/tremulous_voicecmd.menu
index 1b5ac8b80..bd771ee67 100644
--- a/assets/ui/tremulous_voicecmd.menu
+++ b/assets/ui/tremulous_voicecmd.menu
@@ -1,4 +1,5 @@
#include "ui/menudef.h"
+#include "ui/menustyle.h"
{
@@ -27,7 +28,7 @@
fullscreen MENU_FALSE
outOfBoundsClick
rect (320-(W/2)) (240-(H/2)) W H
- focusColor 1 .75 0 1
+ focusColor WINDOW_FOCUSCOLOR
style WINDOW_STYLE_FILLED
popup
onOpen
@@ -41,13 +42,14 @@
name window
rect 0 0 W H
style WINDOW_STYLE_FILLED
- backcolor 0 0 0 .75
+ backcolor WINDOW_BACKCOLOR
visible MENU_TRUE
decoration
- border WINDOW_BORDER_FULL
+ border WINDOW_BORDER_ROUNDED
borderSize 1.0
- borderColor 0.5 0.5 0.5 1
+ borderColor WINDOW_BORDER
+ borderStyle WINDOW_BORDER_STYLE
}
itemDef
diff --git a/misc/tremulous.ico b/misc/tremulous.ico
index c1c847a6c..1ff7b41a4 100644
Binary files a/misc/tremulous.ico and b/misc/tremulous.ico differ
diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c
index 7d7596b6d..9fb76a74c 100644
--- a/src/cgame/cg_buildable.c
+++ b/src/cgame/cg_buildable.c
@@ -96,6 +96,7 @@ void CG_HumanBuildableExplosion( vec3_t origin, vec3_t dir )
#define CREEP_SIZE 64.0f
#define CREEP_DISTANCE 64.0f
+#define CREEP_FRAMES 550
/*
==================
@@ -109,7 +110,8 @@ static void CG_Creep( centity_t *cent )
trace_t tr;
vec3_t temp, origin;
int scaleUpTime = BG_Buildable( cent->currentState.modelindex )->buildTime;
- int time;
+ int time, frame;
+ int animatedCreep = cg_animatedCreep.integer;
time = cent->currentState.time;
@@ -139,11 +141,24 @@ static void CG_Creep( centity_t *cent )
VectorCopy( tr.endpos, origin );
- size = CREEP_SIZE * frac;
- if( size > 0.0f && tr.fraction < 1.0f )
- CG_ImpactMark( cgs.media.creepShader, origin, cent->currentState.origin2,
- 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, qfalse, size, qtrue );
+ if (animatedCreep > 0)
+ {
+ frame = (int)((float)(CREEP_FRAMES - 1) * frac);
+
+ if( frac > 0.0f && tr.fraction < 1.0f )
+ CG_ImpactMark( cgs.media.creepAnimationShader[ frame ], origin, cent->currentState.origin2,
+ 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, qfalse, CREEP_SIZE, qtrue );
+ }
+ else
+ {
+ size = CREEP_SIZE * frac;
+
+ if( size > 0.0f && tr.fraction < 1.0f )
+ CG_ImpactMark( cgs.media.creepShader, origin, cent->currentState.origin2,
+ 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, qfalse, size, qtrue );
+ }
+
}
/*
@@ -596,56 +611,73 @@ CG_GhostBuildable
*/
void CG_GhostBuildable( buildable_t buildable )
{
- refEntity_t ent;
+ refEntity_t ent[MAX_BUILDABLE_MODELS];
playerState_t *ps;
vec3_t angles, entity_origin;
vec3_t mins, maxs;
trace_t tr;
float scale;
+ int i;
ps = &cg.predictedPlayerState;
-
- memset( &ent, 0, sizeof( ent ) );
+ for( i = 0; i < MAX_BUILDABLE_MODELS; i++ )
+ {
+ memset( &(ent[i]), 0, sizeof( ent[i] ) );
+ }
BG_BuildableBoundingBox( buildable, mins, maxs );
BG_PositionBuildableRelativeToPlayer( ps, mins, maxs, CG_Trace, entity_origin, angles, &tr );
if( cg_rangeMarkerForBlueprint.integer && tr.entityNum != ENTITYNUM_NONE )
- CG_GhostBuildableRangeMarker( buildable, entity_origin, tr.plane.normal );
+ CG_GhostBuildableRangeMarker( buildable, entity_origin, tr.plane.normal, 0.7f );
- CG_PositionAndOrientateBuildable( ps->viewangles, entity_origin, tr.plane.normal, ps->clientNum,
- mins, maxs, ent.axis, ent.origin );
+ CG_PositionAndOrientateBuildable( angles, entity_origin, tr.plane.normal, ps->clientNum,
+ mins, maxs, ent[0].axis, ent[0].origin );
//offset on the Z axis if required
- VectorMA( ent.origin, BG_BuildableConfig( buildable )->zOffset, tr.plane.normal, ent.origin );
-
- VectorCopy( ent.origin, ent.lightingOrigin );
- VectorCopy( ent.origin, ent.oldorigin ); // don't positionally lerp at all
+ VectorMA( ent[0].origin, BG_BuildableConfig( buildable )->zOffset, tr.plane.normal, ent[0].origin );
- ent.hModel = cg_buildables[ buildable ].models[ 0 ];
- if( ps->stats[ STAT_BUILDABLE ] & SB_VALID_TOGGLEBIT )
- ent.customShader = cgs.media.greenBuildShader;
- else
- ent.customShader = cgs.media.redBuildShader;
-
- //rescale the model
scale = BG_BuildableConfig( buildable )->modelScale;
- if( scale != 1.0f )
+ for( i = 0; i < MAX_BUILDABLE_MODELS; i++ )
{
- VectorScale( ent.axis[ 0 ], scale, ent.axis[ 0 ] );
- VectorScale( ent.axis[ 1 ], scale, ent.axis[ 1 ] );
- VectorScale( ent.axis[ 2 ], scale, ent.axis[ 2 ] );
+ if( cg_buildables[ buildable ].models[ i ] )
+ {
+ if (i != 0)
+ {
+ VectorCopy( ent[0].origin, ent[i].origin );
+ AxisCopy( ent[0].axis, ent[i].axis );
+ }
- ent.nonNormalizedAxes = qtrue;
- }
- else
- ent.nonNormalizedAxes = qfalse;
+ VectorCopy( ent[i].origin, ent[i].lightingOrigin );
+ VectorCopy( ent[i].origin, ent[i].oldorigin ); // don't positionally lerp at all
- // add to refresh list
- trap_R_AddRefEntityToScene( &ent );
+ ent[i].hModel = cg_buildables[ buildable ].models[ i ];
+ ent[i].frame = cg_buildables[ buildable ].animations[ BANIM_CONSTRUCT1 ].firstFrame;
+
+ if( ps->stats[ STAT_BUILDABLE ] & SB_VALID_TOGGLEBIT )
+ ent[i].customShader = cgs.media.greenBuildShader;
+ else
+ ent[i].customShader = cgs.media.redBuildShader;
+
+ //rescale the model
+ if( scale != 1.0f )
+ {
+ VectorScale( ent[i].axis[ 0 ], scale, ent[i].axis[ 0 ] );
+ VectorScale( ent[i].axis[ 1 ], scale, ent[i].axis[ 1 ] );
+ VectorScale( ent[i].axis[ 2 ], scale, ent[i].axis[ 2 ] );
+
+ ent[i].nonNormalizedAxes = qtrue;
+ }
+ else
+ ent[i].nonNormalizedAxes = qfalse;
+
+ // add to refresh list
+ trap_R_AddRefEntityToScene( &ent[i] );
+ }
+ }
}
/*
@@ -1474,6 +1506,7 @@ void CG_Buildable( centity_t *cent )
{
// only light up the powered buildables.
if ( es->eFlags & EF_B_POWERED )
- CG_GhostBuildableRangeMarker( es->modelindex, ent.origin, surfNormal );
+ CG_GhostBuildableRangeMarker( es->modelindex, ent.origin, surfNormal,
+ CG_RangeMarkerAnimation( cent ) );
}
}
diff --git a/src/cgame/cg_consolecmds.c b/src/cgame/cg_consolecmds.c
index 90e2e2d66..7a75c1980 100644
--- a/src/cgame/cg_consolecmds.c
+++ b/src/cgame/cg_consolecmds.c
@@ -133,13 +133,13 @@ void CG_ClientList_f( void )
int i;
int count = 0;
- for( i = 0; i < MAX_CLIENTS; i++ )
+ for( i = 0; i < MAX_CLIENTS; i++ )
{
ci = &cgs.clientinfo[ i ];
- if( !ci->infoValid )
+ if( !ci->infoValid )
continue;
- switch( ci->team )
+ switch( ci->team )
{
case TEAM_ALIENS:
Com_Printf( "%2d " S_COLOR_RED "A " S_COLOR_WHITE "%s\n", i,
@@ -193,7 +193,7 @@ static void CG_UIMenu_f( void )
static void CG_KillMessage_f( void )
{
- char msg1[ 33 * 3 + 1];
+ char msg1[ 33 * 3 + 1];
char msg2[ 33 * 3 + 1 ];
trap_Argv( 1, msg1, sizeof(msg1) );
trap_Argv( 2, msg2, sizeof(msg2) );
@@ -316,7 +316,7 @@ qboolean CG_Console_CompleteArgument( int argNum )
return qtrue;
}
#endif
-
+
/*
=================
CG_InitConsoleCommands
@@ -361,6 +361,9 @@ void CG_InitConsoleCommands( void )
trap_AddCommand( "teamvote" );
trap_AddCommand( "class" );
trap_AddCommand( "build" );
+ trap_AddCommand( "rotatebuild" );
+ trap_AddCommand( "rotatebuildleft" );
+ trap_AddCommand( "rotatebuildright" );
trap_AddCommand( "buy" );
trap_AddCommand( "sell" );
trap_AddCommand( "reload" );
diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c
index 38c957877..8a857231e 100644
--- a/src/cgame/cg_draw.c
+++ b/src/cgame/cg_draw.c
@@ -240,6 +240,58 @@ void CG_DrawField( float x, float y, int width, float cw, float ch, int value )
}
}
+static void CG_DrawNewProgressBar( rectDef_t *rect, vec4_t color,
+ vec4_t backColor, float scale, int align,
+ int textalign, int textStyle, float borderSize,
+ float progress )
+{
+ float rimWidth;
+ float doneWidth, leftWidth;
+ float tx, ty;
+ char textBuffer[ 8 ];
+ float borderStyle[ 4 ];
+
+ borderStyle[0] = BORDER_FOLD;
+ borderStyle[1] = BORDER_FOLD;
+ borderStyle[2] = BORDER_FOLD;
+ borderStyle[3] = BORDER_FOLD;
+
+ if( borderSize >= 0.0f )
+ rimWidth = borderSize;
+ else
+ {
+ rimWidth = rect->h / 20.0f;
+ if( rimWidth < 0.6f )
+ rimWidth = 0.6f;
+ }
+
+ if( progress < 0.0f )
+ progress = 0.0f;
+ else if( progress > 1.0f )
+ progress = 1.0f;
+
+ doneWidth = ( rect->w - (8 + 6) * rimWidth ) * progress + 6 * rimWidth;
+
+ //draw rim and bar
+ CG_DrawRoundedRect(rect->x, rect->y, rect->w, rect->h, rimWidth, borderStyle, color);
+ CG_FillRoundedRect(
+ rect->x + rimWidth * 4,
+ rect->y + rimWidth * 4,
+ doneWidth,
+ rect->h - rimWidth * 8,
+ rimWidth, borderStyle, backColor);
+
+
+ //draw text
+ if( scale > 0.0 )
+ {
+ Com_sprintf( textBuffer, sizeof( textBuffer ), "%d%%", (int)( progress * 100 ) );
+ CG_AlignText( rect, textBuffer, scale, 0.0f, 0.0f, textalign, VALIGN_CENTER, &tx, &ty );
+
+ UI_Text_Paint( tx, ty, scale, color, textBuffer, 0, 0, textStyle );
+ }
+}
+
static void CG_DrawProgressBar( rectDef_t *rect, vec4_t color, float scale,
int align, int textalign, int textStyle,
float borderSize, float progress )
@@ -686,8 +738,8 @@ static void CG_DrawPlayerAmmoValue( rectDef_t *rect, vec4_t color )
scale = 0.50;
else if( len <= 6 )
scale = 0.43;
- else if( len == 7 )
- scale = 0.36;
+ else if( len == 7 )
+ scale = 0.36;
else if( len == 8 )
scale = 0.33;
else
@@ -1087,11 +1139,11 @@ static void CG_DrawProgressLabel( rectDef_t *rect, float text_x, float text_y, v
s, 0, 0, ITEM_TEXTSTYLE_NEON );
}
-static void CG_DrawMediaProgress( rectDef_t *rect, vec4_t color, float scale,
+static void CG_DrawMediaProgress( rectDef_t *rect, vec4_t color, vec4_t backColor, float scale,
int align, int textalign, int textStyle,
float borderSize )
{
- CG_DrawProgressBar( rect, color, scale, align, textalign, textStyle,
+ CG_DrawNewProgressBar( rect, color, backColor, scale, align, textalign, textStyle,
borderSize, cg.mediaFraction );
}
@@ -1102,11 +1154,11 @@ static void CG_DrawMediaProgressLabel( rectDef_t *rect, float text_x, float text
"Map and Textures", cg.mediaFraction );
}
-static void CG_DrawBuildablesProgress( rectDef_t *rect, vec4_t color,
+static void CG_DrawBuildablesProgress( rectDef_t *rect, vec4_t color, vec4_t backColor,
float scale, int align, int textalign,
int textStyle, float borderSize )
{
- CG_DrawProgressBar( rect, color, scale, align, textalign, textStyle,
+ CG_DrawNewProgressBar( rect, color, backColor, scale, align, textalign, textStyle,
borderSize, cg.buildablesFraction );
}
@@ -1117,11 +1169,11 @@ static void CG_DrawBuildablesProgressLabel( rectDef_t *rect, float text_x, float
"Buildable Models", cg.buildablesFraction );
}
-static void CG_DrawCharModelProgress( rectDef_t *rect, vec4_t color,
+static void CG_DrawCharModelProgress( rectDef_t *rect, vec4_t color, vec4_t backColor,
float scale, int align, int textalign,
int textStyle, float borderSize )
{
- CG_DrawProgressBar( rect, color, scale, align, textalign, textStyle,
+ CG_DrawNewProgressBar( rect, color, backColor, scale, align, textalign, textStyle,
borderSize, cg.charModelFraction );
}
@@ -1132,7 +1184,7 @@ static void CG_DrawCharModelProgressLabel( rectDef_t *rect, float text_x, float
"Character Models", cg.charModelFraction );
}
-static void CG_DrawOverallProgress( rectDef_t *rect, vec4_t color, float scale,
+static void CG_DrawOverallProgress( rectDef_t *rect, vec4_t color, vec4_t backColor, float scale,
int align, int textalign, int textStyle,
float borderSize )
{
@@ -1141,7 +1193,7 @@ static void CG_DrawOverallProgress( rectDef_t *rect, vec4_t color, float scale,
total = cg.charModelFraction + cg.buildablesFraction + cg.mediaFraction;
total /= 3.0f;
- CG_DrawProgressBar( rect, color, scale, align, textalign, textStyle,
+ CG_DrawNewProgressBar( rect, color, backColor, scale, align, textalign, textStyle,
borderSize, total );
}
@@ -1443,6 +1495,68 @@ static void CG_DrawTeamLabel( rectDef_t *rect, team_t team, float text_x, float
UI_Text_Paint( text_x + tx, text_y + ty, scale, color, s, 0, 0, textStyle );
}
+/*
+==================
+CG_DrawTeamStatus
+==================
+*/
+static void CG_DrawTeamStatus( rectDef_t *rect, float text_x, float text_y,
+ vec4_t color, float scale, int textalign, int textvalign, int textStyle )
+{
+ char s[ MAX_TOKEN_CHARS ];
+ float tx, ty;
+
+ if( cg.intermissionStarted )
+ return;
+
+ if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_NONE )
+ return;
+
+ if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
+ {
+ alienStates_t *alienStates = &cgs.alienStates;
+ int fullHealth = BG_Buildable(BA_A_OVERMIND)->health;
+ Com_sprintf( s, MAX_TOKEN_CHARS, "^7%s[overmind](%s%i/%i^7) [egg](%s%i^7) [granger](%s%i^7) [booster](%s%i^7)",
+ alienStates->omBuilding ? "[upgrade]" : (alienStates->omHealth ? "" : "[!]"),
+ ((alienStates->omHealth > fullHealth / 2) ? "^2" : ((alienStates->omHealth > fullHealth / 4) ? "^3" : "^1" )),
+ alienStates->omHealth,
+ fullHealth,
+ !alienStates->spawns ? "^1" : "^2",
+ alienStates->spawns,
+ !alienStates->builders ? ((!alienStates->spawns || !alienStates->omHealth) ? "^1" : "^0") : "^2",
+ alienStates->builders,
+ !alienStates->boosters ? (BG_BuildableAllowedInStage(BA_A_BOOSTER, cgs.alienStage) ? "^1" : "^0") : "^2",
+ alienStates->boosters
+ );
+ }
+ else if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
+ {
+ humanStates_t *humanStates = &cgs.humanStates;
+ int fullHealth = BG_Buildable(BA_H_REACTOR)->health;
+ Com_sprintf( s, MAX_TOKEN_CHARS, "^7%s[reactor](%s%i/%i^7) [telenode](%s%i^7) [ckit](%s%i^7) [armoury](%s%i^7) [medstat](%s%i^7) [defcomp](%s%i^7)",
+ (humanStates->rcBuilding ? "[upgrade]" : (humanStates->rcHealth ? "" : "[!]")),
+ ((humanStates->rcHealth > fullHealth / 2) ? "^2" : ((humanStates->rcHealth > fullHealth / 4) ? "^3" : "^1" )),
+ humanStates->rcHealth,
+ fullHealth,
+ !humanStates->spawns ? "^1" : "^2",
+ humanStates->spawns,
+ !humanStates->builders ? ((!humanStates->spawns || !humanStates->rcHealth) ? "^1" : "^0") : "^2",
+ humanStates->builders,
+ !humanStates->armourys ? "^1" : "^2",
+ humanStates->armourys,
+ !humanStates->medicals ? "^1" : "^2",
+ humanStates->medicals,
+ !humanStates->computers ? (BG_BuildableAllowedInStage(BA_H_DCC, cgs.humanStage) ? "^1" : "^0") : "^2",
+ humanStates->computers
+ );
+ }
+
+ CG_AlignText( rect, s, scale, 0.0f, 0.0f, textalign, textvalign, &tx, &ty );
+
+ UI_Text_Paint( text_x + tx, text_y + ty, scale, color, s, 0, 0, textStyle );
+}
+
+
/*
==================
CG_DrawStageReport
@@ -1713,9 +1827,9 @@ static int QDECL SortWeaponClass( const void *a, const void *b )
// We want grangers on top. ckits are already on top without the special case.
if( ca->team == TEAM_ALIENS )
{
- if( ca->curWeaponClass == PCL_ALIEN_BUILDER0_UPG ||
+ if( ca->curWeaponClass == PCL_ALIEN_BUILDER0_UPG ||
cb->curWeaponClass == PCL_ALIEN_BUILDER0_UPG ||
- ca->curWeaponClass == PCL_ALIEN_BUILDER0 ||
+ ca->curWeaponClass == PCL_ALIEN_BUILDER0 ||
cb->curWeaponClass == PCL_ALIEN_BUILDER0 )
{
out = -out;
@@ -1778,9 +1892,9 @@ static void CG_DrawTeamOverlay( rectDef_t *rect, float scale, vec4_t color )
displayClients[ maxDisplayCount++ ] = i;
else
{
- if( ci->curWeaponClass == PCL_ALIEN_BUILDER0 ||
+ if( ci->curWeaponClass == PCL_ALIEN_BUILDER0 ||
ci->curWeaponClass == PCL_ALIEN_BUILDER0_UPG ||
- ci->curWeaponClass == PCL_ALIEN_LEVEL1 ||
+ ci->curWeaponClass == PCL_ALIEN_LEVEL1 ||
ci->curWeaponClass == PCL_ALIEN_LEVEL1_UPG ||
ci->curWeaponClass == WP_HBUILD )
{
@@ -1798,7 +1912,7 @@ static void CG_DrawTeamOverlay( rectDef_t *rect, float scale, vec4_t color )
vec3_t relOrigin = { 0.0f, 0.0f, 0.0f };
int team = cent->currentState.misc & 0x00FF;
- if( cent->currentState.eType != ET_PLAYER ||
+ if( cent->currentState.eType != ET_PLAYER ||
team != pci->team ||
cent->currentState.eFlags & EF_DEAD )
{
@@ -1871,7 +1985,7 @@ static void CG_DrawTeamOverlay( rectDef_t *rect, float scale, vec4_t color )
{
if( ci->upgrade != UP_NONE )
{
- CG_DrawPic( x + iconSize + leftMargin, y, iconSize,
+ CG_DrawPic( x + iconSize + leftMargin, y, iconSize,
iconSize, cg_upgrades[ ci->upgrade ].upgradeIcon );
}
}
@@ -1880,7 +1994,7 @@ static void CG_DrawTeamOverlay( rectDef_t *rect, float scale, vec4_t color )
if( curWeapon == WP_ABUILD2 || curWeapon == WP_ALEVEL1_UPG ||
curWeapon == WP_ALEVEL2_UPG || curWeapon == WP_ALEVEL3_UPG )
{
- CG_DrawPic( x + iconSize + leftMargin, y, iconSize,
+ CG_DrawPic( x + iconSize + leftMargin, y, iconSize,
iconSize, cgs.media.upgradeClassIconShader );
}
}
@@ -1894,13 +2008,13 @@ static void CG_DrawTeamOverlay( rectDef_t *rect, float scale, vec4_t color )
trap_R_SetColor( NULL );
nameMaxX = nameMaxXCp = x + 2.0f * iconSize +
leftMargin + midSep + nameWidth;
- UI_Text_Paint_Limit( &nameMaxXCp, x + 2.0f * iconSize + leftMargin + midSep,
+ UI_Text_Paint_Limit( &nameMaxXCp, x + 2.0f * iconSize + leftMargin + midSep,
y + iconSize - iconTopMargin, fontScale, tcolor, name,
0, 0 );
maxXCp = maxX;
- UI_Text_Paint_Limit( &maxXCp, nameMaxX, y + iconSize - iconTopMargin,
+ UI_Text_Paint_Limit( &maxXCp, nameMaxX, y + iconSize - iconTopMargin,
fontScale, tcolor, s, 0, 0 );
y += iconSize;
displayCount++;
@@ -2919,6 +3033,9 @@ void CG_OwnerDraw( float x, float y, float w, float h, float text_x,
case CG_PLAYER_CROSSHAIR:
CG_DrawCrosshair( &rect, foreColor );
break;
+ case CG_TEAM_STATUS:
+ CG_DrawTeamStatus( &rect, text_x, text_y, foreColor, scale, textalign, textvalign, textStyle );
+ break;
case CG_STAGE_REPORT_TEXT:
CG_DrawStageReport( &rect, text_x, text_y, foreColor, scale, textalign, textvalign, textStyle );
break;
@@ -2934,28 +3051,28 @@ void CG_OwnerDraw( float x, float y, float w, float h, float text_x,
CG_DrawLevelShot( &rect );
break;
case CG_LOAD_MEDIA:
- CG_DrawMediaProgress( &rect, foreColor, scale, align, textalign, textStyle,
+ CG_DrawMediaProgress( &rect, foreColor, backColor, scale, align, textalign, textStyle,
borderSize );
break;
case CG_LOAD_MEDIA_LABEL:
CG_DrawMediaProgressLabel( &rect, text_x, text_y, foreColor, scale, textalign, textvalign );
break;
case CG_LOAD_BUILDABLES:
- CG_DrawBuildablesProgress( &rect, foreColor, scale, align, textalign,
+ CG_DrawBuildablesProgress( &rect, foreColor, backColor, scale, align, textalign,
textStyle, borderSize );
break;
case CG_LOAD_BUILDABLES_LABEL:
CG_DrawBuildablesProgressLabel( &rect, text_x, text_y, foreColor, scale, textalign, textvalign );
break;
case CG_LOAD_CHARMODEL:
- CG_DrawCharModelProgress( &rect, foreColor, scale, align, textalign,
+ CG_DrawCharModelProgress( &rect, foreColor, backColor, scale, align, textalign,
textStyle, borderSize );
break;
case CG_LOAD_CHARMODEL_LABEL:
CG_DrawCharModelProgressLabel( &rect, text_x, text_y, foreColor, scale, textalign, textvalign );
break;
case CG_LOAD_OVERALL:
- CG_DrawOverallProgress( &rect, foreColor, scale, align, textalign, textStyle,
+ CG_DrawOverallProgress( &rect, foreColor, backColor, scale, align, textalign, textStyle,
borderSize );
break;
case CG_LOAD_LEVELNAME:
@@ -3314,16 +3431,16 @@ static void CG_DrawVote( team_t team )
if( cg_tutorial.integer )
{
- Com_sprintf( yeskey, sizeof( yeskey ), "[%s]",
+ Com_sprintf( yeskey, sizeof( yeskey ), "[%s]",
CG_KeyBinding( va( "%svote yes", team == TEAM_NONE ? "" : "team" ) ) );
- Com_sprintf( nokey, sizeof( nokey ), "[%s]",
+ Com_sprintf( nokey, sizeof( nokey ), "[%s]",
CG_KeyBinding( va( "%svote no", team == TEAM_NONE ? "" : "team" ) ) );
}
if( team != TEAM_NONE )
offset = 80;
- s = va( "%sVOTE(%i): %s",
+ s = va( "%sVOTE(%i): %s",
team == TEAM_NONE ? "" : "TEAM", sec, cgs.voteString[ team ] );
UI_Text_Paint( 8, 300 + offset, 0.3f, white, s, 0, 0,
diff --git a/src/cgame/cg_drawtools.c b/src/cgame/cg_drawtools.c
index cc8533a43..b6d1abc96 100644
--- a/src/cgame/cg_drawtools.c
+++ b/src/cgame/cg_drawtools.c
@@ -99,23 +99,6 @@ void CG_AdjustFrom640( float *x, float *y, float *w, float *h )
*h *= cgs.screenYScale;
}
-/*
-================
-CG_FillRect
-
-Coordinates are 640*480 virtual values
-=================
-*/
-void CG_FillRect( float x, float y, float width, float height, const float *color )
-{
- trap_R_SetColor( color );
-
- CG_AdjustFrom640( &x, &y, &width, &height );
- trap_R_DrawStretchPic( x, y, width, height, 0, 0, 0, 0, cgs.media.whiteShader );
-
- trap_R_SetColor( NULL );
-}
-
/*
================
@@ -144,6 +127,56 @@ void CG_DrawTopBottom( float x, float y, float w, float h, float size )
trap_R_DrawStretchPic( x, y + h - size, w, size, 0, 0, 0, 0, cgs.media.whiteShader );
}
+static void CG_DrawCorners( float x, float y, float w, float h, float size, const float *style, qhandle_t *pic )
+{
+ float hs, vs;
+ CG_AdjustFrom640( &x, &y, &w, &h );
+ hs = size * cgs.screenXScale;
+ vs = size * cgs.screenYScale;
+
+ trap_R_DrawStretchPic( x, y, hs , vs, 0, 0, 0.5, 0.5, pic[(int)(style[0])] );
+ trap_R_DrawStretchPic( x + w - hs, y, hs, vs, 0.5, 0, 1, 0.5, pic[(int)(style[1])] );
+ trap_R_DrawStretchPic( x + w - hs, y + h - vs, hs, vs, 0.5, 0.5, 1, 1, pic[(int)(style[2])] );
+ trap_R_DrawStretchPic( x, y + h - vs, hs, vs, 0, 0.5, 0.5, 1, pic[(int)(style[3])] );
+}
+
+
+/*
+================
+CG_FillRect
+
+Coordinates are 640*480 virtual values
+=================
+*/
+void CG_FillRect( float x, float y, float width, float height, const float *color )
+{
+ trap_R_SetColor( color );
+
+ CG_AdjustFrom640( &x, &y, &width, &height );
+ trap_R_DrawStretchPic( x, y, width, height, 0, 0, 0, 0, cgs.media.whiteShader );
+
+ trap_R_SetColor( NULL );
+}
+
+
+/*
+================
+CG_FillRoundedRect
+Coordinates are 640*480 virtual values
+=================
+*/
+void CG_FillRoundedRect( float x, float y, float width, float height, float size, const float *style, const float *color )
+{
+ CG_FillRect( x, y + size * 3, width, height - size * 6, color );
+
+ trap_R_SetColor( color );
+
+ CG_DrawTopBottom( x + size * 3, y, width - size * 6, height, size * 3 );
+ CG_DrawCorners( x - size, y - size, width + size * 2, height + size * 2, size * 4, style, cgDC.Assets.cornerIn );
+
+ trap_R_SetColor( NULL );
+}
+
/*
================
@@ -163,6 +196,24 @@ void CG_DrawRect( float x, float y, float width, float height, float size, const
}
+/*
+================
+CG_DrawRoundedRect
+Coordinates are 640*480 virtual values
+=================
+*/
+void CG_DrawRoundedRect( float x, float y, float width, float height, float size, const float *style, const float *color )
+{
+ trap_R_SetColor( color );
+
+ CG_DrawTopBottom( x + size * 4, y, width - size * 8, height, size );
+ CG_DrawSides( x, y + size * 3, width, height - size * 6, size );
+ CG_DrawCorners( x, y, width, height, size * 4, style, cgDC.Assets.cornerOut);
+
+ trap_R_SetColor( NULL );
+}
+
+
/*
================
CG_DrawPic
diff --git a/src/cgame/cg_ents.c b/src/cgame/cg_ents.c
index 4008e56a2..3a711b41f 100644
--- a/src/cgame/cg_ents.c
+++ b/src/cgame/cg_ents.c
@@ -364,7 +364,7 @@ static void CG_WeaponDrop( centity_t *cent )
+ wi->weaponMidpoint[1] * ent.axis[1][2]
+ wi->weaponMidpoint[2] * ent.axis[2][2];
cent->lerpOrigin[2] += 8; // an extra height boost
-
+
#if 0
if( item->giType == IT_WEAPON && item->giTag == WP_RAILGUN ) {
clientInfo_t *ci = &cgs.clientinfo[cg.snap->ps.clientNum];
@@ -1086,12 +1086,12 @@ static void CG_CalcEntityLerpPositions( centity_t *cent )
{
trace_t tr;
vec3_t lastOrigin;
-
+
BG_EvaluateTrajectory( ¢->currentState.pos, cg.time, lastOrigin );
-
+
CG_Trace( &tr, lastOrigin, vec3_origin, vec3_origin, cent->lerpOrigin,
cent->currentState.number, MASK_SHOT );
-
+
// don't let the projectile go through the floor
if( tr.fraction < 1.0f )
VectorLerp2( tr.fraction, lastOrigin, cent->lerpOrigin, cent->lerpOrigin );
@@ -1279,6 +1279,7 @@ void CG_AddPacketEntities( void )
int num;
centity_t *cent;
playerState_t *ps;
+ entityState_t *es;
// set cg.frameInterpolation
if( cg.nextSnap )
@@ -1341,6 +1342,9 @@ void CG_AddPacketEntities( void )
else if( !cent->valid && cent->oldValid )
CG_CEntityPVSLeave( cent );
+ if( cent->valid != cent->oldValid )
+ cent->validTime = cg.time;
+
cent->oldValid = cent->valid;
}
@@ -1351,6 +1355,25 @@ void CG_AddPacketEntities( void )
CG_AddCEntity( cent );
}
+ if ( cg_rangeMarkerForBlueprint.integer )
+ {
+ // Keep range marker for hidding animation
+ for( num = 0; num < MAX_GENTITIES; num++ )
+ {
+ cent = &cg_entities[ num ];
+
+ if( !cent->valid && cent->currentState.eType == ET_BUILDABLE
+ && cg.time - cent->validTime < RM_ANIM_TIME)
+ {
+ es = ¢->currentState;
+ // only light up the powered buildables.
+ if ( es->eFlags & EF_B_POWERED )
+ CG_GhostBuildableRangeMarker( es->modelindex, cent->buildableCache.cachedOrigin, cent->buildableCache.cachedNormal,
+ CG_RangeMarkerAnimation( cent ) );
+ }
+ }
+ }
+
//make an attempt at drawing bounding boxes of selected entity types
if( cg_drawBBOX.integer )
{
diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h
index ecdf02d09..f7e5fd157 100644
--- a/src/cgame/cg_local.h
+++ b/src/cgame/cg_local.h
@@ -84,6 +84,8 @@ along with Tremulous; if not, see
#define TEAM_OVERLAY_MAXNAME_WIDTH 12
#define TEAM_OVERLAY_MAXLOCATION_WIDTH 16
+#define RM_ANIM_TIME 1000
+
typedef enum
{
FOOTSTEP_NORMAL,
@@ -321,7 +323,7 @@ typedef struct baseParticle_s
qboolean overdrawProtection;
qboolean realLight;
qboolean cullOnStartSolid;
-
+
float scaleWithCharge;
} baseParticle_t;
@@ -367,7 +369,7 @@ typedef struct particleSystem_s
//for PMT_LAST_NORMAL and PMT_OPPORTUNISTIC_NORMAL
qboolean lastNormalIsCurrent;
vec3_t lastNormal;
-
+
int charge;
} particleSystem_t;
@@ -476,7 +478,7 @@ typedef struct baseTrailBeam_s
// the time it takes for a beam to fade out (double attached only)
int fadeOutTime;
-
+
char shaderName[ MAX_QPATH ];
qhandle_t shader;
@@ -694,7 +696,8 @@ typedef struct centity_s
int muzzleTSDeathTime;
qboolean valid;
- qboolean oldValid;
+ qboolean oldValid;
+ int validTime;
struct centity_s *nextLocation;
} centity_t;
@@ -742,7 +745,7 @@ typedef struct
int score; // updated by score servercmds
int location; // location index for team mode
int health; // you only get this info about your teammates
- int upgrade;
+ int upgrade;
int curWeaponClass; // sends current weapon for H, current class for A
// when clientinfo is changed, the loading of models/skins/sounds
@@ -1156,13 +1159,13 @@ typedef struct
playerState_t savedPmoveStates[ NUM_SAVED_STATES ];
int stateHead, stateTail;
int ping;
-
+
float chargeMeterAlpha;
float chargeMeterValue;
qhandle_t lastHealthCross;
float healthCrossFade;
int nearUsableBuildable;
-
+
int nextWeaponClickTime;
// binary shaders - by /dev/humancontroller
int numBinaryShadersUsed;
@@ -1178,6 +1181,8 @@ typedef struct
qhandle_t level2ZapTS;
qhandle_t balloonShader;
+ qhandle_t aliensBalloonShader;
+ qhandle_t humansBalloonShader;
qhandle_t connectionShader;
qhandle_t viewBloodShader;
@@ -1187,6 +1192,8 @@ typedef struct
qhandle_t creepShader;
+ qhandle_t creepAnimationShader[550];
+
qhandle_t scannerShader;
qhandle_t scannerBlipShader;
qhandle_t scannerLineShader;
@@ -1384,6 +1391,9 @@ typedef struct
int alienNextStageThreshold;
int humanNextStageThreshold;
+ alienStates_t alienStates;
+ humanStates_t humanStates;
+
//
// locally derived information from gamestate
//
@@ -1550,6 +1560,8 @@ extern vmCvar_t cg_rangeMarkerForBlueprint;
extern vmCvar_t cg_rangeMarkerBuildableTypes;
extern vmCvar_t cg_binaryShaderScreenScale;
+extern vmCvar_t cg_animatedCreep;
+
extern vmCvar_t cg_painBlendUpRate;
extern vmCvar_t cg_painBlendDownRate;
extern vmCvar_t cg_painBlendMax;
@@ -1564,7 +1576,11 @@ extern vmCvar_t cg_debugVoices;
extern vmCvar_t ui_currentClass;
extern vmCvar_t ui_carriage;
+extern vmCvar_t ui_credit;
+extern vmCvar_t ui_ammoFull;
extern vmCvar_t ui_stages;
+extern vmCvar_t ui_alienStates;
+extern vmCvar_t ui_humanStates;
extern vmCvar_t ui_dialog;
extern vmCvar_t ui_voteActive;
extern vmCvar_t ui_alienTeamVoteActive;
@@ -1647,6 +1663,7 @@ void CG_OffsetShoulderView( void );
void CG_DrawPlane( vec3_t origin, vec3_t down, vec3_t right, qhandle_t shader );
void CG_AdjustFrom640( float *x, float *y, float *w, float *h );
void CG_FillRect( float x, float y, float width, float height, const float *color );
+void CG_FillRoundedRect( float x, float y, float width, float height, float size, const float *style, const float *color );
void CG_DrawPic( float x, float y, float width, float height, qhandle_t hShader );
void CG_DrawFadePic( float x, float y, float width, float height, vec4_t fcolor,
vec4_t tcolor, float amount, qhandle_t hShader );
@@ -1659,6 +1676,7 @@ float *CG_FadeColor( int startMsec, int totalMsec );
void CG_TileClear( void );
void CG_ColorForHealth( vec4_t hcolor );
void CG_DrawRect( float x, float y, float width, float height, float size, const float *color );
+void CG_DrawRoundedRect( float x, float y, float width, float height, float size, const float *style, const float *color );
void CG_DrawSides(float x, float y, float w, float h, float size);
void CG_DrawTopBottom(float x, float y, float w, float h, float size);
qboolean CG_WorldToScreen( vec3_t point, float *x, float *y );
@@ -1669,7 +1687,8 @@ void CG_DrawSphericalCone( const vec3_t tip, const vec3_t rotation, float
qboolean a240, int customShader, const float *shaderRGBA );
void CG_DrawRangeMarker( rangeMarkerType_t rmType, const vec3_t origin, const float *angles, float range,
qboolean drawSurface, qboolean drawIntersection, qboolean drawFrontline,
- const vec3_t rgb, float surfaceOpacity, float lineOpacity, float lineThickness );
+ const vec3_t rgb, float surfaceOpacity, float lineOpacity, float lineThickness,
+ float animation );
//
// cg_draw.c
@@ -1778,6 +1797,7 @@ void CG_RangeMarker( centity_t *cent );
//
// cg_weapons.c
//
+void CG_AutoSelectWeapon_f( void );
void CG_NextWeapon_f( void );
void CG_PrevWeapon_f( void );
void CG_Weapon_f( void );
@@ -1930,10 +1950,12 @@ qboolean CG_GetRangeMarkerPreferences( qboolean *drawSurface, qboolean *drawI
// cg_drawtools.c
void CG_DrawRangeMarker( rangeMarkerType_t rmType, const vec3_t origin, const float *angles, float range,
qboolean drawSurface, qboolean drawIntersection, qboolean drawFrontline,
- const vec3_t rgb, float surfaceOpacity, float lineOpacity, float lineThickness );
+ const vec3_t rgb, float surfaceOpacity, float lineOpacity, float lineThickness,
+ float animation);
// cg_buildable.c
+float CG_RangeMarkerAnimation(centity_t *cent);
qboolean CG_GetBuildableRangeMarkerProperties( buildable_t bType, rangeMarkerType_t *rmType, float *range, vec3_t rgb );
-void CG_GhostBuildableRangeMarker( buildable_t buildable, const vec3_t origin, const vec3_t normal );
+void CG_GhostBuildableRangeMarker( buildable_t buildable, const vec3_t origin, const vec3_t normal, float animation );
// cg_ents.c
void CG_RangeMarker( centity_t *cent );
diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c
index 7ec4ae9b3..6627740a4 100644
--- a/src/cgame/cg_main.c
+++ b/src/cgame/cg_main.c
@@ -204,6 +204,8 @@ vmCvar_t cg_rangeMarkerForBlueprint;
vmCvar_t cg_rangeMarkerBuildableTypes;
vmCvar_t cg_binaryShaderScreenScale;
+vmCvar_t cg_animatedCreep;
+
vmCvar_t cg_painBlendUpRate;
vmCvar_t cg_painBlendDownRate;
vmCvar_t cg_painBlendMax;
@@ -218,7 +220,11 @@ vmCvar_t cg_debugVoices;
vmCvar_t ui_currentClass;
vmCvar_t ui_carriage;
+vmCvar_t ui_credit;
+vmCvar_t ui_ammoFull;
vmCvar_t ui_stages;
+vmCvar_t ui_alienStates;
+vmCvar_t ui_humanStates;
vmCvar_t ui_dialog;
vmCvar_t ui_voteActive;
vmCvar_t ui_alienTeamVoteActive;
@@ -308,7 +314,7 @@ static cvarTable_t cvarTable[ ] =
{ &cg_noVoiceText, "cg_noVoiceText", "0", CVAR_ARCHIVE },
{ &cg_drawSurfNormal, "cg_drawSurfNormal", "0", CVAR_CHEAT },
{ &cg_drawBBOX, "cg_drawBBOX", "0", CVAR_CHEAT },
- { &cg_wwSmoothTime, "cg_wwSmoothTime", "300", CVAR_ARCHIVE },
+ { &cg_wwSmoothTime, "cg_wwSmoothTime", "225", CVAR_ARCHIVE },
{ NULL, "cg_wwFollow", "1", CVAR_ARCHIVE|CVAR_USERINFO },
{ NULL, "cg_wwToggle", "1", CVAR_ARCHIVE|CVAR_USERINFO },
{ NULL, "cg_disableBlueprintErrors", "0", CVAR_ARCHIVE|CVAR_USERINFO },
@@ -317,7 +323,7 @@ static cvarTable_t cvarTable[ ] =
{ &cg_unlagged, "cg_unlagged", "1", CVAR_ARCHIVE|CVAR_USERINFO },
{ NULL, "cg_flySpeed", "600", CVAR_ARCHIVE|CVAR_USERINFO },
{ &cg_depthSortParticles, "cg_depthSortParticles", "1", CVAR_ARCHIVE },
- { &cg_bounceParticles, "cg_bounceParticles", "0", CVAR_ARCHIVE },
+ { &cg_bounceParticles, "cg_bounceParticles", "1", CVAR_ARCHIVE },
{ &cg_consoleLatency, "cg_consoleLatency", "3000", CVAR_ARCHIVE },
{ &cg_lightFlare, "cg_lightFlare", "3", CVAR_ARCHIVE },
{ &cg_debugParticles, "cg_debugParticles", "0", CVAR_CHEAT },
@@ -331,8 +337,8 @@ static cvarTable_t cvarTable[ ] =
{ &cg_tutorial, "cg_tutorial", "1", CVAR_ARCHIVE },
{ &cg_rangeMarkerDrawSurface, "cg_rangeMarkerDrawSurface", "1", CVAR_ARCHIVE },
- { &cg_rangeMarkerDrawIntersection, "cg_rangeMarkerDrawIntersection", "1", CVAR_ARCHIVE },
- { &cg_rangeMarkerDrawFrontline, "cg_rangeMarkerDrawFrontline", "1", CVAR_ARCHIVE },
+ { &cg_rangeMarkerDrawIntersection, "cg_rangeMarkerDrawIntersection", "0", CVAR_ARCHIVE },
+ { &cg_rangeMarkerDrawFrontline, "cg_rangeMarkerDrawFrontline", "0", CVAR_ARCHIVE },
{ &cg_rangeMarkerSurfaceOpacity, "cg_rangeMarkerSurfaceOpacity", "0.08", CVAR_ARCHIVE },
{ &cg_rangeMarkerLineOpacity, "cg_rangeMarkerLineOpacity", "0.4", CVAR_ARCHIVE },
{ &cg_rangeMarkerLineThickness, "cg_rangeMarkerLineThickness", "4.0", CVAR_ARCHIVE },
@@ -341,6 +347,8 @@ static cvarTable_t cvarTable[ ] =
{ NULL, "cg_buildableRangeMarkerMask", "", CVAR_USERINFO },
{ &cg_binaryShaderScreenScale, "cg_binaryShaderScreenScale", "1.0", CVAR_ARCHIVE },
+ { &cg_animatedCreep, "cg_animatedCreep", "2", CVAR_ARCHIVE },
+
{ &cg_hudFiles, "cg_hudFiles", "ui/hud.txt", CVAR_ARCHIVE},
{ NULL, "cg_alienConfig", "", CVAR_ARCHIVE },
{ NULL, "cg_humanConfig", "", CVAR_ARCHIVE },
@@ -351,20 +359,24 @@ static cvarTable_t cvarTable[ ] =
{ &cg_painBlendMax, "cg_painBlendMax", "0.7", 0 },
{ &cg_painBlendScale, "cg_painBlendScale", "7.0", 0 },
{ &cg_painBlendZoom, "cg_painBlendZoom", "0.65", 0 },
-
+
{ &cg_debugVoices, "cg_debugVoices", "0", 0 },
// communication cvars set by the cgame to be read by ui
{ &ui_currentClass, "ui_currentClass", "0", CVAR_ROM },
{ &ui_carriage, "ui_carriage", "", CVAR_ROM },
+ { &ui_credit, "ui_credit", "0", CVAR_ROM },
+ { &ui_ammoFull, "ui_ammoFull", "1", CVAR_ROM },
{ &ui_stages, "ui_stages", "0 0", CVAR_ROM },
+ { &ui_alienStates, "ui_alienStates", "0 0 0 0 0", CVAR_ROM },
+ { &ui_humanStates, "ui_humanStates", "0 0 0 0 0 0", CVAR_ROM },
{ &ui_dialog, "ui_dialog", "Text not set", CVAR_ROM },
{ &ui_voteActive, "ui_voteActive", "0", CVAR_ROM },
{ &ui_humanTeamVoteActive, "ui_humanTeamVoteActive", "0", CVAR_ROM },
{ &ui_alienTeamVoteActive, "ui_alienTeamVoteActive", "0", CVAR_ROM },
{ &cg_debugRandom, "cg_debugRandom", "0", 0 },
-
+
{ &cg_optimizePrediction, "cg_optimizePrediction", "1", CVAR_ARCHIVE },
{ &cg_projectileNudge, "cg_projectileNudge", "1", CVAR_ARCHIVE },
@@ -383,7 +395,7 @@ static cvarTable_t cvarTable[ ] =
{ &pmove_fixed, "pmove_fixed", "0", 0},
{ &pmove_msec, "pmove_msec", "8", 0},
{ &cg_noTaunt, "cg_noTaunt", "0", CVAR_ARCHIVE},
-
+
{ &cg_voice, "voice", "default", CVAR_USERINFO|CVAR_ARCHIVE},
{ &cg_emoticons, "cg_emoticons", "1", CVAR_LATCH|CVAR_ARCHIVE},
@@ -424,6 +436,23 @@ void CG_RegisterCvars( void )
cgs.localServer = atoi( var );
}
+/*
+===============
+CG_DoNeedAmmo
+===============
+*/
+static qboolean CG_DoNeedAmmo( playerState_t *ps )
+{
+ weapon_t weapon = ps->stats[ STAT_WEAPON ];
+
+ if (weapon == WP_NONE)
+ return (qfalse);
+ if (BG_Weapon( weapon )->infiniteAmmo)
+ return (qfalse);
+ if (BG_WeaponIsFull( weapon, ps->stats, ps->ammo, ps->clips ))
+ return (qfalse);
+ return (qtrue);
+}
/*
===============
@@ -436,10 +465,15 @@ static void CG_SetUIVars( void )
{
int i;
char carriageCvar[ MAX_TOKEN_CHARS ];
+ int credit;
+ playerState_t *ps;
+ alienStates_t *alienStates = &cgs.alienStates;
+ humanStates_t *humanStates = &cgs.humanStates;
if( !cg.snap )
return;
+ ps = &cg.snap->ps;
*carriageCvar = 0;
//determine what the player is carrying
@@ -456,7 +490,18 @@ static void CG_SetUIVars( void )
trap_Cvar_Set( "ui_carriage", carriageCvar );
+ credit = ps->persistant[ PERS_CREDIT ];
+ trap_Cvar_Set( "ui_credit", va( "%d", credit > -1 ? credit : 0 ) );
+
+ trap_Cvar_Set( "ui_ammoFull", va( "%d", !CG_DoNeedAmmo(ps)));
+
trap_Cvar_Set( "ui_stages", va( "%d %d", cgs.alienStage, cgs.humanStage ) );
+
+ trap_Cvar_Set( "ui_alienStates", va( "%d %d %d %d %d", alienStates->omBuilding, alienStates->omHealth,
+ alienStates->spawns, alienStates->builders, alienStates->boosters ) );
+
+ trap_Cvar_Set( "ui_humanStates", va( "%d %d %d %d %d %d %d", humanStates->rcBuilding, humanStates->rcHealth,
+ humanStates->spawns, humanStates->builders, humanStates->armourys, humanStates->medicals, humanStates->computers ) );
}
/*
@@ -497,7 +542,7 @@ static void CG_SetPVars( void )
trap_Cvar_Set( "team_stage", va( "%d", cgs.humanStage+1 ) );
break;
}
-
+
trap_Cvar_Set( "player_credits", va( "%d", cg.snap->ps.persistant[ PERS_CREDIT ] ) );
trap_Cvar_Set( "player_score", va( "%d", cg.snap->ps.persistant[ PERS_SCORE ] ) );
@@ -800,6 +845,7 @@ static void CG_RegisterSounds( void )
//===================================================================================
+#define CREEP_FRAMES 550
/*
=================
CG_RegisterGraphics
@@ -810,6 +856,8 @@ This function may execute for a couple of minutes with a slow disk.
static void CG_RegisterGraphics( void )
{
int i;
+ int animatedCreep = cg_animatedCreep.integer;
+
static char *sb_nums[ 11 ] =
{
"gfx/2d/numbers/zero_32b",
@@ -852,6 +900,19 @@ static void CG_RegisterGraphics( void )
cgs.media.creepShader = trap_R_RegisterShader( "creep" );
+ if (animatedCreep > 0)
+ {
+ CG_UpdateMediaFraction( 0.67f );
+ for ( i = 0; i < CREEP_FRAMES; i++ )
+ {
+ if (i % animatedCreep == 0 || i == CREEP_FRAMES - 1)
+ cgs.media.creepAnimationShader[ i ] = trap_R_RegisterShader( va( "creep%d", i ) );
+ else
+ cgs.media.creepAnimationShader[ i ] = cgs.media.creepAnimationShader[ (i / animatedCreep) * animatedCreep ];
+ }
+ CG_UpdateMediaFraction( 0.685f );
+ }
+
cgs.media.scannerBlipShader = trap_R_RegisterShader( "gfx/2d/blip" );
cgs.media.scannerLineShader = trap_R_RegisterShader( "gfx/2d/stalk" );
@@ -876,10 +937,12 @@ static void CG_RegisterGraphics( void )
cgs.media.healthCross3X = trap_R_RegisterShader( "ui/assets/neutral/cross3.tga" );
cgs.media.healthCrossMedkit = trap_R_RegisterShader( "ui/assets/neutral/cross_medkit.tga" );
cgs.media.healthCrossPoisoned = trap_R_RegisterShader( "ui/assets/neutral/cross_poison.tga" );
-
+
cgs.media.upgradeClassIconShader = trap_R_RegisterShader( "icons/icona_upgrade.tga" );
-
+
cgs.media.balloonShader = trap_R_RegisterShader( "gfx/sprites/chatballoon" );
+ cgs.media.aliensBalloonShader = trap_R_RegisterShader( "gfx/sprites/aliens_chatballoon" );
+ cgs.media.humansBalloonShader = trap_R_RegisterShader( "gfx/sprites/humans_chatballoon" );
cgs.media.disconnectPS = CG_RegisterParticleSystem( "disconnectPS" );
@@ -905,7 +968,7 @@ static void CG_RegisterGraphics( void )
cgs.media.humanBuildableDestroyedPS = CG_RegisterParticleSystem( "humanBuildableDestroyedPS" );
cgs.media.alienBuildableDestroyedPS = CG_RegisterParticleSystem( "alienBuildableDestroyedPS" );
- cgs.media.humanBuildableBleedPS = CG_RegisterParticleSystem( "humanBuildableBleedPS");
+ cgs.media.humanBuildableBleedPS = CG_RegisterParticleSystem( "humanBuildableBleedPS");
cgs.media.alienBuildableBleedPS = CG_RegisterParticleSystem( "alienBuildableBleedPS" );
cgs.media.alienBleedPS = CG_RegisterParticleSystem( "alienBleedPS" );
@@ -930,7 +993,7 @@ static void CG_RegisterGraphics( void )
CG_BuildableStatusParse( "ui/assets/human/buildstat.cfg", &cgs.humanBuildStat );
CG_BuildableStatusParse( "ui/assets/alien/buildstat.cfg", &cgs.alienBuildStat );
-
+
// register the inline models
cgs.numInlineModels = trap_CM_NumInlineModels( );
@@ -1757,7 +1820,9 @@ void CG_LoadHudMenu( void )
cgDC.registerModel = &trap_R_RegisterModel;
cgDC.modelBounds = &trap_R_ModelBounds;
cgDC.fillRect = &CG_FillRect;
+ cgDC.fillRoundedRect = &CG_FillRoundedRect;
cgDC.drawRect = &CG_DrawRect;
+ cgDC.drawRoundedRect = &CG_DrawRoundedRect;
cgDC.drawSides = &CG_DrawSides;
cgDC.drawTopBottom = &CG_DrawTopBottom;
cgDC.clearScene = &trap_R_ClearScene;
@@ -1820,9 +1885,17 @@ void CG_AssetCache( void )
cgDC.Assets.scrollBarArrowLeft = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWLEFT );
cgDC.Assets.scrollBarArrowRight = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWRIGHT );
cgDC.Assets.scrollBarThumb = trap_R_RegisterShaderNoMip( ASSET_SCROLL_THUMB );
+ cgDC.Assets.showMoreArrow = trap_R_RegisterShaderNoMip( ASSET_SHOWMORE_ARROW );
cgDC.Assets.sliderBar = trap_R_RegisterShaderNoMip( ASSET_SLIDER_BAR );
cgDC.Assets.sliderThumb = trap_R_RegisterShaderNoMip( ASSET_SLIDER_THUMB );
+ cgDC.Assets.cornerIn[BORDER_SQUARE] = trap_R_RegisterShaderNoMip( ASSET_CORNERIN_SQUARE );
+ cgDC.Assets.cornerOut[BORDER_SQUARE] = trap_R_RegisterShaderNoMip( ASSET_CORNEROUT_SQUARE );
+ cgDC.Assets.cornerIn[BORDER_ROUNDED] = trap_R_RegisterShaderNoMip( ASSET_CORNERIN_ROUNDED );
+ cgDC.Assets.cornerOut[BORDER_ROUNDED] = trap_R_RegisterShaderNoMip( ASSET_CORNEROUT_ROUNDED );
+ cgDC.Assets.cornerIn[BORDER_FOLD] = trap_R_RegisterShaderNoMip( ASSET_CORNERIN_FOLD );
+ cgDC.Assets.cornerOut[BORDER_FOLD] = trap_R_RegisterShaderNoMip( ASSET_CORNEROUT_FOLD );
+
if( cg_emoticons.integer )
{
cgDC.Assets.emoticonCount = BG_LoadEmoticons( cgDC.Assets.emoticons,
@@ -1942,7 +2015,7 @@ void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum )
CG_UpdateMediaFraction( 1.0f );
CG_InitBuildables( );
-
+
cgs.voices = BG_VoiceInit( );
BG_PrintVoices( cgs.voices, cg_debugVoices.integer );
diff --git a/src/cgame/cg_rangemarker.c b/src/cgame/cg_rangemarker.c
index 2810b904f..b2d029bbb 100644
--- a/src/cgame/cg_rangemarker.c
+++ b/src/cgame/cg_rangemarker.c
@@ -145,7 +145,24 @@ void CG_UpdateBuildableRangeMarkerMask( void )
}
}
-// cg_drawtools.c
+float CG_RangeMarkerAnimation(centity_t *cent)
+{
+ int msec = cg.time - cent->validTime;
+ float ratio = (float)msec / RM_ANIM_TIME;
+
+ // It would be fine if we could avoid animation when teleported
+ if (msec > RM_ANIM_TIME)
+ return (1.0f);
+ else
+ {
+ if (cent->valid)
+ return 1.0f - (fabs(sin(pow(ratio, 2) * M_PI * 3)/pow(ratio, 2))) / 9.425f;
+ else
+ return (1.0f - ratio);
+ }
+}
+
+// cg_drawtools.c
//
/*
================
@@ -221,7 +238,8 @@ CG_DrawRangeMarker
*/
void CG_DrawRangeMarker( rangeMarkerType_t rmType, const vec3_t origin, const float *angles, float range,
qboolean drawSurface, qboolean drawIntersection, qboolean drawFrontline,
- const vec3_t rgb, float surfaceOpacity, float lineOpacity, float lineThickness )
+ const vec3_t rgb, float surfaceOpacity, float lineOpacity, float lineThickness,
+ float animation)
{
if( drawSurface )
{
@@ -230,7 +248,7 @@ void CG_DrawRangeMarker( rangeMarkerType_t rmType, const vec3_t origin, const fl
pcsh = cgs.media.plainColorShader;
VectorCopy( rgb, rgba );
- rgba[ 3 ] = surfaceOpacity;
+ rgba[ 3 ] = surfaceOpacity * animation;
switch( rmType )
{
@@ -297,7 +315,7 @@ void CG_DrawRangeMarker( rangeMarkerType_t rmType, const vec3_t origin, const fl
bshs = &cg.binaryShaderSettings[ cg.numBinaryShadersUsed ];
for( i = 0; i < 3; ++i )
- bshs->color[ i ] = 255 * lineOpacity * rgb[ i ];
+ bshs->color[ i ] = 255 * lineOpacity * animation * rgb[ i ];
bshs->drawIntersection = drawIntersection;
bshs->drawFrontline = drawFrontline;
@@ -348,7 +366,7 @@ qboolean CG_GetBuildableRangeMarkerProperties( buildable_t bType, rangeMarkerTyp
CG_GhostBuildableRangeMarker
================
*/
-void CG_GhostBuildableRangeMarker( buildable_t buildable, const vec3_t origin, const vec3_t normal )
+void CG_GhostBuildableRangeMarker( buildable_t buildable, const vec3_t origin, const vec3_t normal, float animation )
{
qboolean drawS, drawI, drawF;
float so, lo, th;
@@ -370,7 +388,7 @@ void CG_GhostBuildableRangeMarker( buildable_t buildable, const vec3_t origin, c
vectoangles( normal, angles );
CG_DrawRangeMarker( rmType, localOrigin, ( rmType != RMT_SPHERE ? angles : NULL ),
- range, drawS, drawI, drawF, rgb, so, lo, th );
+ range, drawS, drawI, drawF, rgb, so, lo, th, animation );
}
}
@@ -392,8 +410,8 @@ void CG_RangeMarker( centity_t *cent )
if( CG_GetRangeMarkerPreferences( &drawS, &drawI, &drawF, &so, &lo, &th ) &&
CG_GetBuildableRangeMarkerProperties( cent->currentState.modelindex, &rmType, &range, rgb ) )
{
+ // Allways draw range marker send by the server directly
CG_DrawRangeMarker( rmType, cent->lerpOrigin, ( rmType > 0 ? cent->lerpAngles : NULL ),
- range, drawS, drawI, drawF, rgb, so, lo, th );
+ range, drawS, drawI, drawF, rgb, so, lo, th, 1.0f );
}
}
-
diff --git a/src/cgame/cg_scanner.c b/src/cgame/cg_scanner.c
index a7df03054..b0455cc64 100644
--- a/src/cgame/cg_scanner.c
+++ b/src/cgame/cg_scanner.c
@@ -182,7 +182,9 @@ static void CG_DrawDir( rectDef_t *rect, vec3_t origin, vec4_t colour )
vec3_t up = { 0.0f, 0.0f, 1.0f };
vec3_t top = { 0.0f, -1.0f, 0.0f };
float angle;
+ float distanceRatio;
playerState_t *ps = &cg.snap->ps;
+ vec4_t drawColor;
BG_GetClientNormal( ps, normal );
@@ -205,7 +207,12 @@ static void CG_DrawDir( rectDef_t *rect, vec3_t origin, vec4_t colour )
RotatePointAroundVector( drawOrigin, up, top, angle );
- trap_R_SetColor( colour );
+ Vector4Copy(colour, drawColor);
+ // simplified circular easing out
+ distanceRatio = Distance(view, origin) / ALIENSENSE_RANGE;
+ drawColor[3] *= sqrt( 1 - distanceRatio * distanceRatio);
+
+ trap_R_SetColor( drawColor );
CG_DrawPic( rect->x + ( rect->w / 2 ) - ( BLIPX2 / 2 ) - drawOrigin[ 0 ] * ( rect->w / 2 ),
rect->y + ( rect->h / 2 ) - ( BLIPY2 / 2 ) + drawOrigin[ 1 ] * ( rect->h / 2 ),
BLIPX2, BLIPY2, cgs.media.scannerBlipShader );
@@ -222,11 +229,33 @@ void CG_AlienSense( rectDef_t *rect )
int i;
vec3_t origin;
vec3_t relOrigin;
- vec4_t buildable = { 1.0f, 0.0f, 0.0f, 0.7f };
- vec4_t client = { 0.0f, 0.0f, 1.0f, 0.7f };
+ vec4_t abuildable = { 0.5f, 0.55f, 0.02f, 0.7f };
+ vec4_t aclient = { 0.325f, 0.55f, 0.025f, 0.7f };
+ vec4_t hbuildable = { 1.0f, 0.0f, 0.0f, 0.7f };
+ vec4_t hclient = { 0.0f, 0.0f, 1.0f, 0.7f };
VectorCopy( entityPositions.origin, origin );
+ //draw alien buildables
+ for( i = 0; i < entityPositions.numAlienBuildables; i++ )
+ {
+ VectorClear( relOrigin );
+ VectorSubtract( entityPositions.alienBuildablePos[ i ], origin, relOrigin );
+
+ if( VectorLength( relOrigin ) < ALIENSENSE_RANGE )
+ CG_DrawDir( rect, relOrigin, abuildable );
+ }
+
+ //draw alien clients
+ for( i = 0; i < entityPositions.numAlienClients; i++ )
+ {
+ VectorClear( relOrigin );
+ VectorSubtract( entityPositions.alienClientPos[ i ], origin, relOrigin );
+
+ if( VectorLength( relOrigin ) < ALIENSENSE_RANGE )
+ CG_DrawDir( rect, relOrigin, aclient );
+ }
+
//draw human buildables
for( i = 0; i < entityPositions.numHumanBuildables; i++ )
{
@@ -234,7 +263,7 @@ void CG_AlienSense( rectDef_t *rect )
VectorSubtract( entityPositions.humanBuildablePos[ i ], origin, relOrigin );
if( VectorLength( relOrigin ) < ALIENSENSE_RANGE )
- CG_DrawDir( rect, relOrigin, buildable );
+ CG_DrawDir( rect, relOrigin, hbuildable );
}
//draw human clients
@@ -244,7 +273,7 @@ void CG_AlienSense( rectDef_t *rect )
VectorSubtract( entityPositions.humanClientPos[ i ], origin, relOrigin );
if( VectorLength( relOrigin ) < ALIENSENSE_RANGE )
- CG_DrawDir( rect, relOrigin, client );
+ CG_DrawDir( rect, relOrigin, hclient );
}
}
@@ -382,7 +411,7 @@ void THZ_DrawScanner( rectDef_t *rect )
// Draw cross
CG_FillRect( rect->x + (rect->w/2),
- rect->y,
+ rect->y,
1,
rect->h,
color );
diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c
index 4de7586f7..14addea76 100644
--- a/src/cgame/cg_servercmds.c
+++ b/src/cgame/cg_servercmds.c
@@ -146,6 +146,44 @@ static void CG_ParseWarmup( void )
cg.warmupTime = warmup;
}
+/*
+==================
+CG_ParseAlienStates
+==================
+*/
+static void CG_ParseAlienStates( void )
+{
+ const char *alienStates = CG_ConfigString( CS_ALIEN_STATUS );
+ alienStates_t *state = &cgs.alienStates;
+
+ if( alienStates[0] )
+ {
+ sscanf( alienStates, "%d %d %d %d %d", &state->omBuilding, &state->omHealth,
+ &state->spawns, &state->builders, &state->boosters );
+ }
+ else
+ state->omBuilding = state->omHealth = state->spawns = state->builders = state->boosters = 0;
+}
+
+/*
+==================
+CG_ParseAliensStates
+==================
+*/
+static void CG_ParseHumanStates( void )
+{
+ const char *humanStates = CG_ConfigString( CS_HUMAN_STATUS );
+ humanStates_t *state = &cgs.humanStates;
+
+ if( humanStates[0] )
+ {
+ sscanf( humanStates, "%d %d %d %d %d %d %d", &state->rcBuilding, &state->rcHealth,
+ &state->spawns, &state->builders, &state->armourys, &state->medicals, &state->computers );
+ }
+ else
+ state->rcBuilding = state->rcHealth = state->spawns = state->builders = state->armourys = state->medicals = 0;
+}
+
/*
================
CG_SetConfigValues
@@ -175,6 +213,9 @@ void CG_SetConfigValues( void )
else
cgs.humanStage = cgs.humanCredits = cgs.humanNextStageThreshold = 0;
+ CG_ParseAlienStates();
+ CG_ParseHumanStates();
+
cgs.levelStartTime = atoi( CG_ConfigString( CS_LEVEL_START_TIME ) );
cg.warmupTime = atoi( CG_ConfigString( CS_WARMUP ) );
}
@@ -319,6 +360,10 @@ static void CG_ConfigStringModified( void )
cgs.humanStage = cgs.humanCredits = cgs.humanNextStageThreshold = 0;
}
}
+ else if( num == CS_ALIEN_STATUS )
+ CG_ParseAlienStates( );
+ else if( num == CS_HUMAN_STATUS )
+ CG_ParseHumanStates( );
else if( num == CS_LEVEL_START_TIME )
cgs.levelStartTime = atoi( str );
else if( num >= CS_VOTE_TIME && num < CS_VOTE_TIME + NUM_TEAMS )
@@ -432,7 +477,7 @@ void CG_Menu( int menu, int arg )
const char *shortMsg = NULL; // non-modal version of message
const char *dialog;
dialogType_t type = 0; // controls which cg_disable var will switch it off
-
+
switch( cg.snap->ps.stats[ STAT_TEAM ] )
{
case TEAM_ALIENS:
@@ -521,7 +566,7 @@ void CG_Menu( int menu, int arg )
//===============================
// Since cheating commands have no default binds, they will often be done
- // via console. In light of this, perhaps opening a menu is
+ // via console. In light of this, perhaps opening a menu is
// counterintuitive
case MN_CMD_CHEAT:
//longMsg = "This action is considered cheating. It can only be used "
@@ -570,7 +615,7 @@ void CG_Menu( int menu, int arg )
//===============================
-
+
case MN_B_NOROOM:
longMsg = "There is no room to build here. Move until the structure turns "
"translucent green, indicating a valid build location.";
@@ -804,7 +849,7 @@ void CG_Menu( int menu, int arg )
break;
case MN_A_CANTEVOLVE:
- shortMsg = va( "You cannot evolve into a %s",
+ shortMsg = va( "You cannot evolve into a %s",
BG_ClassConfig( arg )->humanName );
type = DT_ARMOURYEVOLVE;
break;
@@ -818,13 +863,13 @@ void CG_Menu( int menu, int arg )
shortMsg = "Unknown class";
type = DT_ARMOURYEVOLVE;
break;
-
+
case MN_A_CLASSNOTSPAWN:
- shortMsg = va( "You cannot spawn as a %s",
+ shortMsg = va( "You cannot spawn as a %s",
BG_ClassConfig( arg )->humanName );
type = DT_ARMOURYEVOLVE;
break;
-
+
case MN_A_CLASSNOTALLOWED:
shortMsg = va( "The %s is not allowed",
BG_ClassConfig( arg )->humanName );
@@ -841,7 +886,7 @@ void CG_Menu( int menu, int arg )
default:
Com_Printf( "cgame: debug: no such menu %d\n", menu );
}
-
+
if( type == DT_ARMOURYEVOLVE && cg_disableUpgradeDialogs.integer )
return;
@@ -997,7 +1042,7 @@ static void CG_Say( int clientNum, saymode_t mode, const char *text )
#endif
if( !ignore[0] )
{
- CG_CenterPrint( va( "%sPrivate message from: " S_COLOR_WHITE "%s",
+ CG_CenterPrint( va( "%sPrivate message from: " S_COLOR_WHITE "%s",
color, name ), 200, GIANTCHAR_WIDTH * 4 );
if( clientNum < 0 || clientNum >= MAX_CLIENTS )
clientNum = cg.clientNum;
@@ -1024,7 +1069,7 @@ static void CG_Say( int clientNum, saymode_t mode, const char *text )
trap_S_StartLocalSound( cgs.media.humanTalkSound, CHAN_LOCAL_SOUND );
break;
}
- default:
+ default:
trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND );
}
}
@@ -1108,7 +1153,7 @@ static void CG_ParseVoice( void )
track = CG_VoiceTrack( ci->voice, atoi( CG_Argv( 3 ) ), atoi( CG_Argv( 4 ) ) );
// keep track of how long the player will be speaking
- // assume it takes 3s to say "*unintelligible gibberish*"
+ // assume it takes 3s to say "*unintelligible gibberish*"
if( track )
ci->voiceTime = cg.time + track->duration;
else
@@ -1121,8 +1166,8 @@ static void CG_ParseVoice( void )
else
Q_strncpyz( sayText, "*unintelligible gibberish*", sizeof( sayText ) );
}
-
- if( !cg_noVoiceText.integer )
+
+ if( !cg_noVoiceText.integer )
{
switch( vChan )
{
@@ -1158,7 +1203,7 @@ static void CG_ParseVoice( void )
break;
default:
break;
- }
+ }
}
/*
diff --git a/src/cgame/cg_tutorial.c b/src/cgame/cg_tutorial.c
index e9dbcd690..efbfc3ded 100644
--- a/src/cgame/cg_tutorial.c
+++ b/src/cgame/cg_tutorial.c
@@ -176,7 +176,7 @@ CG_AlienBuilderText
*/
static void CG_AlienBuilderText( char *text, playerState_t *ps )
{
- buildable_t buildable = ps->stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT;
+ buildable_t buildable = ps->stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK;
entityState_t *es;
if( buildable > BA_NONE )
@@ -190,6 +190,13 @@ static void CG_AlienBuilderText( char *text, playerState_t *ps )
va( "Press %s to cancel placing the %s\n",
CG_KeyNameForCommand( "+button5" ),
BG_Buildable( buildable )->humanName ) );
+
+ Q_strcat( text, MAX_TUTORIAL_TEXT,
+ va( "Press %s or %s to rotate the %s and %s to reset\n",
+ CG_KeyNameForCommand( "rotatebuildleft" ),
+ CG_KeyNameForCommand( "rotatebuildright" ),
+ BG_Buildable( buildable )->humanName,
+ CG_KeyNameForCommand( "rotatebuild" ) ) );
}
else
{
@@ -223,7 +230,7 @@ static void CG_AlienBuilderText( char *text, playerState_t *ps )
}
}
- if( ( ps->stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) == BA_NONE )
+ if( ( ps->stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK ) == BA_NONE )
{
Q_strcat( text, MAX_TUTORIAL_TEXT,
va( "Press %s to swipe\n",
@@ -352,7 +359,7 @@ CG_HumanCkitText
*/
static void CG_HumanCkitText( char *text, playerState_t *ps )
{
- buildable_t buildable = ps->stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT;
+ buildable_t buildable = ps->stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK;
entityState_t *es;
if( buildable > BA_NONE )
@@ -366,6 +373,13 @@ static void CG_HumanCkitText( char *text, playerState_t *ps )
va( "Press %s to cancel placing the %s\n",
CG_KeyNameForCommand( "+button5" ),
BG_Buildable( buildable )->humanName ) );
+
+ Q_strcat( text, MAX_TUTORIAL_TEXT,
+ va( "Press %s or %s to rotate the %s and %s to reset\n",
+ CG_KeyNameForCommand( "rotatebuildleft" ),
+ CG_KeyNameForCommand( "rotatebuildright" ),
+ BG_Buildable( buildable )->humanName,
+ CG_KeyNameForCommand( "rotatebuild" ) ) );
}
else
{
@@ -588,7 +602,7 @@ static void CG_SpectatorText( char *text, playerState_t *ps )
va( "Press %s to spawn\n",
CG_KeyNameForCommand( "+attack" ) ) );
}
- else
+ else
{
Q_strcat( text, MAX_TUTORIAL_TEXT,
va( "Press %s to join a team\n",
diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c
index fc88606f1..d61d3a229 100644
--- a/src/cgame/cg_weapons.c
+++ b/src/cgame/cg_weapons.c
@@ -1254,8 +1254,8 @@ void CG_AddViewWeapon( playerState_t *ps )
return;
// draw a prospective buildable infront of the player
- if( ( ps->stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) > BA_NONE )
- CG_GhostBuildable( ps->stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT );
+ if( ( ps->stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK ) > BA_NONE )
+ CG_GhostBuildable( ps->stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK );
// no gun if in third person view
if( cg.renderingThirdPerson )
@@ -1407,20 +1407,7 @@ void CG_DrawItemSelect( rectDef_t *rect, vec4_t color )
if( cg.predictedPlayerState.stats[ STAT_HEALTH ] <= 0 )
return;
- if( !( cg.snap->ps.pm_flags & PMF_FOLLOW ) )
- {
- // first make sure that whatever it selected is actually selectable
- if( cg.weaponSelect < 32 )
- {
- if( !CG_WeaponSelectable( cg.weaponSelect ) )
- CG_NextWeapon_f( );
- }
- else
- {
- if( !CG_UpgradeSelectable( cg.weaponSelect - 32 ) )
- CG_NextWeapon_f( );
- }
- }
+ CG_AutoSelectWeapon_f( );
// showing weapon select clears pickup item display, but not the blend blob
cg.itemPickupTime = 0;
@@ -1577,6 +1564,46 @@ void CG_DrawItemSelectText( rectDef_t *rect, float scale, int textStyle )
}
+/*
+===============
+CG_AutoSelectWeapon_f
+===============
+*/
+void CG_AutoSelectWeapon_f( void )
+{
+ static weapon_t oldWeapon;
+ weapon_t weapon;
+ playerState_t *ps;
+
+ if( ( cg.snap->ps.pm_flags & PMF_FOLLOW ) )
+ return;
+
+ ps = &cg.snap->ps;
+
+ weapon = BG_GetPlayerWeapon( ps );
+
+ // Allways reset cursor on current weapon
+ if ( weapon != oldWeapon )
+ {
+ oldWeapon = weapon;
+ if( cg.weaponSelect != weapon && CG_WeaponSelectable ( weapon ) )
+ cg.weaponSelect = weapon;
+ }
+
+ // make sure that whatever it selected is actually selectable
+ if( cg.weaponSelect < 32 )
+ {
+ if( !CG_WeaponSelectable( cg.weaponSelect ) )
+ CG_NextWeapon_f( );
+ }
+ else
+ {
+ if( !CG_UpgradeSelectable( cg.weaponSelect - 32 ) )
+ CG_NextWeapon_f( );
+ }
+}
+
+
/*
===============
CG_NextWeapon_f
@@ -1875,7 +1902,7 @@ void CG_MissileHitEntity( weapon_t weaponNum, weaponMode_t weaponMode,
}
else
sound = IMPACTSOUND_DEFAULT;
-
+
CG_MissileHitWall( weaponNum, weaponMode, 0, origin, dir, sound, charge );
}
}
diff --git a/src/client/cl_keys.cpp b/src/client/cl_keys.cpp
index 82f56668f..733a3105c 100644
--- a/src/client/cl_keys.cpp
+++ b/src/client/cl_keys.cpp
@@ -1089,6 +1089,10 @@ void Key_Bind_f (void)
strcat (cmd, " ");
}
+ // Autoconvert boost to +button8
+ if (strcmp(cmd, "boost") == 0)
+ return Key_SetBinding (b, "+button8");
+
Key_SetBinding (b, cmd);
}
diff --git a/src/client/cl_main.cpp b/src/client/cl_main.cpp
index 8b33acd93..434b68382 100644
--- a/src/client/cl_main.cpp
+++ b/src/client/cl_main.cpp
@@ -2007,6 +2007,7 @@ void CL_NextDownload(void)
char *remoteName, *localName;
bool useCURL = false;
int prompt;
+ int remaining;
// A download has finished, check whether this matches a referenced checksum
if (*clc.downloadName && !clc.activeCURLNotGameRelated)
@@ -2023,6 +2024,16 @@ void CL_NextDownload(void)
// We are looking to start a download here
if (*clc.downloadList)
{
+ // Calculated
+ remaining = 1; // 1 to be rounded up, '@' may not be in pair
+ s = clc.downloadList;
+ while (*s)
+ if (*(s++) == '@')
+ remaining++;
+ remaining /= 2;
+ clc.downloadDone = clc.downloadTotal - remaining;
+ Cvar_SetValue("cl_downloadDone", clc.downloadDone);
+
// Prompt if we do not allow automatic downloads
prompt = com_downloadPrompt->integer;
if (!(prompt & DLP_TYPE_MASK) && !(cl_allowDownload->integer & DLF_ENABLE))
@@ -2221,6 +2232,8 @@ and determine if we need to download them
*/
void CL_InitDownloads(void)
{
+ char *s;
+
if (FS_ComparePaks(clc.downloadList, sizeof(clc.downloadList), true))
{
Com_Printf("Need paks: %s\n", clc.downloadList);
@@ -2228,10 +2241,20 @@ void CL_InitDownloads(void)
Cvar_Set("com_downloadPrompt", "0");
if (*clc.downloadList)
{
+ clc.downloadDone = 0;
+ clc.downloadTotal = 0;
+ s = clc.downloadList;
+ while (*s)
+ if (*(s++) == '@')
+ clc.downloadTotal++;
+ clc.downloadTotal /= 2;
+
// if autodownloading is not enabled on the server
clc.state = CA_CONNECTED;
*clc.downloadTempName = *clc.downloadName = 0;
Cvar_Set("cl_downloadName", "");
+ Cvar_Set("cl_downloadDone", "0");
+ Cvar_SetValue("cl_downloadTotal", clc.downloadTotal);
CL_NextDownload();
return;
}
@@ -4687,7 +4710,7 @@ static void CL_InitRef(void)
Com_Printf("----- Initializing Renderer ----\n");
#ifdef USE_RENDERER_DLOPEN
- cl_renderer = Cvar_Get("cl_renderer", "opengl2", CVAR_ARCHIVE | CVAR_LATCH);
+ cl_renderer = Cvar_Get("cl_renderer", "opengl1", CVAR_ARCHIVE | CVAR_LATCH);
Com_sprintf(dllName, sizeof(dllName), "renderer_%s" DLL_EXT, cl_renderer->string);
diff --git a/src/client/client.h b/src/client/client.h
index 2474a3da4..ba99d0826 100644
--- a/src/client/client.h
+++ b/src/client/client.h
@@ -284,7 +284,9 @@ struct clientConnection_t {
int sv_allowDownload;
char sv_dlURL[MAX_CVAR_VALUE_STRING];
- int downloadNumber;
+ int downloadNumber; // Unused ??
+ int downloadTotal;
+ int downloadDone;
int downloadBlock; // block we are waiting for
int downloadCount; // how many bytes we got
int downloadSize; // how many bytes we got
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index e30a754f4..ebd9ed9a1 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -1345,7 +1345,7 @@ int BG_ClassCanEvolveFromTo( class_t fclass,
for( j = 0; j < 3; j++ )
{
int thruClass, evolveCost;
-
+
thruClass = bg_classList[ i ].children[ j ];
if( thruClass == PCL_NONE || !BG_ClassAllowedInStage( thruClass, stage ) ||
!BG_ClassIsAllowed( thruClass ) )
@@ -2959,7 +2959,7 @@ void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean
if( s->generic1 <= WPM_NONE || s->generic1 >= WPM_NUM_WEAPONMODES )
s->generic1 = WPM_PRIMARY;
- s->otherEntityNum = ps->otherEntityNum;
+ s->otherEntityNum = ps->otherEntityNum;
}
@@ -3085,7 +3085,7 @@ qboolean BG_WeaponIsFull( weapon_t weapon, int stats[ ], int ammo, int clips )
maxAmmo = BG_Weapon( weapon )->maxAmmo;
maxClips = BG_Weapon( weapon )->maxClips;
- if( BG_InventoryContainsUpgrade( UP_BATTPACK, stats ) )
+ if( BG_InventoryContainsUpgrade( UP_BATTPACK, stats ) && BG_Weapon( weapon )->usesEnergy)
maxAmmo = (int)( (float)maxAmmo * BATTPACK_MODIFIER );
return ( maxAmmo == ammo ) && ( maxClips == clips );
@@ -3107,6 +3107,33 @@ qboolean BG_InventoryContainsWeapon( int weapon, int stats[ ] )
return ( stats[ STAT_WEAPON ] == weapon );
}
+/*
+========================
+BG_GetConflictingWithInventory
+
+Calculate conflicting's item name slots with sended slots
+========================
+*/
+void BG_GetConflictingWithInventory( int refSlots, int stats[ ], int conflictingWP[WP_NUM_WEAPONS - 1],
+ int conflictingUP[UP_NUM_UPGRADES - 1] )
+{
+ int i, j = 0;
+
+ if ( BG_Weapon( stats[ STAT_WEAPON ] )->slots & refSlots )
+ conflictingWP[j++] = stats[ STAT_WEAPON ];
+ if( stats[ STAT_TEAM ] == TEAM_HUMANS && (BG_Weapon( WP_BLASTER )->slots & refSlots) )
+ conflictingWP[j++] = WP_BLASTER;
+ conflictingWP[j] = 0;
+ j = 0;
+ for( i = UP_NONE; i < UP_NUM_UPGRADES; i++ )
+ {
+ if( BG_InventoryContainsUpgrade( i, stats ) && ( BG_Upgrade( i )->slots & refSlots ) )
+ conflictingUP[j++] = i;
+ }
+ conflictingUP[j] = 0;
+}
+
+
/*
========================
BG_SlotsForInventory
@@ -3298,6 +3325,25 @@ void BG_GetClientViewOrigin( const playerState_t *ps, vec3_t viewOrigin )
VectorMA( ps->origin, ps->viewheight, normal, viewOrigin );
}
+/*
+===============
+BG_GetBuildableRotation
+
+Read the custom rotation added by the player
+===============
+*/
+static int BG_GetBuildableRotation( const playerState_t *ps )
+{
+ int angle = 0;
+
+ // Get the angle in hexadecimal with value from 0 to 15
+ angle = (ps->stats[ STAT_BUILDABLE ] & SB_ROTATION_MASK) / SB_ROTATION_UNIT;
+ // Convert to degree
+ angle = (int)((float)angle * 360.0f/16.0f);
+
+ return (angle);
+}
+
/*
===============
BG_PositionBuildableRelativeToPlayer
@@ -3311,7 +3357,7 @@ void BG_PositionBuildableRelativeToPlayer( const playerState_t *ps,
const vec3_t, const vec3_t, int, int ),
vec3_t outOrigin, vec3_t outAngles, trace_t *tr )
{
- vec3_t forward, entityOrigin, targetOrigin;
+ vec3_t forward, rotated, entityOrigin, targetOrigin;
vec3_t angles, playerOrigin, playerNormal;
float buildDist;
@@ -3325,6 +3371,7 @@ void BG_PositionBuildableRelativeToPlayer( const playerState_t *ps,
ProjectPointOnPlane( forward, forward, playerNormal );
VectorNormalize( forward );
+ // Move the build to `buildDist` distance forwaring the player
VectorMA( playerOrigin, buildDist, forward, entityOrigin );
VectorCopy( entityOrigin, targetOrigin );
@@ -3338,7 +3385,10 @@ void BG_PositionBuildableRelativeToPlayer( const playerState_t *ps,
// The mask is MASK_DEADSOLID on purpose to avoid collisions with other entities
(*trace)( tr, entityOrigin, mins, maxs, targetOrigin, ps->clientNum, MASK_DEADSOLID );
VectorCopy( tr->endpos, outOrigin );
- vectoangles( forward, outAngles );
+
+ // Create a rotated vector from the forwarding. The norrnal was calculated from `trace`
+ RotatePointAroundVector(rotated, tr->plane.normal, forward, BG_GetBuildableRotation(ps));
+ vectoangles( rotated, outAngles );
}
/*
@@ -3401,7 +3451,7 @@ int BG_PlayerPoisonCloudTime( playerState_t *ps )
time -= HELMET_PCLOUD_PROTECTION;
if( BG_InventoryContainsUpgrade( UP_LIGHTARMOUR, ps->stats ) )
time -= LIGHTARMOUR_PCLOUD_PROTECTION;
-
+
return time;
}
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index f850a5d2c..ba96b4cae 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -72,7 +72,7 @@ enum
CS_VOTE_YES = CS_VOTE_STRING + NUM_TEAMS,
CS_VOTE_NO = CS_VOTE_YES + NUM_TEAMS,
CS_VOTE_CALLER = CS_VOTE_NO + NUM_TEAMS,
-
+
CS_GAME_VERSION = CS_VOTE_CALLER + NUM_TEAMS,
CS_LEVEL_START_TIME, // so the timer only shows the current level
CS_INTERMISSION, // when 1, fraglimit/timelimit has been hit and intermission will start in a second or two
@@ -83,6 +83,8 @@ enum
CS_ALIEN_STAGES,
CS_HUMAN_STAGES,
+ CS_ALIEN_STATUS,
+ CS_HUMAN_STATUS,
CS_MODELS,
CS_SOUNDS = CS_MODELS + MAX_MODELS,
@@ -259,7 +261,10 @@ typedef enum
#define SS_HEALING_2X 0x00000800 // medkit or double healing rate
#define SS_HEALING_3X 0x00001000 // triple healing rate
-#define SB_VALID_TOGGLEBIT 0x00002000
+#define SB_BUILDABLE_MASK 0x000000ff
+#define SB_ROTATION_MASK 0x0000f000
+#define SB_ROTATION_UNIT 0x00001000
+#define SB_VALID_TOGGLEBIT 0x00000200
// player_state->persistant[] indexes
// these fields are the only part of player_state that isn't
@@ -1030,7 +1035,7 @@ typedef struct
qboolean dccTest;
qboolean transparentTest;
qboolean uniqueTest;
-
+
int value;
} buildableAttributes_t;
@@ -1103,8 +1108,31 @@ typedef struct
team_t team;
} upgradeAttributes_t;
+// Teams status provided by the server, also a remplacement for /teamstatus
+typedef struct
+{
+ int omBuilding;
+ int omHealth;
+ int spawns;
+ int builders;
+ int boosters;
+} alienStates_t;
+
+typedef struct
+{
+ int rcBuilding;
+ int rcHealth;
+ int spawns;
+ int builders;
+ int armourys;
+ int medicals;
+ int computers;
+} humanStates_t;
+
qboolean BG_WeaponIsFull( weapon_t weapon, int stats[ ], int ammo, int clips );
qboolean BG_InventoryContainsWeapon( int weapon, int stats[ ] );
+void BG_GetConflictingWithInventory( int refSlots, int stats[ ], int conflictingWP[WP_NUM_WEAPONS - 1],
+ int conflictingUP[UP_NUM_UPGRADES - 1] );
int BG_SlotsForInventory( int stats[ ] );
void BG_AddUpgradeToInventory( int item, int stats[ ] );
void BG_RemoveUpgradeFromInventory( int item, int stats[ ] );
diff --git a/src/game/g_active.c b/src/game/g_active.c
index d978a4aa6..207b86922 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -218,7 +218,7 @@ static void ClientShove( gentity_t *ent, gentity_t *victim )
vec3_t dir, push;
float force;
int entMass, vicMass;
-
+
// Don't push if the entity is not trying to move
if( !ent->client->pers.cmd.rightmove && !ent->client->pers.cmd.forwardmove &&
!ent->client->pers.cmd.upmove )
@@ -227,7 +227,7 @@ static void ClientShove( gentity_t *ent, gentity_t *victim )
// Cannot push enemy players unless they are walking on the player
if( !OnSameTeam( ent, victim ) &&
victim->client->ps.groundEntityNum != ent - g_entities )
- return;
+ return;
// Shove force is scaled by relative mass
entMass = GetClientMass( ent );
@@ -245,7 +245,7 @@ static void ClientShove( gentity_t *ent, gentity_t *victim )
VectorNormalizeFast( dir );
VectorScale( dir, force, push );
VectorAdd( victim->client->ps.velocity, push, victim->client->ps.velocity );
-
+
// Set the pmove timer so that the other client can't cancel
// out the movement immediately
if( !victim->client->ps.pm_time )
@@ -401,8 +401,8 @@ void SpectatorThink( gentity_t *ent, usercmd_t *ucmd )
attack1 = ( client->buttons & BUTTON_ATTACK ) &&
!( client->oldbuttons & BUTTON_ATTACK );
-
- // We are in following mode only if we are following a non-spectating client
+
+ // We are in following mode only if we are following a non-spectating client
following = client->sess.spectatorState == SPECTATOR_FOLLOW;
if( following )
{
@@ -412,7 +412,7 @@ void SpectatorThink( gentity_t *ent, usercmd_t *ucmd )
g_entities[ clientNum ].client->sess.spectatorState != SPECTATOR_NOT )
following = qfalse;
}
-
+
// Check to see if we are in the spawn queue
if( client->pers.teamSelection == TEAM_ALIENS )
queued = G_SearchSpawnQueue( &level.alienSpawnQueue, ent - g_entities );
@@ -596,7 +596,7 @@ void ClientTimerActions( gentity_t *ent, int msec )
while ( client->time100 >= 100 )
{
weapon_t weapon = BG_GetPlayerWeapon( &client->ps );
-
+
client->time100 -= 100;
// Restore or subtract stamina
@@ -607,7 +607,7 @@ void ClientTimerActions( gentity_t *ent, int msec )
client->ps.stats[ STAT_STAMINA ] -= STAMINA_SPRINT_TAKE;
else if( walking || crouched )
client->ps.stats[ STAT_STAMINA ] += STAMINA_WALK_RESTORE;
-
+
// Check stamina limits
if( client->ps.stats[ STAT_STAMINA ] > STAMINA_MAX )
client->ps.stats[ STAT_STAMINA ] = STAMINA_MAX;
@@ -630,16 +630,16 @@ void ClientTimerActions( gentity_t *ent, int msec )
case WP_ABUILD:
case WP_ABUILD2:
case WP_HBUILD:
-
+
// Set validity bit on buildable
- if( ( client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) > BA_NONE )
+ if( ( client->ps.stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK ) > BA_NONE )
{
int dist = BG_Class( ent->client->ps.stats[ STAT_CLASS ] )->buildDist;
- vec3_t dummy, dummy2;
- int dummy3;
+ vec3_t dummy, dummy2, dummy3;
+ int dummy4;
- if( G_CanBuild( ent, client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT,
- dist, dummy, dummy2, &dummy3 ) == IBE_NONE )
+ if( G_CanBuild( ent, client->ps.stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK,
+ dist, dummy, dummy2, dummy3, &dummy4 ) == IBE_NONE )
client->ps.stats[ STAT_BUILDABLE ] |= SB_VALID_TOGGLEBIT;
else
client->ps.stats[ STAT_BUILDABLE ] &= ~SB_VALID_TOGGLEBIT;
@@ -664,7 +664,7 @@ void ClientTimerActions( gentity_t *ent, int msec )
break;
}
- if( ent->client->pers.teamSelection == TEAM_HUMANS &&
+ if( ent->client->pers.teamSelection == TEAM_HUMANS &&
( client->ps.stats[ STAT_STATE ] & SS_HEALING_2X ) )
{
int remainingStartupTime = MEDKIT_STARTUP_TIME - ( level.time - client->lastMedKitTime );
@@ -1539,7 +1539,7 @@ void ClientThink_real( gentity_t *ent )
ent->flags &= ~FL_FORCE_GESTURE;
ent->client->pers.cmd.buttons |= BUTTON_GESTURE;
}
-
+
// clear fall velocity before every pmove
client->pmext.fallVelocity = 0.0f;
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c
index 05135c498..76f166009 100644
--- a/src/game/g_buildable.c
+++ b/src/game/g_buildable.c
@@ -247,7 +247,7 @@ qboolean G_FindPower( gentity_t *self, qboolean searchUnspawned )
// TODO: handle combined power zones here
}
- }
+ }
else
{
// Dummy buildables don't need to look for zones
@@ -483,7 +483,7 @@ int G_FindDCC( gentity_t *self )
distance = VectorLength( temp_v );
if( distance < DC_RANGE && ent->powered )
{
- foundDCC++;
+ foundDCC++;
}
}
}
@@ -535,7 +535,7 @@ The code here will break if more than one reactor or overmind is allowed, even
if one of them is dead/unspawned
================
*/
-static gentity_t *G_FindBuildable( buildable_t buildable );
+static gentity_t *G_FindBuildable( buildable_t buildable );
gentity_t *G_Reactor( void )
{
@@ -596,7 +596,7 @@ qboolean G_FindCreep( gentity_t *self )
if( ent->s.eType != ET_BUILDABLE )
continue;
- if( ( ent->s.modelindex == BA_A_SPAWN ||
+ if( ( ent->s.modelindex == BA_A_SPAWN ||
ent->s.modelindex == BA_A_OVERMIND ) &&
ent->spawned && ent->health > 0 )
{
@@ -843,7 +843,7 @@ void AGeneric_Pain( gentity_t *self, gentity_t *attacker, int damage )
{
if( self->health <= 0 )
return;
-
+
// Alien buildables only have the first pain animation defined
G_SetBuildableAnim( self, BANIM_PAIN1, qfalse );
}
@@ -872,8 +872,8 @@ void ASpawn_Think( gentity_t *self )
if( ( ent = G_CheckSpawnPoint( self->s.number, self->r.currentOrigin,
self->s.origin2, BA_A_SPAWN, NULL ) ) != NULL )
{
- // If the thing blocking the spawn is a buildable, kill it.
- // If it's part of the map, kill self.
+ // If the thing blocking the spawn is a buildable, kill it.
+ // If it's part of the map, kill self.
if( ent->s.eType == ET_BUILDABLE )
{
// don't queue the bp from this
@@ -1200,9 +1200,9 @@ void AAcidTube_Think( gentity_t *self )
G_SetBuildableAnim( self, BANIM_ATTACK1, qfalse );
G_AddEvent( self, EV_ALIEN_ACIDTUBE, DirToByte( self->s.origin2 ) );
}
-
+
G_SelectiveRadiusDamage( self->s.pos.trBase, self, ACIDTUBE_DAMAGE,
- ACIDTUBE_RANGE, self, MOD_ATUBE, TEAM_ALIENS );
+ ACIDTUBE_RANGE, self, MOD_ATUBE, TEAM_ALIENS );
self->nextthink = level.time + ACIDTUBE_REPEAT;
return;
}
@@ -1692,8 +1692,8 @@ void HSpawn_Think( gentity_t *self )
if( ( ent = G_CheckSpawnPoint( self->s.number, self->r.currentOrigin,
self->s.origin2, BA_H_SPAWN, NULL ) ) != NULL )
{
- // If the thing blocking the spawn is a buildable, kill it.
- // If it's part of the map, kill self.
+ // If the thing blocking the spawn is a buildable, kill it.
+ // If it's part of the map, kill self.
if( ent->s.eType == ET_BUILDABLE )
{
G_Damage( ent, NULL, NULL, NULL, NULL, self->health, 0, MOD_SUICIDE );
@@ -2056,7 +2056,7 @@ void HMedistat_Think( gentity_t *self )
//if active use the healing idle
if( self->active )
G_SetIdleBuildableAnim( self, BANIM_IDLE2 );
-
+
//check if a previous occupier is still here
num = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES );
for( i = 0; i < num; i++ )
@@ -2065,7 +2065,7 @@ void HMedistat_Think( gentity_t *self )
if( player->flags & FL_NOTARGET )
continue; // notarget cancels even beneficial effects?
-
+
//remove poison from everyone, not just the healed player
if( player->client && player->client->ps.stats[ STAT_STATE ] & SS_POISONED )
player->client->ps.stats[ STAT_STATE ] &= ~SS_POISONED;
@@ -2173,7 +2173,7 @@ qboolean HMGTurret_CheckTarget( gentity_t *self, gentity_t *target,
if( target->flags & FL_NOTARGET )
return qfalse;
-
+
if( !los_check )
return qtrue;
@@ -2266,7 +2266,7 @@ void HMGTurret_FindEnemy( gentity_t *self )
int start;
self->enemy = NULL;
-
+
// Look for targets in a box around the turret
VectorSet( range, MGTURRET_RANGE, MGTURRET_RANGE, MGTURRET_RANGE );
VectorAdd( self->r.currentOrigin, range, maxs );
@@ -2323,7 +2323,7 @@ static qboolean HMGTurret_State( gentity_t *self, int state )
else
self->speed *= 1.25f;
- self->s.angles2[ PITCH ] =
+ self->s.angles2[ PITCH ] =
MIN( MGTURRET_VERTICALCAP, angle + self->speed );
return qtrue;
}
@@ -2354,7 +2354,7 @@ Think function for MG turret
*/
void HMGTurret_Think( gentity_t *self )
{
- self->nextthink = level.time +
+ self->nextthink = level.time +
BG_Buildable( self->s.modelindex )->nextthink;
// Turn off client side muzzle flashes
@@ -2378,7 +2378,7 @@ void HMGTurret_Think( gentity_t *self )
}
if( !self->spawned )
return;
-
+
// If the current target is not valid find a new enemy
if( !HMGTurret_CheckTarget( self, self->enemy, qtrue ) )
{
@@ -2411,7 +2411,7 @@ void HMGTurret_Think( gentity_t *self )
// Not firing or haven't spun up yet
if( !self->active || self->turretSpinupTime > level.time )
return;
-
+
// Fire repeat delay
if( self->timestamp > level.time )
return;
@@ -2552,7 +2552,7 @@ void G_QueueBuildPoints( gentity_t *self )
if( !queuePoints )
return;
-
+
switch( self->buildableTeam )
{
default:
@@ -3266,7 +3266,7 @@ static itemBuildError_t G_SufficientBPAvailable( buildable_t buildable,
// than we have now due to mismatches between priority and BP amounts
// by repeatedly testing if we can chop off the first thing that isn't
// required by rules of collision/uniqueness, which are always at the head
- while( changed && level.numBuildablesForRemoval > 1 &&
+ while( changed && level.numBuildablesForRemoval > 1 &&
level.numBuildablesForRemoval > numRequired )
{
int pointsUnYielded = 0;
@@ -3280,7 +3280,7 @@ static itemBuildError_t G_SufficientBPAvailable( buildable_t buildable,
pointsYielded -= pointsUnYielded;
memmove( &level.markedBuildables[ numRequired ],
&level.markedBuildables[ numRequired + 1 ],
- ( level.numBuildablesForRemoval - numRequired )
+ ( level.numBuildablesForRemoval - numRequired )
* sizeof( gentity_t * ) );
level.numBuildablesForRemoval--;
changed = qtrue;
@@ -3351,9 +3351,8 @@ Checks to see if a buildable can be built
================
*/
itemBuildError_t G_CanBuild( gentity_t *ent, buildable_t buildable, int distance,
- vec3_t origin, vec3_t normal, int *groundEntNum )
+ vec3_t origin, vec3_t normal, vec3_t angles, int *groundEntNum )
{
- vec3_t angles;
vec3_t entity_origin;
vec3_t mins, maxs;
trace_t tr1, tr2, tr3;
@@ -3435,7 +3434,7 @@ itemBuildError_t G_CanBuild( gentity_t *ent, buildable_t buildable, int distance
tempent = G_Reactor( );
if( tempent == NULL ) // No reactor
- reason = IBE_RPTNOREAC;
+ reason = IBE_RPTNOREAC;
else if( g_markDeconstruct.integer && G_IsPowered( entity_origin ) == BA_H_REACTOR )
reason = IBE_RPTPOWERHERE;
else if( !g_markDeconstruct.integer && G_IsPowered( entity_origin ) )
@@ -3797,15 +3796,15 @@ G_BuildIfValid
qboolean G_BuildIfValid( gentity_t *ent, buildable_t buildable )
{
float dist;
- vec3_t origin, normal;
+ vec3_t origin, normal, angles;
int groundEntNum;
dist = BG_Class( ent->client->ps.stats[ STAT_CLASS ] )->buildDist;
- switch( G_CanBuild( ent, buildable, dist, origin, normal, &groundEntNum ) )
+ switch( G_CanBuild( ent, buildable, dist, origin, normal, angles, &groundEntNum ) )
{
case IBE_NONE:
- G_Build( ent, buildable, origin, normal, ent->s.apos.trBase, groundEntNum );
+ G_Build( ent, buildable, origin, normal, angles, groundEntNum );
return qtrue;
case IBE_NOALIENBP:
@@ -4567,7 +4566,7 @@ void G_BuildLogRevert( int id )
builder->nextthink = level.time + FRAMETIME;
// Number of thinks before giving up and killing players in the way
- builder->suicideTime = 30;
+ builder->suicideTime = 30;
if( log->fate == BF_DESTROY || log->fate == BF_TEAMKILL )
{
diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c
index 4dccf6af0..1059bdc85 100644
--- a/src/game/g_cmds.c
+++ b/src/game/g_cmds.c
@@ -400,8 +400,8 @@ static void Give_Class( gentity_t *ent, char *s )
return;
}
- ent->client->pers.evolveHealthFraction
- = (float)ent->client->ps.stats[ STAT_HEALTH ]
+ ent->client->pers.evolveHealthFraction
+ = (float)ent->client->ps.stats[ STAT_HEALTH ]
/ (float)BG_Class( currentClass )->health;
if( ent->client->pers.evolveHealthFraction < 0.0f )
@@ -466,7 +466,7 @@ void Cmd_Give_f( gentity_t *ent )
if( trap_Argc( ) < 2 )
{
ADMP( "^3give: ^7usage: give [what]\n"
- "health, funds , stamina, poison, gas, ammo, "
+ "health, funds , stamina, poison, gas, ammo, "
"^3level0, level1, level1upg, level2, level2upg, level3, level3upg, level4, builder, builderupg, "
"human_base, human_bsuit, "
"^5blaster, rifle, psaw, shotgun, lgun, mdriver, chaingun, flamer, prifle, grenade, lockblob, "
@@ -494,7 +494,7 @@ void Cmd_Give_f( gentity_t *ent )
else
{
credits = atof( name + 6 ) *
- ( ent->client->pers.teamSelection ==
+ ( ent->client->pers.teamSelection ==
TEAM_ALIENS ? ALIEN_CREDITS_PER_KILL : 1.0f );
// clamp credits manually, as G_AddCreditToClient() expects a short int
@@ -761,7 +761,7 @@ void Cmd_Team_f( gentity_t *ent )
humans--;
// stop team join spam
- if( ent->client->pers.teamChangeTime &&
+ if( ent->client->pers.teamChangeTime &&
level.time - ent->client->pers.teamChangeTime < 1000 )
return;
@@ -1410,8 +1410,8 @@ void Cmd_CallVote_f( gentity_t *ent )
G_AdminMessage( NULL, va( S_COLOR_WHITE "%s" S_COLOR_YELLOW " attempted %s %s"
" on immune admin " S_COLOR_WHITE "%s" S_COLOR_YELLOW
" for: %s",
- ent->client->pers.netname, cmd, vote,
- g_entities[ clientNum ].client->pers.netname,
+ ent->client->pers.netname, cmd, vote,
+ g_entities[ clientNum ].client->pers.netname,
reason[ 0 ] ? reason : "no reason" ) );
return;
}
@@ -1692,9 +1692,9 @@ void Cmd_CallVote_f( gentity_t *ent )
}
else if( G_admin_permission( &g_entities[ i ], ADMF_ADMINCHAT ) )
{
- trap_SendServerCommand( i, va( "chat -1 %d \"" S_COLOR_YELLOW "%s"
+ trap_SendServerCommand( i, va( "chat -1 %d \"" S_COLOR_YELLOW "%s"
S_COLOR_YELLOW " called a team vote (%ss): %s\"", SAY_ADMINS,
- ent->client->pers.netname, BG_TeamName( team ),
+ ent->client->pers.netname, BG_TeamName( team ),
level.voteDisplayString[ team ] ) );
}
}
@@ -2273,6 +2273,187 @@ void Cmd_ToggleItem_f( gentity_t *ent )
trap_SendServerCommand( ent-g_entities, va( "print \"You don't have the %s\n\"", s ) );
}
+/*
+=================
+G_CanClientSellWeapon
+=================
+*/
+qboolean G_CanClientSellWeapon( gentity_t *ent, weapon_t weapon )
+{
+ //no armoury nearby
+ if( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )
+ {
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOARMOURYHERE );
+ return (qfalse);
+ }
+
+ if( !BG_PlayerCanChangeWeapon( &ent->client->ps ) )
+ return (qfalse);
+
+ //are we /allowed/ to sell this?
+ if( !BG_Weapon( weapon )->purchasable )
+ {
+ trap_SendServerCommand( ent-g_entities, "print \"You can't sell this weapon\n\"" );
+ return (qfalse);
+ }
+
+ if( BG_InventoryContainsWeapon( weapon, ent->client->ps.stats ) )
+ {
+ //guard against selling the HBUILD weapons exploit
+ if( weapon == WP_HBUILD && ent->client->ps.stats[ STAT_MISC ] > 0 )
+ {
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_ARMOURYBUILDTIMER );
+ return (qfalse);
+ }
+ return (qtrue);
+ }
+
+ return (qfalse);
+}
+
+/*
+=================
+G_SellClientWeapon
+Must test G_CanClientSellWeapon
+=================
+*/
+void G_SellClientWeapon( gentity_t *ent, weapon_t weapon )
+{
+ weapon_t selected = BG_GetPlayerWeapon( &ent->client->ps );
+
+ ent->client->ps.stats[ STAT_WEAPON ] = WP_NONE;
+ // Cancel ghost buildables
+ ent->client->ps.stats[ STAT_BUILDABLE ] = BA_NONE;
+
+ //add to funds
+ G_AddCreditToClient( ent->client, (short)BG_Weapon( weapon )->price, qfalse );
+
+ //if we have this weapon selected, force a new selection
+ if( weapon == selected )
+ G_ForceWeaponChange( ent, WP_BLASTER );
+}
+
+/*
+=================
+G_CanClientSellUpgrade
+=================
+*/
+qboolean G_CanClientSellUpgrade( gentity_t *ent, upgrade_t upgrade )
+{
+ //no armoury nearby
+ if( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )
+ {
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOARMOURYHERE );
+ return (qfalse);
+ }
+
+ //are we /allowed/ to sell this?
+ if( !BG_Upgrade( upgrade )->purchasable )
+ {
+ trap_SendServerCommand( ent-g_entities, "print \"You can't sell this item\n\"" );
+ return (qfalse);
+ }
+
+ if( BG_InventoryContainsUpgrade( upgrade, ent->client->ps.stats ) )
+ {
+ // shouldn't really need to test for this, but just to be safe
+ if( upgrade == UP_BATTLESUIT )
+ {
+ vec3_t newOrigin;
+
+ if( !G_RoomForClassChange( ent, PCL_HUMAN, newOrigin ) )
+ {
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOROOMBSUITOFF );
+ return (qfalse);
+ }
+ }
+
+ return (qtrue);
+ }
+
+ return (qfalse);
+}
+
+/*
+=================
+G_SellClientUpgrade
+Must test G_CanClientSellUpgrade
+=================
+*/
+void G_SellClientUpgrade( gentity_t *ent, upgrade_t upgrade )
+{
+ // shouldn't really need to test for this, but just to be safe
+ if( upgrade == UP_BATTLESUIT )
+ {
+ vec3_t newOrigin;
+
+ if( !G_RoomForClassChange( ent, PCL_HUMAN, newOrigin ) )
+ {
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOROOMBSUITOFF );
+ return ;
+ }
+ VectorCopy( newOrigin, ent->client->ps.origin );
+ ent->client->ps.stats[ STAT_CLASS ] = PCL_HUMAN;
+ ent->client->pers.classSelection = PCL_HUMAN;
+ ent->client->ps.eFlags ^= EF_TELEPORT_BIT;
+ }
+
+ //add to inventory
+ BG_RemoveUpgradeFromInventory( upgrade, ent->client->ps.stats );
+
+ if( upgrade == UP_BATTPACK )
+ G_GiveClientMaxAmmo( ent, qtrue );
+
+ //add to funds
+ G_AddCreditToClient( ent->client, (short)BG_Upgrade( upgrade )->price, qfalse );
+}
+
+/*
+=================
+G_PriceOfClientItems
+=================
+*/
+static int G_PriceOfClientItems( int conflictingWP[WP_NUM_WEAPONS - 1], int conflictingUP[UP_NUM_UPGRADES - 1] )
+{
+ int i;
+ int price = 0;
+
+ i = 0;
+ while (conflictingWP[i])
+ price += BG_Weapon(conflictingWP[i++])->price;
+ i = 0;
+ while (conflictingUP[i])
+ price += BG_Upgrade(conflictingUP[i++])->price;
+ return (price);
+}
+/*
+=================
+G_SellClientItems
+=================
+*/
+static qboolean G_SellClientItems( gentity_t *ent, int conflictingWP[WP_NUM_WEAPONS - 1], int conflictingUP[UP_NUM_UPGRADES - 1] )
+{
+ int i;
+
+ i = 0;
+ while (conflictingWP[i])
+ if (!G_CanClientSellWeapon(ent, conflictingWP[i++]))
+ return (qfalse);
+ i = 0;
+ while (conflictingUP[i])
+ if (!G_CanClientSellUpgrade(ent, conflictingUP[i++]))
+ return (qfalse);
+
+ i = 0;
+ while (conflictingWP[i])
+ G_SellClientWeapon(ent, conflictingWP[i++]);
+ i = 0;
+ while (conflictingUP[i])
+ G_SellClientUpgrade(ent, conflictingUP[i++]);
+
+ return (qtrue);
+}
+
/*
=================
Cmd_Buy_f
@@ -2280,10 +2461,12 @@ Cmd_Buy_f
*/
void Cmd_Buy_f( gentity_t *ent )
{
- char s[ MAX_TOKEN_CHARS ];
+ char s[ MAX_TOKEN_CHARS ];
weapon_t weapon;
upgrade_t upgrade;
qboolean energyOnly;
+ int conflictingWP[WP_NUM_WEAPONS - 1];
+ int conflictingUP[UP_NUM_UPGRADES - 1];
trap_Argv( 1, s, sizeof( s ) );
@@ -2338,18 +2521,23 @@ void Cmd_Buy_f( gentity_t *ent )
return;
}
+ BG_GetConflictingWithInventory(BG_Weapon( weapon )->slots, ent->client->ps.stats, conflictingWP, conflictingUP);
+
//can afford this?
- if( BG_Weapon( weapon )->price > (short)ent->client->pers.credit )
+ if( BG_Weapon( weapon )->price > (short)ent->client->pers.credit + G_PriceOfClientItems(conflictingWP, conflictingUP) )
{
G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOFUNDS );
return;
}
- //have space to carry this?
+ //have space to carry this? try to remove conflicting items, or cancel
if( BG_Weapon( weapon )->slots & BG_SlotsForInventory( ent->client->ps.stats ) )
{
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOSLOTS );
- return;
+ if (!G_SellClientItems(ent, conflictingWP, conflictingUP))
+ {
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOSLOTS );
+ return ;
+ }
}
// In some instances, weapons can't be changed
@@ -2374,27 +2562,22 @@ void Cmd_Buy_f( gentity_t *ent )
}
else if( upgrade != UP_NONE )
{
- //already got this?
+ //already got this? try to remove conflicting items, or cancel
if( BG_InventoryContainsUpgrade( upgrade, ent->client->ps.stats ) )
{
G_TriggerMenu( ent->client->ps.clientNum, MN_H_ITEMHELD );
return;
}
+ BG_GetConflictingWithInventory(BG_Upgrade( upgrade )->slots, ent->client->ps.stats, conflictingWP, conflictingUP);
+
//can afford this?
- if( BG_Upgrade( upgrade )->price > (short)ent->client->pers.credit )
+ if( BG_Upgrade( upgrade )->price > (short)ent->client->pers.credit + G_PriceOfClientItems(conflictingWP, conflictingUP) )
{
G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOFUNDS );
return;
}
- //have space to carry this?
- if( BG_Upgrade( upgrade )->slots & BG_SlotsForInventory( ent->client->ps.stats ) )
- {
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOSLOTS );
- return;
- }
-
// Only humans can buy stuff
if( BG_Upgrade( upgrade )->team != TEAM_HUMANS )
{
@@ -2416,6 +2599,16 @@ void Cmd_Buy_f( gentity_t *ent )
return;
}
+ //have space to carry this?
+ if( BG_Upgrade( upgrade )->slots & BG_SlotsForInventory( ent->client->ps.stats ) )
+ {
+ if (!G_SellClientItems(ent, conflictingWP, conflictingUP))
+ {
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOSLOTS );
+ return ;
+ }
+ }
+
if( upgrade == UP_AMMO )
G_GiveClientMaxAmmo( ent, energyOnly );
else
@@ -2471,13 +2664,6 @@ void Cmd_Sell_f( gentity_t *ent )
trap_Argv( 1, s, sizeof( s ) );
- //no armoury nearby
- if( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )
- {
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOARMOURYHERE );
- return;
- }
-
if( !Q_stricmpn( s, "weapon", 6 ) )
weapon = ent->client->ps.stats[ STAT_WEAPON ];
else
@@ -2487,110 +2673,20 @@ void Cmd_Sell_f( gentity_t *ent )
if( weapon != WP_NONE )
{
- weapon_t selected = BG_GetPlayerWeapon( &ent->client->ps );
-
- if( !BG_PlayerCanChangeWeapon( &ent->client->ps ) )
- return;
-
- //are we /allowed/ to sell this?
- if( !BG_Weapon( weapon )->purchasable )
- {
- trap_SendServerCommand( ent-g_entities, "print \"You can't sell this weapon\n\"" );
- return;
- }
-
- //remove weapon if carried
- if( BG_InventoryContainsWeapon( weapon, ent->client->ps.stats ) )
- {
- //guard against selling the HBUILD weapons exploit
- if( weapon == WP_HBUILD && ent->client->ps.stats[ STAT_MISC ] > 0 )
- {
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_ARMOURYBUILDTIMER );
- return;
- }
-
- ent->client->ps.stats[ STAT_WEAPON ] = WP_NONE;
- // Cancel ghost buildables
- ent->client->ps.stats[ STAT_BUILDABLE ] = BA_NONE;
-
- //add to funds
- G_AddCreditToClient( ent->client, (short)BG_Weapon( weapon )->price, qfalse );
- }
-
- //if we have this weapon selected, force a new selection
- if( weapon == selected )
- G_ForceWeaponChange( ent, WP_BLASTER );
+ if (G_CanClientSellWeapon(ent, weapon))
+ G_SellClientWeapon(ent, weapon);
}
else if( upgrade != UP_NONE )
{
- //are we /allowed/ to sell this?
- if( !BG_Upgrade( upgrade )->purchasable )
- {
- trap_SendServerCommand( ent-g_entities, "print \"You can't sell this item\n\"" );
- return;
- }
- //remove upgrade if carried
- if( BG_InventoryContainsUpgrade( upgrade, ent->client->ps.stats ) )
- {
- // shouldn't really need to test for this, but just to be safe
- if( upgrade == UP_BATTLESUIT )
- {
- vec3_t newOrigin;
-
- if( !G_RoomForClassChange( ent, PCL_HUMAN, newOrigin ) )
- {
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOROOMBSUITOFF );
- return;
- }
- VectorCopy( newOrigin, ent->client->ps.origin );
- ent->client->ps.stats[ STAT_CLASS ] = PCL_HUMAN;
- ent->client->pers.classSelection = PCL_HUMAN;
- ent->client->ps.eFlags ^= EF_TELEPORT_BIT;
- }
-
- //add to inventory
- BG_RemoveUpgradeFromInventory( upgrade, ent->client->ps.stats );
-
- if( upgrade == UP_BATTPACK )
- G_GiveClientMaxAmmo( ent, qtrue );
-
- //add to funds
- G_AddCreditToClient( ent->client, (short)BG_Upgrade( upgrade )->price, qfalse );
- }
+ if (G_CanClientSellUpgrade(ent, upgrade))
+ G_SellClientUpgrade(ent, upgrade);
}
else if( !Q_stricmp( s, "upgrades" ) )
{
for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ )
{
- //remove upgrade if carried
- if( BG_InventoryContainsUpgrade( i, ent->client->ps.stats ) &&
- BG_Upgrade( i )->purchasable )
- {
-
- // shouldn't really need to test for this, but just to be safe
- if( i == UP_BATTLESUIT )
- {
- vec3_t newOrigin;
-
- if( !G_RoomForClassChange( ent, PCL_HUMAN, newOrigin ) )
- {
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOROOMBSUITOFF );
- continue;
- }
- VectorCopy( newOrigin, ent->client->ps.origin );
- ent->client->ps.stats[ STAT_CLASS ] = PCL_HUMAN;
- ent->client->pers.classSelection = PCL_HUMAN;
- ent->client->ps.eFlags ^= EF_TELEPORT_BIT;
- }
-
- BG_RemoveUpgradeFromInventory( i, ent->client->ps.stats );
-
- if( i == UP_BATTPACK )
- G_GiveClientMaxAmmo( ent, qtrue );
-
- //add to funds
- G_AddCreditToClient( ent->client, (short)BG_Upgrade( i )->price, qfalse );
- }
+ if (G_CanClientSellUpgrade(ent, i))
+ G_SellClientUpgrade(ent, i);
}
}
else
@@ -2615,7 +2711,7 @@ void Cmd_Build_f( gentity_t *ent )
char s[ MAX_TOKEN_CHARS ];
buildable_t buildable;
float dist;
- vec3_t origin, normal;
+ vec3_t origin, normal, angles;
int groundEntNum;
team_t team;
@@ -2659,7 +2755,7 @@ void Cmd_Build_f( gentity_t *ent )
dist = BG_Class( ent->client->ps.stats[ STAT_CLASS ] )->buildDist;
//these are the errors displayed when the builder first selects something to use
- switch( G_CanBuild( ent, buildable, dist, origin, normal, &groundEntNum ) )
+ switch( G_CanBuild( ent, buildable, dist, origin, normal, angles, &groundEntNum ) )
{
// can place right away, set the blueprint and the valid togglebit
case IBE_NONE:
@@ -2735,6 +2831,83 @@ void Cmd_Build_f( gentity_t *ent )
G_TriggerMenu( ent->client->ps.clientNum, MN_B_CANNOT );
}
+
+/*
+=================
+Cmd_RotateBuild
+=================
+*/
+static void Cmd_RotateBuild( gentity_t *ent, int unit, qboolean add )
+{
+ int currentAngle;
+ int finalAngle;
+
+ if ( !ent->client || ent->client->ps.stats[ STAT_BUILDABLE ] & SB_BUILDABLE_MASK == 0 )
+ return;
+
+ if (add == qtrue)
+ {
+ currentAngle =
+ (ent->client->ps.stats[ STAT_BUILDABLE ] & SB_ROTATION_MASK)
+ / SB_ROTATION_UNIT;
+ finalAngle = currentAngle + unit;
+ }
+ else
+ {
+ finalAngle = unit;
+ }
+ finalAngle %= 16;
+ if (finalAngle < 0)
+ finalAngle -= 16;
+
+ ent->client->ps.stats[ STAT_BUILDABLE ] &= ~SB_ROTATION_MASK; // Earse rotation data
+ ent->client->ps.stats[ STAT_BUILDABLE ] |= SB_ROTATION_UNIT * finalAngle; // Write rotation data
+}
+
+
+/*
+=================
+Cmd_RotateBuild_f
+=================
+*/
+void Cmd_RotateBuild_f( gentity_t *ent )
+{
+ int unit;
+ char arg[16];
+ char *argcpy;
+
+ trap_Argv( 1, arg, sizeof( arg ) );
+ argcpy = arg;
+ while (*argcpy && isspace(*argcpy))
+ argcpy++;
+ unit = atoi(arg);
+
+ Cmd_RotateBuild( ent, unit, *argcpy == '-' || *argcpy == '+' );
+}
+
+
+/*
+=================
+Cmd_RotateBuildLeft_f
+=================
+*/
+void Cmd_RotateBuildLeft_f( gentity_t *ent )
+{
+ Cmd_RotateBuild( ent, -1, qtrue );
+}
+
+
+/*
+=================
+Cmd_RotateBuildRight_f
+=================
+*/
+void Cmd_RotateBuildRight_f( gentity_t *ent )
+{
+ Cmd_RotateBuild( ent, 1, qtrue );
+}
+
+
/*
=================
Cmd_Reload_f
@@ -3451,6 +3624,9 @@ commands_t cmds[ ] = {
{ "noclip", CMD_CHEAT_TEAM, Cmd_Noclip_f },
{ "notarget", CMD_CHEAT|CMD_TEAM|CMD_ALIVE, Cmd_Notarget_f },
{ "reload", CMD_HUMAN|CMD_ALIVE, Cmd_Reload_f },
+ { "rotatebuild", CMD_TEAM|CMD_ALIVE, Cmd_RotateBuild_f },
+ { "rotatebuildleft", CMD_TEAM|CMD_ALIVE, Cmd_RotateBuildLeft_f },
+ { "rotatebuildright", CMD_TEAM|CMD_ALIVE, Cmd_RotateBuildRight_f },
{ "say", CMD_MESSAGE|CMD_INTERMISSION, Cmd_Say_f },
{ "say_area", CMD_MESSAGE|CMD_TEAM|CMD_ALIVE, Cmd_SayArea_f },
{ "say_team", CMD_MESSAGE|CMD_INTERMISSION, Cmd_Say_f },
diff --git a/src/game/g_local.h b/src/game/g_local.h
index f894ec24a..9d8ab251f 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -675,7 +675,7 @@ typedef struct
emoticon_t emoticons[ MAX_EMOTICONS ];
int emoticonCount;
-
+
char *playerModel[ MAX_PLAYER_MODEL ];
int playerModelCount;
@@ -795,7 +795,7 @@ void G_BuildableThink( gentity_t *ent, int msec );
qboolean G_BuildableRange( vec3_t origin, float r, buildable_t buildable );
void G_ClearDeconMarks( void );
itemBuildError_t G_CanBuild( gentity_t *ent, buildable_t buildable, int distance,
- vec3_t origin, vec3_t normal, int *groundEntNum );
+ vec3_t origin, vec3_t normal, vec3_t angles, int *groundEntNum );
qboolean G_BuildIfValid( gentity_t *ent, buildable_t buildable );
void G_SetBuildableAnim( gentity_t *ent, buildableAnimNumber_t anim, qboolean force );
void G_SetIdleBuildableAnim( gentity_t *ent, buildableAnimNumber_t anim );
diff --git a/src/game/g_main.c b/src/game/g_main.c
index f0f215817..1a0ab1bde 100644
--- a/src/game/g_main.c
+++ b/src/game/g_main.c
@@ -1394,6 +1394,90 @@ void G_CalculateStages( void )
humanNextStageThreshold ) );
}
+/*
+============
+G_CalculateStates
+============
+*/
+void G_CalculateStates( void )
+{
+ int i;
+ int abuilders = 0;
+ int hbuilders = 0;
+ int arm = 0, medi = 0, dcc = 0, boost = 0;
+ int om = 0, rc = 0;
+ qboolean ombuild = qfalse, rcbuild = qfalse;
+ gentity_t *ent;
+
+ // Objects counter
+ for ( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ {
+ if( !ent->inuse || ent->s.eType != ET_BUILDABLE || ent->health <= 0 )
+ continue;
+
+ switch (ent->s.modelindex) {
+
+ case BA_A_OVERMIND:
+ om = ent->health;
+ ombuild = !ent->spawned;
+ break;
+
+ case BA_H_REACTOR:
+ rc = ent->health;
+ rcbuild = !ent->spawned;
+ break;
+
+ case BA_A_BOOSTER:
+ boost++;
+ break;
+
+ case BA_H_MEDISTAT:
+ medi++;
+ break;
+
+ case BA_H_ARMOURY:
+ arm++;
+ break;
+
+ case BA_H_DCC:
+ dcc++;
+ break;
+
+ }
+ }
+
+ // Builder counter
+ for( i = 0; i < level.maxclients; i++ )
+ {
+ ent = &g_entities[ i ];
+ if( !ent->client || ent->client->pers.connected != CON_CONNECTED
+ || ent->client->pers.teamSelection == TEAM_NONE || ent->client->sess.spectatorState == SPECTATOR_FOLLOW )
+ continue;
+
+ if( ent->client->ps.stats[ STAT_CLASS ] == PCL_ALIEN_BUILDER0 ||
+ ent->client->ps.stats[ STAT_CLASS ] == PCL_ALIEN_BUILDER0_UPG )
+ abuilders++;
+ else if( BG_InventoryContainsWeapon( WP_HBUILD, ent->client->ps.stats ) )
+ hbuilders++;
+ }
+
+
+ trap_SetConfigstring( CS_ALIEN_STATUS, va( "%d %d %d %d %d",
+ ombuild,
+ ( om > 0 ) ? om : 0,
+ level.numAlienSpawns,
+ abuilders,
+ boost ) );
+ trap_SetConfigstring( CS_HUMAN_STATUS, va( "%d %d %d %d %d %d %d",
+ rcbuild,
+ ( rc > 0 ) ? rc : 0,
+ level.numHumanSpawns,
+ hbuilders,
+ arm,
+ medi,
+ dcc ) );
+}
+
/*
============
CalculateAvgPlayers
@@ -2003,8 +2087,8 @@ void CheckExitRules( void )
{
//humans win
level.lastWin = TEAM_HUMANS;
- trap_SendServerCommand( -1, "print \"Humans win\n\"");
- trap_SetConfigstring( CS_WINNER, "Humans Win" );
+ trap_SendServerCommand( -1, "print \"Humans win [human]\n\"");
+ trap_SetConfigstring( CS_WINNER, "^5 Humans Win [human]" );
LogExit( "Humans win." );
}
else if( level.uncondAlienWin ||
@@ -2014,8 +2098,8 @@ void CheckExitRules( void )
{
//aliens win
level.lastWin = TEAM_ALIENS;
- trap_SendServerCommand( -1, "print \"Aliens win\n\"");
- trap_SetConfigstring( CS_WINNER, "Aliens Win" );
+ trap_SendServerCommand( -1, "print \"Aliens win [dragoon]\n\"");
+ trap_SetConfigstring( CS_WINNER, "^1 Aliens Win [dragoon]" );
LogExit( "Aliens win." );
}
}
@@ -2306,7 +2390,7 @@ void G_RunFrame( int levelTime )
trap_SendServerCommand( -1, "cp \"The game has been paused. Please wait.\"" );
if( level.pausedTime >= 110000 && level.pausedTime <= 119000 )
- trap_SendServerCommand( -1, va( "print \"Server: Game will auto-unpause in %d seconds\n\"",
+ trap_SendServerCommand( -1, va( "print \"Server: Game will auto-unpause in %d seconds\n\"",
(int) ( (float) ( 120000 - level.pausedTime ) / 1000.0f ) ) );
}
@@ -2443,6 +2527,7 @@ void G_RunFrame( int levelTime )
{
G_CalculateBuildPoints( );
G_CalculateStages( );
+ G_CalculateStates( );
G_SpawnClients( TEAM_ALIENS );
G_SpawnClients( TEAM_HUMANS );
G_CalculateAvgPlayers( );
diff --git a/src/game/g_team.c b/src/game/g_team.c
index 4af62354d..15dfdd199 100644
--- a/src/game/g_team.c
+++ b/src/game/g_team.c
@@ -135,6 +135,8 @@ void G_UpdateTeamConfigStrings( void )
trap_SetConfigstringRestrictions( CS_ALIEN_STAGES, &humanTeam );
trap_SetConfigstringRestrictions( CS_HUMAN_STAGES, &alienTeam );
+ trap_SetConfigstringRestrictions( CS_ALIEN_STATUS, &humanTeam );
+ trap_SetConfigstringRestrictions( CS_HUMAN_STATUS, &alienTeam );
}
/*
@@ -293,7 +295,7 @@ void TeamplayInfoMessage( gentity_t *ent )
{
char entry[ 17 ],
string[ ( MAX_CLIENTS - 1 ) * ( sizeof( entry ) - 1 ) + 1 ];
- int i, j;
+ int i, j;
int team, stringlength;
gentity_t *player;
gclient_t *cl;
@@ -445,14 +447,14 @@ void CheckTeamStatus( void )
level.numTeamImbalanceWarnings < 3 && !level.restarted )
{
level.lastTeamImbalancedTime = level.time;
- if( level.numAlienSpawns > 0 &&
+ if( level.numAlienSpawns > 0 &&
level.numHumanClients - level.numAlienClients > 2 )
{
trap_SendServerCommand( -1, "print \"Teams are imbalanced. "
"Humans have more players.\n\"");
level.numTeamImbalanceWarnings++;
}
- else if( level.numHumanSpawns > 0 &&
+ else if( level.numHumanSpawns > 0 &&
level.numAlienClients - level.numHumanClients > 2 )
{
trap_SendServerCommand ( -1, "print \"Teams are imbalanced. "
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index 302c47e63..306b22946 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -445,8 +445,8 @@ void massDriverFire( gentity_t *ent )
SnapVectorTowards( tr.endpos, muzzle );
// send impact
- if( traceEnt->takedamage &&
- (traceEnt->s.eType == ET_BUILDABLE ||
+ if( traceEnt->takedamage &&
+ (traceEnt->s.eType == ET_BUILDABLE ||
traceEnt->s.eType == ET_PLAYER ) )
{
BloodSpurt( ent, traceEnt, &tr );
@@ -493,7 +493,7 @@ void hiveFire( gentity_t *ent )
// Fire from the hive tip, not the center
VectorMA( muzzle, ent->r.maxs[ 2 ], ent->s.origin2, origin );
-
+
fire_hive( ent, origin, forward );
}
@@ -535,7 +535,7 @@ void flamerFire( gentity_t *ent )
{
vec3_t origin;
- // Correct muzzle so that the missile does not start in the ceiling
+ // Correct muzzle so that the missile does not start in the ceiling
VectorMA( muzzle, -7.0f, up, origin );
// Correct muzzle so that the missile fires from the player's hand
@@ -592,8 +592,8 @@ void lasGunFire( gentity_t *ent )
SnapVectorTowards( tr.endpos, muzzle );
// send impact
- if( traceEnt->takedamage &&
- (traceEnt->s.eType == ET_BUILDABLE ||
+ if( traceEnt->takedamage &&
+ (traceEnt->s.eType == ET_BUILDABLE ||
traceEnt->s.eType == ET_PLAYER ) )
{
BloodSpurt( ent, traceEnt, &tr );
@@ -799,7 +799,7 @@ buildFire
void buildFire( gentity_t *ent, dynMenu_t menu )
{
buildable_t buildable = ( ent->client->ps.stats[ STAT_BUILDABLE ]
- & ~SB_VALID_TOGGLEBIT );
+ & SB_BUILDABLE_MASK );
if( buildable > BA_NONE )
{
@@ -1286,7 +1286,7 @@ qboolean CheckPounceAttack( gentity_t *ent )
if( !traceEnt->takedamage )
return qfalse;
-
+
// Deal damage
timeMax = ent->client->ps.weapon == WP_ALEVEL3 ? LEVEL3_POUNCE_TIME :
LEVEL3_POUNCE_TIME_UPG;
@@ -1388,7 +1388,7 @@ void G_CrushAttack( gentity_t *ent, gentity_t *victim )
if( damage < 0 )
damage = 0;
-
+
// Players also get damaged periodically
if( victim->client &&
ent->client->lastCrushTime + LEVEL4_CRUSH_REPEAT < level.time )
@@ -1396,7 +1396,7 @@ void G_CrushAttack( gentity_t *ent, gentity_t *victim )
ent->client->lastCrushTime = level.time;
damage += LEVEL4_CRUSH_DAMAGE;
}
-
+
if( damage < 1 )
return;
@@ -1517,7 +1517,7 @@ void FireWeapon( gentity_t *ent )
{
// set aiming directions
AngleVectors( ent->client->ps.viewangles, forward, right, up );
- CalcMuzzlePoint( ent, forward, right, up, muzzle );
+ CalcMuzzlePoint( ent, forward, right, up, muzzle );
}
else
{
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index f5f5e1695..a0269ad6f 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -97,7 +97,7 @@ along with Tremulous; if not, see
#define LEVEL3_CLAW_DMG ADM(80)
#define LEVEL3_CLAW_RANGE 80.0f
-#define LEVEL3_CLAW_UPG_RANGE LEVEL3_CLAW_RANGE + 3.0f
+#define LEVEL3_CLAW_UPG_RANGE LEVEL3_CLAW_RANGE + 3.0f
#define LEVEL3_CLAW_WIDTH 12.0f
#define LEVEL3_CLAW_REPEAT 900
#define LEVEL3_CLAW_K_SCALE 1.0f
@@ -109,7 +109,7 @@ along with Tremulous; if not, see
#define LEVEL3_POUNCE_WIDTH 14.0f
#define LEVEL3_POUNCE_TIME 800 // msec for full Dragoon pounce
#define LEVEL3_POUNCE_TIME_UPG 800 // msec for full Adv. Dragoon pounce
-#define LEVEL3_POUNCE_TIME_MIN 200 // msec before which pounce cancels
+#define LEVEL3_POUNCE_TIME_MIN 200 // msec before which pounce cancels
#define LEVEL3_POUNCE_REPEAT 400 // msec before a new pounce starts
#define LEVEL3_POUNCE_SPEED_MOD 0.75f // walking speed modifier for pounce charging
#define LEVEL3_POUNCE_JUMP_MAG 700 // Dragoon pounce jump power
@@ -675,7 +675,7 @@ along with Tremulous; if not, see
#define DAMAGE_FRACTION_FOR_KILL 0.5f //how much damage players (versus structures) need to
//do to increment the stage kill counters
-
+
#define MAXIMUM_BUILD_TIME 20000 // used for pie timer
#endif
diff --git a/src/qcommon/qfiles.h b/src/qcommon/qfiles.h
index 91bcf04cf..549302219 100644
--- a/src/qcommon/qfiles.h
+++ b/src/qcommon/qfiles.h
@@ -39,7 +39,7 @@ along with Tremulous; if not, see
#endif
// surface geometry should not exceed these limits
-#define SHADER_MAX_VERTEXES 1000
+#define SHADER_MAX_VERTEXES 3000
#define SHADER_MAX_INDEXES (6 * SHADER_MAX_VERTEXES)
// the maximum size of game relative pathnames
diff --git a/src/renderergl1/tr_init.cpp b/src/renderergl1/tr_init.cpp
index cbd5095c1..c92999536 100644
--- a/src/renderergl1/tr_init.cpp
+++ b/src/renderergl1/tr_init.cpp
@@ -191,11 +191,11 @@ static void InitOpenGL( void )
// - r_ignorehwgamma
// - r_gamma
//
-
+
if ( glConfig.vidWidth == 0 )
{
GLint temp;
-
+
GLimp_Init( qfalse );
strcpy( renderer_buffer, glConfig.renderer_string );
@@ -206,7 +206,7 @@ static void InitOpenGL( void )
glConfig.maxTextureSize = temp;
// stubbed or broken drivers may have reported 0...
- if ( glConfig.maxTextureSize <= 0 )
+ if ( glConfig.maxTextureSize <= 0 )
{
glConfig.maxTextureSize = 0;
}
@@ -260,10 +260,10 @@ void GL_CheckErrors( void ) {
}
-/*
-==============================================================================
-
- SCREEN SHOTS
+/*
+==============================================================================
+
+ SCREEN SHOTS
NOTE TTimo
some thoughts about the screenshots system:
@@ -276,11 +276,11 @@ we use statics to store a count and start writing the first screenshot/screensho
(with FS_FileExists / FS_FOpenFileWrite calls)
FIXME: the statics don't get a reinit between fs_game changes
-==============================================================================
-*/
+==============================================================================
+*/
-/*
-==================
+/*
+==================
RB_ReadPixels
Reads an image but takes care of alignment issues for reading RGB images.
@@ -293,50 +293,50 @@ alignment of packAlign to ensure efficient copying.
Stores the length of padding after a line of pixels to address padlen
Return value must be freed with ri.Hunk_FreeTempMemory()
-==================
-*/
+==================
+*/
byte *RB_ReadPixels(int x, int y, int width, int height, size_t *offset, int *padlen)
{
byte *buffer, *bufstart;
int padwidth, linelen;
GLint packAlign;
-
+
qglGetIntegerv(GL_PACK_ALIGNMENT, &packAlign);
-
+
linelen = width * 3;
padwidth = PAD(linelen, packAlign);
-
+
// Allocate a few more bytes so that we can choose an alignment we like
buffer = (byte*)ri.Hunk_AllocateTempMemory(padwidth * height + *offset + packAlign - 1);
-
+
bufstart = (byte*)PADP((intptr_t) buffer + *offset, packAlign);
qglReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, bufstart);
-
+
*offset = bufstart - buffer;
*padlen = padwidth - linelen;
-
+
return buffer;
}
-/*
-==================
+/*
+==================
RB_TakeScreenshot
-==================
-*/
+==================
+*/
void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
{
byte *allbuf, *buffer;
byte *srcptr, *destptr;
byte *endline, *endmem;
byte temp;
-
+
int linelen, padlen;
size_t offset = 18, memcount;
-
+
allbuf = RB_ReadPixels(x, y, width, height, &offset, &padlen);
buffer = allbuf + offset - 18;
-
+
Com_Memset (buffer, 0, 18);
buffer[2] = 2; // uncompressed type
buffer[12] = width & 255;
@@ -347,10 +347,10 @@ void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
// swap rgb to bgr and remove padding from line endings
linelen = width * 3;
-
+
srcptr = destptr = allbuf + offset;
endmem = srcptr + (linelen + padlen) * height;
-
+
while(srcptr < endmem)
{
endline = srcptr + linelen;
@@ -361,10 +361,10 @@ void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
*destptr++ = srcptr[2];
*destptr++ = srcptr[1];
*destptr++ = temp;
-
+
srcptr += 3;
}
-
+
// Skip the pad
srcptr += padlen;
}
@@ -380,10 +380,10 @@ void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
ri.Hunk_FreeTempMemory(allbuf);
}
-/*
-==================
+/*
+==================
RB_TakeScreenshotJPEG
-==================
+==================
*/
void RB_TakeScreenshotJPEG(int x, int y, int width, int height, char *fileName)
@@ -410,15 +410,15 @@ RB_TakeScreenshotCmd
*/
const void *RB_TakeScreenshotCmd( const void *data ) {
const screenshotCommand_t *cmd;
-
+
cmd = (const screenshotCommand_t *)data;
-
+
if (cmd->jpeg)
RB_TakeScreenshotJPEG( cmd->x, cmd->y, cmd->width, cmd->height, cmd->fileName);
else
RB_TakeScreenshot( cmd->x, cmd->y, cmd->width, cmd->height, cmd->fileName);
-
- return (const void *)(cmd + 1);
+
+ return (const void *)(cmd + 1);
}
/*
@@ -445,11 +445,11 @@ void R_TakeScreenshot( int x, int y, int width, int height, char *name, bool jpe
cmd->jpeg = jpeg;
}
-/*
-==================
+/*
+==================
R_ScreenshotFilename
-==================
-*/
+==================
+*/
void R_ScreenshotFilename( int lastNumber, char *fileName ) {
int a,b,c,d;
@@ -470,11 +470,11 @@ void R_ScreenshotFilename( int lastNumber, char *fileName ) {
, a, b, c, d );
}
-/*
-==================
+/*
+==================
R_ScreenshotFilename
-==================
-*/
+==================
+*/
void R_ScreenshotFilenameJPEG( int lastNumber, char *fileName ) {
int a,b,c,d;
@@ -562,8 +562,8 @@ void R_LevelShot( void ) {
ri.Printf( PRINT_ALL, "Wrote %s\n", checkname );
}
-/*
-==================
+/*
+==================
R_ScreenShot_f
screenshot
@@ -572,8 +572,8 @@ screenshot [levelshot]
screenshot [filename]
Doesn't print the pacifier message if there is a second arg
-==================
-*/
+==================
+*/
void R_ScreenShot_f (void) {
char checkname[MAX_OSPATH];
static int lastNumber = -1;
@@ -613,7 +613,7 @@ void R_ScreenShot_f (void) {
}
if ( lastNumber >= 9999 ) {
- ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
+ ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
return;
}
@@ -625,7 +625,7 @@ void R_ScreenShot_f (void) {
if ( !silent ) {
ri.Printf (PRINT_ALL, "Wrote %s\n", checkname);
}
-}
+}
void R_ScreenShotJPEG_f (void) {
char checkname[MAX_OSPATH];
@@ -666,7 +666,7 @@ void R_ScreenShotJPEG_f (void) {
}
if ( lastNumber == 10000 ) {
- ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
+ ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
return;
}
@@ -678,7 +678,7 @@ void R_ScreenShotJPEG_f (void) {
if ( !silent ) {
ri.Printf (PRINT_ALL, "Wrote %s\n", checkname);
}
-}
+}
//============================================================================
@@ -694,9 +694,9 @@ const void *RB_TakeVideoFrameCmd( const void *data )
size_t memcount, linelen;
int padwidth, avipadwidth, padlen, avipadlen;
GLint packAlign;
-
+
cmd = (const videoFrameCommand_t *)data;
-
+
qglGetIntegerv(GL_PACK_ALIGNMENT, &packAlign);
linelen = cmd->width * 3;
@@ -709,7 +709,7 @@ const void *RB_TakeVideoFrameCmd( const void *data )
avipadlen = avipadwidth - linelen;
cBuf = (byte*)PADP(cmd->captureBuffer, packAlign);
-
+
qglReadPixels(0, 0, cmd->width, cmd->height, GL_RGB,
GL_UNSIGNED_BYTE, cBuf);
@@ -730,11 +730,11 @@ const void *RB_TakeVideoFrameCmd( const void *data )
{
byte *lineend, *memend;
byte *srcptr, *destptr;
-
+
srcptr = cBuf;
destptr = cmd->encodeBuffer;
memend = srcptr + memcount;
-
+
// swap R and B and remove line paddings
while(srcptr < memend)
{
@@ -746,17 +746,17 @@ const void *RB_TakeVideoFrameCmd( const void *data )
*destptr++ = srcptr[0];
srcptr += 3;
}
-
+
Com_Memset(destptr, '\0', avipadlen);
destptr += avipadlen;
-
+
srcptr += padlen;
}
-
+
ri.CL_WriteAVIVideoFrame(cmd->encodeBuffer, avipadwidth * cmd->height);
}
- return (const void *)(cmd + 1);
+ return (const void *)(cmd + 1);
}
//============================================================================
@@ -833,7 +833,7 @@ void R_PrintLongString(const char *string) {
GfxInfo_f
================
*/
-void GfxInfo_f( void )
+void GfxInfo_f( void )
{
const char *enablestrings[] =
{
@@ -927,11 +927,11 @@ void GfxInfo_f( void )
R_Register
===============
*/
-void R_Register( void )
+void R_Register( void )
{
#ifdef USE_RENDERER_DLOPEN
com_altivec = ri.Cvar_Get("com_altivec", "1", CVAR_ARCHIVE);
- #endif
+ #endif
//
// latched and archived variables
@@ -945,7 +945,7 @@ void R_Register( void )
r_picmip = ri.Cvar_Get ("r_picmip", GENERIC_HW_R_PICMIP_DEFAULT,
CVAR_ARCHIVE | CVAR_LATCH );
r_ext_texture_filter_anisotropic = ri.Cvar_Get( "r_ext_texture_filter_anisotropic",
- "0", CVAR_ARCHIVE | CVAR_LATCH );
+ "1", CVAR_ARCHIVE | CVAR_LATCH );
r_ext_max_anisotropy = ri.Cvar_Get( "r_ext_max_anisotropy", "2", CVAR_ARCHIVE | CVAR_LATCH );
r_roundImagesDown = ri.Cvar_Get ("r_roundImagesDown", "1", CVAR_ARCHIVE | CVAR_LATCH );
@@ -1090,7 +1090,7 @@ void R_Register( void )
R_Init
===============
*/
-void R_Init( void ) {
+void R_Init( void ) {
int err;
int i;
byte *ptr;
@@ -1183,7 +1183,7 @@ void R_Init( void ) {
RE_Shutdown
===============
*/
-void RE_Shutdown( bool destroyWindow ) {
+void RE_Shutdown( bool destroyWindow ) {
ri.Printf( PRINT_ALL, "RE_Shutdown( %i )\n", destroyWindow );
@@ -1249,7 +1249,7 @@ refexport_t *GetRefAPI ( int apiVersion, refimport_t *rimp ) {
Com_Memset( &re, 0, sizeof( re ) );
if ( apiVersion != REF_API_VERSION ) {
- ri.Printf(PRINT_ALL, "Mismatched REF_API_VERSION: expected %i, got %i\n",
+ ri.Printf(PRINT_ALL, "Mismatched REF_API_VERSION: expected %i, got %i\n",
REF_API_VERSION, apiVersion );
return NULL;
}
diff --git a/src/renderergl1/tr_model.cpp b/src/renderergl1/tr_model.cpp
index 5afd51d05..809fb80dd 100644
--- a/src/renderergl1/tr_model.cpp
+++ b/src/renderergl1/tr_model.cpp
@@ -61,6 +61,17 @@ qhandle_t R_RegisterMD3(const char *name, model_t *mod)
fext++;
}
+ if(strcmp(fext, "md3") == 0)
+ {
+ char name3000[MAX_QPATH];
+ qhandle_t md3000;
+
+ strcpy(name3000, filename);
+ strncat(name3000, ".md3000", MAX_QPATH);
+ if(md3000 = R_RegisterMD3(name3000, mod))
+ return md3000;
+ }
+
for (lod = MD3_MAX_LODS - 1 ; lod >= 0 ; lod--)
{
if(lod)
@@ -71,13 +82,13 @@ qhandle_t R_RegisterMD3(const char *name, model_t *mod)
ri.FS_ReadFile( namebuf, &buf.v );
if(!buf.u)
continue;
-
+
ident = LittleLong(* (unsigned *) buf.u);
if (ident == MD3_IDENT)
loaded = R_LoadMD3(mod, lod, buf.u, name);
else
ri.Printf(PRINT_WARNING,"R_RegisterMD3: unknown fileid for %s\n", name);
-
+
ri.FS_FreeFile(buf.v);
if(loaded)
@@ -129,20 +140,20 @@ qhandle_t R_RegisterMDR(const char *name, model_t *mod)
mod->type = MOD_BAD;
return 0;
}
-
+
ident = LittleLong(*(unsigned *)buf.u);
if(ident == MDR_IDENT)
loaded = R_LoadMDR(mod, buf.u, filesize, name);
ri.FS_FreeFile (buf.v);
-
+
if(!loaded)
{
ri.Printf(PRINT_WARNING,"R_RegisterMDR: couldn't load mdr file %s\n", name);
mod->type = MOD_BAD;
return 0;
}
-
+
return mod->index;
}
@@ -166,18 +177,18 @@ qhandle_t R_RegisterIQM(const char *name, model_t *mod)
mod->type = MOD_BAD;
return 0;
}
-
+
loaded = R_LoadIQM(mod, buf.u, filesize, name);
ri.FS_FreeFile (buf.v);
-
+
if(!loaded)
{
ri.Printf(PRINT_WARNING,"R_RegisterIQM: couldn't load iqm file %s\n", name);
mod->type = MOD_BAD;
return 0;
}
-
+
return mod->index;
}
@@ -412,7 +423,7 @@ static bool R_LoadMD3 (model_t *mod, int lod, void *buffer, const char *mod_name
ri.Printf( PRINT_WARNING, "R_LoadMD3: %s has no frames\n", mod_name );
return false;
}
-
+
// swap all the frames
frame = (md3Frame_t *) ( (byte *)mod->md3[lod] + mod->md3[lod]->ofsFrames );
for ( i = 0 ; i < mod->md3[lod]->numFrames ; i++, frame++) {
@@ -450,7 +461,7 @@ static bool R_LoadMD3 (model_t *mod, int lod, void *buffer, const char *mod_name
LL(surf->ofsSt);
LL(surf->ofsXyzNormals);
LL(surf->ofsEnd);
-
+
if ( surf->numVerts >= SHADER_MAX_VERTEXES ) {
ri.Printf(PRINT_WARNING, "R_LoadMD3: %s has more than %i verts on %s (%i).\n",
mod_name, SHADER_MAX_VERTEXES - 1, surf->name[0] ? surf->name : "a surface",
@@ -463,7 +474,7 @@ static bool R_LoadMD3 (model_t *mod, int lod, void *buffer, const char *mod_name
surf->numTriangles );
return false;
}
-
+
// change to surface identifier
surf->ident = SF_MD3;
@@ -507,7 +518,7 @@ static bool R_LoadMD3 (model_t *mod, int lod, void *buffer, const char *mod_name
// swap all the XyzNormals
xyz = (md3XyzNormal_t *) ( (byte *)surf + surf->ofsXyzNormals );
- for ( j = 0 ; j < surf->numVerts * surf->numFrames ; j++, xyz++ )
+ for ( j = 0 ; j < surf->numVerts * surf->numFrames ; j++, xyz++ )
{
xyz->xyz[0] = LittleShort( xyz->xyz[0] );
xyz->xyz[1] = LittleShort( xyz->xyz[1] );
@@ -520,7 +531,7 @@ static bool R_LoadMD3 (model_t *mod, int lod, void *buffer, const char *mod_name
// find the next surface
surf = (md3Surface_t *)( (byte *)surf + surf->ofsEnd );
}
-
+
return true;
}
@@ -531,7 +542,7 @@ static bool R_LoadMD3 (model_t *mod, int lod, void *buffer, const char *mod_name
R_LoadMDR
=================
*/
-static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod_name )
+static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod_name )
{
int i, j, k, l;
mdrHeader_t *pinmodel, *mdr;
@@ -548,20 +559,20 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
pinmodel = (mdrHeader_t *)buffer;
pinmodel->version = LittleLong(pinmodel->version);
- if (pinmodel->version != MDR_VERSION)
+ if (pinmodel->version != MDR_VERSION)
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has wrong version (%i should be %i)\n", mod_name, pinmodel->version, MDR_VERSION);
return false;
}
size = LittleLong(pinmodel->ofsEnd);
-
+
if(size > filesize)
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: Header of %s is broken. Wrong filesize declared!\n", mod_name);
return false;
}
-
+
mod->type = MOD_MDR;
LL(pinmodel->numFrames);
@@ -577,7 +588,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
// now add enough space for the uncompressed bones.
size += pinmodel->numFrames * pinmodel->numBones * ((sizeof(mdrBone_t) - sizeof(mdrCompBone_t)));
}
-
+
// simple bounds check
if(pinmodel->numBones < 0 ||
sizeof(*mdr) + pinmodel->numFrames * (sizeof(*frame) + (pinmodel->numBones - 1) * sizeof(*frame->bones)) > size)
@@ -590,7 +601,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
mod->modelData = mdr = (mdrHeader_t*)ri.Hunk_Alloc( size, h_low );
// Copy all the values over from the file and fix endian issues in the process, if necessary.
-
+
mdr->ident = LittleLong(pinmodel->ident);
mdr->version = pinmodel->version; // Don't need to swap byte order on this one, we already did above.
Q_strncpyz(mdr->name, pinmodel->name, sizeof(mdr->name));
@@ -602,7 +613,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
mod->numLods = mdr->numLODs;
- if ( mdr->numFrames < 1 )
+ if ( mdr->numFrames < 1 )
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has no frames\n", mod_name);
return false;
@@ -611,14 +622,14 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
/* The first frame will be put into the first free space after the header */
frame = (mdrFrame_t *)(mdr + 1);
mdr->ofsFrames = (int)((byte *) frame - (byte *) mdr);
-
+
if (pinmodel->ofsFrames < 0)
{
mdrCompFrame_t *cframe;
-
- // compressed model...
+
+ // compressed model...
cframe = (mdrCompFrame_t *)((byte *) pinmodel - pinmodel->ofsFrames);
-
+
for(i = 0; i < mdr->numFrames; i++)
{
for(j = 0; j < 3; j++)
@@ -630,7 +641,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
frame->radius = LittleFloat(cframe->radius);
frame->name[0] = '\0'; // No name supplied in the compressed version.
-
+
for(j = 0; j < mdr->numBones; j++)
{
for(k = 0; k < (sizeof(cframe->bones[j].Comp) / 2); k++)
@@ -638,15 +649,15 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
// Do swapping for the uncompressing functions. They seem to use shorts
// values only, so I assume this will work. Never tested it on other
// platforms, though.
-
+
((unsigned short *)(cframe->bones[j].Comp))[k] =
LittleShort( ((unsigned short *)(cframe->bones[j].Comp))[k] );
}
-
+
/* Now do the actual uncompressing */
MC_UnCompress(frame->bones[j].matrix, cframe->bones[j].Comp);
}
-
+
// Next Frame...
cframe = (mdrCompFrame_t *) &cframe->bones[j];
frame = (mdrFrame_t *) &frame->bones[j];
@@ -655,14 +666,14 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
else
{
mdrFrame_t *curframe;
-
+
// uncompressed model...
//
-
+
curframe = (mdrFrame_t *)((byte *) pinmodel + pinmodel->ofsFrames);
-
+
// swap all the frames
- for ( i = 0 ; i < mdr->numFrames ; i++)
+ for ( i = 0 ; i < mdr->numFrames ; i++)
{
for(j = 0; j < 3; j++)
{
@@ -670,26 +681,26 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
frame->bounds[1][j] = LittleFloat(curframe->bounds[1][j]);
frame->localOrigin[j] = LittleFloat(curframe->localOrigin[j]);
}
-
+
frame->radius = LittleFloat(curframe->radius);
Q_strncpyz(frame->name, curframe->name, sizeof(frame->name));
-
- for (j = 0; j < (int) (mdr->numBones * sizeof(mdrBone_t) / 4); j++)
+
+ for (j = 0; j < (int) (mdr->numBones * sizeof(mdrBone_t) / 4); j++)
{
((float *)frame->bones)[j] = LittleFloat( ((float *)curframe->bones)[j] );
}
-
+
curframe = (mdrFrame_t *) &curframe->bones[mdr->numBones];
frame = (mdrFrame_t *) &frame->bones[mdr->numBones];
}
}
-
+
// frame should now point to the first free address after all frames.
lod = (mdrLOD_t *) frame;
mdr->ofsLODs = (int) ((byte *) lod - (byte *)mdr);
-
+
curlod = (mdrLOD_t *)((byte *) pinmodel + LittleLong(pinmodel->ofsLODs));
-
+
// swap all the LOD's
for ( l = 0 ; l < mdr->numLODs ; l++)
{
@@ -701,12 +712,12 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
}
lod->numSurfaces = LittleLong(curlod->numSurfaces);
-
+
// swap all the surfaces
surf = (mdrSurface_t *) (lod + 1);
lod->ofsSurfaces = (int)((byte *) surf - (byte *) lod);
cursurf = (mdrSurface_t *) ((byte *)curlod + LittleLong(curlod->ofsSurfaces));
-
+
for ( i = 0 ; i < lod->numSurfaces ; i++)
{
// simple bounds check
@@ -717,26 +728,26 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
}
// first do some copying stuff
-
+
surf->ident = SF_MDR;
Q_strncpyz(surf->name, cursurf->name, sizeof(surf->name));
Q_strncpyz(surf->shader, cursurf->shader, sizeof(surf->shader));
-
+
surf->ofsHeader = (byte *) mdr - (byte *) surf;
-
+
surf->numVerts = LittleLong(cursurf->numVerts);
surf->numTriangles = LittleLong(cursurf->numTriangles);
// numBoneReferences and BoneReferences generally seem to be unused
-
+
// now do the checks that may fail.
- if ( surf->numVerts >= SHADER_MAX_VERTEXES )
+ if ( surf->numVerts >= SHADER_MAX_VERTEXES )
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has more than %i verts on %s (%i).\n",
mod_name, SHADER_MAX_VERTEXES - 1, surf->name[0] ? surf->name : "a surface",
surf->numVerts );
return false;
}
- if ( surf->numTriangles*3 >= SHADER_MAX_INDEXES )
+ if ( surf->numTriangles*3 >= SHADER_MAX_INDEXES )
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has more than %i triangles on %s (%i).\n",
mod_name, ( SHADER_MAX_INDEXES / 3 ) - 1, surf->name[0] ? surf->name : "a surface",
@@ -753,16 +764,16 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
} else {
surf->shaderIndex = sh->index;
}
-
+
// now copy the vertexes.
v = (mdrVertex_t *) (surf + 1);
surf->ofsVerts = (int)((byte *) v - (byte *) surf);
curv = (mdrVertex_t *) ((byte *)cursurf + LittleLong(cursurf->ofsVerts));
-
+
for(j = 0; j < surf->numVerts; j++)
{
LL(curv->numWeights);
-
+
// simple bounds check
if(curv->numWeights < 0 || (byte *) (v + 1) + (curv->numWeights - 1) * sizeof(*weight) > (byte *) mdr + size)
{
@@ -773,37 +784,37 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
v->normal[0] = LittleFloat(curv->normal[0]);
v->normal[1] = LittleFloat(curv->normal[1]);
v->normal[2] = LittleFloat(curv->normal[2]);
-
+
v->texCoords[0] = LittleFloat(curv->texCoords[0]);
v->texCoords[1] = LittleFloat(curv->texCoords[1]);
-
+
v->numWeights = curv->numWeights;
weight = &v->weights[0];
curweight = &curv->weights[0];
-
+
// Now copy all the weights
for(k = 0; k < v->numWeights; k++)
{
weight->boneIndex = LittleLong(curweight->boneIndex);
weight->boneWeight = LittleFloat(curweight->boneWeight);
-
+
weight->offset[0] = LittleFloat(curweight->offset[0]);
weight->offset[1] = LittleFloat(curweight->offset[1]);
weight->offset[2] = LittleFloat(curweight->offset[2]);
-
+
weight++;
curweight++;
}
-
+
v = (mdrVertex_t *) weight;
curv = (mdrVertex_t *) curweight;
}
-
+
// we know the offset to the triangles now:
tri = (mdrTriangle_t *) v;
surf->ofsTriangles = (int)((byte *) tri - (byte *) surf);
curtri = (mdrTriangle_t *)((byte *) cursurf + LittleLong(cursurf->ofsTriangles));
-
+
// simple bounds check
if(surf->numTriangles < 0 || (byte *) (tri + surf->numTriangles) > (byte *) mdr + size)
{
@@ -816,11 +827,11 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
tri->indexes[0] = LittleLong(curtri->indexes[0]);
tri->indexes[1] = LittleLong(curtri->indexes[1]);
tri->indexes[2] = LittleLong(curtri->indexes[2]);
-
+
tri++;
curtri++;
}
-
+
// tri now points to the end of the surface.
surf->ofsEnd = (byte *) tri - (byte *) surf;
surf = (mdrSurface_t *) tri;
@@ -836,7 +847,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
// find the next LOD.
curlod = (mdrLOD_t *)((byte *) curlod + LittleLong(curlod->ofsEnd));
}
-
+
// lod points to the first tag now, so update the offset too.
tag = (mdrTag_t *) lod;
mdr->ofsTags = (int)((byte *) tag - (byte *) mdr);
@@ -848,21 +859,21 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has broken structure.\n", mod_name);
return false;
}
-
+
for (i = 0 ; i < mdr->numTags ; i++)
{
tag->boneIndex = LittleLong(curtag->boneIndex);
Q_strncpyz(tag->name, curtag->name, sizeof(tag->name));
-
+
tag++;
curtag++;
}
-
+
// And finally we know the real offset to the end.
mdr->ofsEnd = (int)((byte *) tag - (byte *) mdr);
// phew! we're done.
-
+
return true;
}
@@ -966,14 +977,14 @@ static md3Tag_t *R_GetTag( md3Header_t *mod, int frame, const char *tagName ) {
return NULL;
}
-md3Tag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, md3Tag_t * dest)
+md3Tag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, md3Tag_t * dest)
{
int i, j, k;
int frameSize;
mdrFrame_t *frame;
mdrTag_t *tag;
- if ( framenum >= mod->numFrames )
+ if ( framenum >= mod->numFrames )
{
// it is possible to have a bad frame while changing models, so don't error
framenum = mod->numFrames - 1;
@@ -999,7 +1010,7 @@ md3Tag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, md3
dest->origin[0] = frame->bones[tag->boneIndex].matrix[0][3];
dest->origin[1] = frame->bones[tag->boneIndex].matrix[1][3];
- dest->origin[2] = frame->bones[tag->boneIndex].matrix[2][3];
+ dest->origin[2] = frame->bones[tag->boneIndex].matrix[2][3];
return dest;
}
@@ -1013,7 +1024,7 @@ md3Tag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, md3
R_LerpTag
================
*/
-int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame,
+int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame,
float frac, const char *tagName ) {
md3Tag_t *start, *end;
md3Tag_t start_space, end_space;
@@ -1078,7 +1089,7 @@ void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs ) {
if(model->type == MOD_BRUSH) {
VectorCopy( model->bmodel->bounds[0], mins );
VectorCopy( model->bmodel->bounds[1], maxs );
-
+
return;
} else if (model->type == MOD_MESH) {
md3Header_t *header;
@@ -1089,7 +1100,7 @@ void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs ) {
VectorCopy( frame->bounds[0], mins );
VectorCopy( frame->bounds[1], maxs );
-
+
return;
} else if (model->type == MOD_MDR) {
mdrHeader_t *header;
@@ -1100,11 +1111,11 @@ void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs ) {
VectorCopy( frame->bounds[0], mins );
VectorCopy( frame->bounds[1], maxs );
-
+
return;
} else if(model->type == MOD_IQM) {
iqmData_t *iqmData;
-
+
iqmData = (iqmData_t*)model->modelData;
if(iqmData->bounds)
diff --git a/src/renderergl2/tr_init.cpp b/src/renderergl2/tr_init.cpp
index 12e46a2de..8d27c3867 100644
--- a/src/renderergl2/tr_init.cpp
+++ b/src/renderergl2/tr_init.cpp
@@ -257,11 +257,11 @@ static void InitOpenGL( void )
// - r_ignorehwgamma
// - r_gamma
//
-
+
if ( glConfig.vidWidth == 0 )
{
GLint temp;
-
+
GLimp_Init( qtrue );
GLimp_InitExtraExtensions();
@@ -273,7 +273,7 @@ static void InitOpenGL( void )
glConfig.maxTextureSize = temp;
// stubbed or broken drivers may have reported 0...
- if ( glConfig.maxTextureSize <= 0 )
+ if ( glConfig.maxTextureSize <= 0 )
{
glConfig.maxTextureSize = 0;
}
@@ -327,10 +327,10 @@ void GL_CheckErrs( const char *file, int line ) {
}
-/*
-==============================================================================
-
- SCREEN SHOTS
+/*
+==============================================================================
+
+ SCREEN SHOTS
NOTE TTimo
some thoughts about the screenshots system:
@@ -343,11 +343,11 @@ we use statics to store a count and start writing the first screenshot/screensho
(with FS_FileExists / FS_FOpenFileWrite calls)
FIXME: the statics don't get a reinit between fs_game changes
-==============================================================================
-*/
+==============================================================================
+*/
-/*
-==================
+/*
+==================
RB_ReadPixels
Reads an image but takes care of alignment issues for reading RGB images.
@@ -360,51 +360,51 @@ alignment of packAlign to ensure efficient copying.
Stores the length of padding after a line of pixels to address padlen
Return value must be freed with ri.Hunk_FreeTempMemory()
-==================
-*/
+==================
+*/
byte *RB_ReadPixels(int x, int y, int width, int height, size_t *offset, int *padlen)
{
byte *buffer, *bufstart;
int padwidth, linelen;
GLint packAlign;
-
+
qglGetIntegerv(GL_PACK_ALIGNMENT, &packAlign);
-
+
linelen = width * 3;
padwidth = PAD(linelen, packAlign);
-
+
// Allocate a few more bytes so that we can choose an alignment we like
buffer = (byte*)ri.Hunk_AllocateTempMemory(padwidth * height + *offset + packAlign - 1);
-
+
bufstart = (byte*)PADP((intptr_t) buffer + *offset, packAlign);
qglReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, bufstart);
-
+
*offset = bufstart - buffer;
*padlen = padwidth - linelen;
-
+
return buffer;
}
-/*
-==================
+/*
+==================
RB_TakeScreenshot
-==================
-*/
+==================
+*/
void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
{
byte *allbuf, *buffer;
byte *srcptr, *destptr;
byte *endline, *endmem;
byte temp;
-
+
int linelen, padlen;
size_t offset = 18, memcount;
-
+
allbuf = RB_ReadPixels(x, y, width, height, &offset, &padlen);
buffer = allbuf + offset - 18;
-
+
Com_Memset (buffer, 0, 18);
buffer[2] = 2; // uncompressed type
buffer[12] = width & 255;
@@ -415,10 +415,10 @@ void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
// swap rgb to bgr and remove padding from line endings
linelen = width * 3;
-
+
srcptr = destptr = allbuf + offset;
endmem = srcptr + (linelen + padlen) * height;
-
+
while(srcptr < endmem)
{
endline = srcptr + linelen;
@@ -429,10 +429,10 @@ void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
*destptr++ = srcptr[2];
*destptr++ = srcptr[1];
*destptr++ = temp;
-
+
srcptr += 3;
}
-
+
// Skip the pad
srcptr += padlen;
}
@@ -448,10 +448,10 @@ void RB_TakeScreenshot(int x, int y, int width, int height, char *fileName)
ri.Hunk_FreeTempMemory(allbuf);
}
-/*
-==================
+/*
+==================
RB_TakeScreenshotJPEG
-==================
+==================
*/
void RB_TakeScreenshotJPEG(int x, int y, int width, int height, char *fileName)
@@ -478,7 +478,7 @@ RB_TakeScreenshotCmd
*/
const void *RB_TakeScreenshotCmd( const void *data ) {
const screenshotCommand_t *cmd;
-
+
cmd = (const screenshotCommand_t *)data;
// finish any 2D drawing if needed
@@ -489,8 +489,8 @@ const void *RB_TakeScreenshotCmd( const void *data ) {
RB_TakeScreenshotJPEG( cmd->x, cmd->y, cmd->width, cmd->height, cmd->fileName);
else
RB_TakeScreenshot( cmd->x, cmd->y, cmd->width, cmd->height, cmd->fileName);
-
- return (const void *)(cmd + 1);
+
+ return (const void *)(cmd + 1);
}
/*
@@ -517,11 +517,11 @@ void R_TakeScreenshot( int x, int y, int width, int height, char *name, bool jpe
cmd->jpeg = jpeg;
}
-/*
-==================
+/*
+==================
R_ScreenshotFilename
-==================
-*/
+==================
+*/
void R_ScreenshotFilename( int lastNumber, char *fileName ) {
int a,b,c,d;
@@ -542,11 +542,11 @@ void R_ScreenshotFilename( int lastNumber, char *fileName ) {
, a, b, c, d );
}
-/*
-==================
+/*
+==================
R_ScreenshotFilename
-==================
-*/
+==================
+*/
void R_ScreenshotFilenameJPEG( int lastNumber, char *fileName ) {
int a,b,c,d;
@@ -634,8 +634,8 @@ void R_LevelShot( void ) {
ri.Printf( PRINT_ALL, "Wrote %s\n", checkname );
}
-/*
-==================
+/*
+==================
R_ScreenShot_f
screenshot
@@ -644,8 +644,8 @@ screenshot [levelshot]
screenshot [filename]
Doesn't print the pacifier message if there is a second arg
-==================
-*/
+==================
+*/
void R_ScreenShot_f (void) {
char checkname[MAX_OSPATH];
static int lastNumber = -1;
@@ -685,7 +685,7 @@ void R_ScreenShot_f (void) {
}
if ( lastNumber >= 9999 ) {
- ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
+ ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
return;
}
@@ -697,7 +697,7 @@ void R_ScreenShot_f (void) {
if ( !silent ) {
ri.Printf (PRINT_ALL, "Wrote %s\n", checkname);
}
-}
+}
void R_ScreenShotJPEG_f (void) {
char checkname[MAX_OSPATH];
@@ -738,7 +738,7 @@ void R_ScreenShotJPEG_f (void) {
}
if ( lastNumber == 10000 ) {
- ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
+ ri.Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n");
return;
}
@@ -750,7 +750,7 @@ void R_ScreenShotJPEG_f (void) {
if ( !silent ) {
ri.Printf (PRINT_ALL, "Wrote %s\n", checkname);
}
-}
+}
//============================================================================
@@ -801,7 +801,7 @@ const void *RB_TakeVideoFrameCmd( const void *data )
RB_EndSurface();
cmd = (const videoFrameCommand_t *)data;
-
+
qglGetIntegerv(GL_PACK_ALIGNMENT, &packAlign);
linelen = cmd->width * 3;
@@ -814,7 +814,7 @@ const void *RB_TakeVideoFrameCmd( const void *data )
avipadlen = avipadwidth - linelen;
cBuf = (byte*)PADP(cmd->captureBuffer, packAlign);
-
+
qglReadPixels(0, 0, cmd->width, cmd->height, GL_RGB,
GL_UNSIGNED_BYTE, cBuf);
@@ -835,11 +835,11 @@ const void *RB_TakeVideoFrameCmd( const void *data )
{
byte *lineend, *memend;
byte *srcptr, *destptr;
-
+
srcptr = cBuf;
destptr = cmd->encodeBuffer;
memend = srcptr + memcount;
-
+
// swap R and B and remove line paddings
while(srcptr < memend)
{
@@ -851,17 +851,17 @@ const void *RB_TakeVideoFrameCmd( const void *data )
*destptr++ = srcptr[0];
srcptr += 3;
}
-
+
Com_Memset(destptr, '\0', avipadlen);
destptr += avipadlen;
-
+
srcptr += padlen;
}
-
+
ri.CL_WriteAVIVideoFrame(cmd->encodeBuffer, avipadwidth * cmd->height);
}
- return (const void *)(cmd + 1);
+ return (const void *)(cmd + 1);
}
//============================================================================
@@ -946,7 +946,7 @@ void R_PrintLongString(const char *string) {
GfxInfo_f
================
*/
-void GfxInfo_f( void )
+void GfxInfo_f( void )
{
const char *enablestrings[] =
{
@@ -1014,7 +1014,7 @@ void GfxInfo_f( void )
GfxMemInfo_f
================
*/
-void GfxMemInfo_f( void )
+void GfxMemInfo_f( void )
{
switch (glRefConfig.memInfo)
{
@@ -1066,11 +1066,11 @@ void GfxMemInfo_f( void )
R_Register
===============
*/
-void R_Register( void )
+void R_Register( void )
{
#ifdef USE_RENDERER_DLOPEN
com_altivec = ri.Cvar_Get("com_altivec", "1", CVAR_ARCHIVE);
- #endif
+ #endif
//
// latched and archived variables
@@ -1083,13 +1083,13 @@ void R_Register( void )
r_ext_framebuffer_object = ri.Cvar_Get( "r_ext_framebuffer_object", "1", CVAR_ARCHIVE | CVAR_LATCH);
r_ext_texture_float = ri.Cvar_Get( "r_ext_texture_float", "1", CVAR_ARCHIVE | CVAR_LATCH);
- r_ext_framebuffer_multisample = ri.Cvar_Get( "r_ext_framebuffer_multisample", "0", CVAR_ARCHIVE | CVAR_LATCH);
+ r_ext_framebuffer_multisample = ri.Cvar_Get( "r_ext_framebuffer_multisample", "16", CVAR_ARCHIVE | CVAR_LATCH);
r_arb_seamless_cube_map = ri.Cvar_Get( "r_arb_seamless_cube_map", "0", CVAR_ARCHIVE | CVAR_LATCH);
r_arb_vertex_array_object = ri.Cvar_Get( "r_arb_vertex_array_object", "1", CVAR_ARCHIVE | CVAR_LATCH);
r_ext_direct_state_access = ri.Cvar_Get("r_ext_direct_state_access", "1", CVAR_ARCHIVE | CVAR_LATCH);
r_ext_texture_filter_anisotropic = ri.Cvar_Get( "r_ext_texture_filter_anisotropic",
- "0", CVAR_ARCHIVE | CVAR_LATCH );
+ "1", CVAR_ARCHIVE | CVAR_LATCH );
r_ext_max_anisotropy = ri.Cvar_Get( "r_ext_max_anisotropy", "2", CVAR_ARCHIVE | CVAR_LATCH );
r_picmip = ri.Cvar_Get ("r_picmip", "1", CVAR_ARCHIVE | CVAR_LATCH );
@@ -1309,7 +1309,7 @@ void R_ShutDownQueries(void)
R_Init
===============
*/
-void R_Init( void ) {
+void R_Init( void ) {
int err;
int i;
byte *ptr;
@@ -1411,7 +1411,7 @@ void R_Init( void ) {
RE_Shutdown
===============
*/
-void RE_Shutdown( bool destroyWindow ) {
+void RE_Shutdown( bool destroyWindow ) {
ri.Printf( PRINT_ALL, "RE_Shutdown( %i )\n", destroyWindow );
@@ -1484,7 +1484,7 @@ refexport_t *GetRefAPI ( int apiVersion, refimport_t *rimp ) {
Com_Memset( &re, 0, sizeof( re ) );
if ( apiVersion != REF_API_VERSION ) {
- ri.Printf(PRINT_ALL, "Mismatched REF_API_VERSION: expected %i, got %i\n",
+ ri.Printf(PRINT_ALL, "Mismatched REF_API_VERSION: expected %i, got %i\n",
REF_API_VERSION, apiVersion );
return NULL;
}
diff --git a/src/renderergl2/tr_model.cpp b/src/renderergl2/tr_model.cpp
index 6e3b984f7..9b0927bfe 100644
--- a/src/renderergl2/tr_model.cpp
+++ b/src/renderergl2/tr_model.cpp
@@ -62,6 +62,17 @@ qhandle_t R_RegisterMD3(const char *name, model_t *mod)
fext++;
}
+ if(strcmp(fext, "md3") == 0)
+ {
+ char name3000[MAX_QPATH];
+ qhandle_t md3000;
+
+ strcpy(name3000, filename);
+ strncat(name3000, ".md3000", MAX_QPATH);
+ if(md3000 = R_RegisterMD3(name3000, mod))
+ return md3000;
+ }
+
for (lod = MD3_MAX_LODS - 1 ; lod >= 0 ; lod--)
{
if(lod)
@@ -72,13 +83,13 @@ qhandle_t R_RegisterMD3(const char *name, model_t *mod)
size = ri.FS_ReadFile( namebuf, &buf.v );
if(!buf.u)
continue;
-
+
ident = LittleLong(* (unsigned *) buf.u);
if (ident == MD3_IDENT)
loaded = R_LoadMD3(mod, lod, buf.u, size, name);
else
ri.Printf(PRINT_WARNING,"R_RegisterMD3: unknown fileid for %s\n", name);
-
+
ri.FS_FreeFile(buf.v);
if(loaded)
@@ -130,20 +141,20 @@ qhandle_t R_RegisterMDR(const char *name, model_t *mod)
mod->type = MOD_BAD;
return 0;
}
-
+
ident = LittleLong(*(unsigned *)buf.u);
if(ident == MDR_IDENT)
loaded = R_LoadMDR(mod, buf.u, filesize, name);
ri.FS_FreeFile (buf.v);
-
+
if(!loaded)
{
ri.Printf(PRINT_WARNING,"R_RegisterMDR: couldn't load mdr file %s\n", name);
mod->type = MOD_BAD;
return 0;
}
-
+
return mod->index;
}
@@ -167,18 +178,18 @@ qhandle_t R_RegisterIQM(const char *name, model_t *mod)
mod->type = MOD_BAD;
return 0;
}
-
+
loaded = R_LoadIQM(mod, buf.u, filesize, name);
ri.FS_FreeFile (buf.v);
-
+
if(!loaded)
{
ri.Printf(PRINT_WARNING,"R_RegisterIQM: couldn't load iqm file %s\n", name);
mod->type = MOD_BAD;
return 0;
}
-
+
return mod->index;
}
@@ -763,7 +774,7 @@ static bool R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize, cons
vaoSurf->mdvSurface = surf;
vaoSurf->numIndexes = surf->numIndexes;
vaoSurf->numVerts = surf->numVerts;
-
+
vaoSurf->minIndex = 0;
vaoSurf->maxIndex = surf->numVerts - 1;
@@ -824,7 +835,7 @@ static bool R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize, cons
R_LoadMDR
=================
*/
-static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod_name )
+static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod_name )
{
int i, j, k, l;
mdrHeader_t *pinmodel, *mdr;
@@ -841,20 +852,20 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
pinmodel = (mdrHeader_t *)buffer;
pinmodel->version = LittleLong(pinmodel->version);
- if (pinmodel->version != MDR_VERSION)
+ if (pinmodel->version != MDR_VERSION)
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has wrong version (%i should be %i)\n", mod_name, pinmodel->version, MDR_VERSION);
return false;
}
size = LittleLong(pinmodel->ofsEnd);
-
+
if(size > filesize)
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: Header of %s is broken. Wrong filesize declared!\n", mod_name);
return false;
}
-
+
mod->type = MOD_MDR;
LL(pinmodel->numFrames);
@@ -870,7 +881,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
// now add enough space for the uncompressed bones.
size += pinmodel->numFrames * pinmodel->numBones * ((sizeof(mdrBone_t) - sizeof(mdrCompBone_t)));
}
-
+
// simple bounds check
if(pinmodel->numBones < 0 ||
sizeof(*mdr) + pinmodel->numFrames * (sizeof(*frame) + (pinmodel->numBones - 1) * sizeof(*frame->bones)) > size)
@@ -883,7 +894,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
mod->modelData = mdr = (mdrHeader_t*)ri.Hunk_Alloc( size, h_low );
// Copy all the values over from the file and fix endian issues in the process, if necessary.
-
+
mdr->ident = LittleLong(pinmodel->ident);
mdr->version = pinmodel->version; // Don't need to swap byte order on this one, we already did above.
Q_strncpyz(mdr->name, pinmodel->name, sizeof(mdr->name));
@@ -895,7 +906,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
mod->numLods = mdr->numLODs;
- if ( mdr->numFrames < 1 )
+ if ( mdr->numFrames < 1 )
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has no frames\n", mod_name);
return false;
@@ -904,14 +915,14 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
/* The first frame will be put into the first free space after the header */
frame = (mdrFrame_t *)(mdr + 1);
mdr->ofsFrames = (int)((byte *) frame - (byte *) mdr);
-
+
if (pinmodel->ofsFrames < 0)
{
mdrCompFrame_t *cframe;
-
- // compressed model...
+
+ // compressed model...
cframe = (mdrCompFrame_t *)((byte *) pinmodel - pinmodel->ofsFrames);
-
+
for(i = 0; i < mdr->numFrames; i++)
{
for(j = 0; j < 3; j++)
@@ -923,7 +934,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
frame->radius = LittleFloat(cframe->radius);
frame->name[0] = '\0'; // No name supplied in the compressed version.
-
+
for(j = 0; j < mdr->numBones; j++)
{
for(k = 0; k < (sizeof(cframe->bones[j].Comp) / 2); k++)
@@ -931,15 +942,15 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
// Do swapping for the uncompressing functions. They seem to use shorts
// values only, so I assume this will work. Never tested it on other
// platforms, though.
-
+
((unsigned short *)(cframe->bones[j].Comp))[k] =
LittleShort( ((unsigned short *)(cframe->bones[j].Comp))[k] );
}
-
+
/* Now do the actual uncompressing */
MC_UnCompress(frame->bones[j].matrix, cframe->bones[j].Comp);
}
-
+
// Next Frame...
cframe = (mdrCompFrame_t *) &cframe->bones[j];
frame = (mdrFrame_t *) &frame->bones[j];
@@ -948,14 +959,14 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
else
{
mdrFrame_t *curframe;
-
+
// uncompressed model...
//
-
+
curframe = (mdrFrame_t *)((byte *) pinmodel + pinmodel->ofsFrames);
-
+
// swap all the frames
- for ( i = 0 ; i < mdr->numFrames ; i++)
+ for ( i = 0 ; i < mdr->numFrames ; i++)
{
for(j = 0; j < 3; j++)
{
@@ -963,26 +974,26 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
frame->bounds[1][j] = LittleFloat(curframe->bounds[1][j]);
frame->localOrigin[j] = LittleFloat(curframe->localOrigin[j]);
}
-
+
frame->radius = LittleFloat(curframe->radius);
Q_strncpyz(frame->name, curframe->name, sizeof(frame->name));
-
- for (j = 0; j < (int) (mdr->numBones * sizeof(mdrBone_t) / 4); j++)
+
+ for (j = 0; j < (int) (mdr->numBones * sizeof(mdrBone_t) / 4); j++)
{
((float *)frame->bones)[j] = LittleFloat( ((float *)curframe->bones)[j] );
}
-
+
curframe = (mdrFrame_t *) &curframe->bones[mdr->numBones];
frame = (mdrFrame_t *) &frame->bones[mdr->numBones];
}
}
-
+
// frame should now point to the first free address after all frames.
lod = (mdrLOD_t *) frame;
mdr->ofsLODs = (int) ((byte *) lod - (byte *)mdr);
-
+
curlod = (mdrLOD_t *)((byte *) pinmodel + LittleLong(pinmodel->ofsLODs));
-
+
// swap all the LOD's
for ( l = 0 ; l < mdr->numLODs ; l++)
{
@@ -994,12 +1005,12 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
}
lod->numSurfaces = LittleLong(curlod->numSurfaces);
-
+
// swap all the surfaces
surf = (mdrSurface_t *) (lod + 1);
lod->ofsSurfaces = (int)((byte *) surf - (byte *) lod);
cursurf = (mdrSurface_t *) ((byte *)curlod + LittleLong(curlod->ofsSurfaces));
-
+
for ( i = 0 ; i < lod->numSurfaces ; i++)
{
// simple bounds check
@@ -1010,26 +1021,26 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
}
// first do some copying stuff
-
+
surf->ident = SF_MDR;
Q_strncpyz(surf->name, cursurf->name, sizeof(surf->name));
Q_strncpyz(surf->shader, cursurf->shader, sizeof(surf->shader));
-
+
surf->ofsHeader = (byte *) mdr - (byte *) surf;
-
+
surf->numVerts = LittleLong(cursurf->numVerts);
surf->numTriangles = LittleLong(cursurf->numTriangles);
// numBoneReferences and BoneReferences generally seem to be unused
-
+
// now do the checks that may fail.
- if ( surf->numVerts >= SHADER_MAX_VERTEXES )
+ if ( surf->numVerts >= SHADER_MAX_VERTEXES )
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has more than %i verts on %s (%i).\n",
mod_name, SHADER_MAX_VERTEXES - 1, surf->name[0] ? surf->name : "a surface",
surf->numVerts );
return false;
}
- if ( surf->numTriangles*3 >= SHADER_MAX_INDEXES )
+ if ( surf->numTriangles*3 >= SHADER_MAX_INDEXES )
{
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has more than %i triangles on %s (%i).\n",
mod_name, ( SHADER_MAX_INDEXES / 3 ) - 1, surf->name[0] ? surf->name : "a surface",
@@ -1046,16 +1057,16 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
} else {
surf->shaderIndex = sh->index;
}
-
+
// now copy the vertexes.
v = (mdrVertex_t *) (surf + 1);
surf->ofsVerts = (int)((byte *) v - (byte *) surf);
curv = (mdrVertex_t *) ((byte *)cursurf + LittleLong(cursurf->ofsVerts));
-
+
for(j = 0; j < surf->numVerts; j++)
{
LL(curv->numWeights);
-
+
// simple bounds check
if(curv->numWeights < 0 || (byte *) (v + 1) + (curv->numWeights - 1) * sizeof(*weight) > (byte *) mdr + size)
{
@@ -1066,37 +1077,37 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
v->normal[0] = LittleFloat(curv->normal[0]);
v->normal[1] = LittleFloat(curv->normal[1]);
v->normal[2] = LittleFloat(curv->normal[2]);
-
+
v->texCoords[0] = LittleFloat(curv->texCoords[0]);
v->texCoords[1] = LittleFloat(curv->texCoords[1]);
-
+
v->numWeights = curv->numWeights;
weight = &v->weights[0];
curweight = &curv->weights[0];
-
+
// Now copy all the weights
for(k = 0; k < v->numWeights; k++)
{
weight->boneIndex = LittleLong(curweight->boneIndex);
weight->boneWeight = LittleFloat(curweight->boneWeight);
-
+
weight->offset[0] = LittleFloat(curweight->offset[0]);
weight->offset[1] = LittleFloat(curweight->offset[1]);
weight->offset[2] = LittleFloat(curweight->offset[2]);
-
+
weight++;
curweight++;
}
-
+
v = (mdrVertex_t *) weight;
curv = (mdrVertex_t *) curweight;
}
-
+
// we know the offset to the triangles now:
tri = (mdrTriangle_t *) v;
surf->ofsTriangles = (int)((byte *) tri - (byte *) surf);
curtri = (mdrTriangle_t *)((byte *) cursurf + LittleLong(cursurf->ofsTriangles));
-
+
// simple bounds check
if(surf->numTriangles < 0 || (byte *) (tri + surf->numTriangles) > (byte *) mdr + size)
{
@@ -1109,11 +1120,11 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
tri->indexes[0] = LittleLong(curtri->indexes[0]);
tri->indexes[1] = LittleLong(curtri->indexes[1]);
tri->indexes[2] = LittleLong(curtri->indexes[2]);
-
+
tri++;
curtri++;
}
-
+
// tri now points to the end of the surface.
surf->ofsEnd = (byte *) tri - (byte *) surf;
surf = (mdrSurface_t *) tri;
@@ -1129,7 +1140,7 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
// find the next LOD.
curlod = (mdrLOD_t *)((byte *) curlod + LittleLong(curlod->ofsEnd));
}
-
+
// lod points to the first tag now, so update the offset too.
tag = (mdrTag_t *) lod;
mdr->ofsTags = (int)((byte *) tag - (byte *) mdr);
@@ -1141,21 +1152,21 @@ static bool R_LoadMDR( model_t *mod, void *buffer, int filesize, const char *mod
ri.Printf(PRINT_WARNING, "R_LoadMDR: %s has broken structure.\n", mod_name);
return false;
}
-
+
for (i = 0 ; i < mdr->numTags ; i++)
{
tag->boneIndex = LittleLong(curtag->boneIndex);
Q_strncpyz(tag->name, curtag->name, sizeof(tag->name));
-
+
tag++;
curtag++;
}
-
+
// And finally we know the real offset to the end.
mdr->ofsEnd = (int)((byte *) tag - (byte *) mdr);
// phew! we're done.
-
+
return true;
}
@@ -1276,7 +1287,7 @@ mdvTag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdv
mdrFrame_t *frame;
mdrTag_t *tag;
- if ( framenum >= mod->numFrames )
+ if ( framenum >= mod->numFrames )
{
// it is possible to have a bad frame while changing models, so don't error
framenum = mod->numFrames - 1;
@@ -1300,7 +1311,7 @@ mdvTag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdv
dest->origin[0] = frame->bones[tag->boneIndex].matrix[0][3];
dest->origin[1] = frame->bones[tag->boneIndex].matrix[1][3];
- dest->origin[2] = frame->bones[tag->boneIndex].matrix[2][3];
+ dest->origin[2] = frame->bones[tag->boneIndex].matrix[2][3];
return dest;
}
@@ -1314,7 +1325,7 @@ mdvTag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdv
R_LerpTag
================
*/
-int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame,
+int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame,
float frac, const char *tagName ) {
mdvTag_t *start, *end;
mdvTag_t start_space, end_space;
@@ -1377,7 +1388,7 @@ void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs ) {
if(model->type == MOD_BRUSH) {
VectorCopy( model->bmodel->bounds[0], mins );
VectorCopy( model->bmodel->bounds[1], maxs );
-
+
return;
} else if (model->type == MOD_MESH) {
mdvModel_t *header;
@@ -1388,7 +1399,7 @@ void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs ) {
VectorCopy( frame->bounds[0], mins );
VectorCopy( frame->bounds[1], maxs );
-
+
return;
} else if (model->type == MOD_MDR) {
mdrHeader_t *header;
@@ -1399,11 +1410,11 @@ void R_ModelBounds( qhandle_t handle, vec3_t mins, vec3_t maxs ) {
VectorCopy( frame->bounds[0], mins );
VectorCopy( frame->bounds[1], maxs );
-
+
return;
} else if(model->type == MOD_IQM) {
iqmData_t *iqmData;
-
+
iqmData = (iqmData_t*)model->modelData;
if(iqmData->bounds)
diff --git a/src/sdl/sdl_glimp.cpp b/src/sdl/sdl_glimp.cpp
index 9ecd224be..9ea4034f4 100644
--- a/src/sdl/sdl_glimp.cpp
+++ b/src/sdl/sdl_glimp.cpp
@@ -195,6 +195,11 @@ static void GLimp_DetectAvailableModes(void)
numModes++;
}
+ // Adding automatic mode
+ modes[numModes].w = 0;
+ modes[numModes].h = 0;
+ numModes++;
+
if( numModes > 1 )
qsort( modes, numModes, sizeof( SDL_Rect ), GLimp_CompareModes );
@@ -462,7 +467,7 @@ static int GLimp_SetMode( bool failSafe, bool fullscreen, bool noborder, bool co
glConfig.stereoEnabled = qfalse;
SDL_GL_SetAttribute(SDL_GL_STEREO, 0);
}
-
+
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
#if 0 // if multisampling is enabled on X11, this causes create window to fail.
diff --git a/src/sdl/sdl_input.cpp b/src/sdl/sdl_input.cpp
index 1e1056afe..13923b0a7 100644
--- a/src/sdl/sdl_input.cpp
+++ b/src/sdl/sdl_input.cpp
@@ -211,8 +211,11 @@ static keyNum_t IN_TranslateSDLToQ3Key( SDL_Keysym *keysym, bool down )
// These happen to match the ASCII chars
key = (keyNum_t)keysym->sym;
}
- else
+ else if (!(keysym->sym >= SDLK_KP_1 && keysym->sym <= SDLK_KP_9
+ && ((SDL_GetModState() & KMOD_NUM) == (KMOD_NUM))))
{
+ // Don't send K_KP_DOWNARROW and others if numpad is activated
+
switch( keysym->sym )
{
case SDLK_PAGEUP: key = K_PGUP; break;
@@ -979,7 +982,7 @@ static void IN_JoyMove( void )
{
Sint16 axis = SDL_JoystickGetAxis(stick, i);
float f = ( (float) abs(axis) ) / 32767.0f;
-
+
if( f < in_joystickThreshold->value ) axis = 0;
if ( axis != stick_state.oldaaxes[i] )
diff --git a/src/server/sv_snapshot.cpp b/src/server/sv_snapshot.cpp
index 07dd21005..a0e53e984 100644
--- a/src/server/sv_snapshot.cpp
+++ b/src/server/sv_snapshot.cpp
@@ -418,6 +418,15 @@ static void SV_AddEntitiesVisibleFromPoint(vec3_t origin, clientSnapshot_t *fram
continue;
}
+ // Doing this have two utility:
+ // - Keep sound, alien sense, and range marker behave well
+ // - Load builds progressivly on the client, avoiding short freeze on low end computer
+ if (Distance(origin, ent->r.currentOrigin) < 1500)
+ {
+ SV_AddEntToSnapshot(svEnt, ent, eNums);
+ continue;
+ }
+
// ignore if not touching a PV leaf
// check area
if (!CM_AreasConnected(clientarea, svEnt->areanum))
diff --git a/src/ui/ui_atoms.c b/src/ui/ui_atoms.c
index b70d34ddf..37ed24fd9 100644
--- a/src/ui/ui_atoms.c
+++ b/src/ui/ui_atoms.c
@@ -189,7 +189,7 @@ static void UI_Me_f(void)
struct uicmd {
char *cmd;
void (*function)(void);
-} commands[] =
+} commands[] =
{
{"closemenus", UI_CloseMenus_f},
{"me", UI_Me_f},
@@ -239,7 +239,7 @@ void UI_DrawHandlePic(float x, float y, float w, float h, qhandle_t hShader)
float t1;
if (w < 0)
- {
+ {
// flip about vertical
w = -w;
s0 = 1;
@@ -252,7 +252,7 @@ void UI_DrawHandlePic(float x, float y, float w, float h, qhandle_t hShader)
}
if (h < 0)
- {
+ {
// flip about horizontal
h = -h;
t0 = 1;
@@ -285,4 +285,23 @@ void UI_FillRect(float x, float y, float width, float height, const float *color
trap_R_SetColor(NULL);
}
+/*
+================
+UI_FillRoundedRect
+
+Coordinates are 640*480 virtual values
+=================
+*/
+void UI_FillRoundedRect( float x, float y, float width, float height, float size, const float *style, const float *color )
+{
+ UI_FillRect( x, y + size * 3, width, height - size * 6, color );
+
+ trap_R_SetColor( color );
+
+ UI_DrawTopBottom( x + size * 3, y, width - size * 6, height, size * 3 );
+ UI_DrawCorners( x - size, y - size, width + size * 2, height + size * 2, size * 4, style, uiInfo.uiDC.Assets.cornerIn );
+
+ trap_R_SetColor( NULL );
+}
+
void UI_SetColor(const float *rgba) { trap_R_SetColor(rgba); }
diff --git a/src/ui/ui_local.h b/src/ui/ui_local.h
index 936c414a3..fe53af3cc 100644
--- a/src/ui/ui_local.h
+++ b/src/ui/ui_local.h
@@ -177,6 +177,26 @@ typedef struct {
} v;
} menuItem_t;
+typedef struct {
+ char *parentTagName;
+ int parentIndex;
+} menuItemModelParent_t;
+
+typedef struct {
+ qhandle_t asset[4];
+ int assetCount;
+ qhandle_t skin[4];
+ int frame[4];
+ int animation[4][2];
+ float animationFPS[4];
+ menuItemModelParent_t parent[3];
+ float scale;
+ float zOffset;
+ float cameraDist;
+ qboolean autoAdjust;
+ qboolean forceCentering;
+} menuItemModel_t;
+
typedef struct {
int w;
int h;
@@ -218,18 +238,22 @@ typedef struct {
int previewMovie;
menuItem_t teamList[4];
+ menuItemModel_t teamListModel[4];
int teamCount;
int teamIndex;
menuItem_t alienClassList[3];
+ menuItemModel_t alienClassListModel[3];
int alienClassCount;
int alienClassIndex;
menuItem_t humanItemList[3];
+ menuItemModel_t humanItemListModel[3];
int humanItemCount;
int humanItemIndex;
menuItem_t humanArmouryBuyList[32];
+ menuItemModel_t humanArmouryBuyListModel[WP_NUM_WEAPONS + UP_NUM_UPGRADES];
int humanArmouryBuyCount;
int humanArmouryBuyIndex;
@@ -238,14 +262,17 @@ typedef struct {
int humanArmourySellIndex;
menuItem_t alienUpgradeList[16];
+ menuItemModel_t alienUpgradeListModel[PCL_NUM_CLASSES];
int alienUpgradeCount;
int alienUpgradeIndex;
menuItem_t alienBuildList[32];
+ menuItemModel_t alienBuildListModel[32];
int alienBuildCount;
int alienBuildIndex;
menuItem_t humanBuildList[32];
+ menuItemModel_t humanBuildListModel[32];
int humanBuildCount;
int humanBuildIndex;
@@ -300,8 +327,11 @@ char *UI_Cvar_VariableString(const char *var_name);
void UI_SetColor(const float *rgba);
void UI_AdjustFrom640(float *x, float *y, float *w, float *h);
void UI_Refresh(int time);
+void UI_DrawCorners( float x, float y, float w, float h, float size, const float *style, qhandle_t *pic );
void UI_DrawHandlePic(float x, float y, float w, float h, qhandle_t hShader);
+void UI_DrawTopBottom(float x, float y, float w, float h, float size);
void UI_FillRect(float x, float y, float width, float height, const float *color);
+void UI_FillRoundedRect( float x, float y, float width, float height, float size, const float *style, const float *color );
//
// ui_syscalls.c
diff --git a/src/ui/ui_main.c b/src/ui/ui_main.c
index ec7c0aabe..03bce7cf0 100644
--- a/src/ui/ui_main.c
+++ b/src/ui/ui_main.c
@@ -199,9 +199,17 @@ void AssetCache(void)
uiInfo.uiDC.Assets.scrollBarArrowLeft = trap_R_RegisterShaderNoMip(ASSET_SCROLLBAR_ARROWLEFT);
uiInfo.uiDC.Assets.scrollBarArrowRight = trap_R_RegisterShaderNoMip(ASSET_SCROLLBAR_ARROWRIGHT);
uiInfo.uiDC.Assets.scrollBarThumb = trap_R_RegisterShaderNoMip(ASSET_SCROLL_THUMB);
+ uiInfo.uiDC.Assets.showMoreArrow = trap_R_RegisterShaderNoMip(ASSET_SHOWMORE_ARROW);
uiInfo.uiDC.Assets.sliderBar = trap_R_RegisterShaderNoMip(ASSET_SLIDER_BAR);
uiInfo.uiDC.Assets.sliderThumb = trap_R_RegisterShaderNoMip(ASSET_SLIDER_THUMB);
+ uiInfo.uiDC.Assets.cornerIn[BORDER_SQUARE] = trap_R_RegisterShaderNoMip( ASSET_CORNERIN_SQUARE );
+ uiInfo.uiDC.Assets.cornerOut[BORDER_SQUARE] = trap_R_RegisterShaderNoMip( ASSET_CORNEROUT_SQUARE );
+ uiInfo.uiDC.Assets.cornerIn[BORDER_ROUNDED] = trap_R_RegisterShaderNoMip( ASSET_CORNERIN_ROUNDED );
+ uiInfo.uiDC.Assets.cornerOut[BORDER_ROUNDED] = trap_R_RegisterShaderNoMip( ASSET_CORNEROUT_ROUNDED );
+ uiInfo.uiDC.Assets.cornerIn[BORDER_FOLD] = trap_R_RegisterShaderNoMip( ASSET_CORNERIN_FOLD );
+ uiInfo.uiDC.Assets.cornerOut[BORDER_FOLD] = trap_R_RegisterShaderNoMip( ASSET_CORNEROUT_FOLD );
+
if (ui_emoticons.integer)
{
uiInfo.uiDC.Assets.emoticonCount = BG_LoadEmoticons(uiInfo.uiDC.Assets.emoticons, MAX_EMOTICONS);
@@ -218,14 +226,11 @@ void AssetCache(void)
void UI_DrawSides(float x, float y, float w, float h, float size)
{
- float sizeY;
-
UI_AdjustFrom640(&x, &y, &w, &h);
- sizeY = size * uiInfo.uiDC.yscale;
size *= uiInfo.uiDC.xscale;
- trap_R_DrawStretchPic(x, y + sizeY, size, h - (sizeY * 2.0f), 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
- trap_R_DrawStretchPic(x + w - size, y + sizeY, size, h - (sizeY * 2.0f), 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
+ trap_R_DrawStretchPic(x, y, size, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
+ trap_R_DrawStretchPic(x + w - size, y, size, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
}
void UI_DrawTopBottom(float x, float y, float w, float h, float size)
@@ -236,6 +241,19 @@ void UI_DrawTopBottom(float x, float y, float w, float h, float size)
trap_R_DrawStretchPic(x, y + h - size, w, size, 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
}
+void UI_DrawCorners( float x, float y, float w, float h, float size, const float *style, qhandle_t *pic )
+{
+ float hs, vs;
+ UI_AdjustFrom640( &x, &y, &w, &h );
+ hs = size * uiInfo.uiDC.xscale;
+ vs = size * uiInfo.uiDC.yscale;
+
+ trap_R_DrawStretchPic( x, y, hs, vs, 0, 0, 0.5, 0.5, pic[(int)(style[0])] );
+ trap_R_DrawStretchPic( x + w - hs, y, hs, vs, 0.5, 0, 1, 0.5, pic[(int)(style[1])] );
+ trap_R_DrawStretchPic( x + w - hs, y + h - vs, hs, vs, 0.5, 0.5, 1, 1, pic[(int)(style[2])] );
+ trap_R_DrawStretchPic( x, y + h - vs, hs, vs, 0, 0.5, 0.5, 1, pic[(int)(style[3])] );
+}
+
/*
================
UI_DrawRect
@@ -243,16 +261,43 @@ UI_DrawRect
Coordinates are 640*480 virtual values
=================
*/
-void UI_DrawRect(float x, float y, float width, float height, float size, const float *color)
+void UI_DrawRect(float x, float y, float w, float h, float size, const float *color)
{
+ float sizeY, sizeX;
+
+ UI_AdjustFrom640(&x, &y, &w, &h);
+ sizeY = size * uiInfo.uiDC.yscale;
+ sizeX = size * uiInfo.uiDC.xscale;
+
trap_R_SetColor(color);
- UI_DrawTopBottom(x, y, width, height, size);
- UI_DrawSides(x, y, width, height, size);
+ trap_R_DrawStretchPic(x, y, w, sizeY, 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
+ trap_R_DrawStretchPic(x, y + h - sizeY, w, sizeY, 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
+
+ trap_R_DrawStretchPic(x, y + sizeY, sizeX, h - (sizeY * 2.0f), 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
+ trap_R_DrawStretchPic(x + w - sizeX, y + sizeY, sizeX, h - (sizeY * 2.0f), 0, 0, 0, 0, uiInfo.uiDC.whiteShader);
trap_R_SetColor(NULL);
}
+/*
+================
+UI_DrawRoundedRect
+
+Coordinates are 640*480 virtual values
+=================
+*/
+void UI_DrawRoundedRect( float x, float y, float width, float height, float size, const float *style, const float *color )
+{
+ trap_R_SetColor( color );
+
+ UI_DrawTopBottom( x + size * 4, y, width - size * 8, height, size );
+ UI_DrawSides( x, y + size * 4, width, height - size * 8, size );
+ UI_DrawCorners( x, y, width, height, size * 4, style, uiInfo.uiDC.Assets.cornerOut );
+
+ trap_R_SetColor( NULL );
+}
+
/*
==================
UI_ServerInfoIsValid
@@ -1772,6 +1817,144 @@ static stage_t UI_GetCurrentHumanStage(void)
return stage;
}
+/*
+===============
+UI_alienStates
+===============
+*/
+static void UI_alienStates(alienStates_t *state)
+{
+ char alienStates[MAX_TOKEN_CHARS];
+
+ trap_Cvar_VariableStringBuffer("ui_alienStates", alienStates, sizeof(alienStates));
+
+ sscanf( alienStates, "%d %d %d %d %d", &state->omBuilding, &state->omHealth,
+ &state->spawns, &state->builders, &state->boosters );
+}
+
+/*
+===============
+UI_humanStates
+===============
+*/
+static void UI_humanStates(humanStates_t *state)
+{
+ char humanStates[MAX_TOKEN_CHARS];
+
+ trap_Cvar_VariableStringBuffer("ui_humanStates", humanStates, sizeof(humanStates));
+
+ sscanf( humanStates, "%d %d %d %d %d %d %d", &state->rcBuilding, &state->rcHealth,
+ &state->spawns, &state->builders, &state->armourys, &state->medicals, &state->computers );
+}
+
+/*
+===============
+UI_GetStageText
+===============
+*/
+static char *UI_GetStageText(int stages)
+{
+ if (stages == (( 1 << S1 )|( 1 << S2 )|( 1 << S3 )))
+ return "from stage 1";
+ else if (stages == (( 1 << S2 )|( 1 << S3 )))
+ return "from stage 2";
+ else if (stages == (( 1 << S1 )|( 1 << S3 )))
+ return "at stages 1 and 3";
+ else if (stages == (( 1 << S1 )|( 1 << S2 )))
+ return "at stages 1 and 2";
+ else if (stages == (( 1 << S3 )))
+ return "at stage 3";
+ else if (stages == ( 1 << S1 ))
+ return "at stage 1";
+ else if (stages == ( 1 << S2 ))
+ return "at stage 2";
+ else
+ return "nevertime";
+}
+
+/*
+===============
+UI_DrawNewProgressBar
+===============
+*/
+static void UI_DrawNewProgressBar( rectDef_t *rect, vec4_t color,
+ vec4_t backColor, float scale, int align,
+ int textalign, int textStyle, float borderSize,
+ float progress )
+{
+ float rimWidth;
+ float doneWidth, leftWidth;
+ float tx, ty;
+ char textBuffer[ 8 ];
+ float borderStyle[ 4 ];
+ int w, h;
+
+ borderStyle[0] = BORDER_FOLD;
+ borderStyle[1] = BORDER_FOLD;
+ borderStyle[2] = BORDER_FOLD;
+ borderStyle[3] = BORDER_FOLD;
+
+ if( borderSize >= 0.0f )
+ rimWidth = borderSize;
+ else
+ {
+ rimWidth = rect->h / 20.0f;
+ if( rimWidth < 0.6f )
+ rimWidth = 0.6f;
+ }
+
+ if( progress < 0.0f )
+ progress = 0.0f;
+ else if( progress > 1.0f )
+ progress = 1.0f;
+
+ doneWidth = ( rect->w - (8 + 6) * rimWidth ) * progress + 6 * rimWidth;
+
+ //draw rim and bar
+ UI_DrawRoundedRect(rect->x, rect->y, rect->w, rect->h, rimWidth, borderStyle, color);
+ UI_FillRoundedRect(
+ rect->x + rimWidth * 4,
+ rect->y + rimWidth * 4,
+ doneWidth,
+ rect->h - rimWidth * 8,
+ rimWidth, borderStyle, backColor);
+
+
+ //draw text
+ if( scale > 0.0 )
+ {
+ Com_sprintf( textBuffer, sizeof( textBuffer ), "%d%%", (int)( progress * 100 ) );
+ w = UI_Text_Width(textBuffer, scale);
+ h = UI_Text_Height(textBuffer, scale);
+ UI_Text_Paint( rect->x + (rect->w - w ) / 2.0, rect->y + h + ( rect->h - h ) / 2.0f, scale, color, textBuffer, 0, 0, textStyle );
+ }
+}
+
+/*
+===============
+UI_DrawDownloadOverall
+===============
+*/
+static void UI_DrawDownloadOverall( rectDef_t *rect, vec4_t color, vec4_t backColor, float scale,
+ int align, int textalign, int textStyle,
+ float borderSize )
+{
+ char downloadName[MAX_INFO_VALUE];
+ int downloadSize, downloadCount, downloadTotal, downloadDone;
+
+ trap_Cvar_VariableStringBuffer("cl_downloadName", downloadName, sizeof(downloadName));
+ if (!*downloadName)
+ return;
+
+ downloadSize = trap_Cvar_VariableValue("cl_downloadSize");
+ downloadCount = trap_Cvar_VariableValue("cl_downloadCount");
+ downloadTotal = trap_Cvar_VariableValue("cl_downloadTotal");
+ downloadDone = trap_Cvar_VariableValue("cl_downloadDone");
+
+ UI_DrawNewProgressBar( rect, color, backColor, scale, align, textalign, textStyle, borderSize,
+ (downloadSize ? ((float)downloadCount / downloadSize / downloadTotal) : 0) + (float)downloadDone / downloadTotal );
+}
+
/*
===============
UI_DrawInfoPane
@@ -1803,47 +1986,48 @@ static void UI_DrawInfoPane(menuItem_t *item, rectDef_t *rect, float text_x, flo
ALIEN_CREDITS_PER_KILL - 1) /
ALIEN_CREDITS_PER_KILL;
- if (value < 1)
- {
- s = va("%s\n\n%s", BG_ClassConfig(item->v.pclass)->humanName, BG_Class(item->v.pclass)->info);
- }
- else
- {
- s = va("%s\n\n%s\n\nFrags: %d", BG_ClassConfig(item->v.pclass)->humanName,
- BG_Class(item->v.pclass)->info, value);
- }
+ s = va("%s\n\n%s\nAvailable %s.%s",
+ BG_ClassConfig(item->v.pclass)->humanName,
+ BG_Class(item->v.pclass)->info,
+ UI_GetStageText(BG_Class(item->v.pclass)->stages),
+ (
+ (value > 0) ?
+ va("\n\nFrags: %d", value) :
+ ""
+ )
+ );
break;
case INFOTYPE_WEAPON:
value = BG_Weapon(item->v.weapon)->price;
- if (value == 0)
- {
- s = va(
- "%s\n\n%s\n\nCredits: Free", BG_Weapon(item->v.weapon)->humanName, BG_Weapon(item->v.weapon)->info);
- }
- else
- {
- s = va("%s\n\n%s\n\nCredits: %d", BG_Weapon(item->v.weapon)->humanName, BG_Weapon(item->v.weapon)->info,
- value);
- }
+ s = va("%s\n\n%s\nAvailable %s.\n\nCredits: %s",
+ BG_Weapon(item->v.weapon)->humanName,
+ BG_Weapon(item->v.weapon)->info,
+ UI_GetStageText(BG_Weapon(item->v.weapon)->stages),
+ (
+ (value > 0) ?
+ va("%d", value) :
+ "Free"
+ )
+ );
break;
case INFOTYPE_UPGRADE:
value = BG_Upgrade(item->v.upgrade)->price;
- if (value == 0)
- {
- s = va("%s\n\n%s\n\nCredits: Free", BG_Upgrade(item->v.upgrade)->humanName,
- BG_Upgrade(item->v.upgrade)->info);
- }
- else
- {
- s = va("%s\n\n%s\n\nCredits: %d", BG_Upgrade(item->v.upgrade)->humanName,
- BG_Upgrade(item->v.upgrade)->info, value);
- }
+ s = va("%s\n\n%s\nAvailable %s.\n\nCredits: %s",
+ BG_Upgrade(item->v.upgrade)->humanName,
+ BG_Upgrade(item->v.upgrade)->info,
+ UI_GetStageText(BG_Upgrade(item->v.upgrade)->stages),
+ (
+ (value > 0) ?
+ va("%d", value) :
+ "Free"
+ )
+ );
break;
@@ -1864,15 +2048,16 @@ static void UI_DrawInfoPane(menuItem_t *item, rectDef_t *rect, float text_x, flo
break;
}
- if (value == 0)
- {
- s = va("%s\n\n%s", BG_Buildable(item->v.buildable)->humanName, BG_Buildable(item->v.buildable)->info);
- }
- else
- {
- s = va("%s\n\n%s\n\n%s: %d", BG_Buildable(item->v.buildable)->humanName,
- BG_Buildable(item->v.buildable)->info, string, value);
- }
+ s = va("%s\n\n%s\nAvailable %s.%s",
+ BG_Buildable(item->v.buildable)->humanName,
+ BG_Buildable(item->v.buildable)->info,
+ UI_GetStageText(BG_Buildable(item->v.buildable)->stages),
+ (
+ (value > 0) ?
+ va("\n\n%s: %d", string, value) :
+ ""
+ )
+ );
break;
}
@@ -1880,6 +2065,180 @@ static void UI_DrawInfoPane(menuItem_t *item, rectDef_t *rect, float text_x, flo
UI_DrawTextBlock(rect, text_x, text_y, color, scale, textalign, textvalign, textStyle, s);
}
+static void UI_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_t *parent,
+ qhandle_t parentModel, char *tagName ) // Imported from cg_ents.c
+{
+ int i;
+ orientation_t lerped;
+ vec3_t tempAxis[ 3 ];
+
+//AxisClear( entity->axis );
+ // lerp the tag
+ uiInfo.uiDC.lerpTag( &lerped, parentModel, parent->oldframe, parent->frame,
+ 1.0 - parent->backlerp, tagName );
+
+ // FIXME: allow origin offsets along tag?
+ VectorCopy( parent->origin, entity->origin );
+ for( i = 0; i < 3; i++ )
+ VectorMA( entity->origin, lerped.origin[ i ], parent->axis[ i ], entity->origin );
+
+ // had to cast away the const to avoid compiler problems...
+ MatrixMultiply( entity->axis, lerped.axis, tempAxis );
+ MatrixMultiply( tempAxis, ( (refEntity_t *)parent )->axis, entity->axis );
+}
+
+static void UI_DrawInfoPaneModel(menuItemModel_t *model, rectDef_t *rect)
+{
+ float x, y, w, h;
+ refdef_t refdef;
+ refEntity_t ent[4];
+ vec3_t tmpMins, tmpMaxs;
+ vec3_t mins, maxs;
+ vec3_t origin;
+ vec3_t angles;
+ float suggestedDist;
+ int i;
+ int millisPerDeg = 100; // 36s = 1 turn
+ float tmpFrame;
+
+ if (model->assetCount == 0)
+ return;
+
+ // setup the refdef
+ memset(&refdef, 0, sizeof(refdef));
+
+ refdef.rdflags = RDF_NOWORLDMODEL;
+
+ AxisClear(refdef.viewaxis);
+
+ x = rect->x;
+ y = rect->y;
+ w = rect->w;
+ h = rect->h;
+
+ UI_AdjustFrom640(&x, &y, &w, &h);
+
+ refdef.x = x;
+ refdef.y = y;
+ refdef.width = w;
+ refdef.height = h;
+
+ if (model->autoAdjust)
+ {
+ uiInfo.uiDC.modelBounds(model->asset[0], mins, maxs);
+ for (i = 1; i < model->assetCount; i++) // Maybe there are already a function for this ?
+ {
+ uiInfo.uiDC.modelBounds(model->asset[i], tmpMins, tmpMaxs);
+ if (tmpMins[0] < mins[0])
+ mins[0] = tmpMins[0];
+ if (tmpMins[1] < mins[1])
+ mins[1] = tmpMins[1];
+ if (tmpMins[2] < mins[2])
+ mins[2] = tmpMins[2];
+ if (tmpMaxs[0] > maxs[0])
+ maxs[0] = tmpMaxs[0];
+ if (tmpMaxs[1] > maxs[1])
+ maxs[1] = tmpMaxs[1];
+ if (tmpMaxs[2] > maxs[2])
+ maxs[2] = tmpMaxs[2];
+ }
+
+ origin[1] = 0.5 * (mins[1] + maxs[1]);
+ suggestedDist = ((0.5 * (maxs[2]*model->scale - mins[2]*model->scale)) / 0.268); // len / tan( fov/2 )
+
+ if (model->forceCentering)
+ {
+ origin[0] = suggestedDist * 2.0;
+ origin[2] = -0.5 * (mins[2] + maxs[2]);
+ }
+ else
+ {
+ origin[0] = suggestedDist * 0.5 + model->cameraDist * 0.5;
+ origin[2] = model->zOffset * 0.2 + (-0.5 * (mins[2] + maxs[2])) * 0.8;
+ }
+ }
+ else
+ {
+ origin[0] = model->cameraDist;
+ origin[1] = 0;
+ origin[2] = model->zOffset;
+ }
+
+
+ refdef.fov_x = (int)((float)refdef.width / 640.0f * 90.0f);
+ refdef.fov_y = atan2(
+ refdef.height,
+ refdef.width / tan( refdef.fov_x / 360 * M_PI )
+ );
+ refdef.fov_y *= ( 360 / M_PI );
+
+ refdef.fov_x *= 2;
+ refdef.fov_y *= 2;
+
+ uiInfo.uiDC.clearScene();
+
+ refdef.time = uiInfo.uiDC.realTime;
+
+ // add the model
+
+ VectorSet(angles, 0,
+ (
+ (float)(uiInfo.uiDC.realTime % (360 * millisPerDeg)) / (float)(millisPerDeg)
+ ), 0);
+
+ for (i = 0; i < model->assetCount; i++)
+ {
+ memset(&(ent[i]), 0, sizeof(ent[i]));
+
+ if( model->scale != 1.0f )
+ {
+ VectorScale( ent[i].axis[ 0 ], model->scale, ent[i].axis[ 0 ] );
+ VectorScale( ent[i].axis[ 1 ], model->scale, ent[i].axis[ 1 ] );
+ VectorScale( ent[i].axis[ 2 ], model->scale, ent[i].axis[ 2 ] );
+
+ ent[i].nonNormalizedAxes = qtrue;
+ }
+ else
+ ent[i].nonNormalizedAxes = qfalse;
+
+ ent[i].hModel = model->asset[i];
+ if (model->skin[i])
+ ent[i].customSkin = model->skin[i];
+ if (model->frame[i] == -1)
+ {
+ // Animate
+ tmpFrame = (uiInfo.uiDC.realTime * model->animationFPS[i]) / 1000;
+ ent[i].backlerp = 1.0f - (tmpFrame - floor(tmpFrame));
+ tmpFrame = (int)tmpFrame % (model->animation[i][1] - model->animation[i][0])
+ + model->animation[i][0];
+ ent[i].frame = tmpFrame + 1;
+ ent[i].oldframe = tmpFrame;
+ }
+ else
+ {
+ // Static
+ ent[i].frame = model->frame[i];
+ ent[i].oldframe = model->frame[i];
+ }
+ if (i && strlen(model->parent[i - 1].parentTagName))
+ {
+ AxisClear(ent[i].axis);
+ UI_PositionRotatedEntityOnTag(&(ent[i]), &(ent[model->parent[i - 1].parentIndex]), model->asset[model->parent[i - 1].parentIndex], model->parent[i - 1].parentTagName);
+ }
+ else
+ {
+ VectorCopy(origin, ent[i].origin);
+ VectorCopy(origin, ent[i].lightingOrigin);
+ VectorCopy(ent[i].origin, ent[i].oldorigin);
+ AnglesToAxis(angles, ent[i].axis);
+ }
+
+ ent[i].renderfx = RF_LIGHTING_ORIGIN | RF_NOSHADOW;
+ uiInfo.uiDC.addRefEntityToScene(&(ent[i]));
+ }
+ uiInfo.uiDC.renderScene(&refdef);
+}
+
static void UI_DrawServerMapPreview(rectDef_t *rect, float scale, vec4_t color)
{
if (uiInfo.serverStatus.currentServerCinematic >= 0)
@@ -2073,7 +2432,7 @@ static void UI_BuildPlayerList(void)
static void UI_DrawGLInfo(rectDef_t *rect, float scale, int textalign, int textvalign, vec4_t color, int textStyle,
float text_x, float text_y)
{
- char buffer[4096];
+ char buffer[8192];
Com_sprintf(buffer, sizeof(buffer),
"VENDOR: %s\nVERSION: %s\n"
@@ -2099,11 +2458,20 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float
switch (ownerDraw)
{
+ case UI_DOWNLOAD_OVERALL:
+ UI_DrawDownloadOverall(&rect, foreColor, backColor, scale, align, textalign,
+ textStyle, borderSize );
+ break;
+
case UI_TEAMINFOPANE:
UI_DrawInfoPane(&uiInfo.teamList[uiInfo.teamIndex], &rect, text_x, text_y, scale, textalign, textvalign,
foreColor, textStyle);
break;
+ case UI_TEAMINFOPANEMODEL:
+ UI_DrawInfoPaneModel(&uiInfo.teamListModel[uiInfo.teamIndex], &rect);
+ break;
+
case UI_VOICECMDINFOPANE:
UI_DrawInfoPane(&uiInfo.voiceCmdList[uiInfo.voiceCmdIndex], &rect, text_x, text_y, scale, textalign,
textvalign, foreColor, textStyle);
@@ -2114,21 +2482,43 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float
textvalign, foreColor, textStyle);
break;
+ case UI_ACLASSINFOPANEMODEL:
+ UI_DrawInfoPaneModel(&uiInfo.alienClassListModel[uiInfo.alienClassIndex], &rect);
+ break;
+
case UI_AUPGRADEINFOPANE:
UI_DrawInfoPane(&uiInfo.alienUpgradeList[uiInfo.alienUpgradeIndex], &rect, text_x, text_y, scale, textalign,
textvalign, foreColor, textStyle);
break;
+ case UI_AUPGRADEINFOPANEMODEL:
+ UI_DrawInfoPaneModel(&uiInfo.alienUpgradeListModel[
+ uiInfo.alienUpgradeList[uiInfo.alienUpgradeIndex].v.pclass
+ ], &rect);
+ break;
+
case UI_HITEMINFOPANE:
UI_DrawInfoPane(&uiInfo.humanItemList[uiInfo.humanItemIndex], &rect, text_x, text_y, scale, textalign,
textvalign, foreColor, textStyle);
break;
+ case UI_HITEMINFOPANEMODEL:
+ UI_DrawInfoPaneModel(&uiInfo.humanItemListModel[uiInfo.humanItemIndex], &rect);
+ break;
+
case UI_HBUYINFOPANE:
UI_DrawInfoPane(&uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex], &rect, text_x, text_y, scale,
textalign, textvalign, foreColor, textStyle);
break;
+ case UI_HBUYINFOPANEMODEL:
+ UI_DrawInfoPaneModel(&uiInfo.humanArmouryBuyListModel[
+ uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex].type == INFOTYPE_WEAPON ?
+ uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex].v.weapon :
+ (uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex].v.upgrade + WP_NUM_WEAPONS)
+ ], &rect);
+ break;
+
case UI_HSELLINFOPANE:
UI_DrawInfoPane(&uiInfo.humanArmourySellList[uiInfo.humanArmourySellIndex], &rect, text_x, text_y, scale,
textalign, textvalign, foreColor, textStyle);
@@ -2139,10 +2529,23 @@ static void UI_OwnerDraw(float x, float y, float w, float h, float text_x, float
textvalign, foreColor, textStyle);
break;
+ case UI_ABUILDINFOPANEMODEL:
+ UI_DrawInfoPaneModel(&uiInfo.alienBuildListModel[
+ uiInfo.alienBuildList[uiInfo.alienBuildIndex].v.buildable
+ ], &rect);
+ break;
+
case UI_HBUILDINFOPANE:
UI_DrawInfoPane(&uiInfo.humanBuildList[uiInfo.humanBuildIndex], &rect, text_x, text_y, scale, textalign,
textvalign, foreColor, textStyle);
break;
+ break;
+
+ case UI_HBUILDINFOPANEMODEL:
+ UI_DrawInfoPaneModel(&uiInfo.humanBuildListModel[
+ uiInfo.humanBuildList[uiInfo.humanBuildIndex].v.buildable
+ ], &rect);
+ break;
case UI_HELPINFOPANE:
UI_DrawInfoPane(&uiInfo.helpList[uiInfo.helpIndex], &rect, text_x, text_y, scale, textalign, textvalign,
@@ -2352,6 +2755,9 @@ UI_LoadTeams
*/
static void UI_LoadTeams(void)
{
+ class_t alienPreviewClass = PCL_ALIEN_LEVEL0;
+
+ memset(&(uiInfo.teamListModel), 0, sizeof(uiInfo.teamListModel));
uiInfo.teamCount = 4;
uiInfo.teamList[0].text = "Aliens";
@@ -2364,6 +2770,14 @@ static void UI_LoadTeams(void)
"of abilities including basic melee attacks, movement-"
"crippling poisons and more.";
+ uiInfo.teamListModel[0].asset[0] = uiInfo.uiDC.registerModel(va("models/players/%s/nonseg.md3", BG_ClassConfig(alienPreviewClass)->modelName));
+ uiInfo.teamListModel[0].assetCount = 1;
+ uiInfo.teamListModel[0].skin[0] = uiInfo.uiDC.registerSkin(va("models/players/%s/nonseg_%s.skin", BG_ClassConfig(alienPreviewClass)->modelName, BG_ClassConfig(alienPreviewClass)->skinName));
+ uiInfo.teamListModel[0].scale = BG_ClassConfig(alienPreviewClass)->modelScale;
+ uiInfo.teamListModel[0].zOffset = BG_ClassConfig(alienPreviewClass)->zOffset;
+ uiInfo.teamListModel[0].cameraDist = 100;
+ uiInfo.teamListModel[0].autoAdjust = qtrue;
+
uiInfo.teamList[1].text = "Humans";
uiInfo.teamList[1].cmd = "cmd team humans\n";
uiInfo.teamList[1].type = INFOTYPE_TEXT;
@@ -2374,6 +2788,25 @@ static void UI_LoadTeams(void)
"ensures they stay built. A wide range of upgrades and "
"weapons are available to the humans, each contributing "
"to eradicate the alien threat.";
+ uiInfo.teamListModel[1].assetCount = 4;
+ uiInfo.teamListModel[1].asset[0] = uiInfo.uiDC.registerModel("models/players/human_base/lower.md3");
+ uiInfo.teamListModel[1].asset[1] = uiInfo.uiDC.registerModel("models/players/human_base/upper.md3");
+ uiInfo.teamListModel[1].asset[2] = uiInfo.uiDC.registerModel("models/players/human_base/head.md3");
+ uiInfo.teamListModel[1].asset[3] = uiInfo.uiDC.registerModel("models/weapons/rifle/rifle.md3");
+ uiInfo.teamListModel[1].skin[0] = uiInfo.uiDC.registerSkin("models/players/human_base/lower_default.skin");
+ uiInfo.teamListModel[1].skin[1] = uiInfo.uiDC.registerSkin("models/players/human_base/upper_default.skin");
+ uiInfo.teamListModel[1].skin[2] = uiInfo.uiDC.registerSkin("models/players/human_base/head_default.skin");
+ uiInfo.teamListModel[1].frame[0] = 157;
+ uiInfo.teamListModel[1].frame[1] = 151;
+ uiInfo.teamListModel[1].parent[0].parentTagName = "tag_torso";
+ // uiInfo.teamListModel[1].parent[0].parentIndex = 0;
+ uiInfo.teamListModel[1].parent[1].parentTagName = "tag_head";
+ uiInfo.teamListModel[1].parent[1].parentIndex = 1;
+ uiInfo.teamListModel[1].parent[2].parentTagName = "tag_weapon";
+ uiInfo.teamListModel[1].parent[2].parentIndex = 1;
+ uiInfo.teamListModel[1].cameraDist = 75;
+ uiInfo.teamListModel[1].zOffset = -16;
+ uiInfo.teamListModel[1].scale = 1.0;
uiInfo.teamList[2].text = "Spectate";
uiInfo.teamList[2].cmd = "cmd team spectate\n";
@@ -2392,14 +2825,22 @@ UI_AddClass
===============
*/
-static void UI_AddClass(class_t class)
+static void UI_AddClass(class_t class, char *prefix)
{
- uiInfo.alienClassList[uiInfo.alienClassCount].text = BG_ClassConfig(class)->humanName;
+ uiInfo.alienClassList[uiInfo.alienClassCount].text = String_Alloc(va("%s%s", prefix, BG_ClassConfig(class)->humanName));
uiInfo.alienClassList[uiInfo.alienClassCount].cmd = String_Alloc(va("cmd class %s\n", BG_Class(class)->name));
uiInfo.alienClassList[uiInfo.alienClassCount].type = INFOTYPE_CLASS;
uiInfo.alienClassList[uiInfo.alienClassCount].v.pclass = class;
+ uiInfo.alienClassListModel[uiInfo.alienClassCount].asset[0] = uiInfo.uiDC.registerModel(va("models/players/%s/nonseg.md3", BG_ClassConfig(class)->modelName));
+ uiInfo.alienClassListModel[uiInfo.alienClassCount].assetCount = 1;
+ uiInfo.alienClassListModel[uiInfo.alienClassCount].skin[0] = uiInfo.uiDC.registerSkin(va("models/players/%s/nonseg_%s.skin", BG_ClassConfig(class)->modelName, BG_ClassConfig(class)->skinName));
+ uiInfo.alienClassListModel[uiInfo.alienClassCount].scale = BG_ClassConfig(class)->modelScale;
+ uiInfo.alienClassListModel[uiInfo.alienClassCount].zOffset = BG_ClassConfig(class)->zOffset;
+ uiInfo.alienClassListModel[uiInfo.alienClassCount].cameraDist = 100;
+ uiInfo.alienClassListModel[uiInfo.alienClassCount].autoAdjust = qtrue;
+
uiInfo.alienClassCount++;
}
@@ -2410,16 +2851,29 @@ UI_LoadAlienClasses
*/
static void UI_LoadAlienClasses(void)
{
+ alienStates_t state;
+ stage_t stage;
+ char *prefix;
+
+ memset(&(uiInfo.alienClassListModel), 0, sizeof(uiInfo.alienClassListModel));
uiInfo.alienClassCount = 0;
+ UI_alienStates(&state);
+ stage = UI_GetCurrentAlienStage();
+
+ if ( ( !state.omHealth || !state.spawns || BG_BuildableAllowedInStage(BA_A_BOOSTER, stage) && !state.boosters )
+ && !state.builders )
+ prefix = "[!] ";
+ else
+ prefix = "";
if (BG_ClassIsAllowed(PCL_ALIEN_LEVEL0))
- UI_AddClass(PCL_ALIEN_LEVEL0);
+ UI_AddClass(PCL_ALIEN_LEVEL0, "");
if (BG_ClassIsAllowed(PCL_ALIEN_BUILDER0_UPG) &&
BG_ClassAllowedInStage(PCL_ALIEN_BUILDER0_UPG, UI_GetCurrentAlienStage()))
- UI_AddClass(PCL_ALIEN_BUILDER0_UPG);
+ UI_AddClass(PCL_ALIEN_BUILDER0_UPG, prefix);
else if (BG_ClassIsAllowed(PCL_ALIEN_BUILDER0))
- UI_AddClass(PCL_ALIEN_BUILDER0);
+ UI_AddClass(PCL_ALIEN_BUILDER0, prefix);
}
/*
@@ -2427,13 +2881,20 @@ static void UI_LoadAlienClasses(void)
UI_AddItem
===============
*/
-static void UI_AddItem(weapon_t weapon)
+static void UI_AddItem(weapon_t weapon, char *prefix)
{
- uiInfo.humanItemList[uiInfo.humanItemCount].text = BG_Weapon(weapon)->humanName;
+ uiInfo.humanItemList[uiInfo.humanItemCount].text = String_Alloc(va("%s%s", prefix, BG_Weapon(weapon)->humanName));
uiInfo.humanItemList[uiInfo.humanItemCount].cmd = String_Alloc(va("cmd class %s\n", BG_Weapon(weapon)->name));
uiInfo.humanItemList[uiInfo.humanItemCount].type = INFOTYPE_WEAPON;
uiInfo.humanItemList[uiInfo.humanItemCount].v.weapon = weapon;
+ uiInfo.humanItemListModel[uiInfo.humanItemCount].asset[0] = uiInfo.uiDC.registerModel(va("models/weapons/%s/%s.md3", BG_Weapon(weapon)->name, BG_Weapon(weapon)->name));
+ uiInfo.humanItemListModel[uiInfo.humanItemCount].assetCount = 1;
+ uiInfo.humanItemListModel[uiInfo.humanItemCount].scale = 1.0;
+ uiInfo.humanItemListModel[uiInfo.humanItemCount].cameraDist = 0.0;
+ uiInfo.humanItemListModel[uiInfo.humanItemCount].autoAdjust = qtrue;
+ uiInfo.humanItemListModel[uiInfo.humanItemCount].forceCentering = qtrue;
+
uiInfo.humanItemCount++;
}
@@ -2444,13 +2905,28 @@ UI_LoadHumanItems
*/
static void UI_LoadHumanItems(void)
{
+ humanStates_t state;
+ stage_t stage;
+ char *prefix;
+
+ memset(&(uiInfo.humanItemListModel), 0, sizeof(uiInfo.humanItemListModel));
uiInfo.humanItemCount = 0;
+ UI_humanStates(&state);
+ stage = UI_GetCurrentHumanStage();
+
+ if ( ( !state.rcHealth || !state.spawns || BG_BuildableAllowedInStage(BA_H_ARMOURY, stage) && !state.armourys
+ || BG_BuildableAllowedInStage(BA_H_MEDISTAT, stage) && !state.medicals
+ || BG_BuildableAllowedInStage(BA_H_DCC, stage) && !state.computers )
+ && !state.builders )
+ prefix = "[!] ";
+ else
+ prefix = "";
if (BG_WeaponIsAllowed(WP_MACHINEGUN))
- UI_AddItem(WP_MACHINEGUN);
+ UI_AddItem(WP_MACHINEGUN, "");
if (BG_WeaponIsAllowed(WP_HBUILD))
- UI_AddItem(WP_HBUILD);
+ UI_AddItem(WP_HBUILD, prefix);
}
/*
@@ -2511,64 +2987,404 @@ static void UI_ParseCarriageList(void)
/*
===============
-UI_LoadHumanArmouryBuys
+UI_GetCurrentCredits
===============
*/
-static void UI_LoadHumanArmouryBuys(void)
+static int UI_GetCurrentCredits(void)
{
- int i, j = 0;
- stage_t stage = UI_GetCurrentHumanStage();
- int slots = 0;
+ char creditCvar[MAX_TOKEN_CHARS];
- UI_ParseCarriageList();
+ trap_Cvar_VariableStringBuffer("ui_credit", creditCvar, sizeof(creditCvar));
+ return (atoi(creditCvar));
+}
+
+/*
+===============
+UI_GetConflictingUpgradeBudget
+
+Calculate a reduction of what will be sold when buying the upgrade
+===============
+*/
+static int UI_GetConflictingUpgradeBudget( upgrade_t upgrade )
+{
+ int budget = 0;
+ int i;
+ int refSlots = BG_Upgrade(upgrade)->slots;
+
+ for (i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++)
+ if (uiInfo.upgrades & (1 << i) && BG_Upgrade(i)->slots & refSlots)
+ budget += BG_Upgrade(i)->price;
+
+ return (budget);
+}
+
+/*
+===============
+UI_IsAmmoFull
+===============
+*/
+static qboolean UI_IsAmmoFull(void)
+{
+ char ammoFullCvar[MAX_TOKEN_CHARS];
+
+ trap_Cvar_VariableStringBuffer("ui_ammoFull", ammoFullCvar, sizeof(ammoFullCvar));
+ return (atoi(ammoFullCvar));
+}
+/*
+===============
+UI_CanUpgradeToWeapon
+===============
+*/
+static qboolean UI_CanUpgradeToWeapon(weapon_t weapon, int sellingBudget, int credits)
+{
+ return (BG_Weapon(weapon)->price <= sellingBudget + credits);
+}
+
+/*
+===============
+UI_IsBetterWeapon
+===============
+*/
+static qboolean UI_IsBetterWeapon(weapon_t weapon, int sellingBudget)
+{
+ return (BG_Weapon(weapon)->price > sellingBudget);
+}
+
+/*
+===============
+UI_CanGotUpgrade
+===============
+*/
+static qboolean UI_CanGotUpgrade(upgrade_t upgrade, int credits)
+{
+ credits += UI_GetConflictingUpgradeBudget( upgrade );
+ return (BG_Upgrade(upgrade)->price <= credits);
+}
+
+/*
+===============
+UI_IsUpgradeBetter
+===============
+*/
+static qboolean UI_IsUpgradeBetter(upgrade_t upgrade, int slots)
+{
+ return (!(BG_Upgrade(upgrade)->slots & slots) || upgrade == UP_BATTLESUIT);
+}
+
+/*
+===============
+UI_LoadHumanArmouryModels
+===============
+*/
+static void UI_LoadHumanArmouryModels(void)
+{
+ int i, j = 0;
+
+ memset(&(uiInfo.humanArmouryBuyListModel), 0, sizeof(uiInfo.humanArmouryBuyListModel));
for (i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++)
{
- if (uiInfo.weapons & (1 << i))
- slots |= BG_Weapon(i)->slots;
+ uiInfo.humanArmouryBuyListModel[i].assetCount = 0;
+ if (BG_Weapon(i)->team == TEAM_HUMANS && BG_Weapon(i)->purchasable)
+ {
+ uiInfo.humanArmouryBuyListModel[i].asset[0] = uiInfo.uiDC.registerModel(va("models/weapons/%s/%s.md3", BG_Weapon(i)->name, BG_Weapon(i)->name));
+ uiInfo.humanArmouryBuyListModel[i].assetCount = 1;
+ uiInfo.humanArmouryBuyListModel[i].scale = 1.0;
+ uiInfo.humanArmouryBuyListModel[i].autoAdjust = qtrue;
+ uiInfo.humanArmouryBuyListModel[i].forceCentering = qtrue;
+ }
}
-
for (i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++)
{
- if (uiInfo.upgrades & (1 << i))
- slots |= BG_Upgrade(i)->slots;
+ j = WP_NUM_WEAPONS + i;
+ uiInfo.humanArmouryBuyListModel[j].assetCount = 0;
+
+ if (BG_Upgrade(i)->team == TEAM_HUMANS && BG_Upgrade(i)->purchasable)
+ {
+ uiInfo.humanArmouryBuyListModel[j].assetCount = 1;
+ uiInfo.humanArmouryBuyListModel[j].scale = 1.0;
+ switch (i) {
+ case UP_LIGHTARMOUR:
+ uiInfo.humanArmouryBuyListModel[j].assetCount = 3;
+ uiInfo.humanArmouryBuyListModel[j].asset[0] = uiInfo.uiDC.registerModel("models/players/human_base/lower.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[1] = uiInfo.uiDC.registerModel("models/players/human_base/upper.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[2] = uiInfo.uiDC.registerModel("models/players/human_base/head.md3");
+ uiInfo.humanArmouryBuyListModel[j].skin[0] = uiInfo.uiDC.registerSkin("models/players/human_base/lower_light.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[1] = uiInfo.uiDC.registerSkin("models/players/human_base/upper_light.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[2] = uiInfo.uiDC.registerSkin("models/players/human_base/head_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].frame[0] = 157;
+ uiInfo.humanArmouryBuyListModel[j].frame[1] = 151;
+ uiInfo.humanArmouryBuyListModel[j].parent[0].parentTagName = "tag_torso";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentTagName = "tag_head";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentIndex = 1;
+ uiInfo.humanArmouryBuyListModel[j].cameraDist = 40;
+ uiInfo.humanArmouryBuyListModel[j].zOffset = -15;
+ break;
+ case UP_HELMET:
+ uiInfo.humanArmouryBuyListModel[j].assetCount = 3;
+ uiInfo.humanArmouryBuyListModel[j].asset[0] = uiInfo.uiDC.registerModel("models/players/human_base/lower.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[1] = uiInfo.uiDC.registerModel("models/players/human_base/upper.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[2] = uiInfo.uiDC.registerModel("models/players/human_base/head.md3");
+ uiInfo.humanArmouryBuyListModel[j].skin[0] = uiInfo.uiDC.registerSkin("models/players/human_base/lower_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[1] = uiInfo.uiDC.registerSkin("models/players/human_base/upper_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[2] = uiInfo.uiDC.registerSkin("models/players/human_base/head_light.skin");
+ uiInfo.humanArmouryBuyListModel[j].frame[0] = 157;
+ uiInfo.humanArmouryBuyListModel[j].frame[1] = 151;
+ uiInfo.humanArmouryBuyListModel[j].parent[0].parentTagName = "tag_torso";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentTagName = "tag_head";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentIndex = 1;
+ uiInfo.humanArmouryBuyListModel[j].cameraDist = 32;
+ uiInfo.humanArmouryBuyListModel[j].zOffset = -28;
+ break;
+ case UP_MEDKIT:
+ // Should get the red cross of medical station
+ break;
+ case UP_BATTPACK:
+ uiInfo.humanArmouryBuyListModel[j].assetCount = 4;
+ uiInfo.humanArmouryBuyListModel[j].asset[0] = uiInfo.uiDC.registerModel("models/players/human_base/lower.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[1] = uiInfo.uiDC.registerModel("models/players/human_base/upper.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[2] = uiInfo.uiDC.registerModel("models/players/human_base/head.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[3] = uiInfo.uiDC.registerModel("models/players/human_base/battpack.md3");
+ uiInfo.humanArmouryBuyListModel[j].skin[0] = uiInfo.uiDC.registerSkin("models/players/human_base/lower_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[1] = uiInfo.uiDC.registerSkin("models/players/human_base/upper_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[2] = uiInfo.uiDC.registerSkin("models/players/human_base/head_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].frame[0] = 157;
+ uiInfo.humanArmouryBuyListModel[j].frame[1] = 151;
+ uiInfo.humanArmouryBuyListModel[j].parent[0].parentTagName = "tag_torso";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentTagName = "tag_head";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentIndex = 1;
+ uiInfo.humanArmouryBuyListModel[j].parent[2].parentTagName = "tag_head";
+ uiInfo.humanArmouryBuyListModel[j].parent[2].parentIndex = 1;
+ uiInfo.humanArmouryBuyListModel[j].cameraDist = 40;
+ uiInfo.humanArmouryBuyListModel[j].zOffset = -22;
+ break;
+ case UP_JETPACK:
+ uiInfo.humanArmouryBuyListModel[j].assetCount = 4;
+ uiInfo.humanArmouryBuyListModel[j].asset[0] = uiInfo.uiDC.registerModel("models/players/human_base/lower.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[1] = uiInfo.uiDC.registerModel("models/players/human_base/upper.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[2] = uiInfo.uiDC.registerModel("models/players/human_base/head.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[3] = uiInfo.uiDC.registerModel("models/players/human_base/jetpack.md3");
+ uiInfo.humanArmouryBuyListModel[j].skin[0] = uiInfo.uiDC.registerSkin("models/players/human_base/lower_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[1] = uiInfo.uiDC.registerSkin("models/players/human_base/upper_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[2] = uiInfo.uiDC.registerSkin("models/players/human_base/head_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].frame[0] = 157;
+ uiInfo.humanArmouryBuyListModel[j].frame[1] = 151;
+ uiInfo.humanArmouryBuyListModel[j].parent[0].parentTagName = "tag_torso";
+ uiInfo.humanArmouryBuyListModel[j].parent[0].parentIndex = 0;
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentTagName = "tag_head";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentIndex = 1;
+ uiInfo.humanArmouryBuyListModel[j].parent[2].parentTagName = "tag_head";
+ uiInfo.humanArmouryBuyListModel[j].parent[2].parentIndex = 1;
+ uiInfo.humanArmouryBuyListModel[j].cameraDist = 40;
+ uiInfo.humanArmouryBuyListModel[j].zOffset = -22;
+ break;
+ case UP_BATTLESUIT:
+ uiInfo.humanArmouryBuyListModel[j].assetCount = 3;
+ uiInfo.humanArmouryBuyListModel[j].asset[0] = uiInfo.uiDC.registerModel("models/players/human_bsuit/lower.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[1] = uiInfo.uiDC.registerModel("models/players/human_bsuit/upper.md3");
+ uiInfo.humanArmouryBuyListModel[j].asset[2] = uiInfo.uiDC.registerModel("models/players/human_bsuit/head.md3");
+ uiInfo.humanArmouryBuyListModel[j].skin[0] = uiInfo.uiDC.registerSkin("models/players/human_bsuit/lower_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[1] = uiInfo.uiDC.registerSkin("models/players/human_bsuit/upper_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].skin[2] = uiInfo.uiDC.registerSkin("models/players/human_bsuit/head_default.skin");
+ uiInfo.humanArmouryBuyListModel[j].frame[0] = 166;
+ uiInfo.humanArmouryBuyListModel[j].frame[1] = 151;
+ uiInfo.humanArmouryBuyListModel[j].parent[0].parentTagName = "tag_torso";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentTagName = "tag_head";
+ uiInfo.humanArmouryBuyListModel[j].parent[1].parentIndex = 1;
+ uiInfo.humanArmouryBuyListModel[j].cameraDist = 100;
+ uiInfo.humanArmouryBuyListModel[j].zOffset = -25;
+ break;
+ case UP_GRENADE:
+ uiInfo.humanArmouryBuyListModel[j].asset[0] = uiInfo.uiDC.registerModel("models/weapons/grenade/grenade.md3");
+ uiInfo.humanArmouryBuyListModel[j].cameraDist = 15;
+ break;
+ case UP_AMMO:
+ uiInfo.humanArmouryBuyListModel[j].asset[0] = uiInfo.uiDC.registerModel("models/weapons/shells/rifle-shell.md3");
+ uiInfo.humanArmouryBuyListModel[j].cameraDist = 15;
+ break;
+ }
+ }
}
+}
- uiInfo.humanArmouryBuyCount = 0;
+/*
+===============
+UI_LoadHumanArmouryBuysWeapon
+===============
+*/
+static void UI_LoadHumanArmouryBuysWeapon(int priority, int *j, int stage, int sellingBudget,
+ int credits, qboolean criticalBuilds)
+{
+ int i = 0;
+ qboolean addWeapon;
+ char *prefix;
+
+ for (i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++)
+ {
+ if (BG_Weapon(i)->team == TEAM_HUMANS && BG_Weapon(i)->purchasable &&
+ BG_WeaponIsAllowed(i) && !(uiInfo.weapons & (1 << i)))
+ {
+ addWeapon = qfalse;
+ switch (priority) {
+ case 0:
+ if (criticalBuilds == qtrue && i == WP_HBUILD) // If there are critical builds to build
+ {
+ addWeapon = qtrue;
+ prefix = "[!] ";
+ }
+ break;
+ case 1:
+ if (BG_WeaponAllowedInStage(i, stage) && UI_CanUpgradeToWeapon(i, sellingBudget, credits)
+ && !(criticalBuilds == qtrue && i == WP_HBUILD))
+ {
+ addWeapon = qtrue;
+ prefix = UI_IsBetterWeapon(i, sellingBudget) ? "[upgrade] " : "";
+ }
+ break;
+ case 2:
+ if (BG_WeaponAllowedInStage(i, stage) && !UI_CanUpgradeToWeapon(i, sellingBudget, credits))
+ {
+ addWeapon = qtrue;
+ prefix = "^0";
+ }
+ break;
+ case 3:
+ if (!BG_WeaponAllowedInStage(i, stage))
+ {
+ addWeapon = qtrue;
+ prefix = "[locked] ^0";
+ }
+ break;
+ }
- for (i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++)
- {
- if (BG_Weapon(i)->team == TEAM_HUMANS && BG_Weapon(i)->purchasable && BG_WeaponAllowedInStage(i, stage) &&
- BG_WeaponIsAllowed(i) && !(BG_Weapon(i)->slots & slots) && !(uiInfo.weapons & (1 << i)))
- {
- uiInfo.humanArmouryBuyList[j].text = BG_Weapon(i)->humanName;
- uiInfo.humanArmouryBuyList[j].cmd = String_Alloc(va("cmd buy %s\n", BG_Weapon(i)->name));
- uiInfo.humanArmouryBuyList[j].type = INFOTYPE_WEAPON;
- uiInfo.humanArmouryBuyList[j].v.weapon = i;
+ if (addWeapon == qtrue)
+ {
+ uiInfo.humanArmouryBuyList[*j].text = String_Alloc(va("%s%s", prefix, BG_Weapon(i)->humanName));
+ uiInfo.humanArmouryBuyList[*j].cmd = String_Alloc(va("cmd buy %s\n", BG_Weapon(i)->name));
+ uiInfo.humanArmouryBuyList[*j].type = INFOTYPE_WEAPON;
+ uiInfo.humanArmouryBuyList[*j].v.weapon = i;
- j++;
+ (*j)++;
+ uiInfo.humanArmouryBuyCount++;
+ }
+ }
+ }
+}
- uiInfo.humanArmouryBuyCount++;
- }
- }
+
+/*
+===============
+UI_LoadHumanArmouryBuysUpgrade
+===============
+*/
+static void UI_LoadHumanArmouryBuysUpgrade(int priority, int *j, int stage, int upgrSlots, int credits)
+{
+ int i = 0;
+ qboolean addUpgrade;
+ char *prefix;
for (i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++)
{
- if (BG_Upgrade(i)->team == TEAM_HUMANS && BG_Upgrade(i)->purchasable && BG_UpgradeAllowedInStage(i, stage) &&
- BG_UpgradeIsAllowed(i) && !(BG_Upgrade(i)->slots & slots) && !(uiInfo.upgrades & (1 << i)))
+ if (BG_Upgrade(i)->team == TEAM_HUMANS && BG_Upgrade(i)->purchasable &&
+ BG_UpgradeIsAllowed(i) && !(uiInfo.upgrades & (1 << i)))
{
- uiInfo.humanArmouryBuyList[j].text = BG_Upgrade(i)->humanName;
- uiInfo.humanArmouryBuyList[j].cmd = String_Alloc(va("cmd buy %s\n", BG_Upgrade(i)->name));
- uiInfo.humanArmouryBuyList[j].type = INFOTYPE_UPGRADE;
- uiInfo.humanArmouryBuyList[j].v.upgrade = i;
+ addUpgrade = qfalse;
+ switch (priority) {
+ case 0:
+ if (i == UP_AMMO && !UI_IsAmmoFull())
+ {
+ addUpgrade = qtrue;
+ prefix = "[!] ";
+ }
+ break;
+ case 1:
+ if (i != UP_AMMO && BG_UpgradeAllowedInStage(i, stage) && UI_CanGotUpgrade(i, credits))
+ {
+ addUpgrade = qtrue;
+ prefix = UI_IsUpgradeBetter(i, upgrSlots) ? "[upgrade] " : "";
+ }
+ break;
+ case 2:
+ if ((BG_UpgradeAllowedInStage(i, stage) && !UI_CanGotUpgrade(i, credits))
+ || (i == UP_AMMO && UI_IsAmmoFull()))
+ {
+ addUpgrade = qtrue;
+ prefix = "^0";
+ }
+ break;
+ case 3:
+ if (!BG_UpgradeAllowedInStage(i, stage))
+ {
+ addUpgrade = qtrue;
+ prefix = "[locked] ^0";
+ }
+ break;
+ }
- j++;
+ if (addUpgrade == qtrue)
+ {
+ uiInfo.humanArmouryBuyList[*j].text = String_Alloc(va("%s%s", prefix, BG_Upgrade(i)->humanName));
+ uiInfo.humanArmouryBuyList[*j].cmd = String_Alloc(va("cmd buy %s\n", BG_Upgrade(i)->name));
+ uiInfo.humanArmouryBuyList[*j].type = INFOTYPE_UPGRADE;
+ uiInfo.humanArmouryBuyList[*j].v.upgrade = i;
- uiInfo.humanArmouryBuyCount++;
+ (*j)++;
+ uiInfo.humanArmouryBuyCount++;
+ }
}
}
}
+/*
+===============
+UI_LoadHumanArmouryBuys
+===============
+*/
+static void UI_LoadHumanArmouryBuys(void)
+{
+ int i, j = 0;
+ humanStates_t state;
+ qboolean criticalBuilds;
+ stage_t stage = UI_GetCurrentHumanStage();
+ int sellingBudget = 0;
+ int upgrSlots = 0;
+ int credits = UI_GetCurrentCredits();
+
+ UI_humanStates(&state);
+ UI_ParseCarriageList();
+
+ for (i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++)
+ if (uiInfo.weapons & (1 << i))
+ sellingBudget += BG_Weapon(i)->price;
+
+ for (i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++)
+ if (uiInfo.upgrades & (1 << i))
+ upgrSlots |= BG_Upgrade(i)->slots;
+
+ criticalBuilds = ( ( !state.rcHealth || !state.spawns || BG_BuildableAllowedInStage(BA_H_ARMOURY, stage) && !state.armourys
+ || BG_BuildableAllowedInStage(BA_H_MEDISTAT, stage) && !state.medicals
+ || BG_BuildableAllowedInStage(BA_H_DCC, stage) && !state.computers )
+ && !state.builders );
+
+ uiInfo.humanArmouryBuyCount = 0;
+
+ // Critical (ammo mainly)
+ UI_LoadHumanArmouryBuysWeapon(0, &j, stage, sellingBudget, credits, criticalBuilds);
+ UI_LoadHumanArmouryBuysUpgrade(0, &j, stage, upgrSlots, credits);
+
+ // Available to buy
+ UI_LoadHumanArmouryBuysWeapon(1, &j, stage, sellingBudget, credits, criticalBuilds);
+ UI_LoadHumanArmouryBuysUpgrade(1, &j, stage, upgrSlots, credits);
+
+ // Unlocked but no enough funds
+ UI_LoadHumanArmouryBuysWeapon(2, &j, stage, sellingBudget, credits, criticalBuilds);
+ UI_LoadHumanArmouryBuysUpgrade(2, &j, stage, upgrSlots, credits);
+
+ // Locked
+ UI_LoadHumanArmouryBuysWeapon(3, &j, stage, sellingBudget, credits, criticalBuilds);
+ UI_LoadHumanArmouryBuysUpgrade(3, &j, stage, upgrSlots, credits);
+}
+
/*
===============
UI_LoadHumanArmourySells
@@ -2619,6 +3435,7 @@ UI_ArmouryRefreshCb
*/
static void UI_ArmouryRefreshCb(void *data)
{
+ static int oldFullAmmo = -1;
int oldWeapons = uiInfo.weapons;
int oldUpgrades = uiInfo.upgrades;
@@ -2630,6 +3447,91 @@ static void UI_ArmouryRefreshCb(void *data)
UI_LoadHumanArmourySells();
UI_RemoveCaptureFunc();
}
+ else if (UI_IsAmmoFull() != oldFullAmmo)
+ {
+ UI_LoadHumanArmouryBuys();
+ }
+ oldFullAmmo = UI_IsAmmoFull();
+}
+
+/*
+===============
+UI_LoadAlienUpgradesModels
+===============
+*/
+static void UI_LoadAlienUpgradesModels(void)
+{
+ int i;
+
+ memset(&(uiInfo.alienUpgradeListModel), 0, sizeof(uiInfo.alienUpgradeListModel));
+ // No clean way found to determin is class is aliens one
+ for (i = PCL_NONE + 1; i < PCL_HUMAN; i++)
+ {
+ uiInfo.alienUpgradeListModel[i].asset[0] = uiInfo.uiDC.registerModel(va("models/players/%s/nonseg.md3", BG_ClassConfig(i)->modelName));
+ uiInfo.alienUpgradeListModel[i].assetCount = 1;
+ uiInfo.alienUpgradeListModel[i].skin[0] = uiInfo.uiDC.registerSkin(va("models/players/%s/nonseg_%s.skin", BG_ClassConfig(i)->modelName, BG_ClassConfig(i)->skinName));
+ uiInfo.alienUpgradeListModel[i].scale = BG_ClassConfig(i)->modelScale;
+ uiInfo.alienUpgradeListModel[i].zOffset = BG_ClassConfig(i)->zOffset;
+ uiInfo.alienUpgradeListModel[i].cameraDist = 100;
+ uiInfo.alienUpgradeListModel[i].autoAdjust = qtrue;
+ }
+}
+
+/*
+===============
+UI_LoadAlienUpgradesClass
+===============
+*/
+static void UI_LoadAlienUpgradesClass(int priority, int *j, int class, int credits, int stage)
+{
+ int i = 0;
+ qboolean addClass;
+ char *prefix;
+
+ // No clean way found to determin is class is aliens one
+ for (i = PCL_NONE + 1; i < PCL_HUMAN; i++)
+ {
+ addClass = qfalse;
+ if (BG_ClassIsAllowed(i))
+ {
+ switch (priority) {
+ case 1:
+ if (BG_ClassCanEvolveFromTo(class, i, credits, stage, 0) >= 0)
+ {
+ addClass = qtrue;
+ // Is it stage 1 or is it newer in current stage, or is level0 (cause no adv dretch)
+ prefix = (!stage || !BG_ClassAllowedInStage( i, 0 )
+ || i == PCL_ALIEN_LEVEL0) ? "[upgrade] " : "";
+ }
+ break;
+ case 2:
+ if (BG_ClassCanEvolveFromTo(class, i, credits, stage, 0) < 0 && BG_ClassAllowedInStage( i, stage ))
+ {
+ addClass = qtrue;
+ prefix = "^0";
+ }
+ break;
+ case 3:
+ if (BG_ClassCanEvolveFromTo(class, i, credits, stage, 0) < 0 && !BG_ClassAllowedInStage( i, stage ))
+ {
+ addClass = qtrue;
+ prefix = "[locked] ^0";
+ }
+ break;
+ }
+ }
+
+ if (addClass == qtrue)
+ {
+ uiInfo.alienUpgradeList[*j].text = String_Alloc(va("%s%s", prefix, BG_ClassConfig(i)->humanName));
+ uiInfo.alienUpgradeList[*j].cmd = String_Alloc(va("cmd class %s\n", BG_Class(i)->name));
+ uiInfo.alienUpgradeList[*j].type = INFOTYPE_CLASS;
+ uiInfo.alienUpgradeList[*j].v.pclass = i;
+
+ (*j)++;
+ uiInfo.alienUpgradeCount++;
+ }
+ }
}
/*
@@ -2640,7 +3542,6 @@ UI_LoadAlienUpgrades
static void UI_LoadAlienUpgrades(void)
{
int i, j = 0;
-
int class, credits;
char ui_currentClass[MAX_STRING_CHARS];
stage_t stage = UI_GetCurrentAlienStage();
@@ -2651,18 +3552,104 @@ static void UI_LoadAlienUpgrades(void)
uiInfo.alienUpgradeCount = 0;
- for (i = PCL_NONE + 1; i < PCL_NUM_CLASSES; i++)
+ // UI_LoadAlienUpgradesClass(0, &j, class, credits, stage);
+ UI_LoadAlienUpgradesClass(1, &j, class, credits, stage);
+ UI_LoadAlienUpgradesClass(2, &j, class, credits, stage);
+ UI_LoadAlienUpgradesClass(3, &j, class, credits, stage);
+}
+
+/*
+===============
+UI_LoadAlienBuildsModels
+===============
+*/
+static void UI_LoadAlienBuildsModels(void)
+{
+ int i;
+ fileHandle_t h;
+ char *modelFile;
+
+ memset(&(uiInfo.alienBuildListModel), 0, sizeof(uiInfo.alienBuildListModel));
+ for (i = BA_NONE + 1; i < BA_NUM_BUILDABLES; i++)
+ {
+ if (BG_Buildable(i)->team == TEAM_ALIENS && BG_BuildableIsAllowed(i))
+ {
+ uiInfo.alienBuildListModel[i].assetCount = 0;
+ for( h = 0; h < MAX_BUILDABLE_MODELS; h++ )
+ {
+ modelFile = BG_BuildableConfig( i )->models[ h ];
+ if( strlen( modelFile ) > 0 )
+ uiInfo.alienBuildListModel[i].asset[ uiInfo.alienBuildListModel[i].assetCount++ ]
+ = uiInfo.uiDC.registerModel( modelFile );
+ }
+ uiInfo.alienBuildListModel[i].scale = BG_BuildableConfig( i )->modelScale;
+ uiInfo.alienBuildListModel[i].zOffset = BG_BuildableConfig( i )->zOffset;
+ uiInfo.alienBuildListModel[i].cameraDist = 100;
+ uiInfo.alienBuildListModel[i].autoAdjust = qtrue;
+ }
+ }
+}
+
+/*
+===============
+UI_LoadAlienBuildsItems
+===============
+*/
+static void UI_LoadAlienBuildsItems(int priority, int *j, int stage)
+{
+ int i = 0;
+ qboolean addItem;
+ char *prefix;
+ qboolean critical;
+ alienStates_t state;
+
+ UI_alienStates(&state);
+
+ for (i = BA_NONE + 1; i < BA_NUM_BUILDABLES; i++)
{
- if (BG_ClassCanEvolveFromTo(class, i, credits, stage, 0) >= 0)
+ addItem = qfalse;
+ critical = qfalse;
+ if (BG_Buildable(i)->team == TEAM_ALIENS && BG_BuildableIsAllowed(i))
{
- uiInfo.alienUpgradeList[j].text = BG_ClassConfig(i)->humanName;
- uiInfo.alienUpgradeList[j].cmd = String_Alloc(va("cmd class %s\n", BG_Class(i)->name));
- uiInfo.alienUpgradeList[j].type = INFOTYPE_CLASS;
- uiInfo.alienUpgradeList[j].v.pclass = i;
+ switch (priority) {
+ case 0:
+ break;
+ case 1:
+ if (BG_BuildableAllowedInStage(i, stage))
+ {
+ addItem = qtrue;
+ if (i == BA_A_SPAWN && !state.spawns
+ || i == BA_A_BOOSTER && !state.boosters
+ || i == BA_A_OVERMIND && !state.omHealth )
+ critical = qtrue;
+ prefix = (char*)(va(
+ "%s%s%s%s",
+ ( (!state.omHealth || state.omBuilding) && i != BA_A_OVERMIND ) ? "[overmind] " : "", // Show an overmind if it need it
+ ( !state.omHealth && i != BA_A_OVERMIND ) ? "^0" : "", // Grey out the item if om is not building too
+ ( !(BG_Buildable(i)->buildWeapon & uiInfo.weapons) ) ? "[upgrade][advgranger]^0 " : "", // Grey out and ask to upgrade if adv granger is needed
+ ( critical ) ? "[!] " : "" // Inform if this item is important
+ ));
+ }
+ break;
+ case 2:
+ if (!BG_BuildableAllowedInStage(i, stage))
+ {
+ addItem = qtrue;
+ prefix = "[locked] ^0";
+ }
+ break;
+ }
- j++;
+ if (addItem == qtrue)
+ {
+ uiInfo.alienBuildList[*j].text = String_Alloc(va("%s%s", prefix, BG_Buildable(i)->humanName));
+ uiInfo.alienBuildList[*j].cmd = String_Alloc(va("cmd build %s\n", BG_Buildable(i)->name));
+ uiInfo.alienBuildList[*j].type = INFOTYPE_BUILDABLE;
+ uiInfo.alienBuildList[*j].v.buildable = i;
- uiInfo.alienUpgradeCount++;
+ (*j)++;
+ uiInfo.alienBuildCount++;
+ }
}
}
}
@@ -2682,19 +3669,104 @@ static void UI_LoadAlienBuilds(void)
uiInfo.alienBuildCount = 0;
+ // UI_LoadAlienBuildsItems(0, &j, stage);
+ UI_LoadAlienBuildsItems(1, &j, stage);
+ UI_LoadAlienBuildsItems(2, &j, stage);
+}
+
+/*
+===============
+UI_LoadHumansBuildsModels
+===============
+*/
+static void UI_LoadHumansBuildsModels(void)
+{
+ int i;
+ fileHandle_t h;
+ char *modelFile;
+
+ memset(&(uiInfo.humanBuildListModel), 0, sizeof(uiInfo.humanBuildListModel));
+ for (i = BA_NONE + 1; i < BA_NUM_BUILDABLES; i++)
+ {
+ if (BG_Buildable(i)->team == TEAM_HUMANS && BG_BuildableIsAllowed(i))
+ {
+ for( h = 0; h < MAX_BUILDABLE_MODELS; h++ )
+ {
+ modelFile = BG_BuildableConfig( i )->models[ h ];
+ if( strlen( modelFile ) > 0 )
+ uiInfo.humanBuildListModel[i].asset[ uiInfo.humanBuildListModel[i].assetCount++ ]
+ = uiInfo.uiDC.registerModel( modelFile );
+ }
+ uiInfo.humanBuildListModel[i].scale = BG_BuildableConfig( i )->modelScale;
+ uiInfo.humanBuildListModel[i].zOffset = BG_BuildableConfig( i )->zOffset;
+ uiInfo.humanBuildListModel[i].cameraDist = 160;
+ uiInfo.humanBuildListModel[i].autoAdjust = qtrue;
+ }
+ }
+}
+
+/*
+===============
+UI_LoadHumanBuildsItems
+===============
+*/
+static void UI_LoadHumanBuildsItems(int priority, int *j, int stage)
+{
+ int i = 0;
+ qboolean addItem;
+ char *prefix;
+ qboolean critical;
+ humanStates_t state;
+
+ UI_humanStates(&state);
+
for (i = BA_NONE + 1; i < BA_NUM_BUILDABLES; i++)
{
- if (BG_Buildable(i)->team == TEAM_ALIENS && BG_Buildable(i)->buildWeapon & uiInfo.weapons &&
- BG_BuildableAllowedInStage(i, stage) && BG_BuildableIsAllowed(i))
+ addItem = qfalse;
+ critical = qfalse;
+ if (BG_Buildable(i)->team == TEAM_HUMANS && BG_BuildableIsAllowed(i))
{
- uiInfo.alienBuildList[j].text = BG_Buildable(i)->humanName;
- uiInfo.alienBuildList[j].cmd = String_Alloc(va("cmd build %s\n", BG_Buildable(i)->name));
- uiInfo.alienBuildList[j].type = INFOTYPE_BUILDABLE;
- uiInfo.alienBuildList[j].v.buildable = i;
+ switch (priority) {
+ case 0:
+ break;
+ case 1:
+ if (BG_BuildableAllowedInStage(i, stage))
+ {
+ addItem = qtrue;
+ if (i == BA_H_SPAWN && !state.spawns
+ || i == BA_H_ARMOURY && !state.armourys
+ || i == BA_H_MEDISTAT && !state.medicals
+ || i == BA_H_DCC && !state.computers
+ || i == BA_H_REACTOR && !state.rcHealth )
+ critical = qtrue;
+ prefix = (char*)(va(
+ "%s%s%s%s",
+ ( (!state.rcHealth || state.rcBuilding) && i != BA_H_REACTOR ) ? "[reactor] " : "", // Show a reactor if it need it
+ ( !state.rcHealth && i != BA_H_REACTOR ) ? "^0" : "", // Grey out the item if om is not building too
+ ( !(BG_Buildable(i)->buildWeapon & uiInfo.weapons) ) ? "[upgrade][ckit]^0 " : "", // Grey out and ask to upgrade if adv ckit is needed. Now Ckit = AdvCkit (keep for compatibility)
+ ( critical ) ? "[!] " : "" // Inform if this item is important
+ ));
+ }
+ break;
+ case 2:
+ if (!BG_BuildableAllowedInStage(i, stage))
+ {
+ addItem = qtrue;
+ prefix = "[locked] ^0";
+ }
+ break;
+ }
- j++;
+ if (addItem == qtrue)
+ {
+ uiInfo.humanBuildList[*j].text = String_Alloc(va("%s%s", prefix, BG_Buildable(i)->humanName));
+ uiInfo.humanBuildList[*j].cmd = String_Alloc(va("cmd build %s\n", BG_Buildable(i)->name));
+ uiInfo.humanBuildList[*j].type = INFOTYPE_BUILDABLE;
+ uiInfo.humanBuildList[*j].v.buildable = i;
- uiInfo.alienBuildCount++;
+ (*j)++;
+ uiInfo.humanBuildCount++;
+ }
}
}
}
@@ -2707,6 +3779,8 @@ UI_LoadHumanBuilds
static void UI_LoadHumanBuilds(void)
{
int i, j = 0;
+ fileHandle_t h;
+ char *modelFile;
stage_t stage;
UI_ParseCarriageList();
@@ -2714,21 +3788,10 @@ static void UI_LoadHumanBuilds(void)
uiInfo.humanBuildCount = 0;
- for (i = BA_NONE + 1; i < BA_NUM_BUILDABLES; i++)
- {
- if (BG_Buildable(i)->team == TEAM_HUMANS && BG_Buildable(i)->buildWeapon & uiInfo.weapons &&
- BG_BuildableAllowedInStage(i, stage) && BG_BuildableIsAllowed(i))
- {
- uiInfo.humanBuildList[j].text = BG_Buildable(i)->humanName;
- uiInfo.humanBuildList[j].cmd = String_Alloc(va("cmd build %s\n", BG_Buildable(i)->name));
- uiInfo.humanBuildList[j].type = INFOTYPE_BUILDABLE;
- uiInfo.humanBuildList[j].v.buildable = i;
-
- j++;
- uiInfo.humanBuildCount++;
- }
- }
+ // UI_LoadHumanBuildsItems(0, &j, stage);
+ UI_LoadHumanBuildsItems(1, &j, stage);
+ UI_LoadHumanBuildsItems(2, &j, stage);
}
/*
@@ -3151,7 +4214,10 @@ static void UI_RunMenuScript(char **args)
trap_Cmd_ExecuteText(EXEC_APPEND, cmd);
}
else if (Q_stricmp(name, "LoadHumanArmouryBuys") == 0)
+ {
+ UI_LoadHumanArmouryModels();
UI_LoadHumanArmouryBuys();
+ }
else if (Q_stricmp(name, "BuyFromArmoury") == 0)
{
if ((cmd = uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex].cmd))
@@ -3170,6 +4236,7 @@ static void UI_RunMenuScript(char **args)
}
else if (Q_stricmp(name, "LoadAlienUpgrades") == 0)
{
+ UI_LoadAlienUpgradesModels();
UI_LoadAlienUpgrades();
}
else if (Q_stricmp(name, "UpgradeToNewClass") == 0)
@@ -3178,14 +4245,20 @@ static void UI_RunMenuScript(char **args)
trap_Cmd_ExecuteText(EXEC_APPEND, cmd);
}
else if (Q_stricmp(name, "LoadAlienBuilds") == 0)
- UI_LoadAlienBuilds();
+ {
+ UI_LoadAlienBuildsModels();
+ UI_LoadAlienBuilds();
+ }
else if (Q_stricmp(name, "BuildAlienBuildable") == 0)
{
if ((cmd = uiInfo.alienBuildList[uiInfo.alienBuildIndex].cmd))
trap_Cmd_ExecuteText(EXEC_APPEND, cmd);
}
else if (Q_stricmp(name, "LoadHumanBuilds") == 0)
- UI_LoadHumanBuilds();
+ {
+ UI_LoadHumansBuildsModels();
+ UI_LoadHumanBuilds();
+ }
else if (Q_stricmp(name, "BuildHumanBuildable") == 0)
{
if ((cmd = uiInfo.humanBuildList[uiInfo.humanBuildIndex].cmd))
@@ -3734,6 +4807,7 @@ static const char *UI_FeederItemText(int feederID, int index, int column, qhandl
static int lastColumn = -1;
static int lastTime = 0;
int ping;
+ char *cleanedcpy;
if (lastColumn != column || lastTime > uiInfo.uiDC.realTime + 5000)
{
@@ -3756,15 +4830,19 @@ static const char *UI_FeederItemText(int feederID, int index, int column, qhandl
{
static char hostname[1024];
+ // Strip leading whitespace
+ cleanedcpy = cleaned;
+ while (*cleanedcpy != '\0' && isspace(*cleanedcpy))
+ cleanedcpy++;
+
if (ui_netSource.integer == AS_LOCAL)
{
- Com_sprintf(hostname, sizeof(hostname), "%s [%s]", cleaned,
+ Com_sprintf(hostname, sizeof(hostname), "^7%s [%s]", cleaned,
netnames[atoi(Info_ValueForKey(info, "nettype"))]);
return hostname;
}
else
{
- char *text;
char *label;
label = Info_ValueForKey(info, "label");
@@ -3773,20 +4851,14 @@ static const char *UI_FeederItemText(int feederID, int index, int column, qhandl
// First char of the label response is a sorting tag. Skip it.
label += 1;
- Com_sprintf(hostname, sizeof(hostname), "%s %s", label, cleaned);
+ Com_sprintf(hostname, sizeof(hostname), "^7%s %s", label, cleaned);
}
else
{
- Com_sprintf(hostname, sizeof(hostname), "%s", cleaned);
+ Com_sprintf(hostname, sizeof(hostname), "^7%s", cleaned);
}
- // Strip leading whitespace
- text = hostname;
-
- while (*text != '\0' && *text == ' ')
- text++;
-
- return text;
+ return hostname;
}
}
@@ -3911,7 +4983,23 @@ static const char *UI_FeederItemText(int feederID, int index, int column, qhandl
else if (feederID == FEEDER_TREMHUMANARMOURYSELL)
{
if (index >= 0 && index < uiInfo.humanArmourySellCount)
- return uiInfo.humanArmourySellList[index].text;
+ {
+ // If conflicting with selected
+ if (
+ (
+ uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex].type == INFOTYPE_WEAPON ?
+ BG_Weapon(uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex].v.weapon)->slots :
+ BG_Upgrade(uiInfo.humanArmouryBuyList[uiInfo.humanArmouryBuyIndex].v.upgrade)->slots
+ ) & (
+ uiInfo.humanArmourySellList[index].type == INFOTYPE_WEAPON ?
+ BG_Weapon(uiInfo.humanArmourySellList[index].v.weapon)->slots :
+ BG_Upgrade(uiInfo.humanArmourySellList[index].v.upgrade)->slots
+ )
+ )
+ return (va("[!] %s", uiInfo.humanArmourySellList[index].text));
+ else
+ return uiInfo.humanArmourySellList[index].text;
+ }
}
else if (feederID == FEEDER_TREMALIENUPGRADE)
{
@@ -3938,7 +5026,10 @@ static const char *UI_FeederItemText(int feederID, int index, int column, qhandl
w = uiInfo.resolutions[index].w;
h = uiInfo.resolutions[index].h;
- Com_sprintf(resolution, sizeof(resolution), "%dx%d (%s)", w, h, UI_DisplayAspectString(w, h));
+ if (w == 0 && h == 0)
+ Com_sprintf(resolution, sizeof(resolution), "Automatic");
+ else
+ Com_sprintf(resolution, sizeof(resolution), "%dx%d (%s)", w, h, UI_DisplayAspectString(w, h));
return resolution;
}
@@ -4203,6 +5294,7 @@ UI_Init
void UI_Init(qboolean inGameLoad)
{
BG_InitClassConfigs();
+ BG_InitBuildableConfigs();
BG_InitAllowedGameElements();
uiInfo.inGameLoad = inGameLoad;
@@ -4229,9 +5321,13 @@ void UI_Init(qboolean inGameLoad)
uiInfo.uiDC.drawHandlePic = &UI_DrawHandlePic;
uiInfo.uiDC.drawStretchPic = &trap_R_DrawStretchPic;
uiInfo.uiDC.registerModel = &trap_R_RegisterModel;
+ uiInfo.uiDC.registerSkin = &trap_R_RegisterSkin;
uiInfo.uiDC.modelBounds = &trap_R_ModelBounds;
+ uiInfo.uiDC.lerpTag = &trap_CM_LerpTag;
uiInfo.uiDC.fillRect = &UI_FillRect;
+ uiInfo.uiDC.fillRoundedRect = &UI_FillRoundedRect;
uiInfo.uiDC.drawRect = &UI_DrawRect;
+ uiInfo.uiDC.drawRoundedRect = &UI_DrawRoundedRect;
uiInfo.uiDC.drawSides = &UI_DrawSides;
uiInfo.uiDC.drawTopBottom = &UI_DrawTopBottom;
uiInfo.uiDC.clearScene = &trap_R_ClearScene;
@@ -4243,6 +5339,7 @@ void UI_Init(qboolean inGameLoad)
uiInfo.uiDC.ownerDrawVisible = &UI_OwnerDrawVisible;
uiInfo.uiDC.runScript = &UI_RunMenuScript;
uiInfo.uiDC.setCVar = trap_Cvar_Set;
+ uiInfo.uiDC.resetCVar = trap_Cvar_Reset;
uiInfo.uiDC.getCVarString = trap_Cvar_VariableStringBuffer;
uiInfo.uiDC.getCVarValue = trap_Cvar_VariableValue;
uiInfo.uiDC.setOverstrikeMode = &trap_Key_SetOverstrikeMode;
@@ -4553,7 +5650,7 @@ static void UI_DisplayDownloadInfo(const char *downloadName, float centerPoint,
static char etaText[] = "Estimated time left:";
static char xferText[] = "Transfer rate:";
- int downloadSize, downloadCount, downloadTime;
+ int downloadSize, downloadCount, downloadTime, downloadTotal, downloadDone;
char dlSizeBuf[64], totalSizeBuf[64], xferRateBuf[64], dlTimeBuf[64];
int xferRate;
int leftWidth;
@@ -4562,6 +5659,8 @@ static void UI_DisplayDownloadInfo(const char *downloadName, float centerPoint,
downloadSize = trap_Cvar_VariableValue("cl_downloadSize");
downloadCount = trap_Cvar_VariableValue("cl_downloadCount");
downloadTime = trap_Cvar_VariableValue("cl_downloadTime");
+ downloadTotal = trap_Cvar_VariableValue("cl_downloadTotal");
+ downloadDone = trap_Cvar_VariableValue("cl_downloadDone");
leftWidth = 320;
@@ -4571,7 +5670,7 @@ static void UI_DisplayDownloadInfo(const char *downloadName, float centerPoint,
Text_PaintCenter(centerPoint, yStart + 248, scale, colorWhite, xferText, 0);
if (downloadSize > 0)
- s = va("%s (%d%%)", downloadName, (int)((float)downloadCount * 100.0f / downloadSize));
+ s = va("%s (%d%%, %d/%d)", downloadName, (int)((float)downloadCount * 100.0f / downloadSize), downloadDone + 1, downloadTotal);
else
s = downloadName;
diff --git a/src/ui/ui_shared.c b/src/ui/ui_shared.c
index 8b6225e0b..9a964af70 100644
--- a/src/ui/ui_shared.c
+++ b/src/ui/ui_shared.c
@@ -1000,8 +1000,8 @@ static void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fad
{
fillRect.x += w->borderSize;
fillRect.y += w->borderSize;
- fillRect.w -= w->borderSize + 1;
- fillRect.h -= w->borderSize + 1;
+ fillRect.w -= w->borderSize * 2;
+ fillRect.h -= w->borderSize * 2;
}
if (w->style == WINDOW_STYLE_FILLED)
@@ -1015,6 +1015,8 @@ static void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fad
DC->drawHandlePic(fillRect.x, fillRect.y, fillRect.w, fillRect.h, w->background);
DC->setColor(NULL);
}
+ else if( w->border == WINDOW_BORDER_ROUNDED )
+ DC->fillRoundedRect( fillRect.x, fillRect.y, fillRect.w, fillRect.h, w->borderSize, w->borderStyle, w->backColor );
else
DC->fillRect(fillRect.x, fillRect.y, fillRect.w, fillRect.h, w->backColor);
}
@@ -1082,6 +1084,11 @@ static void Border_Paint(Window *w)
r.y = w->rect.y + w->rect.h - 1;
GradientBar_Paint(&r, w->borderColor);
}
+ else if( w->border == WINDOW_BORDER_ROUNDED )
+ {
+ // rounded, style depending of borderStyle
+ DC->drawRoundedRect( w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize, w->borderStyle, w->borderColor );
+ }
}
void Item_SetScreenCoords(itemDef_t *item, float x, float y)
@@ -2170,6 +2177,39 @@ static void UI_Text_Paint_Generic(float x, float y, float scale, float gapAdjust
float yadj = useScale * glyph->top;
DC->setColor(NULL);
+
+ if (style == ITEM_TEXTSTYLE_SHADOWED || style == ITEM_TEXTSTYLE_SHADOWEDMORE)
+ {
+ int ofs;
+
+ if (style == ITEM_TEXTSTYLE_SHADOWED)
+ ofs = 1;
+ else
+ ofs = 2;
+
+ colorBlack[3] = newColor[3] * 4 / 8 / 6;
+ DC->setColor(colorBlack);
+ DC->drawHandlePic(x + ofs - 0.2f, y + ofs - 0.2f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs + 0.2f, y + ofs - 0.2f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs - 0.2f, y + ofs + 0.2f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs + 0.2f, y + ofs + 0.2f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ colorBlack[3] = newColor[3] * 3 / 8 / 6;
+ DC->setColor(colorBlack);
+ DC->drawHandlePic(x + ofs - 0.4f, y + ofs - 0.4f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs + 0.4f, y + ofs - 0.4f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs - 0.4f, y + ofs + 0.4f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs + 0.4f, y + ofs + 0.4f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ colorBlack[3] = newColor[3] * 1 / 8 / 6;
+ DC->setColor(colorBlack);
+ DC->drawHandlePic(x + ofs - 0.6f, y + ofs - 0.6f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs + 0.6f, y + ofs - 0.6f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs - 0.6f, y + ofs + 0.6f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+ DC->drawHandlePic(x + ofs + 0.6f, y + ofs + 0.6f - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
+
+ DC->setColor(NULL);
+ colorBlack[3] = 1.0f;
+ }
+
DC->drawHandlePic(x, y - yadj, (emoticonW * emoticonWidth), emoticonH, emoticonHandle);
DC->setColor(newColor);
x += (emoticonW * emoticonWidth) + gapAdjust;
@@ -2188,9 +2228,26 @@ static void UI_Text_Paint_Generic(float x, float y, float scale, float gapAdjust
ofs = 1;
else
ofs = 2;
- colorBlack[3] = newColor[3];
+
+ colorBlack[3] = newColor[3] * 4 / 8 / 6;
+ DC->setColor(colorBlack);
+ UI_Text_PaintChar(x + ofs - 0.2f, y + ofs - 0.2f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs + 0.2f, y + ofs - 0.2f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs - 0.2f, y + ofs + 0.2f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs + 0.2f, y + ofs + 0.2f, useScale, glyph, 0.0f);
+ colorBlack[3] = newColor[3] * 3 / 8 / 6;
DC->setColor(colorBlack);
- UI_Text_PaintChar(x + ofs, y + ofs, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs - 0.4f, y + ofs - 0.4f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs + 0.4f, y + ofs - 0.4f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs - 0.4f, y + ofs + 0.4f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs + 0.4f, y + ofs + 0.4f, useScale, glyph, 0.0f);
+ colorBlack[3] = newColor[3] * 1 / 8 / 6;
+ DC->setColor(colorBlack);
+ UI_Text_PaintChar(x + ofs - 0.6f, y + ofs - 0.6f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs + 0.6f, y + ofs - 0.6f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs - 0.6f, y + ofs + 0.6f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + ofs + 0.6f, y + ofs + 0.6f, useScale, glyph, 0.0f);
+
DC->setColor(newColor);
colorBlack[3] = 1.0f;
}
@@ -2199,13 +2256,30 @@ static void UI_Text_Paint_Generic(float x, float y, float scale, float gapAdjust
vec4_t glow;
memcpy(&glow[0], &newColor[0], sizeof(vec4_t));
- glow[3] *= 0.2f;
DC->setColor(glow);
- UI_Text_PaintChar(x, y, useScale, glyph, 6.0f);
- UI_Text_PaintChar(x, y, useScale, glyph, 4.0f);
- DC->setColor(newColor);
- UI_Text_PaintChar(x, y, useScale, glyph, 2.0f);
+ UI_Text_PaintChar(x - 0.1f, y - 0.1f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + 0.1f, y - 0.1f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x - 0.1f, y + 0.1f, useScale, glyph, 0.0f);
+ UI_Text_PaintChar(x + 0.1f, y + 0.1f, useScale, glyph, 0.0f);
+ glow[3] = newColor[3] * 4 / 8 / 4;
+ DC->setColor(glow);
+ UI_Text_PaintChar(x - 0.2f, y - 0.2f, useScale, glyph, 0.4f);
+ UI_Text_PaintChar(x + 0.2f, y - 0.2f, useScale, glyph, 0.4f);
+ UI_Text_PaintChar(x - 0.2f, y + 0.2f, useScale, glyph, 0.4f);
+ UI_Text_PaintChar(x + 0.2f, y + 0.2f, useScale, glyph, 0.4f);
+ glow[3] = newColor[3] * 3 / 8 / 4;
+ DC->setColor(glow);
+ UI_Text_PaintChar(x - 0.4f, y - 0.4f, useScale, glyph, 0.4f);
+ UI_Text_PaintChar(x + 0.4f, y - 0.4f, useScale, glyph, 0.4f);
+ UI_Text_PaintChar(x - 0.4f, y + 0.4f, useScale, glyph, 0.4f);
+ UI_Text_PaintChar(x + 0.4f, y + 0.4f, useScale, glyph, 0.4f);
+ glow[3] = newColor[3] * 1 / 8 / 4;
+ DC->setColor(glow);
+ UI_Text_PaintChar(x - 0.8f, y - 0.8f, useScale, glyph, 0.8f);
+ UI_Text_PaintChar(x + 0.8f, y - 0.8f, useScale, glyph, 0.8f);
+ UI_Text_PaintChar(x - 0.8f, y + 0.8f, useScale, glyph, 0.8f);
+ UI_Text_PaintChar(x + 0.8f, y + 0.8f, useScale, glyph, 0.8f);
DC->setColor(colorWhite);
}
@@ -2947,6 +3021,10 @@ qboolean Item_YesNo_HandleKey(itemDef_t *item, int key)
DC->setCVar(item->cvar, va("%i", !DC->getCVarValue(item->cvar)));
return qtrue;
}
+ else if (key == K_BACKSPACE || key == K_DEL)
+ {
+ DC->resetCVar(item->cvar);
+ }
}
return qfalse;
@@ -3080,6 +3158,10 @@ qboolean Item_Multi_HandleKey(itemDef_t *item, int key)
current = (Item_Multi_FindCvarByValue(item) + max - 1) % max;
changed = qtrue;
}
+ else if (key == K_BACKSPACE || key == K_DEL)
+ {
+ DC->resetCVar(item->cvar);
+ }
if (changed)
{
@@ -3492,28 +3574,35 @@ qboolean Item_Slider_HandleKey(itemDef_t *item, int key, qboolean down)
if (item->window.flags & WINDOW_HASFOCUS && item->cvar &&
Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory))
{
- if (item->typeData.edit && (key == K_ENTER || key == K_MOUSE1 || key == K_MOUSE2 || key == K_MOUSE3))
+ if (item->typeData.edit)
{
- rectDef_t testRect;
- width = SLIDER_WIDTH;
+ if (key == K_ENTER || key == K_MOUSE1 || key == K_MOUSE2 || key == K_MOUSE3)
+ {
+ rectDef_t testRect;
+ width = SLIDER_WIDTH;
- if (item->text)
- x = item->textRect.x + item->textRect.w + ITEM_VALUE_OFFSET;
- else
- x = item->window.rect.x;
+ if (item->text)
+ x = item->textRect.x + item->textRect.w + ITEM_VALUE_OFFSET;
+ else
+ x = item->window.rect.x;
- testRect = item->window.rect;
- value = (float)SLIDER_THUMB_WIDTH / 2;
- testRect.x = x - value;
- testRect.w = SLIDER_WIDTH + value;
+ testRect = item->window.rect;
+ value = (float)SLIDER_THUMB_WIDTH / 2;
+ testRect.x = x - value;
+ testRect.w = SLIDER_WIDTH + value;
- if (Rect_ContainsPoint(&testRect, DC->cursorx, DC->cursory))
+ if (Rect_ContainsPoint(&testRect, DC->cursorx, DC->cursory))
+ {
+ value = (float)(DC->cursorx - x) / width;
+ value *= (item->typeData.edit->maxVal - item->typeData.edit->minVal);
+ value += item->typeData.edit->minVal;
+ DC->setCVar(item->cvar, va("%f", value));
+ return qtrue;
+ }
+ }
+ else if (key == K_BACKSPACE || key == K_DEL)
{
- value = (float)(DC->cursorx - x) / width;
- value *= (item->typeData.edit->maxVal - item->typeData.edit->minVal);
- value += item->typeData.edit->minVal;
- DC->setCVar(item->cvar, va("%f", value));
- return qtrue;
+ DC->resetCVar(item->cvar);
}
}
}
@@ -4790,11 +4879,14 @@ static bind_t g_bindings[] = {{"+scores", K_TAB, -1, -1, -1, -1}, {"+button2", K
{"reload", 'r', -1, -1, -1, -1}, // reload
{"buy ammo", 'b', -1, -1, -1, -1}, // buy ammo
{"itemact medkit", 'm', -1, -1, -1, -1}, // use medkit
+ {"rotatebuildleft", ',', -1, -1, -1, -1}, // Rotate ghost build to left
+ {"rotatebuildright", '.', -1, -1, -1, -1}, // Rotate ghost build to right
+ {"rotatebuild", 'l', -1, -1, -1, -1}, // Reset ghost build rotation
{"+button7", 'q', -1, -1, -1, -1}, // buildable use
{"deconstruct", 'e', -1, -1, -1, -1}, // buildable destroy
{"weapprev", '[', -1, -1, -1, -1}, {"weapnext", ']', -1, -1, -1, -1}, {"+button3", K_MOUSE3, -1, -1, -1, -1},
{"+button4", K_MOUSE4, -1, -1, -1, -1}, {"vote yes", K_F1, -1, -1, -1, -1}, {"vote no", K_F2, -1, -1, -1, -1},
- {"teamvote yes", K_F3, -1, -1, -1, -1}, {"teamvote no", K_F4, -1, -1, -1, -1},
+ {"teamvote yes", K_F3, -1, -1, -1, -1}, {"teamvote no", K_F4, -1, -1, -1, -1}, {"ready", K_F5, -1, -1, -1, -1},
{"scoresUp", K_KP_PGUP, -1, -1, -1, -1}, {"scoresDown", K_KP_PGDN, -1, -1, -1, -1},
{"screenshotJPEG", -1, -1, -1, -1, -1}, {"messagemode", -1, -1, -1, -1, -1}, {"messagemode2", -1, -1, -1, -1, -1}};
@@ -5229,6 +5321,8 @@ void Item_ListBoxRow_Paint(itemDef_t *item, int row, int renderPos, qboolean hig
listBoxDef_t *listPtr = item->typeData.list;
menuDef_t *menu = (menuDef_t *)item->parent;
float one, two;
+ rectDef_t itemRect;
+ vec4_t hightlightColor;
one = 1.0f * DC->aspectScale;
two = 2.0f * DC->aspectScale;
@@ -5237,8 +5331,15 @@ void Item_ListBoxRow_Paint(itemDef_t *item, int row, int renderPos, qboolean hig
y = SCROLLBAR_Y(item) + (listPtr->elementHeight * renderPos);
w = item->window.rect.w - (two * item->window.borderSize);
+ itemRect.x = x;
+ itemRect.y = y;
+ itemRect.w = w;
+ itemRect.h = listPtr->elementHeight;
+
+ highlight = highlight && row == item->cursorPos;
+
if (scrollbar)
- w -= SCROLLBAR_ARROW_WIDTH;
+ w -= SCROLLBAR_ARROW_WIDTH + 1.0f;
if (listPtr->elementStyle == LISTBOX_IMAGE)
{
@@ -5249,7 +5350,7 @@ void Item_ListBoxRow_Paint(itemDef_t *item, int row, int renderPos, qboolean hig
if (image)
DC->drawHandlePic(x + one, y + 1.0f, listPtr->elementWidth - two, listPtr->elementHeight - 2.0f, image);
- if (highlight && row == item->cursorPos)
+ if (highlight)
{
DC->drawRect(
x, y, listPtr->elementWidth, listPtr->elementHeight, item->window.borderSize, item->window.borderColor);
@@ -5262,6 +5363,17 @@ void Item_ListBoxRow_Paint(itemDef_t *item, int row, int renderPos, qboolean hig
const float m = UI_Text_EmHeight(item->textscale);
char text[MAX_STRING_CHARS];
qhandle_t optionalImage;
+ Vector4Copy(item->window.outlineColor, hightlightColor);
+
+ if (highlight || Rect_ContainsPoint(&itemRect, DC->cursorx, DC->cursory))
+ {
+ if (!highlight)
+ hightlightColor[3] *= 0.55f;
+ if( item->window.border == WINDOW_BORDER_ROUNDED )
+ DC->fillRoundedRect(x, y, w, listPtr->elementHeight, item->window.borderSize, item->window.borderStyle, hightlightColor);
+ else
+ DC->fillRect(x, y, w, listPtr->elementHeight, hightlightColor);
+ }
if (listPtr->numColumns > 0)
{
@@ -5317,7 +5429,7 @@ void Item_ListBoxRow_Paint(itemDef_t *item, int row, int renderPos, qboolean hig
}
UI_Text_Paint(x + columnPos + alignOffset, y + m + ((listPtr->elementHeight - m) / 2.0f),
- item->textscale, item->window.foreColor, text, 0, 0, item->textStyle);
+ item->textscale, (highlight ? menu->focusColor : item->window.foreColor), text, 0, 0, item->textStyle);
}
UI_ClearClipRegion();
@@ -5341,14 +5453,11 @@ void Item_ListBoxRow_Paint(itemDef_t *item, int row, int renderPos, qboolean hig
else if (text[0])
{
UI_Text_Paint(x + offset, y + m + ((listPtr->elementHeight - m) / 2.0f), item->textscale,
- item->window.foreColor, text, 0, 0, item->textStyle);
+ (highlight ? menu->focusColor : item->window.foreColor), text, 0, 0, item->textStyle);
}
UI_ClearClipRegion();
}
-
- if (highlight && row == item->cursorPos)
- DC->fillRect(x, y, w, listPtr->elementHeight, item->window.outlineColor);
}
}
@@ -5397,7 +5506,7 @@ void Item_ComboBox_Paint(itemDef_t *item)
h = item->window.rect.h - 2.0f;
// Down arrow
- DC->drawHandlePic(x, y, SCROLLBAR_ARROW_WIDTH, h, DC->Assets.scrollBarArrowDown);
+ DC->drawHandlePic(x, y, SCROLLBAR_ARROW_WIDTH, h, DC->Assets.showMoreArrow);
Item_ListBoxRow_Paint(item, item->cursorPos, 0, qfalse, qtrue);
if (g_comboBoxItem != NULL)
{
@@ -6651,6 +6760,22 @@ qboolean ItemParse_bordercolor(itemDef_t *item, int handle)
return qtrue;
}
+qboolean ItemParse_borderstyle(itemDef_t *item, int handle)
+{
+ int i;
+ float f;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!PC_Float_Parse(handle, &f))
+ return qfalse;
+
+ item->window.borderStyle[i] = f;
+ }
+
+ return qtrue;
+}
+
qboolean ItemParse_outlinecolor(itemDef_t *item, int handle)
{
if (!PC_Color_Parse(handle, &item->window.outlineColor))
@@ -7010,7 +7135,8 @@ keywordHash_t itemParseKeywords[] = {{"name", ItemParse_name, TYPE_ANY, NULL}, {
{"textalignx", ItemParse_textalignx, TYPE_ANY, NULL}, {"textaligny", ItemParse_textaligny, TYPE_ANY, NULL},
{"textscale", ItemParse_textscale, TYPE_ANY, NULL}, {"textstyle", ItemParse_textstyle, TYPE_ANY, NULL},
{"backcolor", ItemParse_backcolor, TYPE_ANY, NULL}, {"forecolor", ItemParse_forecolor, TYPE_ANY, NULL},
- {"bordercolor", ItemParse_bordercolor, TYPE_ANY, NULL}, {"outlinecolor", ItemParse_outlinecolor, TYPE_ANY, NULL},
+ {"bordercolor", ItemParse_bordercolor, TYPE_ANY, NULL}, {"borderstyle", ItemParse_borderstyle, TYPE_ANY, NULL},
+ {"outlinecolor", ItemParse_outlinecolor, TYPE_ANY, NULL},
{"background", ItemParse_background, TYPE_ANY, NULL}, {"onFocus", ItemParse_onFocus, TYPE_ANY, NULL},
{"leaveFocus", ItemParse_leaveFocus, TYPE_ANY, NULL}, {"mouseEnter", ItemParse_mouseEnter, TYPE_ANY, NULL},
{"mouseExit", ItemParse_mouseExit, TYPE_ANY, NULL}, {"mouseEnterText", ItemParse_mouseEnterText, TYPE_ANY, NULL},
@@ -7319,6 +7445,23 @@ qboolean MenuParse_bordercolor(itemDef_t *item, int handle)
return qtrue;
}
+qboolean MenuParse_borderstyle(itemDef_t *item, int handle)
+{
+ int i;
+ float f;
+ menuDef_t *menu = (menuDef_t *)item;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!PC_Float_Parse(handle, &f))
+ return qfalse;
+
+ menu->window.borderStyle[i] = f;
+ }
+
+ return qtrue;
+}
+
qboolean MenuParse_focuscolor(itemDef_t *item, int handle)
{
int i;
@@ -7499,6 +7642,7 @@ keywordHash_t menuParseKeywords[] = {{"font", MenuParse_font, 0, NULL}, {"name",
{"onClose", MenuParse_onClose, 0, NULL}, {"onESC", MenuParse_onESC, 0, NULL}, {"border", MenuParse_border, 0, NULL},
{"borderSize", MenuParse_borderSize, 0, NULL}, {"backcolor", MenuParse_backcolor, 0, NULL},
{"forecolor", MenuParse_forecolor, 0, NULL}, {"bordercolor", MenuParse_bordercolor, 0, NULL},
+ {"borderstyle", MenuParse_borderstyle, 0, NULL},
{"focuscolor", MenuParse_focuscolor, 0, NULL}, {"disablecolor", MenuParse_disablecolor, 0, NULL},
{"outlinecolor", MenuParse_outlinecolor, 0, NULL}, {"background", MenuParse_background, 0, NULL},
{"ownerdraw", MenuParse_ownerdraw, 0, NULL}, {"ownerdrawFlag", MenuParse_ownerdrawFlag, 0, NULL},
diff --git a/src/ui/ui_shared.h b/src/ui/ui_shared.h
index 470792c85..4da0123ab 100644
--- a/src/ui/ui_shared.h
+++ b/src/ui/ui_shared.h
@@ -37,7 +37,7 @@ along with Tremulous; if not, see
#define MAX_MENUDEFFILE 4096
#define MAX_MENUFILE 32768
#define MAX_MENUS 256
-#define MAX_MENUITEMS 128
+#define MAX_MENUITEMS 256
#define MAX_COLOR_RANGES 10
#define MAX_OPEN_MENUS 16
@@ -97,8 +97,15 @@ along with Tremulous; if not, see
#define ASSET_SCROLLBAR_ARROWLEFT "ui/assets/scrollbar_arrow_left.tga"
#define ASSET_SCROLLBAR_ARROWRIGHT "ui/assets/scrollbar_arrow_right.tga"
#define ASSET_SCROLL_THUMB "ui/assets/scrollbar_thumb.tga"
-#define ASSET_SLIDER_BAR "ui/assets/slider2.tga"
-#define ASSET_SLIDER_THUMB "ui/assets/sliderbutt_1.tga"
+#define ASSET_SHOWMORE_ARROW "ui/assets/showmore_arrow.tga"
+#define ASSET_SLIDER_BAR "ui/assets/slider.png"
+#define ASSET_SLIDER_THUMB "ui/assets/sliderbutt.png"
+#define ASSET_CORNERIN_SQUARE "ui/assets/cornerIn_square"
+#define ASSET_CORNEROUT_SQUARE "ui/assets/cornerOut_square"
+#define ASSET_CORNERIN_ROUNDED "ui/assets/cornerIn_rounded"
+#define ASSET_CORNEROUT_ROUNDED "ui/assets/cornerOut_rounded"
+#define ASSET_CORNERIN_FOLD "ui/assets/cornerIn_fold"
+#define ASSET_CORNEROUT_FOLD "ui/assets/cornerOut_fold"
#define SCROLLBAR_ARROW_SIZE 16.0f
#define SCROLLBAR_ARROW_WIDTH (SCROLLBAR_ARROW_SIZE * DC->aspectScale)
@@ -114,7 +121,7 @@ along with Tremulous; if not, see
#define SLIDER_WIDTH (96.0f * DC->aspectScale)
#define SLIDER_HEIGHT 16.0f
-#define SLIDER_THUMB_WIDTH (12.0f * DC->aspectScale)
+#define SLIDER_THUMB_WIDTH (10.0f * DC->aspectScale)
#define SLIDER_THUMB_HEIGHT 20.0f
#define NUM_CROSSHAIRS 10
@@ -155,6 +162,7 @@ typedef struct {
vec4_t foreColor; // text color
vec4_t backColor; // border color
vec4_t borderColor; // border color
+ vec4_t borderStyle; // border style, for rounded border style (Top left, top right, bottom right, bottom left)
vec4_t outlineColor; // border color
qhandle_t background; // background asset
} Window;
@@ -322,11 +330,14 @@ typedef struct {
qhandle_t scrollBarArrowRight;
qhandle_t scrollBar;
qhandle_t scrollBarThumb;
+ qhandle_t showMoreArrow;
qhandle_t buttonMiddle;
qhandle_t buttonInside;
qhandle_t solidBox;
qhandle_t sliderBar;
qhandle_t sliderThumb;
+ qhandle_t cornerOut[16];
+ qhandle_t cornerIn[16];
sfxHandle_t menuEnterSound;
sfxHandle_t menuExitSound;
sfxHandle_t menuBuzzSound;
@@ -355,9 +366,13 @@ typedef struct {
void (*drawStretchPic)(
float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader);
qhandle_t (*registerModel)(const char *p);
+ qhandle_t (*registerSkin)(const char *p);
void (*modelBounds)(qhandle_t model, vec3_t min, vec3_t max);
+ int (*lerpTag)(orientation_t *tag, clipHandle_t mod, int startFrame, int endFrame, float frac, const char *tagName);
void (*fillRect)(float x, float y, float w, float h, const vec4_t color);
void (*drawRect)(float x, float y, float w, float h, float size, const vec4_t color);
+ void (*drawRoundedRect) (float x, float y, float w, float h, float size, const vec4_t style, const vec4_t color);
+ void (*fillRoundedRect) (float x, float y, float w, float h, float size, const vec4_t style, const vec4_t color);
void (*drawSides)(float x, float y, float w, float h, float size);
void (*drawTopBottom)(float x, float y, float w, float h, float size);
void (*clearScene)(void);
@@ -373,6 +388,7 @@ typedef struct {
void (*getCVarString)(const char *cvar, char *buffer, int bufsize);
float (*getCVarValue)(const char *cvar);
void (*setCVar)(const char *cvar, const char *value);
+ void (*resetCVar)(const char *cvar);
void (*drawTextWithCursor)(float x, float y, float scale, vec4_t color, const char *text, int cursorPos,
char cursor, int limit, int style);
void (*setOverstrikeMode)(qboolean b);