Merge pull request #9 from exogen/chore/updated-GameData-asset-export
re-export new GameData folder from fresh QoL install, updated DynamixThreeSpaceBlenderAddon
|
|
@ -1,8 +0,0 @@
|
|||
Tribes2 Classic map pack version 2
|
||||
10/31/02
|
||||
|
||||
The "classic_maps_v1.vl2" file should be put into
|
||||
your "...\Tribes2\GameData\base" directory, overwriting
|
||||
any existing earlier version.
|
||||
|
||||
See the "classic_readme.txt" file for a list of changes.
|
||||
|
|
@ -1,996 +0,0 @@
|
|||
// DisplayName = Cold Fusion
|
||||
// MissionTypes = Siege
|
||||
|
||||
//--- MISSION QUOTE BEGIN ---
|
||||
//"A single death is a tragedy, a million deaths is a statistic."
|
||||
//--Stalin
|
||||
//--map by Comkill; fixes by Jacen
|
||||
//--- MISSION QUOTE END ---
|
||||
|
||||
//--- MISSION STRING BEGIN ---
|
||||
//Hidden passageway leads to reserve generator that must be down for switch access
|
||||
//Remote tower contains forcefield generator
|
||||
//North and South generators supply main power to enemy base
|
||||
//--- MISSION STRING END ---
|
||||
|
||||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
cdTrack = "2";
|
||||
powerCount = "0";
|
||||
musicTrack = "Ice";
|
||||
|
||||
new MissionArea(MissionArea) {
|
||||
area = "-840 -1024 1728 2032";
|
||||
flightCeiling = "2000";
|
||||
flightCeilingRange = "50";
|
||||
locked = "true";
|
||||
};
|
||||
new Sun() {
|
||||
position = "-1216 -848 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
direction = "0.57735 0.57735 -0.57735";
|
||||
color = "0.100000 0.100000 0.100000 1.000000";
|
||||
ambient = "0.400000 0.400000 0.420000 1.000000";
|
||||
texture[0] = "special/sunFlare";
|
||||
texture[1] = "special/sunFlare02";
|
||||
texture[2] = "special/LensFlare/flare01";
|
||||
texture[3] = "special/LensFlare/flare02";
|
||||
texture[4] = "special/LensFlare/flare03";
|
||||
lensFlareScale = "0.7";
|
||||
lensFlareIntensity = "1";
|
||||
frontFlareSize = "300";
|
||||
backFlareSize = "450";
|
||||
flareColor = "1.000000 1.000000 1.000000 1.000000";
|
||||
locked = "true";
|
||||
};
|
||||
new TerrainBlock(terrain) {
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
detailTexture = "details/lushdet1";
|
||||
terrainFile = "Rimehold.ter";
|
||||
squareSize = "8";
|
||||
emptySquares = "213385 279177 279433 83083 84370 168829 234368 169085 234624 169341 234880 235902 236158 171134 236926 172413 172416 172669 172672 172925 172928 107648";
|
||||
position = "-1024 -1024 0";
|
||||
locked = "true";
|
||||
visibleDistance = "1200";
|
||||
hazeDistance = "250";
|
||||
};
|
||||
new NavigationGraph(NavGraph) {
|
||||
conjoinAngleDev = "45";
|
||||
cullDensity = "0.3";
|
||||
customArea = "0 0 0 0";
|
||||
GraphFile = "Solace.nav";
|
||||
position = "0 0 0 1";
|
||||
XDimOverSize = "0";
|
||||
scale = "1 1 1";
|
||||
locked = "true";
|
||||
YDimOverSize = "0";
|
||||
conjoinBowlDev = "20";
|
||||
coverage = "0";
|
||||
rotation = "0 0 0 0";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "-1216 -848 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
cloudHeightPer[0] = "0.349971";
|
||||
cloudHeightPer[1] = "0.25";
|
||||
cloudHeightPer[2] = "0.199973";
|
||||
cloudSpeed1 = "0.0006";
|
||||
cloudSpeed2 = "0.0005";
|
||||
cloudSpeed3 = "0.0004";
|
||||
visibleDistance = "300";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "0";
|
||||
SkySolidColor = "0.300000 0.300000 0.350000 0.000000";
|
||||
fogDistance = "150";
|
||||
fogColor = "0.300000 0.300000 0.350000 1.000000";
|
||||
fogVolume1 = "2000 800 900";
|
||||
fogVolume2 = "0 0 0";
|
||||
fogVolume3 = "0 0 0";
|
||||
materialList = "sky_ice_starrynight.dml";
|
||||
windVelocity = "1 3 0";
|
||||
windEffectPrecipitation = "1";
|
||||
fogVolumeColor1 = "128.000000 128.000000 128.000000 0.000000";
|
||||
fogVolumeColor2 = "128.000000 128.000000 128.000000 -198748244414614883000000000000000000000.000000";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 -222768154483160258000000000000000000000.000000";
|
||||
high_visibleDistance = "-1";
|
||||
high_fogDistance = "-1";
|
||||
high_fogVolume1 = "-1 1.33164e+29 4.33005e-35";
|
||||
high_fogVolume2 = "-1 -1.15553e-21 -1.26084e-16";
|
||||
high_fogVolume3 = "-1 3.52997e-17 -3.94739e-34";
|
||||
cloudSpeed0 = "0.000000 0.000000";
|
||||
locked = "true";
|
||||
};
|
||||
new SimGroup(ObserverDropPoints) {
|
||||
powerCount = "0";
|
||||
|
||||
new Camera() {
|
||||
position = "-54.2522 106.1 144.824";
|
||||
rotation = "0 0 1 24.6372";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
new Camera() {
|
||||
position = "-156.427 268.141 151.61";
|
||||
rotation = "0 0 1 102.559";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
new Camera() {
|
||||
position = "-372.77 -139.864 225.56";
|
||||
rotation = "0 0 1 14.8969";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
new Camera() {
|
||||
position = "-446.438 -51.6744 243.71";
|
||||
rotation = "0.120584 -0.0842783 0.989119 70.4906";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(Teams) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Team1) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
powerCount = "0";
|
||||
|
||||
new SpawnSphere() {
|
||||
position = "-361.241 -52.7185 198.497";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "65";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
spawnPos38 = "-328.741 -52.7185 179.053";
|
||||
spawnPos43 = "-377.491 -36.4685 198.847";
|
||||
spawnPos4 = "-361.241 -117.718 211.37";
|
||||
spawnPos30 = "-328.741 -68.9685 183.942";
|
||||
spawnPos61 = "-344.991 -3.9685 174.534";
|
||||
spawnPos47 = "-312.491 -36.4685 166.35";
|
||||
spawnPos8 = "-426.241 -101.468 211.71";
|
||||
spawnPos34 = "-393.741 -52.7185 203.314";
|
||||
spawnPos6 = "-328.741 -117.718 197.155";
|
||||
spawnPos51 = "-377.491 -20.2185 195.36";
|
||||
spawnPos18 = "-393.741 -85.2185 199.759";
|
||||
spawnPosCount = "63";
|
||||
spawnPos16 = "-426.241 -85.2185 199.168";
|
||||
spawnPos21 = "-344.991 -85.2185 202.351";
|
||||
spawnPos41 = "-409.991 -36.4685 196.813";
|
||||
spawnPos39 = "-312.491 -52.7185 173.707";
|
||||
spawnPos25 = "-409.991 -68.9685 198.754";
|
||||
spawnPos45 = "-344.991 -36.4685 180.378";
|
||||
spawnPos57 = "-409.991 -3.9685 185.767";
|
||||
spawnPos62 = "-328.741 -3.9685 163.691";
|
||||
spawnPos10 = "-393.741 -101.468 199.14";
|
||||
spawnPos49 = "-409.991 -20.2185 192.468";
|
||||
locked = "true";
|
||||
spawnPos2 = "-393.741 -117.718 198.191";
|
||||
spawnPos7 = "-312.491 -117.718 185.716";
|
||||
spawnPos14 = "-328.741 -101.468 191.966";
|
||||
spawnPos53 = "-344.991 -20.2185 175.818";
|
||||
spawnPos12 = "-361.241 -101.468 216.344";
|
||||
spawnPos17 = "-409.991 -85.2185 198.616";
|
||||
spawnPos37 = "-344.991 -52.7185 188.453";
|
||||
spawnPos35 = "-377.491 -52.7185 205.509";
|
||||
spawnPos40 = "-426.241 -36.4685 196.543";
|
||||
spawnPos60 = "-361.241 -3.9685 184.957";
|
||||
spawnPos58 = "-393.741 -3.9685 191.072";
|
||||
spawnPos44 = "-361.241 -36.4685 191.076";
|
||||
spawnPos5 = "-344.991 -117.718 213.254";
|
||||
spawnPos23 = "-312.491 -85.2185 178.671";
|
||||
spawnPos3 = "-377.491 -117.718 199.113";
|
||||
spawnPos29 = "-344.991 -68.9685 195.34";
|
||||
spawnPos9 = "-409.991 -101.468 198.177";
|
||||
spawnPos27 = "-377.491 -68.9685 210.879";
|
||||
spawnPos13 = "-344.991 -101.468 209.481";
|
||||
spawnPos33 = "-409.991 -52.7185 198.818";
|
||||
spawnPos31 = "-312.491 -68.9685 176.946";
|
||||
spawnPos36 = "-361.241 -52.7185 198.497";
|
||||
spawnPos56 = "-426.241 -3.9685 187.533";
|
||||
spawnPos54 = "-328.741 -20.2185 165.281";
|
||||
spawnPos59 = "-377.491 -3.9685 191.293";
|
||||
spawnPos1 = "-409.991 -117.718 201.585";
|
||||
spawnPos19 = "-377.491 -85.2185 209.604";
|
||||
spawnPos24 = "-426.241 -68.9685 197.634";
|
||||
spawnPos63 = "-312.491 -3.9685 156.819";
|
||||
spawnPos11 = "-377.491 -101.468 202.945";
|
||||
spawnPos42 = "-393.741 -36.4685 199.741";
|
||||
spawnPos28 = "-361.241 -68.9685 207.039";
|
||||
spawnPos48 = "-426.241 -20.2185 193.342";
|
||||
spawnPos15 = "-312.491 -101.468 181.18";
|
||||
spawnPos46 = "-328.741 -36.4685 170.864";
|
||||
spawnPos32 = "-426.241 -52.7185 197.329";
|
||||
spawnPos52 = "-361.241 -20.2185 187.312";
|
||||
spawnPos50 = "-393.741 -20.2185 196.077";
|
||||
spawnPos55 = "-312.491 -20.2185 160.085";
|
||||
spawnPos22 = "-328.741 -85.2185 187.675";
|
||||
spawnPos20 = "-361.241 -85.2185 215.831";
|
||||
spawnPos0 = "-426.241 -117.718 226.436";
|
||||
spawnPos26 = "-393.741 -68.9685 202.886";
|
||||
};
|
||||
new SpawnSphere() {
|
||||
position = "-446.984 -133.625 225.297";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "30";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
spawnPos38 = "-431.984 -133.625 245.021";
|
||||
spawnPos43 = "-454.484 -126.125 245.626";
|
||||
spawnPos4 = "-446.984 -163.625 236.75";
|
||||
spawnPos30 = "-431.984 -141.125 244.578";
|
||||
spawnPos61 = "-439.484 -111.125 241.092";
|
||||
spawnPos47 = "-424.484 -126.125 228.357";
|
||||
spawnPos8 = "-476.984 -156.125 234.883";
|
||||
spawnPos34 = "-461.984 -133.625 243.804";
|
||||
spawnPos6 = "-431.984 -163.625 232.596";
|
||||
spawnPos51 = "-454.484 -118.625 242.929";
|
||||
spawnPos18 = "-461.984 -148.625 243.729";
|
||||
spawnPosCount = "63";
|
||||
spawnPos16 = "-476.984 -148.625 236.15";
|
||||
spawnPos21 = "-439.484 -148.625 244.856";
|
||||
spawnPos41 = "-469.484 -126.125 236.464";
|
||||
spawnPos39 = "-424.484 -133.625 230.686";
|
||||
spawnPos25 = "-469.484 -141.125 240.677";
|
||||
spawnPos45 = "-439.484 -126.125 249.302";
|
||||
spawnPos57 = "-469.484 -111.125 228.713";
|
||||
spawnPos62 = "-431.984 -111.125 231.045";
|
||||
spawnPos10 = "-461.984 -156.125 241.412";
|
||||
spawnPos49 = "-469.484 -118.625 232.829";
|
||||
locked = "true";
|
||||
spawnPos2 = "-461.984 -163.625 237.177";
|
||||
spawnPos7 = "-424.484 -163.625 222.333";
|
||||
spawnPos14 = "-431.984 -156.125 237.878";
|
||||
spawnPos53 = "-439.484 -118.625 246.975";
|
||||
spawnPos12 = "-446.984 -156.125 241.829";
|
||||
spawnPos17 = "-469.484 -148.625 240.747";
|
||||
spawnPos37 = "-439.484 -133.625 249.287";
|
||||
spawnPos35 = "-454.484 -133.625 247.303";
|
||||
spawnPos40 = "-476.984 -126.125 231.366";
|
||||
spawnPos60 = "-446.984 -111.125 241.84";
|
||||
spawnPos58 = "-461.984 -111.125 234.256";
|
||||
spawnPos44 = "-446.984 -126.125 248.37";
|
||||
spawnPos5 = "-439.484 -163.625 235.391";
|
||||
spawnPos23 = "-424.484 -148.625 229.5";
|
||||
spawnPos3 = "-454.484 -163.625 237.546";
|
||||
spawnPos29 = "-439.484 -141.125 247.886";
|
||||
spawnPos9 = "-469.484 -156.125 238.673";
|
||||
spawnPos27 = "-454.484 -141.125 247.093";
|
||||
spawnPos13 = "-439.484 -156.125 240.593";
|
||||
spawnPos33 = "-469.484 -133.625 239.406";
|
||||
spawnPos31 = "-424.484 -141.125 230.967";
|
||||
spawnPos36 = "-446.984 -133.625 248.983";
|
||||
spawnPos56 = "-476.984 -111.125 223.477";
|
||||
spawnPos54 = "-431.984 -118.625 238.233";
|
||||
spawnPos59 = "-454.484 -111.125 239.105";
|
||||
spawnPos1 = "-469.484 -163.625 235.55";
|
||||
spawnPos19 = "-454.484 -148.625 245.556";
|
||||
spawnPos24 = "-476.984 -141.125 236.03";
|
||||
spawnPos63 = "-424.484 -111.125 218.78";
|
||||
spawnPos11 = "-454.484 -156.125 242.109";
|
||||
spawnPos42 = "-461.984 -126.125 241.703";
|
||||
spawnPos28 = "-446.984 -141.125 248.221";
|
||||
spawnPos48 = "-476.984 -118.625 227.611";
|
||||
spawnPos15 = "-424.484 -156.125 226.376";
|
||||
spawnPos46 = "-431.984 -126.125 242.97";
|
||||
spawnPos32 = "-476.984 -133.625 234.317";
|
||||
spawnPos52 = "-446.984 -118.625 246.123";
|
||||
spawnPos50 = "-461.984 -118.625 238.249";
|
||||
spawnPos55 = "-424.484 -118.625 224.112";
|
||||
spawnPos22 = "-431.984 -148.625 242.04";
|
||||
spawnPos20 = "-446.984 -148.625 245.668";
|
||||
spawnPos0 = "-476.984 -163.625 231.844";
|
||||
spawnPos26 = "-461.984 -141.125 244.84";
|
||||
};
|
||||
};
|
||||
new SimGroup(base) {
|
||||
powerCount = "1";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "-384.802 -82.8573 167.062";
|
||||
rotation = "0 0 1 150.115";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "stowr6.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-386.271 -94.3029 220.435";
|
||||
rotation = "0 0 -1 29.7938";
|
||||
scale = "0.1 18.4377 8.77065";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "33";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-376.822 -89.0448 220.193";
|
||||
rotation = "0 0 -1 29.7938";
|
||||
scale = "0.1 18.4377 9.03641";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "34";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(Team2GeneratorLarge1) {
|
||||
position = "-378.229 -77.2511 196.696";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "35";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new Item() {
|
||||
position = "-386.097 -83.5564 232.534";
|
||||
rotation = "0 0 1 64.7442";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "0";
|
||||
Target = "-1";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(Team2StationInventory1) {
|
||||
position = "-389.922 -76.8712 220.638";
|
||||
rotation = "0 0 -1 29.2209";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "36";
|
||||
locked = "true";
|
||||
inUse = "Down";
|
||||
notReady = "1";
|
||||
Trigger = "6691";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(Team2StationInventory2) {
|
||||
position = "-382.302 -90.3852 220.628";
|
||||
rotation = "0 0 1 150.688";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "37";
|
||||
locked = "true";
|
||||
inUse = "Down";
|
||||
notReady = "1";
|
||||
Trigger = "6693";
|
||||
team = "2";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(Team2) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
powerCount = "0";
|
||||
|
||||
new SpawnSphere() {
|
||||
position = "-11 220.8 128.2";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "100";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
spawnPos38 = "-61 245.8 124.509";
|
||||
spawnPos43 = "64 245.8 146.947";
|
||||
spawnPos4 = "-11 120.8 127.371";
|
||||
spawnPos30 = "-86 220.8 128.903";
|
||||
spawnPos47 = "-36 270.8 114.153";
|
||||
spawnPos8 = "-111 145.8 120.078";
|
||||
spawnPos34 = "39 220.8 118.02";
|
||||
spawnPos61 = "39 295.8 144.278";
|
||||
spawnPos6 = "39 120.8 136.059";
|
||||
spawnPos51 = "-86 295.8 133.958";
|
||||
spawnPos18 = "-61 170.8 127.704";
|
||||
spawnPosCount = "56";
|
||||
spawnPos16 = "-111 170.8 121.08";
|
||||
spawnPos21 = "64 170.8 119.664";
|
||||
spawnPos41 = "14 245.8 116.489";
|
||||
spawnPos39 = "-36 245.8 115.627";
|
||||
spawnPos25 = "-36 195.8 119.742";
|
||||
spawnPos45 = "-86 270.8 137.1";
|
||||
spawnPos57 = "-61 295.8 116.639";
|
||||
spawnPos10 = "-61 145.8 128.739";
|
||||
spawnPos49 = "64 270.8 166.833";
|
||||
spawnPos62 = "64 295.8 176.54";
|
||||
locked = "true";
|
||||
spawnPos2 = "-61 120.8 131.349";
|
||||
spawnPos7 = "64 120.8 150.806";
|
||||
spawnPos14 = "39 145.8 120.982";
|
||||
spawnPos53 = "-36 295.8 112.527";
|
||||
spawnPos12 = "-11 145.8 123.69";
|
||||
spawnPos17 = "-86 170.8 121.803";
|
||||
spawnPos37 = "-86 245.8 132.184";
|
||||
spawnPos35 = "64 220.8 124.025";
|
||||
spawnPos40 = "-11 245.8 115.927";
|
||||
spawnPos60 = "14 295.8 121.203";
|
||||
spawnPos58 = "-36 295.8 112.527";
|
||||
spawnPos44 = "-111 270.8 147.48";
|
||||
spawnPos5 = "14 120.8 124.898";
|
||||
spawnPos23 = "-86 195.8 126.923";
|
||||
spawnPos3 = "-36 120.8 130.081";
|
||||
spawnPos29 = "-111 220.8 127.335";
|
||||
spawnPos9 = "-86 145.8 123.874";
|
||||
spawnPos27 = "39 195.8 118.439";
|
||||
spawnPos13 = "14 145.8 122.177";
|
||||
spawnPos33 = "14 220.8 117.08";
|
||||
spawnPos31 = "-61 220.8 125.707";
|
||||
spawnPos36 = "-111 245.8 135.04";
|
||||
spawnPos56 = "64 295.8 176.54";
|
||||
spawnPos54 = "-11 295.8 113.002";
|
||||
spawnPos59 = "-11 295.8 113.002";
|
||||
spawnPos1 = "-86 120.8 126.178";
|
||||
spawnPos19 = "-36 170.8 122.764";
|
||||
spawnPos24 = "-61 195.8 126.387";
|
||||
spawnPos11 = "-36 145.8 126.491";
|
||||
spawnPos42 = "39 245.8 127.109";
|
||||
spawnPos28 = "64 195.8 119.406";
|
||||
spawnPos48 = "39 270.8 139.888";
|
||||
spawnPos15 = "64 145.8 122.53";
|
||||
spawnPos46 = "-61 270.8 122.752";
|
||||
spawnPos32 = "-11 220.8 116.65";
|
||||
spawnPos52 = "-61 295.8 116.639";
|
||||
spawnPos50 = "-111 295.8 148.77";
|
||||
spawnPos55 = "39 295.8 144.278";
|
||||
spawnPos22 = "-111 195.8 126.225";
|
||||
spawnPos20 = "39 170.8 119.452";
|
||||
spawnPos0 = "-111 120.8 121.173";
|
||||
spawnPos26 = "14 195.8 118.455";
|
||||
};
|
||||
};
|
||||
new SimGroup(base) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(North) {
|
||||
powerCount = "1";
|
||||
|
||||
new StaticShape(North) {
|
||||
position = "-19.7655 306.003 51.2588";
|
||||
rotation = "-7.90522e-06 0.00999532 0.99995 179.943";
|
||||
scale = "1 1 1";
|
||||
nameTag = "North";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "38";
|
||||
locked = "true";
|
||||
needsObjectiveWaypoint = "1";
|
||||
WayPoint = "6772";
|
||||
team = "1";
|
||||
};
|
||||
new SimGroup(South) {
|
||||
powerCount = "2";
|
||||
|
||||
new StaticShape(Team1StationInventory1) {
|
||||
position = "-70.7856 143.205 36.5365";
|
||||
rotation = "0 0 1 180.482";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "39";
|
||||
locked = "true";
|
||||
Trigger = "6702";
|
||||
team = "1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "-18.0217 220.52 39.3609";
|
||||
rotation = "0.00118813 0.00236581 0.999996 88.8052";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dbase2.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(Team1StationInventory2) {
|
||||
position = "-80.8374 143.151 36.5394";
|
||||
rotation = "0 0 1 179.909";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "40";
|
||||
locked = "true";
|
||||
Trigger = "6705";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(Team1StationInventory3) {
|
||||
position = "-81.2743 159.121 36.6331";
|
||||
rotation = "0 0 -1 1.71915";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "41";
|
||||
locked = "true";
|
||||
Trigger = "6707";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(Team1StationInventory4) {
|
||||
position = "-18.3239 228.725 122.356";
|
||||
rotation = "0 0 -1 0.574711";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "42";
|
||||
locked = "true";
|
||||
inUse = "Down";
|
||||
notReady = "1";
|
||||
Trigger = "6709";
|
||||
team = "1";
|
||||
};
|
||||
new SimGroup(Reserve) {
|
||||
powerCount = "3";
|
||||
|
||||
new StaticShape(Reserve) {
|
||||
position = "17.4218 221.346 67.4835";
|
||||
rotation = "0.000491823 -0.000471153 1 88.2363";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Reserve";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "43";
|
||||
locked = "true";
|
||||
needsObjectiveWaypoint = "1";
|
||||
WayPoint = "6773";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(Team1SensorLargePulse1) {
|
||||
position = "-117.707 280.643 158.25";
|
||||
rotation = "-0.024991 0.0226271 -0.999432 95.7166";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SensorLargePulse";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "44";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(FF) {
|
||||
position = "-23.9553 214.388 62.3825";
|
||||
rotation = "0.0206777 -0.0197207 -0.999592 1.12534";
|
||||
scale = "12.1379 12.1139 17.644";
|
||||
dataBlock = "defaultForceFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "45";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
};
|
||||
new StaticShape(SouthGen) {
|
||||
position = "-14.6068 109.516 48.7554";
|
||||
rotation = "-0.578269 0.577352 0.576428 119.842";
|
||||
scale = "0.850522 1 1";
|
||||
nameTag = "South";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "46";
|
||||
locked = "true";
|
||||
needsObjectiveWaypoint = "1";
|
||||
WayPoint = "6774";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(Team1StationInventory5) {
|
||||
position = "-71.221 159.368 36.575";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "47";
|
||||
locked = "true";
|
||||
Trigger = "6717";
|
||||
team = "1";
|
||||
};
|
||||
};
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "22.6859 156.581 120.157";
|
||||
rotation = "0.0299817 0.0303072 0.999091 89.4335";
|
||||
scale = "3.50102 1.71005 1.28066";
|
||||
shapeName = "stackable3m.dts";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "-117.723 280.601 158.69";
|
||||
rotation = "0 0 -1 6.87562";
|
||||
scale = "1.48782 1.71141 1";
|
||||
interiorFile = "dpole1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "22.6771 170.281 119.077";
|
||||
rotation = "0.0247383 0.0252581 0.999375 89.9903";
|
||||
scale = "3.3311 1.69176 1.45751";
|
||||
shapeName = "stackable3m.dts";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "-14.4421 152.704 121.905";
|
||||
rotation = "0 0 1 88.8084";
|
||||
scale = "2.15569 2.62004 1.34785";
|
||||
shapeName = "stackable3s.dts";
|
||||
team = "2";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "-23.328 155.574 122.22";
|
||||
rotation = "0.0146822 0.0159191 0.999765 87.6757";
|
||||
scale = "3.34567 1 1.2197";
|
||||
shapeName = "stackable3m.dts";
|
||||
team = "2";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "-24.0602 169.756 120.318";
|
||||
rotation = "-0.00499991 -0.00526051 0.999974 87.0911";
|
||||
scale = "3.85723 0.904292 1.53382";
|
||||
shapeName = "stackable3m.dts";
|
||||
team = "2";
|
||||
};
|
||||
};
|
||||
new Item() {
|
||||
position = "-46.6692 220.052 50.7169";
|
||||
rotation = "0 0 -1 91.6732";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "0";
|
||||
Target = "-1";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new SimGroup(FF) {
|
||||
powerCount = "1";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "82.6445 472.542 201.121";
|
||||
rotation = "0 0 -1 26.9291";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "stowr6.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(Team1GeneratorLarge1) {
|
||||
position = "86.044 474.092 264.013";
|
||||
rotation = "0 0 1 63.5984";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forcefield";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "48";
|
||||
locked = "true";
|
||||
needsObjectiveWaypoint = "1";
|
||||
WayPoint = "6775";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-36.6701 204.757 41.494";
|
||||
rotation = "0 -1 0 89.9544";
|
||||
scale = "0.1 32.0519 33.234";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "49";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-48.2985 305.324 35.8824";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "0.1 7.48712 7.42514";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "50";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-24.2743 287.676 50.562";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "9.69896 0.1 8.98597";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "51";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-21.0958 152.932 51.1504";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "9.20716 0.1 8.58927";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "52";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-21.4594 142.571 35.8686";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "11.1818 0.1 15.0275";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "53";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-38.7339 212.894 86.5899";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "0.101108 14.0431 11.1735";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "54";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "-24.8484 296.887 36.5742";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "10.5654 0.1 13.1467";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "55";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "73.3234 338.14 182.566";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "0.617044 0.809401 1";
|
||||
interiorFile = "splat1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new Turret(Team1TurretBaseLarge1) {
|
||||
position = "73.8894 344.235 184.362";
|
||||
rotation = "0 0 -1 89.3814";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "PlasmaBarrelLarge";
|
||||
originalBarrel = "PlasmaBarrelLarge";
|
||||
Target = "56";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(Team0) {
|
||||
powerCount = "0";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "-36.1838 189.516 117.862";
|
||||
rotation = "0 0 -1 0.574711";
|
||||
scale = "1 1 2.14894";
|
||||
interiorFile = "dmisc1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
new StaticShape(Team1FlipFlop1) {
|
||||
position = "-18.0369 220.544 63.1659";
|
||||
rotation = "0 0 1 89.3814";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Control";
|
||||
dataBlock = "FlipFlop";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "57";
|
||||
locked = "true";
|
||||
needsObjectiveWaypoint = "1";
|
||||
WayPoint = "6776";
|
||||
team = "1";
|
||||
};
|
||||
new Item() {
|
||||
position = "-76.5361 214.349 39.4203";
|
||||
rotation = "0 0 1 180.482";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "0";
|
||||
Target = "-1";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
new Item() {
|
||||
position = "16.199 228.748 39.4238";
|
||||
rotation = "0 0 -1 2.29172";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "0";
|
||||
Target = "-1";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "-38.1826 254.478 114.387";
|
||||
rotation = "0 0 -1 2.29377";
|
||||
scale = "1 1 2.44569";
|
||||
interiorFile = "dmisc1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
new Item() {
|
||||
position = "-25.5215 220.574 134.258";
|
||||
rotation = "0 0 -1 88.8084";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "0";
|
||||
Target = "-1";
|
||||
locked = "true";
|
||||
team = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(environment) {
|
||||
powerCount = "0";
|
||||
|
||||
new Precipitation(Precipitation) {
|
||||
position = "-91.3542 155.206 151.502";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "snow";
|
||||
dataBlock = "Snow";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
percentage = "1";
|
||||
color1 = "1.000000 1.000000 1.000000 1.000000";
|
||||
color2 = "-1.000000 0.000000 0.000000 1.000000";
|
||||
color3 = "-1.000000 0.000000 0.000000 1.000000";
|
||||
offsetSpeed = "0.25";
|
||||
minVelocity = "0.25";
|
||||
maxVelocity = "1.5";
|
||||
maxNumDrops = "2000";
|
||||
maxRadius = "80";
|
||||
locked = "true";
|
||||
};
|
||||
new AudioEmitter() {
|
||||
position = "-217.625 3.2526 143.029";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
fileName = "fx/environment/howlingwind1.wav";
|
||||
useProfileDescription = "0";
|
||||
outsideAmbient = "1";
|
||||
volume = "0.5";
|
||||
isLooping = "1";
|
||||
is3D = "0";
|
||||
minDistance = "20";
|
||||
maxDistance = "100";
|
||||
coneInsideAngle = "360";
|
||||
coneOutsideAngle = "360";
|
||||
coneOutsideVolume = "1";
|
||||
coneVector = "0 0 1";
|
||||
loopCount = "-1";
|
||||
minLoopGap = "0";
|
||||
maxLoopGap = "0";
|
||||
type = "EffectAudioType";
|
||||
locked = "true";
|
||||
};
|
||||
new AudioEmitter() {
|
||||
position = "-217.326 7.65398 144.216";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
fileName = "fx/environment/coldwind1.wav";
|
||||
useProfileDescription = "0";
|
||||
outsideAmbient = "1";
|
||||
volume = "1";
|
||||
isLooping = "1";
|
||||
is3D = "0";
|
||||
minDistance = "20";
|
||||
maxDistance = "100";
|
||||
coneInsideAngle = "360";
|
||||
coneOutsideAngle = "360";
|
||||
coneOutsideVolume = "1";
|
||||
coneVector = "0 0 1";
|
||||
loopCount = "-1";
|
||||
minLoopGap = "0";
|
||||
maxLoopGap = "0";
|
||||
type = "EffectAudioType";
|
||||
locked = "true";
|
||||
};
|
||||
new AudioEmitter() {
|
||||
position = "-275.413 -2.48166 132.166";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
fileName = "fx/environment/icecrack1.wav";
|
||||
useProfileDescription = "0";
|
||||
outsideAmbient = "1";
|
||||
volume = "1";
|
||||
isLooping = "1";
|
||||
is3D = "1";
|
||||
minDistance = "20";
|
||||
maxDistance = "100";
|
||||
coneInsideAngle = "360";
|
||||
coneOutsideAngle = "360";
|
||||
coneOutsideVolume = "1";
|
||||
coneVector = "0 0 1";
|
||||
loopCount = "-1";
|
||||
minLoopGap = "2000";
|
||||
maxLoopGap = "2000";
|
||||
type = "EffectAudioType";
|
||||
locked = "true";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
Before Width: | Height: | Size: 894 KiB |
|
Before Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 242 KiB |
|
|
@ -1,14 +0,0 @@
|
|||
|
||||
This file was packed using Emo1313's map zipping utility for Tribes2.
|
||||
Please visit Dopplegangers.com @ www.dopplegangers.com for all your Tribes file needs.
|
||||
Thank you.
|
||||
|
||||
|
||||
|
||||
This file contains:
|
||||
======================================
|
||||
DesertWind.mis.
|
||||
DesertWind.spn.
|
||||
|
||||
======================================
|
||||
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
.mis goes in base\missions folder
|
||||
.ter goes in base\terrains folder
|
||||
.spn goes in base\terrains folder
|
||||
*.dif files go into base\interiors folder
|
||||
*.dml (skies texture list) goes into base\textures folder
|
||||
Sky .png images go into base\textures\lava\skies folder
|
||||
load_*.png goes into base\textures\ gui folder
|
||||
|
||||
These final missions are a thank you from the Dynamix Tribes2 DEV team to you, the Tribes Players.
|
||||
Thanks to you we were able to bring our dreams into reality.
|
||||
These missions are not in a polished state, yet we hope you enjoy them.
|
||||
There are a few rough edges, poly counts are high in some areas,
|
||||
and we did not have the time to completely test these missions so please be kind in your reviews.
|
||||
Thanks to Rod Fung, new producer of the Tribes Franchise, for approving the release of these maps.
|
||||
|
||||
Keep the dream alive,
|
||||
|
||||
Dynamix Tribes 2 DEV team
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
.mis goes in base\missions folder
|
||||
.ter goes in base\terrains folder
|
||||
.spn goes in base\terrains folder
|
||||
*.dif files go into base\interiors folder
|
||||
*.dml (skies texture list) goes into base\textures folder
|
||||
Sky .png images go into base\textures\lava\skies folder
|
||||
load_*.png goes into base\textures\ gui folder
|
||||
|
||||
These final missions are a thank you from the Dynamix Tribes2 DEV team to you, the Tribes Players.
|
||||
Thanks to you we were able to bring our dreams into reality.
|
||||
These missions are not in a polished state, yet we hope you enjoy them.
|
||||
There are a few rough edges, poly counts are high in some areas,
|
||||
and we did not have the time to completely test these missions so please be kind in your reviews.
|
||||
Thanks to Rod Fung, new producer of the Tribes Franchise, for approving the release of these maps.
|
||||
|
||||
Keep the dream alive,
|
||||
|
||||
Dynamix Tribes 2 DEV team
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
.mis goes in base\missions folder
|
||||
.ter goes in base\terrains folder
|
||||
.spn goes in base\terrains folder
|
||||
*.dif files go into base\interiors folder
|
||||
load_*.png goes into base\textures\ gui folder
|
||||
|
||||
These final missions are a thank you from the Dynamix Tribes2 DEV team to you, the Tribes Players.
|
||||
Thanks to you we were able to bring our dreams into reality.
|
||||
These missions are not in a polished state, yet we hope you enjoy them.
|
||||
There are a few rough edges, poly counts are high in some areas,
|
||||
and we did not have the time to completely test these missions so please be kind in your reviews.
|
||||
Thanks to Rod Fung, new producer of the Tribes Franchise, for approving the release of these maps.
|
||||
|
||||
Keep the dream alive,
|
||||
|
||||
Dynamix Tribes 2 DEV team
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
.mis goes in base\missions folder
|
||||
.ter goes in base\terrains folder
|
||||
.spn goes in base\terrains folder
|
||||
*.dif files go into base\interiors folder
|
||||
*.dml (skies texture list) goes into base\textures folder
|
||||
Sky .png images go into base\textures\lush\skies folder
|
||||
load_*.png goes into base\textures\ gui folder
|
||||
|
||||
These final missions are a thank you from the Dynamix Tribes2 DEV team to you, the Tribes Players.
|
||||
Thanks to you we were able to bring our dreams into reality.
|
||||
These missions are not in a polished state, yet we hope you enjoy them.
|
||||
There are a few rough edges, poly counts are high in some areas,
|
||||
and we did not have the time to completely test these missions so please be kind in your reviews.
|
||||
Thanks to Rod Fung, new producer of the Tribes Franchise, for approving the release of these maps.
|
||||
|
||||
Keep the dream alive,
|
||||
|
||||
Dynamix Tribes 2 DEV team
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
.mis goes in base\missions folder
|
||||
.ter goes in base\terrains folder
|
||||
.spn goes in base\terrains folder
|
||||
*.dif files go into base\interiors folder
|
||||
*.dml (skies texture list) goes into base\textures folder
|
||||
Sky .png images go into base\textures\lush\skies folder
|
||||
load_*.png goes into base\textures\ gui folder
|
||||
|
||||
These final missions are a thank you from the Dynamix Tribes2 DEV team to you, the Tribes Players.
|
||||
Thanks to you we were able to bring our dreams into reality.
|
||||
These missions are not in a polished state, yet we hope you enjoy them.
|
||||
There are a few rough edges, poly counts are high in some areas,
|
||||
and we did not have the time to completely test these missions so please be kind in your reviews.
|
||||
Thanks to Rod Fung, new producer of the Tribes Franchise, for approving the release of these maps.
|
||||
|
||||
Keep the dream alive,
|
||||
|
||||
Dynamix Tribes 2 DEV team
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
.mis goes in base\missions folder
|
||||
.ter goes in base\terrains folder
|
||||
.spn goes in base\terrains folder
|
||||
*.dif files go into base\interiors folder
|
||||
*.dml (skies texture list) goes into base\textures folder
|
||||
Sky .png images go into base\textures\lush\skies folder
|
||||
load_*.png goes into base\textures\ gui folder
|
||||
|
||||
These final missions are a thank you from the Dynamix Tribes2 DEV team to you, the Tribes Players.
|
||||
Thanks to you we were able to bring our dreams into reality.
|
||||
These missions are not in a polished state, yet we hope you enjoy them.
|
||||
There are a few rough edges, poly counts are high in some areas,
|
||||
and we did not have the time to completely test these missions so please be kind in your reviews.
|
||||
Thanks to Rod Fung, new producer of the Tribes Franchise, for approving the release of these maps.
|
||||
|
||||
Keep the dream alive,
|
||||
|
||||
Dynamix Tribes 2 DEV team
|
||||
|
|
@ -1 +0,0 @@
|
|||
Heightfield::add("General\tTab_general\tgeneral_min_height\t50\tgeneral_scale\t300\tgeneral_water\t0.000\tgeneral_centerx\t0\tgeneral_centery\t0");
|
||||
|
Before Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
|
@ -1,983 +0,0 @@
|
|||
// DisplayName = Patience
|
||||
// MissionTypes = Siege
|
||||
|
||||
//--- MISSION QUOTE BEGIN ---
|
||||
//Patience and tenacity of purpose are worth more than twice their weight of cleverness.
|
||||
// --Thomas Henry Huxley
|
||||
// • Map by powdahound; Code by t-b0n3, Byte, & [HvC]Dev; Fixes by a tiny fishie.
|
||||
//--- MISSION QUOTE END ---
|
||||
|
||||
//--- MISSION STRING BEGIN ---
|
||||
//The Forcefield Generator protects the Lava Generator
|
||||
//While the Lava Generator is disabled, the lava level will lower
|
||||
//When the lava is low enough, the Capture Switch will be revealed
|
||||
//A repair pack is located on a platform above the lava
|
||||
//--- MISSION STRING END ---
|
||||
|
||||
function ForceFieldBareData::onAdd(%data, %obj)
|
||||
{
|
||||
Parent::onAdd(%data, %obj);
|
||||
|
||||
//%velo = 1;
|
||||
//%grav = 0.1;
|
||||
//%appl = "0 0 0";
|
||||
|
||||
if (%obj.custom $= "" || %obj.custom $= "0")
|
||||
{
|
||||
%velo = %obj.velocityMod;
|
||||
%grav = %obj.gravityMod;
|
||||
%appl = %obj.appliedForce;
|
||||
}
|
||||
else
|
||||
return; // add physical zones unless the force field contains 'custom = "1";'
|
||||
|
||||
%pz = new PhysicalZone() {
|
||||
position = %obj.position;
|
||||
rotation = %obj.rotation;
|
||||
scale = %obj.scale;
|
||||
polyhedron = "0.000000 1.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 0.0000000 1.0000000";
|
||||
velocityMod = %velo;
|
||||
gravityMod = %grav;
|
||||
appliedForce = %appl;
|
||||
ffield = %obj;
|
||||
};
|
||||
|
||||
%pzGroup = nameToID("MissionCleanup/PZones");
|
||||
if(%pzGroup <= 0)
|
||||
{
|
||||
%pzGroup = new SimGroup("PZones");
|
||||
MissionCleanup.add(%pzGroup);
|
||||
}
|
||||
%pzGroup.add(%pz);
|
||||
}
|
||||
|
||||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
cdTrack = "2";
|
||||
powerCount = "0";
|
||||
musicTrack = "Volcanic";
|
||||
|
||||
new MissionArea(MissionArea) {
|
||||
area = "-440 -576 1152 1264";
|
||||
flightCeiling = "2000";
|
||||
flightCeilingRange = "50";
|
||||
locked = "true";
|
||||
};
|
||||
new Sun() {
|
||||
direction = "0.57735 0.57735 -0.57735";
|
||||
color = "0.600000 0.600000 0.600000 1.000000";
|
||||
ambient = "0.400000 0.400000 0.400000 1.000000";
|
||||
locked = "true";
|
||||
scale = "1 1 1";
|
||||
position = "-1216 -848 0";
|
||||
rotation = "1 0 0 0";
|
||||
};
|
||||
new TerrainBlock(Terrain) {
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
detailTexture = "details/lushdet1";
|
||||
terrainFile = "Caldera.ter";
|
||||
squareSize = "8";
|
||||
emptySquares = "167592 167848 102569";
|
||||
locked = "true";
|
||||
hazeDistance = "250";
|
||||
position = "-1024 -1024 0";
|
||||
visibleDistance = "1200";
|
||||
};
|
||||
new NavigationGraph(NavGraph) {
|
||||
conjoinAngleDev = "45";
|
||||
cullDensity = "0.3";
|
||||
customArea = "0 0 0 0";
|
||||
conjoinBowlDev = "20";
|
||||
locked = "true";
|
||||
scale = "1 1 1";
|
||||
coverage = "0";
|
||||
YDimOverSize = "0";
|
||||
position = "0 0 0 1";
|
||||
XDimOverSize = "0";
|
||||
GraphFile = "Patience.nav";
|
||||
rotation = "0 0 0 0";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "-1536 -720 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
cloudHeightPer[0] = "0.149971";
|
||||
cloudHeightPer[1] = "0.25";
|
||||
cloudHeightPer[2] = "0.199973";
|
||||
cloudSpeed1 = "0.001";
|
||||
cloudSpeed2 = "0.0002";
|
||||
cloudSpeed3 = "0.0003";
|
||||
visibleDistance = "390";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "0";
|
||||
SkySolidColor = "0.000000 0.000000 0.000000 0.000000";
|
||||
fogDistance = "160";
|
||||
fogColor = "0.850000 0.380000 0.100000 1.000000";
|
||||
fogVolume1 = "0 0 0";
|
||||
fogVolume2 = "0 0 0";
|
||||
fogVolume3 = "0 0 0";
|
||||
materialList = "sky_lava_starrynight.dml";
|
||||
windVelocity = "1 0 0";
|
||||
windEffectPrecipitation = "0";
|
||||
fogVolumeColor1 = "1.000000 100.000000 1.000000 0.000000";
|
||||
fogVolumeColor2 = "1.000000 100.000000 1.000000 -198748244414614883000000000000000000000.000000";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 -222768154483160258000000000000000000000.000000";
|
||||
locked = "true";
|
||||
cloudSpeed0 = "0.000000 0.000000";
|
||||
};
|
||||
new SimGroup(Teams) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Team1) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
powerCount = "0";
|
||||
|
||||
new SpawnSphere() {
|
||||
position = "-114.528 571.588 162.521";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "50";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
};
|
||||
};
|
||||
new SimGroup(Base0) {
|
||||
powerCount = "1";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "-107.254 557.985 197.32";
|
||||
rotation = "0 0 1 162.72";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dtowr4.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(ff1) {
|
||||
position = "-96.5634 554.451 197.306";
|
||||
rotation = "0 0 1 162.72";
|
||||
scale = "18.2383 0.889118 6.53687";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
Target = "33";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "1";
|
||||
custom = "1";
|
||||
};
|
||||
new ForceFieldBare(ff2) {
|
||||
position = "-99.5607 566.801 198.352";
|
||||
rotation = "0 0 1 162.72";
|
||||
scale = "0.950705 12.6622 5.47157";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
Target = "34";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "1";
|
||||
custom = "1";
|
||||
};
|
||||
new ForceFieldBare(ff3) {
|
||||
position = "-117.654 561.119 198.267";
|
||||
rotation = "0 0 1 162.72";
|
||||
scale = "0.950705 12.6622 5.47157";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
Target = "35";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "1";
|
||||
custom = "1";
|
||||
};
|
||||
new Turret(FirstAssaultTurret) {
|
||||
position = "-142.405 548.163 197.331";
|
||||
rotation = "0 0 1 161.574";
|
||||
scale = "1 1 1";
|
||||
nameTag = "First Assault";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "AABarrelLarge";
|
||||
Target = "36";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new Turret(SecondAssaultTurret) {
|
||||
position = "-72.6665 569.458 197.173";
|
||||
rotation = "0 0 1 161.001";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Second Assault";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "AABarrelLarge";
|
||||
Target = "37";
|
||||
locked = "true";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(AssaultGenerator) {
|
||||
position = "-109.179 570.628 122.296";
|
||||
rotation = "0 0 1 18.3347";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Assault";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "38";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(SecondUpperAssault) {
|
||||
position = "-102.644 563.424 198.27";
|
||||
rotation = "0 0 -1 18.9076";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Second Upper Assault";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "39";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(FirstUpperAssault) {
|
||||
position = "-114.07 559.904 198.27";
|
||||
rotation = "0 0 -1 18.9076";
|
||||
scale = "1 1 1";
|
||||
nameTag = "First Upper Assault";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "40";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(OutsideAssault) {
|
||||
position = "-108.743 562.617 161.219";
|
||||
rotation = "0 0 1 161.574";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Outside";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "41";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(ff4) {
|
||||
position = "-100.353 566.62 197.102";
|
||||
rotation = "0 0 1 162.72";
|
||||
scale = "18.1794 0.181268 6.75839";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
Target = "42";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "1";
|
||||
custom = "1";
|
||||
};
|
||||
new StaticShape(AssaultSensor) {
|
||||
position = "-106.539 555.81 205.046";
|
||||
rotation = "0 0 1 161.574";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Assault";
|
||||
dataBlock = "SensorLargePulse";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "43";
|
||||
team = "1";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(Team2) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
powerCount = "0";
|
||||
|
||||
new SpawnSphere() {
|
||||
position = "-93.1379 -18.6596 91.6641";
|
||||
rotation = "0 0 1 1.7196";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "50";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
};
|
||||
new SpawnSphere() {
|
||||
position = "324.388 108.414 165.424";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "100";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
};
|
||||
new SpawnSphere() {
|
||||
position = "206.292 -117.527 161.706";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "30";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
};
|
||||
new SpawnSphere() {
|
||||
position = "91.9579 -18.2651 163.334";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "20";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
};
|
||||
};
|
||||
new SimGroup(Base0) {
|
||||
powerCount = "1";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "336.45 117.504 201.06";
|
||||
rotation = "0 0 1 47.5555";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dtowr2.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(LavaGenerator) {
|
||||
position = "327.068 111.911 190.986";
|
||||
rotation = "0 0 1 47.5555";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Lava";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "44";
|
||||
team = "2";
|
||||
needsObjectiveWaypoint = "1";
|
||||
};
|
||||
};
|
||||
new StaticShape(Switch) {
|
||||
position = "215.999 15.5824 84.1074";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Control";
|
||||
dataBlock = "FlipFlop";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "45";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
needsObjectiveWaypoint = "1";
|
||||
};
|
||||
new SimGroup(ffbase) {
|
||||
powerCount = "1";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "-93.2626 -19.4114 88.963";
|
||||
rotation = "0 0 1 33.8046";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dtowr1.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(ForcefieldGenerator) {
|
||||
position = "-93.4641 -19.7113 112.471";
|
||||
rotation = "0 0 1 34.1946";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forcefield";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "46";
|
||||
team = "2";
|
||||
needsObjectiveWaypoint = "1";
|
||||
};
|
||||
new ForceFieldBare(ff2) {
|
||||
position = "302.743 108.426 178.041";
|
||||
rotation = "0 0 1 47.5";
|
||||
scale = "8.09539 1 5.04836";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
Target = "47";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "2";
|
||||
};
|
||||
new ForceFieldBare(ff2) {
|
||||
position = "342.767 116.538 177.945";
|
||||
rotation = "0 0 1 47.5";
|
||||
scale = "8.09539 1 5.04836";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
Target = "48";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "2";
|
||||
};
|
||||
new ForceFieldBare(arf) {
|
||||
position = "315.904 110.203 200.17";
|
||||
rotation = "0 0 1 47.5555";
|
||||
scale = "12.5762 14.1549 0.77919";
|
||||
dataBlock = "defaultNoTeamLavaLightField";
|
||||
Target = "49";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "2";
|
||||
};
|
||||
};
|
||||
new SimGroup(equipment) {
|
||||
powerCount = "2";
|
||||
|
||||
new StaticShape(MainBaseSensor) {
|
||||
position = "268.647 -73.8241 166.697";
|
||||
rotation = "0 0 -1 38.5708";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Main Base";
|
||||
dataBlock = "SensorLargePulse";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "50";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(FirstEquipmentGenerator) {
|
||||
position = "338.362 100.474 160.993";
|
||||
rotation = "0 0 -1 41.826";
|
||||
scale = "1 1 1";
|
||||
nameTag = "First Equipment";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "51";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(SecondEquipmentGenerator) {
|
||||
position = "333.901 96.3878 161.007";
|
||||
rotation = "-0.0149879 0.0392227 -0.999118 41.8597";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Second Equipment";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "52";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(BaseInventory1) {
|
||||
position = "318.351 127.163 161";
|
||||
rotation = "0 0 -1 47.5555";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "53";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(BaseInventory2) {
|
||||
position = "312.52 121.556 161";
|
||||
rotation = "0 0 -1 47.5555";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "54";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(ForcefieldBaseInventory) {
|
||||
position = "-93.3344 -30.6533 88.943";
|
||||
rotation = "0 0 1 168.059";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forcefield Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "55";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(ForcefieldBaseSensor) {
|
||||
position = "-96.1364 -22.4047 142.926";
|
||||
rotation = "0 0 1 90.5273";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forcefield Base";
|
||||
dataBlock = "SensorMediumPulse";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "56";
|
||||
team = "2";
|
||||
};
|
||||
new Turret() {
|
||||
position = "-146.278 5.8762 121.257";
|
||||
rotation = "0 0 1 103.132";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forcefield Base";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "PlasmaBarrelLarge";
|
||||
Target = "57";
|
||||
locked = "true";
|
||||
team = "2";
|
||||
};
|
||||
new Turret() {
|
||||
position = "252.852 110.007 160.388";
|
||||
rotation = "0 0 -1 42.9718";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Main Base";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "PlasmaBarrelLarge";
|
||||
Target = "58";
|
||||
team = "2";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(team0) {
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(RandomOrganics) {
|
||||
powerCount = "0";
|
||||
|
||||
new TSStatic() {
|
||||
position = "309.048 -27.1378 154.33";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "dorg16.dts";
|
||||
locked = "true";
|
||||
};
|
||||
new Item() {
|
||||
position = "-106.661 556.116 198.638";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "1";
|
||||
Target = "-1";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "101.351 -120.54 167.234";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "dorg16.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "464.842 298.396 79.6909";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "dorg16.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "261.041 502.394 140.942";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "2 2 1";
|
||||
shapeName = "dorg17.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "-179.046 482.958 133.652";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "dorg19.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "-79.7171 283.882 117.974";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "dorg18.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "200.169 108.041 148.373";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "porg5.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "383.1 104.224 154.805";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "porg1.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "387.165 99.5415 154.764";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "porg1.dts";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "188.321 172.793 113.218";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
shapeName = "porg1.dts";
|
||||
};
|
||||
};
|
||||
new SimGroup(ObserverDropPoints) {
|
||||
powerCount = "0";
|
||||
|
||||
new Camera(observer1) {
|
||||
position = "89.9067 45.4067 198.273";
|
||||
rotation = "0.0863833 -0.0994006 0.991291 98.512";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "0";
|
||||
};
|
||||
new Camera(obs2) {
|
||||
position = "-112.491 -97.7194 157.154";
|
||||
rotation = "0.996092 0.0149425 -0.0870486 19.5555";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "0";
|
||||
};
|
||||
new Camera(obs3) {
|
||||
position = "-170.53 590.907 228.259";
|
||||
rotation = "0.127912 -0.197037 0.972016 115.495";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(environment) {
|
||||
powerCount = "0";
|
||||
|
||||
new FireballAtmosphere(FireballAtmosphere) {
|
||||
position = "177.8 730 143.8";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "fireball";
|
||||
dropRadius = "900";
|
||||
dropsPerMinute = "100";
|
||||
minDropAngle = "0";
|
||||
maxDropAngle = "10";
|
||||
startVelocity = "300";
|
||||
dropHeight = "1000";
|
||||
dropDir = "0.212 0.212 -0.953998";
|
||||
lockCount = "0";
|
||||
locked = "false";
|
||||
homingCount = "0";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "-145.648 5.55263 111.471";
|
||||
rotation = "0 0 -1 76.2034";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dmisc1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new AudioEmitter() {
|
||||
position = "213.054 6.89907 146.851";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
fileName = "fx/environment/lavahostile.wav";
|
||||
useProfileDescription = "0";
|
||||
outsideAmbient = "1";
|
||||
volume = "1";
|
||||
isLooping = "1";
|
||||
is3D = "1";
|
||||
minDistance = "120";
|
||||
maxDistance = "200";
|
||||
coneInsideAngle = "360";
|
||||
coneOutsideAngle = "360";
|
||||
coneOutsideVolume = "1";
|
||||
coneVector = "0 0 1";
|
||||
loopCount = "-1";
|
||||
minLoopGap = "0";
|
||||
maxLoopGap = "0";
|
||||
type = "EffectAudioType";
|
||||
locked = "true";
|
||||
};
|
||||
new WaterBlock(LavaPool) {
|
||||
position = "120 -96 66.9963";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "256 192 60.1947";
|
||||
liquidType = "HotLava";
|
||||
density = "10";
|
||||
viscosity = "15";
|
||||
waveMagnitude = "3";
|
||||
surfaceTexture = "LiquidTiles/Lava";
|
||||
surfaceOpacity = "1";
|
||||
envMapTexture = "desert/skies/d_n_move1";
|
||||
envMapIntensity = "0.3";
|
||||
submergeTexture[0] = "special/lavadeath_1";
|
||||
submergeTexture[1] = "special/lavadeath_2";
|
||||
removeWetEdges = "1";
|
||||
locked = "1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "215.826 15.5557 89.1571";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dplat2.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "191.29 34.6116 106.737";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dplat1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "182.131 -35.7488 117.705";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dplat1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "false";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "257.328 37.3029 134.919";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dplat1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "180.037 9.37294 156.925";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dplat1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "224.792 -24.357 149.806";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dplat1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "253.31 33.7575 109.412";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dplat1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new TSStatic() {
|
||||
position = "12.5365 255.282 122.271";
|
||||
rotation = "0 -1 0 9.16745";
|
||||
scale = "1 1 1";
|
||||
shapeName = "vehicle_air_scout_wreck.dts";
|
||||
locked = "true";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "268.575 -73.7475 156.927";
|
||||
rotation = "0 0 -1 34.9504";
|
||||
scale = "0.724826 1 1";
|
||||
interiorFile = "dmisc1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "7.79674 258.369 124.24";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "LightMaleHuman_Dead";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "-1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "252.784 110.06 150.609";
|
||||
rotation = "0 0 1 45.8367";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "dmisc1.dif";
|
||||
showTerrainInside = "0";
|
||||
locked = "true";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "3.64849 67.5518 104.952";
|
||||
rotation = "-0.933865 0.324319 -0.150707 52.9094";
|
||||
scale = "2 2 2";
|
||||
interiorFile = "drock7.dif";
|
||||
showTerrainInside = "0";
|
||||
};
|
||||
new Item() {
|
||||
position = "180.049 9.42249 159.559";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "1";
|
||||
Target = "-1";
|
||||
};
|
||||
new Item() {
|
||||
position = "329.105 107.661 181.265";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairKit";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "1";
|
||||
Target = "-1";
|
||||
};
|
||||
new AudioEmitter() {
|
||||
position = "7.79674 258.369 125.04";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
fileName = "fx/environment/fly_swarm.wav";
|
||||
useProfileDescription = "0";
|
||||
outsideAmbient = "1";
|
||||
volume = "1";
|
||||
isLooping = "1";
|
||||
is3D = "1";
|
||||
minDistance = "4";
|
||||
maxDistance = "25";
|
||||
coneInsideAngle = "360";
|
||||
coneOutsideAngle = "360";
|
||||
coneOutsideVolume = "1";
|
||||
coneVector = "0 0 1";
|
||||
loopCount = "-1";
|
||||
minLoopGap = "0";
|
||||
maxLoopGap = "0";
|
||||
type = "EffectAudioType";
|
||||
locked = "false";
|
||||
};
|
||||
new ParticleEmissionDummy(smoke) {
|
||||
position = "13.2614 250.543 126.018";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "defaultEmissionDummy";
|
||||
emitter = "SmallHeavyDamageSmoke";
|
||||
velocity = "1";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
||||
package Patience
|
||||
{
|
||||
|
||||
|
||||
function SiegeGame::missionLoadDone(%game)
|
||||
{
|
||||
Parent::missionLoadDone(%game);
|
||||
|
||||
Game.originalScale = nameToID("LavaPool").scale;
|
||||
Game.powerIsUp = true;
|
||||
}
|
||||
|
||||
function SiegeGame::startMatch(%game)
|
||||
{
|
||||
Parent::startMatch(%game);
|
||||
AdjustWaterLevel(NameToID("LavaPool"));
|
||||
}
|
||||
|
||||
function Generator::onDisabled(%data, %obj, %prevState)
|
||||
{
|
||||
%obj.decPowerCount();
|
||||
|
||||
if (%obj == nameToId("LavaGenerator"))
|
||||
Game.PowerIsUp = false;
|
||||
|
||||
Parent::onDisabled(%data, %obj, %prevState);
|
||||
}
|
||||
|
||||
function Generator::onEnabled(%data, %obj, %prevState)
|
||||
{
|
||||
%obj.incPowerCount();
|
||||
|
||||
if (%obj == nameToId("LavaGenerator"))
|
||||
Game.PowerIsUp = true;
|
||||
|
||||
Parent::onEnabled(%data, %obj, %prevState);
|
||||
}
|
||||
|
||||
function SiegeGame::gameOver(%game)
|
||||
{
|
||||
cancel(Game.PatienceSched);
|
||||
exec("scripts/forceField.cs");
|
||||
Parent::gameOver(%game);
|
||||
deactivatePackage(Patience);
|
||||
}
|
||||
|
||||
function SiegeGame::halftime(%game, %reason)
|
||||
{
|
||||
cancel(Game.PatienceSched);
|
||||
Game.PowerIsUp = true;
|
||||
ReSizeWater(nameToID("LavaPool"), Game.originalScale);
|
||||
|
||||
Parent::halftime(%game, %reason);
|
||||
}
|
||||
|
||||
function SiegeGame::startSecondHalf(%game)
|
||||
{
|
||||
Parent::startSecondHalf(%game);
|
||||
AdjustWaterLevel(NameToID("LavaPool"));
|
||||
}
|
||||
|
||||
// The following functions were taken from "Polar Dip", by [HvC]Scuba and [HvC]Dev. Much thanks, Scuba and Dev.
|
||||
|
||||
function AdjustWaterLevel(%Water)
|
||||
{
|
||||
// If the Object you specified to increase in size is not water, just
|
||||
// note that in the console and log and quit
|
||||
if (%Water.getType() != 16)
|
||||
{
|
||||
logEcho("Attempting to raise/lower water level on non-water object.");
|
||||
return;
|
||||
}
|
||||
|
||||
%Water.Locked = true;
|
||||
|
||||
Game.PatienceSched = Schedule(1000, 0, SizeWater, %Water);
|
||||
}
|
||||
|
||||
function ReSizeWater(%Water, %OriginalScale)
|
||||
{
|
||||
%Water.Scale = %OriginalScale;
|
||||
%Water.setTransform(%Water.getTransform());
|
||||
}
|
||||
|
||||
function SizeWater(%Water)
|
||||
{
|
||||
if (Game.powerIsUp)
|
||||
AdjustWaterLevel(%Water);
|
||||
else
|
||||
{
|
||||
%ScaleXY = getWords(%Water.Scale, 0, 1);
|
||||
%ScaleZ = getWord(%Water.Scale, 2) - 0.13333;
|
||||
|
||||
%Water.Scale = %ScaleXY @ " " @ %ScaleZ;
|
||||
|
||||
// Just needed to cause a refresh
|
||||
%Water.setTransform(%Water.getTransform());
|
||||
AdjustWaterLevel(%Water);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
if (!$OFFLINE_NAV_BUILD)
|
||||
activatePackage(Patience);
|
||||
|
Before Width: | Height: | Size: 110 KiB |
|
|
@ -1 +0,0 @@
|
|||
Heightfield::add("General\tTab_general\tgeneral_min_height\t50\tgeneral_scale\t300\tgeneral_water\t0.000\tgeneral_centerx\t0\tgeneral_centery\t0");
|
||||
|
Before Width: | Height: | Size: 137 KiB |
|
|
@ -1,940 +0,0 @@
|
|||
// DisplayName = Siege of Ymir Base
|
||||
// MissionTypes = Siege
|
||||
|
||||
//--- MISSION QUOTE BEGIN ---
|
||||
//Rely on others, and you may yet do better.
|
||||
// -Anonymous
|
||||
//Map by Durikkan
|
||||
//Version 1.2, fixes by a tiny fishie
|
||||
//--- MISSION QUOTE END ---
|
||||
|
||||
//--- MISSION STRING BEGIN ---
|
||||
//Attackers can repair their bunker to assist in attacking
|
||||
//When the Forcefield solar is destroyed, it severely weakens the defensive position (lots of FFs come down)
|
||||
//When the forcefield generator is down, all access forcefields in the main base will fall
|
||||
//When the 2 main generators are destroyed, the switch gen will fall.
|
||||
//Capture the Switch to win the map
|
||||
//--- MISSION STRING END ---
|
||||
|
||||
function ForceFieldBareData::onAdd(%data, %obj)
|
||||
{
|
||||
Parent::onAdd(%data, %obj);
|
||||
|
||||
//%velo = 1;
|
||||
//%grav = 0.1;
|
||||
//%appl = "0 0 0";
|
||||
|
||||
if (%obj.custom $= "" || %obj.custom $= "0")
|
||||
{
|
||||
%velo = %obj.velocityMod;
|
||||
%grav = %obj.gravityMod;
|
||||
%appl = %obj.appliedForce;
|
||||
}
|
||||
else
|
||||
return; // add physical zones unless the force field contains 'custom = "1";'
|
||||
|
||||
%pz = new PhysicalZone() {
|
||||
position = %obj.position;
|
||||
rotation = %obj.rotation;
|
||||
scale = %obj.scale;
|
||||
polyhedron = "0.000000 1.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 0.0000000 1.0000000";
|
||||
velocityMod = %velo;
|
||||
gravityMod = %grav;
|
||||
appliedForce = %appl;
|
||||
ffield = %obj;
|
||||
};
|
||||
|
||||
%pzGroup = nameToID("MissionCleanup/PZones");
|
||||
if(%pzGroup <= 0)
|
||||
{
|
||||
%pzGroup = new SimGroup("PZones");
|
||||
MissionCleanup.add(%pzGroup);
|
||||
}
|
||||
%pzGroup.add(%pz);
|
||||
}
|
||||
|
||||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
musicTrack = "lush";
|
||||
cdTrack = "6";
|
||||
powerCount = "0";
|
||||
|
||||
new MissionArea(MissionArea) {
|
||||
area = "0 -168 640 1088";
|
||||
flightCeiling = "2000";
|
||||
flightCeilingRange = "50";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "0 0 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
cloudHeightPer[0] = "0.349971";
|
||||
cloudHeightPer[1] = "0.25";
|
||||
cloudHeightPer[2] = "0.199973";
|
||||
cloudSpeed1 = "0.0001";
|
||||
cloudSpeed2 = "0.0002";
|
||||
cloudSpeed3 = "0.0003";
|
||||
visibleDistance = "350";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "0";
|
||||
SkySolidColor = "0.390000 0.390000 0.390000 1.000000";
|
||||
fogDistance = "200";
|
||||
fogColor = "0.600000 0.600000 0.600000 1.000000";
|
||||
fogVolume1 = "400 40 65";
|
||||
fogVolume2 = "900 65 250";
|
||||
fogVolume3 = "0 0 0";
|
||||
materialList = "Lush_l4.dml";
|
||||
windVelocity = "1 0 0";
|
||||
windEffectPrecipitation = "0";
|
||||
fogVolumeColor1 = "128.000000 128.000000 128.000000 75824315812260666200000000000000.000000";
|
||||
fogVolumeColor2 = "128.000000 128.000000 128.000000 949.521790";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 3940863705088.000000";
|
||||
high_visibleDistance = "-1";
|
||||
high_fogDistance = "-1";
|
||||
high_fogVolume1 = "-1 1.76574e+22 12.3922";
|
||||
high_fogVolume2 = "-1 1.77526e+28 1.84841e+31";
|
||||
high_fogVolume3 = "-1 7.02879e+22 4.51265e+27";
|
||||
cloudSpeed0 = "0.000500 0.000500";
|
||||
};
|
||||
new Sun() {
|
||||
position = "0 0 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
direction = "0.57735 0.57735 -0.57735";
|
||||
color = "0.600000 0.600000 0.600000 1.000000";
|
||||
ambient = "0.600000 0.600000 0.600000 1.000000";
|
||||
texture[0] = "special/sunFlare";
|
||||
texture[1] = "special/sunFlare02";
|
||||
texture[2] = "special/LensFlare/flare01";
|
||||
texture[3] = "special/LensFlare/flare02";
|
||||
texture[4] = "special/LensFlare/flare03";
|
||||
lensFlareScale = "0.7";
|
||||
lensFlareIntensity = "1";
|
||||
frontFlareSize = "300";
|
||||
backFlareSize = "450";
|
||||
flareColor = "1.000000 1.000000 1.000000 1.000000";
|
||||
};
|
||||
new TerrainBlock(terrain) {
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
detailTexture = "details/snowdet1";
|
||||
terrainFile = "Training4.ter";
|
||||
squareSize = "8";
|
||||
position = "-1024 -1024 0";
|
||||
};
|
||||
new NavigationGraph(NavGraph) {
|
||||
conjoinAngleDev = "50";
|
||||
cullDensity = "0.1";
|
||||
customArea = "0 0 0 0";
|
||||
rotation = "0 0 0 0";
|
||||
position = "0 0 0 1";
|
||||
scale = "1 1 1";
|
||||
coverage = "0";
|
||||
GraphFile = "SiegeofYmir.nav";
|
||||
conjoinBowlDev = "20";
|
||||
};
|
||||
new SimGroup(Teams) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Team1) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnSpheres) {
|
||||
powerCount = "0";
|
||||
|
||||
new SpawnSphere(MainSpawn) {
|
||||
position = "310.222 833.91 108.196";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "50";
|
||||
sphereWeight = "65";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "0";
|
||||
};
|
||||
new SpawnSphere(BunkerSpawn) {
|
||||
position = "532.436 104.526 80.8592";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "6";
|
||||
sphereWeight = "35";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(base) {
|
||||
powerCount = "1";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "303.995 840.308 81.9632";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "15.8501 3.53514 1.23215";
|
||||
interiorFile = "bwall1.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "322.183 843.317 102.627";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "bbunk9.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "286.649 851.467 109.081";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "bbunk1.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(ObaseInv5) {
|
||||
position = "315.974 854.109 104.564";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "33";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "3993";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(OBaseGen) {
|
||||
position = "289.653 844.019 111.939";
|
||||
rotation = "0 0 -1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "34";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(OBaseInv1) {
|
||||
position = "281.695 838.596 103.081";
|
||||
rotation = "0 0 -1 90.5273";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "35";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "3996";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(ObaseInv2) {
|
||||
position = "292.226 848.596 103.049";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "36";
|
||||
Trigger = "3998";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(ObaseInv3) {
|
||||
position = "329.096 853.375 104.581";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "37";
|
||||
Trigger = "4000";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(ObaseInv4) {
|
||||
position = "322.942 854.145 104.58";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "38";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "4002";
|
||||
team = "2";
|
||||
};
|
||||
new ForceFieldBare(BaseBunkFF) {
|
||||
position = "313.169 841.982 104.442";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "18.027 0.227966 7.33224";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "39";
|
||||
team = "2";
|
||||
custom = "1";
|
||||
};
|
||||
new ForceFieldBare(BaseBaseFF1) {
|
||||
position = "284.531 855.468 102.918";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "4.2186 0.1 4.32841";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "40";
|
||||
team = "2";
|
||||
custom = "1";
|
||||
};
|
||||
new ForceFieldBare(BaseBaseFF2) {
|
||||
position = "284.554 832.497 103.059";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "4.2186 0.1 4.32841";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "41";
|
||||
team = "2";
|
||||
custom = "1";
|
||||
};
|
||||
new Turret(BaseBaseTur1) {
|
||||
position = "266.512 814.61 101.625";
|
||||
rotation = "0 0 1 179.336";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Primary";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "PlasmaBarrelLarge";
|
||||
Target = "42";
|
||||
lastDamagedBy = "4011";
|
||||
originalBarrel = "PlasmaBarrelLarge";
|
||||
lastProjectile = "6702";
|
||||
damageTimeMS = "384407";
|
||||
lastDamagedByTeam = "2";
|
||||
team = "2";
|
||||
};
|
||||
new Turret(BaseBaseTur2) {
|
||||
position = "322.259 836.095 112.592";
|
||||
rotation = "0 0 1 180.482";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Secondary";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "PlasmaBarrelLarge";
|
||||
Target = "43";
|
||||
originalBarrel = "PlasmaBarrelLarge";
|
||||
lastProjectile = "6703";
|
||||
team = "2";
|
||||
};
|
||||
new WayPoint(OMainBaseWP) {
|
||||
position = "303.409 846.12 100.991";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Offensive Base";
|
||||
dataBlock = "WayPointMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
name = "Offensive Base";
|
||||
team = "2";
|
||||
};
|
||||
};
|
||||
new SimGroup(Bunkers) {
|
||||
powerCount = "0";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "532.352 104.856 79.2146";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "bbunkb.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "522.481 98.1753 81.0509";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "19.0179 0.1 7.26408";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "44";
|
||||
team = "2";
|
||||
custom = "1";
|
||||
};
|
||||
new ForceFieldBare() {
|
||||
position = "522.882 111.667 81.0738";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "19.0179 0.1 7.26408";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "45";
|
||||
team = "2";
|
||||
custom = "1";
|
||||
};
|
||||
new StaticShape(BunkerGen) {
|
||||
position = "527.484 105.493 81.0892";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Bunker";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "46";
|
||||
repairedBy = "3975";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(BunkerInv) {
|
||||
position = "538.612 105.424 81.1608";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Bunker";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "47";
|
||||
repairedBy = "3975";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "4021";
|
||||
team = "2";
|
||||
};
|
||||
new WayPoint(OffBunkWP) {
|
||||
position = "532.341 105.026 80.4926";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Offensive Bunker";
|
||||
dataBlock = "WayPointMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
name = "Offensive Bunker";
|
||||
team = "2";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(Team2) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(SancFort) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(FFs) {
|
||||
powerCount = "2";
|
||||
|
||||
new ForceFieldBare(MainGenFF2) {
|
||||
position = "228.514 134.237 53.4087";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "0.1 11.4861 5.90247";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "48";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(BaseFFGen1) {
|
||||
position = "260.433 183.991 61.6471";
|
||||
rotation = "0 0 1 180";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Primary Forcefield";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
needsObjectiveWaypoint = "1";
|
||||
Target = "52";
|
||||
WayPoint = "4113";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(MainGenFF1) {
|
||||
position = "278.77 134.121 53.8606";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "0.1 11.4861 5.53418";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "50";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(MainGenFF3) {
|
||||
position = "234.125 134.08 67.3781";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "0.1 4.91206 4.64044";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "51";
|
||||
team = "1";
|
||||
};
|
||||
};
|
||||
new SimGroup(equip) {
|
||||
powerCount = "2";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "257.763 172.427 53.6562";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "bbase4cm.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "2";
|
||||
};
|
||||
new Turret(FrontTurret) {
|
||||
position = "259.385 195.612 63.1315";
|
||||
rotation = "-0 0 -1 0.0395647";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Front";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "MissileBarrelLarge";
|
||||
Target = "53";
|
||||
lastDamagedBy = "3975";
|
||||
originalBarrel = "MissileBarrelLarge";
|
||||
lastProjectile = "5593";
|
||||
damageTimeMS = "147321";
|
||||
lastDamagedByTeam = "1";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(BaseLargePulse) {
|
||||
position = "278.912 187.923 80.2531";
|
||||
rotation = "-0 0 -1 5.72956";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Main";
|
||||
dataBlock = "SensorLargePulse";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "54";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(Team2GeneratorLarge2) {
|
||||
position = "255.5 130.875 53.984";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Main";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
needsObjectiveWaypoint = "1";
|
||||
Target = "55";
|
||||
WayPoint = "4114";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(Team2GeneratorLarge3) {
|
||||
position = "262.793 131.025 54.0067";
|
||||
rotation = "0 0 -1 90.0456";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Main";
|
||||
dataBlock = "GeneratorLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
needsObjectiveWaypoint = "1";
|
||||
Target = "56";
|
||||
WayPoint = "4115";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(EndGenFF) {
|
||||
position = "286.659 133.487 66.9014";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "5.18524 3.91476 5.34363";
|
||||
dataBlock = "defaultForceFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "57";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(GenInv1) {
|
||||
position = "242.408 130.662 67.5944";
|
||||
rotation = "0 0 -1 90.1366";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "58";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "4043";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(GenInv2) {
|
||||
position = "231.078 112.953 54.0859";
|
||||
rotation = "0 0 -1 90.1366";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "59";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "4045";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(GenInv3) {
|
||||
position = "287.878 113.891 54.0901";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Base";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "60";
|
||||
Trigger = "4047";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(FFGenInv1) {
|
||||
position = "243.404 183.859 54.1051";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forcefield";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "61";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "4049";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(FFGenInv2) {
|
||||
position = "275.194 183.643 54.1012";
|
||||
rotation = "0 0 -1 90.0456";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forcefield";
|
||||
dataBlock = "StationInventory";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "62";
|
||||
notReady = "1";
|
||||
inUse = "Down";
|
||||
Trigger = "4051";
|
||||
team = "1";
|
||||
};
|
||||
new Turret(IndoorSentry) {
|
||||
position = "238.982 187.228 76.6106";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
nameTag = "entry";
|
||||
dataBlock = "SentryTurret";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "SentryTurretBarrel";
|
||||
Target = "63";
|
||||
lastDamagedBy = "3975";
|
||||
lastProjectile = "6311";
|
||||
damageTimeMS = "68743";
|
||||
lastDamagedByTeam = "2";
|
||||
team = "1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "152.18 326.279 106.562";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "bplat6.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "2";
|
||||
};
|
||||
new StaticShape(AuxSens1) {
|
||||
position = "152.436 326.872 107.145";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Northwest";
|
||||
dataBlock = "SensorLargePulse";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "64";
|
||||
team = "1";
|
||||
};
|
||||
new StaticShape(AuxSens2) {
|
||||
position = "486.687 188.447 89.8179";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "East";
|
||||
dataBlock = "SensorLargePulse";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "65";
|
||||
team = "1";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "486.433 187.855 89.0349";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "bplat6.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "2";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "421.07 -72.3054 146.79";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "btowr2.dif";
|
||||
showTerrainInside = "0";
|
||||
team = "2";
|
||||
};
|
||||
new Turret(RocketTurret) {
|
||||
position = "410.592 169.181 88.3405";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Side";
|
||||
dataBlock = "TurretBaseLarge";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
initialBarrel = "MissileBarrelLarge";
|
||||
Target = "66";
|
||||
originalBarrel = "MissileBarrelLarge";
|
||||
lastProjectile = "6250";
|
||||
team = "1";
|
||||
};
|
||||
};
|
||||
new SimGroup(Stuff) {
|
||||
powerCount = "0";
|
||||
|
||||
new Item(RepDef1) {
|
||||
position = "234.441 187.115 75.5156";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "0";
|
||||
Target = "-1";
|
||||
team = "2";
|
||||
};
|
||||
new Item(RepDef2) {
|
||||
position = "283.417 187.19 75.5122";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "RepairPack";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
collideable = "0";
|
||||
static = "1";
|
||||
rotate = "0";
|
||||
Target = "-1";
|
||||
team = "2";
|
||||
};
|
||||
};
|
||||
new StaticShape(Team2FlipFlop1) {
|
||||
position = "289.655 131.096 67.483";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Control";
|
||||
dataBlock = "FlipFlop";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
needsObjectiveWaypoint = "1";
|
||||
Target = "67";
|
||||
team = "1";
|
||||
};
|
||||
new SimGroup(SolarFF) {
|
||||
powerCount = "1";
|
||||
|
||||
new StaticShape(FFsolar1) {
|
||||
position = "420.905 -78.3925 160.572";
|
||||
rotation = "0 0 1 180";
|
||||
scale = "1 1 1";
|
||||
nameTag = "Forward Forcefield";
|
||||
dataBlock = "SolarPanel";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
needsObjectiveWaypoint = "1";
|
||||
Target = "68";
|
||||
WayPoint = "4117";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(WindowFF2) {
|
||||
position = "276.926 196.21 62.0799";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "0.140771 9.42908 3.27599";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "76";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(WindowFF1) {
|
||||
position = "232.208 196.237 62.7146";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "0.1 9.7472 2.69256";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "74";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(MainGenFF1) {
|
||||
position = "230.626 181.266 53.701";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "0.170526 6.26318 5.53418";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "73";
|
||||
team = "1";
|
||||
};
|
||||
new ForceFieldBare(MainGenFF2) {
|
||||
position = "281.622 181.323 54.0392";
|
||||
rotation = "0 0 1 89.9544";
|
||||
scale = "0.1 6.26318 5.53418";
|
||||
dataBlock = "defaultTeamSlowFieldBare";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
Target = "75";
|
||||
team = "1";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(spawnSpheres) {
|
||||
powerCount = "0";
|
||||
|
||||
new SpawnSphere(DefBase) {
|
||||
position = "259.245 168.369 75.6808";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SpawnSphereMarker";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
radius = "40";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(team0) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnSpheres) {
|
||||
powerCount = "0";
|
||||
};
|
||||
new SimGroup() {
|
||||
powerCount = "0";
|
||||
};
|
||||
new SimGroup(AIObjectives) {
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(Sounds) {
|
||||
powerCount = "0";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "410.771 170.411 72.291";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "bwall1.dif";
|
||||
showTerrainInside = "0";
|
||||
};
|
||||
new SimGroup(RandomRocks) {
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Addition4brock7) {
|
||||
powerCount = "0";
|
||||
|
||||
new InteriorInstance() {
|
||||
position = "165.815 249.477 50.3257";
|
||||
rotation = "0 0 1 106.62";
|
||||
scale = "1 1 1";
|
||||
interiorFile = "brock7.dif";
|
||||
showTerrainInside = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(Observerdroppoints) {
|
||||
powerCount = "0";
|
||||
|
||||
new Camera() {
|
||||
position = "258.298 114.424 56.2813";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "0";
|
||||
};
|
||||
new Camera() {
|
||||
position = "257.504 183.865 75.7855";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "Observer";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup() {
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
||||
|
||||
package SiegeOfYmirBase
|
||||
{
|
||||
//begin SiegeOfYmirBase package ================================
|
||||
|
||||
|
||||
function SiegeGame::missionLoadDone(%game)
|
||||
{
|
||||
nameToId("BunkerGen").setDamageLevel(2.5);
|
||||
nameToId("BunkerInv").setDamageLevel(2.5);
|
||||
|
||||
nameToId("BunkerSpawn").sphereWeight = 0;
|
||||
nameToId("MainSpawn").sphereWeight = 100;
|
||||
|
||||
Parent::missionLoadDone(%game);
|
||||
}
|
||||
|
||||
function SiegeGame::halftimeOver(%game)
|
||||
{
|
||||
nameToId(BunkerGen).setDamageLevel(2.5);
|
||||
nameToId(BunkerInv).setDamageLevel(2.5);
|
||||
|
||||
nameToId("BunkerSpawn").sphereWeight = 0;
|
||||
nameToId("MainSpawn").sphereWeight = 100;
|
||||
|
||||
Parent::halftimeOver(%game);
|
||||
}
|
||||
|
||||
function SiegeGame::gameOver(%game)
|
||||
{
|
||||
exec("scripts/forceField.cs");
|
||||
Parent::gameOver(%game);
|
||||
deactivatePackage(SiegeOfYmirBase);
|
||||
}
|
||||
|
||||
function Generator::onEnabled(%data, %obj, %prevState)
|
||||
{
|
||||
Parent::onEnabled(%data, %obj, %prevState);
|
||||
|
||||
if(%obj == nameToId("BunkerGen"))
|
||||
{
|
||||
nameToId("BunkerSpawn").sphereWeight = 75;
|
||||
nameToId("MainSpawn").sphereWeight = 25;
|
||||
}
|
||||
}
|
||||
|
||||
function Generator::onDisabled(%data, %obj)
|
||||
{
|
||||
Parent::onDisabled(%data, %obj);
|
||||
|
||||
if(%obj == nameToId("BunkerGen"))
|
||||
{
|
||||
nameToId("BunkerSpawn").sphereWeight = 0;
|
||||
nameToId("MainSpawn").sphereWeight = 100;
|
||||
}
|
||||
}
|
||||
|
||||
//end YmirBase package ================================
|
||||
};
|
||||
|
||||
activatePackage(SiegeOfYmirBase);
|
||||
|
Before Width: | Height: | Size: 216 KiB |
|
|
@ -1,55 +0,0 @@
|
|||
Red Shifter's License for Tribes 2 Works v1.4, updated 2021-03-07
|
||||
|
||||
Copyright (c) 2021 "Red Shifter"
|
||||
|
||||
1. SUMMARY
|
||||
The goal of this license is to
|
||||
- Forbid commercial use of this work and its derivatives
|
||||
- Forbid the solicitation of donations, except with permission
|
||||
- Preserve derivative works and keep server admins from holding onto them
|
||||
- Indemnify the creators of works, taking away all implications of liability and warranty
|
||||
|
||||
2. PERSONAL USE
|
||||
Blanket permission is granted to keep a copy of the work and use it for your own personal use. Personal use is defined as any use on a game server with
|
||||
a maximum of 4 human players on it.
|
||||
|
||||
Acceptance of this license is not required in order to play on a server using the work. Only to host the work on your own server.
|
||||
|
||||
3. COMMERCIAL USE
|
||||
Commercial use is explicitly prohibited. This includes, but is not limited to running a server for money, pay-to-play servers, etc. There are three
|
||||
exceptions to this rule:
|
||||
|
||||
- Server owners may solicit donations to continue running, as long as permission is received by the author of the work (and in cases of derivative
|
||||
works, the creators of those works as well). Such permission can be revoked at any time by the author(s).
|
||||
- Servers that run over a LAN, such as for a LAN party, may host this code as long as all hosted works and derivatives are publicly available. Such
|
||||
servers cannot accept outside connections (such as from VPN, dark web, etc.)
|
||||
- Server infrastructure providers (such as Branzone) are not part of commercial use, as long as it's the server operator (such as the person who paid
|
||||
for said server) is the one who made the decision to include the work on the server.
|
||||
|
||||
4. DERIVATIVE WORKS
|
||||
In this license, a "derivative work" is any map, any code modification, any code addition with the explicit purpose of changing how the code works, etc.
|
||||
|
||||
All derivative works are fine as long as such modifications are PUBLICLY AVAILABLE. It is EXPRESSLY PROHIBITED to run any derivative work on a server
|
||||
without making it publicly available, such as through website, FTP, public GitHub, etc. Works in progress, test versions, etc. do not need to be
|
||||
uploaded for public availability immediately. However, if said versions are requested and are still in active use on a server, it should be made
|
||||
available as soon as convenient, such as within 24 hours of the request, and such files could be made available informally through Discord, etc.
|
||||
|
||||
Derivative works are implied to use this license, even if the license is not included with it. Derivative works that fully replace the existing code
|
||||
(such as a new version of the work not requiring the existing VL2) MUST include this license. Additional terms may be attached to the license, as long
|
||||
as this license is unmodified and does not conflict with the terms of this license. In all cases, this license will be considered to take priority.
|
||||
|
||||
Derivative works based on this work cannot use licenses that are more inclusive, such as MIT License, etc.
|
||||
|
||||
You may not solicit donations, commissions, etc to create a derivative work based on something using this license.
|
||||
|
||||
Derivative works must not contain morally reprehensible or illegal content.
|
||||
|
||||
5. INDEMNIFICATION
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
|
||||
6. TRICKERY CLAUSE
|
||||
This is not an ironclad contract. I am not a lawyer. This license will be interpreted how I see fit. Malicious attempts to get around loopholes in
|
||||
the license are considered a violatios of the license, and you immediately forfeit all rights to the work and its derivatives.
|
||||
|
|
@ -1,135 +0,0 @@
|
|||
// DisplayName = SkiFree
|
||||
// MissionTypes = SkiFree
|
||||
|
||||
//--- MISSION QUOTE BEGIN ---
|
||||
//If you french fry when you pizza, you're gonna have a bad time.
|
||||
// -- Thumper
|
||||
//--- MISSION QUOTE END ---
|
||||
|
||||
//--- MISSION STRING BEGIN ---
|
||||
//Chooses a random terrain
|
||||
//Sets up a random spawn point
|
||||
//--- MISSION STRING END ---
|
||||
|
||||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
|
||||
CTF_scoreLimit = "8";
|
||||
powerCount = "0";
|
||||
musicTrack = "lush";
|
||||
cdTrack = "6";
|
||||
|
||||
new MissionArea(MissionArea) {
|
||||
area = "-1024 -1024 2048 2048";
|
||||
flightCeiling = "1000";
|
||||
flightCeilingRange = "50";
|
||||
|
||||
locked = "true";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "400 0 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
cloudHeightPer[0] = "100";
|
||||
cloudHeightPer[1] = "0.25";
|
||||
cloudHeightPer[2] = "0.199973";
|
||||
cloudSpeed1 = "0.01";
|
||||
cloudSpeed2 = "0.05";
|
||||
cloudSpeed3 = "0.2";
|
||||
visibleDistance = "750";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "0";
|
||||
SkySolidColor = "0.200000 0.700000 0.900000 0.000000";
|
||||
fogDistance = "600";
|
||||
fogColor = "0.200000 0.700000 0.900000 1.000000";
|
||||
fogVolume1 = "0 0 0";
|
||||
fogVolume2 = "0 0 0";
|
||||
fogVolume3 = "0 0 0";
|
||||
materialList = "lush_ram.dml";
|
||||
windVelocity = "0 0 0";
|
||||
windEffectPrecipitation = "0";
|
||||
fogVolumeColor1 = "10.000000 128.000000 28.000000 0.000000";
|
||||
fogVolumeColor2 = "128.000000 128.000000 128.000000 0.000000";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 0.000000";
|
||||
high_visibleDistance = "-1";
|
||||
high_fogDistance = "-1";
|
||||
high_fogVolume1 = "-1 3344 6.27351e-39";
|
||||
high_fogVolume2 = "-1 3.51342e-39 2.46878e+27";
|
||||
high_fogVolume3 = "-1 5.3766e+08 -3.21499e+06";
|
||||
|
||||
locked = "true";
|
||||
cloudSpeed0 = "0.000150 0.000050";
|
||||
};
|
||||
new Sun() {
|
||||
position = "1024 512 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
direction = "0.22528 -0.904932 -0.361037";
|
||||
color = "0.600000 0.600000 0.600000 1.000000";
|
||||
ambient = "0.600000 0.600000 0.600000 1.000000";
|
||||
texture[0] = "special/sunFlare";
|
||||
texture[1] = "special/sunFlare02";
|
||||
texture[2] = "special/LensFlare/flare01";
|
||||
texture[3] = "special/LensFlare/flare02";
|
||||
texture[4] = "special/LensFlare/flare03";
|
||||
lensFlareScale = "0.3";
|
||||
lensFlareIntensity = "0.3";
|
||||
frontFlareSize = "10";
|
||||
backFlareSize = "500";
|
||||
flareColor = "0.200000 0.350000 0.400000 1.000000";
|
||||
|
||||
texture3 = "special/LensFlare/flare02";
|
||||
texture0 = "special/sunFlare";
|
||||
texture1 = "special/sunFlare02";
|
||||
locked = "true";
|
||||
texture2 = "special/LensFlare/flare01";
|
||||
texture4 = "special/LensFlare/flare03";
|
||||
};
|
||||
new NavigationGraph(NavGraph) {
|
||||
conjoinAngleDev = "45";
|
||||
cullDensity = "0.3";
|
||||
customArea = "0 0 0 0";
|
||||
|
||||
scale = "1 1 1";
|
||||
XDimOverSize = "0";
|
||||
YDimOverSize = "0";
|
||||
conjoinBowlDev = "20";
|
||||
position = "0 0 0 1";
|
||||
GraphFile = "SkiFree.nav";
|
||||
locked = "true";
|
||||
rotation = "0 0 0 0";
|
||||
coverage = "0";
|
||||
};
|
||||
new SimGroup(Teams) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Team0) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
new SimGroup(Team1) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(Team2) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(ObserverDropPoints) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
|
@ -1,280 +0,0 @@
|
|||
// MissionTypes = SinglePlayer
|
||||
// DisplayName = SkiFree Tourney 2021
|
||||
|
||||
//--- MISSION BRIEFING BEGIN ---
|
||||
//It's the 20th anniversary of Tribes 2. At least, the 20th anniversary of my account.
|
||||
//
|
||||
//The SkiFree Tourney 2021 is a Medium-difficulty daily generated on 2021-03-30, based on Version 1.04.
|
||||
//
|
||||
//Difficulty doesn't matter.
|
||||
//
|
||||
//Qualifying Time: 73.868
|
||||
//
|
||||
//Hints:
|
||||
//- Discjump twice before Gate 1 and try to hit 450kph
|
||||
//- Ride that speed through Gate 5 if you can
|
||||
//- Use the terrain to turn yourself towards Gate 6
|
||||
//- Carrying high speed through the last two gates is sketchy
|
||||
//--- MISSION BRIEFING END ---
|
||||
|
||||
// BriefingWAV = SkiFree 1
|
||||
// Bitmap = trn_skifree_2021
|
||||
|
||||
//--- MISSION STRING BEGIN ---
|
||||
//SkiFree Tourney 2021
|
||||
//Qualifying Time: 73.868
|
||||
//Good luck!
|
||||
//--- MISSION STRING END ---
|
||||
|
||||
// PlanetName = SkiFree Tourney 2021
|
||||
|
||||
//--- MISSION BLURB BEGIN ---
|
||||
//This isn't actually seen because SkiFree takes over the SinglePlayer thing
|
||||
//Oh well, doesn't really matter
|
||||
//--- MISSION BLURB END ---
|
||||
|
||||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
|
||||
|
||||
cdTrack = "6";
|
||||
SkiFree_qualifierTime = "73.868";
|
||||
powerCount = "0";
|
||||
musicTrack = "lush";
|
||||
|
||||
|
||||
new MissionArea(MissionArea) {
|
||||
area = "-1024 -1024 2048 2048";
|
||||
flightCeiling = "1000";
|
||||
flightCeilingRange = "50";
|
||||
|
||||
locked = "true";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "400 0 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
cloudHeightPer[0] = "100";
|
||||
cloudHeightPer[1] = "0.25";
|
||||
cloudHeightPer[2] = "0.199973";
|
||||
cloudSpeed1 = "0.01";
|
||||
cloudSpeed2 = "0.05";
|
||||
cloudSpeed3 = "0.2";
|
||||
visibleDistance = "750";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "0";
|
||||
SkySolidColor = "0.200000 0.700000 0.900000 0.000000";
|
||||
fogDistance = "600";
|
||||
fogColor = "0.200000 0.700000 0.900000 1.000000";
|
||||
fogVolume1 = "0 0 0";
|
||||
fogVolume2 = "0 0 0";
|
||||
fogVolume3 = "0 0 0";
|
||||
materialList = "lush_ram.dml";
|
||||
windVelocity = "0 0 0";
|
||||
windEffectPrecipitation = "0";
|
||||
fogVolumeColor1 = "10.000000 128.000000 28.000000 0.000000";
|
||||
fogVolumeColor2 = "128.000000 128.000000 128.000000 0.000000";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 0.000000";
|
||||
high_visibleDistance = "-1";
|
||||
high_fogDistance = "-1";
|
||||
high_fogVolume1 = "-1 3344 6.27351e-39";
|
||||
high_fogVolume2 = "-1 3.51342e-39 2.46878e+27";
|
||||
high_fogVolume3 = "-1 5.3766e+08 -3.21499e+06";
|
||||
|
||||
cloudSpeed0 = "0.000150 0.000050";
|
||||
locked = "true";
|
||||
};
|
||||
new Sun() {
|
||||
position = "1024 512 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
direction = "0.57735 0.57735 -0.57735";
|
||||
color = "0.600000 0.600000 0.600000 1.000000";
|
||||
ambient = "0.600000 0.600000 0.600000 1.000000";
|
||||
texture[0] = "special/sunFlare";
|
||||
texture[1] = "special/sunFlare02";
|
||||
texture[2] = "special/LensFlare/flare01";
|
||||
texture[3] = "special/LensFlare/flare02";
|
||||
texture[4] = "special/LensFlare/flare03";
|
||||
lensFlareScale = "0.3";
|
||||
lensFlareIntensity = "0.3";
|
||||
frontFlareSize = "10";
|
||||
backFlareSize = "500";
|
||||
flareColor = "0.200000 0.350000 0.400000 1.000000";
|
||||
|
||||
|
||||
texture2 = "special/LensFlare/flare01";
|
||||
texture3 = "special/LensFlare/flare02";
|
||||
locked = "true";
|
||||
texture4 = "special/LensFlare/flare03";
|
||||
texture0 = "special/sunFlare";
|
||||
texture1 = "special/sunFlare02";
|
||||
};
|
||||
new TerrainBlock(terrain) {
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
detailTexture = "details/lushdet1";
|
||||
terrainFile = "SkiFreeZ_Championship_2021.ter";
|
||||
squareSize = "8";
|
||||
|
||||
|
||||
locked = "true";
|
||||
position = "-1024 -1024 0";
|
||||
};
|
||||
new NavigationGraph(NavGraph) {
|
||||
conjoinAngleDev = "45";
|
||||
cullDensity = "0.3";
|
||||
customArea = "0 0 0 0";
|
||||
|
||||
|
||||
YDimOverSize = "0";
|
||||
GraphFile = "SkiFree.nav";
|
||||
scale = "1 1 1";
|
||||
conjoinBowlDev = "20";
|
||||
locked = "true";
|
||||
|
||||
position = "0 0 0 1";
|
||||
coverage = "0";
|
||||
XDimOverSize = "0";
|
||||
rotation = "0 0 0 0";
|
||||
};
|
||||
new SimGroup(Teams) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Team0) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
new SimGroup(Team1) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(Team2) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(ObserverDropPoints) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
new InteriorInstance(SpawnPlatform) {
|
||||
position = "218 -329 106.258";
|
||||
rotation = "0 0 1 152.943";
|
||||
scale = "3 3 3";
|
||||
interiorFile = "bwall4.dif";
|
||||
showTerrainInside = "0";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "954.49 47.1803 74.0685";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "0";
|
||||
gateNum__ = "1";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "1667.62 465.963 104.027";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "0";
|
||||
gateNum__ = "2";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "2342.69 788.114 78.089";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "0";
|
||||
gateNum__ = "3";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "2881.27 1144.82 118.167";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "0";
|
||||
gateNum__ = "4";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "3598.22 1488.35 88.625";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "0";
|
||||
gateNum__ = "5";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "4243.66 2065.73 77.061";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "0";
|
||||
gateNum__ = "6";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "4297.5 2869.93 63.0078";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "0";
|
||||
gateNum__ = "7";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "4665.18 3599.52 86.497";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
|
||||
isFinish__ = "1";
|
||||
gateNum__ = "8";
|
||||
};
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
||||
// break out the terraformer to make the terrain
|
||||
//Game.breakOutTerraformer(2, 17892); // demos don't work with this!
|
||||
Game.terrain = "Tourney 2021";
|
||||
|
|
@ -1,183 +0,0 @@
|
|||
// MissionTypes = SinglePlayer
|
||||
// DisplayName = SkiFree Daily Challenge
|
||||
|
||||
//--- MISSION BRIEFING BEGIN ---
|
||||
//The daily challenge of SkiFree.
|
||||
//
|
||||
//A new level will be generated every day. A completely random terrain that nobody has ever seen before, until now.
|
||||
//
|
||||
//Since the level will be the same regardless of who is playing, you can share times! Talk about how much better you are than everyone else! Forget about the time zone conversions and end up talking about the wrong map! Get banned from Discord for spamming this crap months after everyone else stops caring about it!
|
||||
//
|
||||
//Difficulty will determine how hard the terrain is. So it can really be thought of as a three-in-one challenge. Easy and Medium will just be varying levels of fBM Fractal, which makes some nice rolling hills. But the Hard terrain? You'll have to see it to believe it.
|
||||
//--- MISSION BRIEFING END ---
|
||||
|
||||
// BriefingWAV = SkiFree 1
|
||||
// Bitmap = trn_skifree_daily
|
||||
|
||||
//--- MISSION STRING BEGIN ---
|
||||
//The Daily
|
||||
//--- MISSION STRING END ---
|
||||
|
||||
// PlanetName = SkiFree Daily Challenge
|
||||
|
||||
//--- MISSION BLURB BEGIN ---
|
||||
//This isn't actually seen because SkiFree takes over the SinglePlayer thing
|
||||
//Oh well, doesn't really matter
|
||||
//--- MISSION BLURB END ---
|
||||
|
||||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
|
||||
CTF_scoreLimit = "8";
|
||||
powerCount = "0";
|
||||
musicTrack = "lush";
|
||||
cdTrack = "6";
|
||||
|
||||
new MissionArea(MissionArea) {
|
||||
area = "-1024 -1024 2048 2048";
|
||||
flightCeiling = "1000";
|
||||
flightCeilingRange = "50";
|
||||
|
||||
locked = "true";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "400 0 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
cloudHeightPer[0] = "100";
|
||||
cloudHeightPer[1] = "0.25";
|
||||
cloudHeightPer[2] = "0.199973";
|
||||
cloudSpeed1 = "0.01";
|
||||
cloudSpeed2 = "0.05";
|
||||
cloudSpeed3 = "0.2";
|
||||
visibleDistance = "750";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "0";
|
||||
SkySolidColor = "0.200000 0.700000 0.900000 0.000000";
|
||||
fogDistance = "600";
|
||||
fogColor = "0.200000 0.700000 0.900000 1.000000";
|
||||
fogVolume1 = "0 0 0";
|
||||
fogVolume2 = "0 0 0";
|
||||
fogVolume3 = "0 0 0";
|
||||
materialList = "lush_ram.dml";
|
||||
windVelocity = "0 0 0";
|
||||
windEffectPrecipitation = "0";
|
||||
fogVolumeColor1 = "10.000000 128.000000 28.000000 0.000000";
|
||||
fogVolumeColor2 = "128.000000 128.000000 128.000000 0.000000";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 0.000000";
|
||||
high_visibleDistance = "-1";
|
||||
high_fogDistance = "-1";
|
||||
high_fogVolume1 = "-1 3344 6.27351e-39";
|
||||
high_fogVolume2 = "-1 3.51342e-39 2.46878e+27";
|
||||
high_fogVolume3 = "-1 5.3766e+08 -3.21499e+06";
|
||||
|
||||
locked = "true";
|
||||
cloudSpeed0 = "0.000150 0.000050";
|
||||
};
|
||||
new Sun() {
|
||||
position = "1024 512 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
direction = "0.22528 -0.904932 -0.361037";
|
||||
color = "0.600000 0.600000 0.600000 1.000000";
|
||||
ambient = "0.600000 0.600000 0.600000 1.000000";
|
||||
texture[0] = "special/sunFlare";
|
||||
texture[1] = "special/sunFlare02";
|
||||
texture[2] = "special/LensFlare/flare01";
|
||||
texture[3] = "special/LensFlare/flare02";
|
||||
texture[4] = "special/LensFlare/flare03";
|
||||
lensFlareScale = "0.3";
|
||||
lensFlareIntensity = "0.3";
|
||||
frontFlareSize = "10";
|
||||
backFlareSize = "500";
|
||||
flareColor = "0.200000 0.350000 0.400000 1.000000";
|
||||
|
||||
texture3 = "special/LensFlare/flare02";
|
||||
texture0 = "special/sunFlare";
|
||||
texture1 = "special/sunFlare02";
|
||||
locked = "true";
|
||||
texture2 = "special/LensFlare/flare01";
|
||||
texture4 = "special/LensFlare/flare03";
|
||||
};
|
||||
new NavigationGraph(NavGraph) {
|
||||
conjoinAngleDev = "45";
|
||||
cullDensity = "0.3";
|
||||
customArea = "0 0 0 0";
|
||||
|
||||
scale = "1 1 1";
|
||||
XDimOverSize = "0";
|
||||
YDimOverSize = "0";
|
||||
conjoinBowlDev = "20";
|
||||
position = "0 0 0 1";
|
||||
GraphFile = "SkiFree.nav";
|
||||
locked = "true";
|
||||
rotation = "0 0 0 0";
|
||||
coverage = "0";
|
||||
};
|
||||
new SimGroup(Teams) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Team0) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
new SimGroup(Team1) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(Team2) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(ObserverDropPoints) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
||||
// break out the terraformer here
|
||||
$SkiFreeRandomSeed = Game.getDailySeed();
|
||||
$SkiFreeRandomSeed *= $pref::trainingDifficulty;
|
||||
|
||||
if( !Game.isAprilFools() ) {
|
||||
|
||||
Game.breakOutTerraformer(
|
||||
$pref::trainingDifficulty,
|
||||
$SkiFreeRandomSeed
|
||||
);
|
||||
|
||||
Game.terrain = Game.terrain SPC formatTimeString("yy-mm-dd");
|
||||
}
|
||||
else {
|
||||
// select the proper terrain
|
||||
if( $pref::trainingDifficulty == 1 ) {
|
||||
$TerrainTest = "FrozenFury";
|
||||
}
|
||||
else if( $pref::trainingDifficulty == 2 ) {
|
||||
$TerrainTest = "Confusco";
|
||||
}
|
||||
else if( $pref::trainingDifficulty == 3 ) {
|
||||
$TerrainTest = "TL_Skylight";
|
||||
}
|
||||
|
||||
Game.generateTerrain();
|
||||
$TerrainTest = "";
|
||||
|
||||
Game.terrain = "April Fools '" @ formatTimeString("y");
|
||||
if( $pref::trainingDifficulty == 1 ) Game.terrain = Game.terrain SPC "Easy";
|
||||
if( $pref::trainingDifficulty == 2 ) Game.terrain = Game.terrain SPC "Medium";
|
||||
if( $pref::trainingDifficulty == 3 ) Game.terrain = Game.terrain SPC "Hard";
|
||||
}
|
||||
|
|
@ -1,154 +0,0 @@
|
|||
// MissionTypes = SinglePlayer
|
||||
// DisplayName = SkiFree Randomizer
|
||||
|
||||
//--- MISSION BRIEFING BEGIN ---
|
||||
//The randomizer of SkiFree.
|
||||
//
|
||||
//This will generate completely random terrains that nobody has ever seen, and nobody will ever see again.
|
||||
//
|
||||
//Difficulty will determine how hard the terrain is. So it can really be thought of as a three-in-one challenge. Easy and Medium will just be varying levels of fBM Fractal, which makes some nice rolling hills. But the Hard terrain? You'll have to see it to believe it.
|
||||
//--- MISSION BRIEFING END ---
|
||||
|
||||
// BriefingWAV = SkiFree 1
|
||||
// Bitmap = trn_skifree_random
|
||||
|
||||
//--- MISSION STRING BEGIN ---
|
||||
//The Randomizer
|
||||
//--- MISSION STRING END ---
|
||||
|
||||
// PlanetName = SkiFree Randomizer
|
||||
|
||||
//--- MISSION BLURB BEGIN ---
|
||||
//This isn't actually seen because SkiFree takes over the SinglePlayer thing
|
||||
//Oh well, doesn't really matter
|
||||
//--- MISSION BLURB END ---
|
||||
|
||||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
|
||||
CTF_scoreLimit = "8";
|
||||
powerCount = "0";
|
||||
musicTrack = "lush";
|
||||
cdTrack = "6";
|
||||
|
||||
new MissionArea(MissionArea) {
|
||||
area = "-1024 -1024 2048 2048";
|
||||
flightCeiling = "1000";
|
||||
flightCeilingRange = "50";
|
||||
|
||||
locked = "true";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "400 0 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
cloudHeightPer[0] = "100";
|
||||
cloudHeightPer[1] = "0.25";
|
||||
cloudHeightPer[2] = "0.199973";
|
||||
cloudSpeed1 = "0.01";
|
||||
cloudSpeed2 = "0.05";
|
||||
cloudSpeed3 = "0.2";
|
||||
visibleDistance = "750";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "0";
|
||||
SkySolidColor = "0.200000 0.700000 0.900000 0.000000";
|
||||
fogDistance = "600";
|
||||
fogColor = "0.200000 0.700000 0.900000 1.000000";
|
||||
fogVolume1 = "0 0 0";
|
||||
fogVolume2 = "0 0 0";
|
||||
fogVolume3 = "0 0 0";
|
||||
materialList = "lush_ram.dml";
|
||||
windVelocity = "0 0 0";
|
||||
windEffectPrecipitation = "0";
|
||||
fogVolumeColor1 = "10.000000 128.000000 28.000000 0.000000";
|
||||
fogVolumeColor2 = "128.000000 128.000000 128.000000 0.000000";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 0.000000";
|
||||
high_visibleDistance = "-1";
|
||||
high_fogDistance = "-1";
|
||||
high_fogVolume1 = "-1 3344 6.27351e-39";
|
||||
high_fogVolume2 = "-1 3.51342e-39 2.46878e+27";
|
||||
high_fogVolume3 = "-1 5.3766e+08 -3.21499e+06";
|
||||
|
||||
locked = "true";
|
||||
cloudSpeed0 = "0.000150 0.000050";
|
||||
};
|
||||
new Sun() {
|
||||
position = "1024 512 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
direction = "0.22528 -0.904932 -0.361037";
|
||||
color = "0.600000 0.600000 0.600000 1.000000";
|
||||
ambient = "0.600000 0.600000 0.600000 1.000000";
|
||||
texture[0] = "special/sunFlare";
|
||||
texture[1] = "special/sunFlare02";
|
||||
texture[2] = "special/LensFlare/flare01";
|
||||
texture[3] = "special/LensFlare/flare02";
|
||||
texture[4] = "special/LensFlare/flare03";
|
||||
lensFlareScale = "0.3";
|
||||
lensFlareIntensity = "0.3";
|
||||
frontFlareSize = "10";
|
||||
backFlareSize = "500";
|
||||
flareColor = "0.200000 0.350000 0.400000 1.000000";
|
||||
|
||||
texture3 = "special/LensFlare/flare02";
|
||||
texture0 = "special/sunFlare";
|
||||
texture1 = "special/sunFlare02";
|
||||
locked = "true";
|
||||
texture2 = "special/LensFlare/flare01";
|
||||
texture4 = "special/LensFlare/flare03";
|
||||
};
|
||||
new NavigationGraph(NavGraph) {
|
||||
conjoinAngleDev = "45";
|
||||
cullDensity = "0.3";
|
||||
customArea = "0 0 0 0";
|
||||
|
||||
scale = "1 1 1";
|
||||
XDimOverSize = "0";
|
||||
YDimOverSize = "0";
|
||||
conjoinBowlDev = "20";
|
||||
position = "0 0 0 1";
|
||||
GraphFile = "SkiFree.nav";
|
||||
locked = "true";
|
||||
rotation = "0 0 0 0";
|
||||
coverage = "0";
|
||||
};
|
||||
new SimGroup(Teams) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(Team0) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
new SimGroup(Team1) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
new SimGroup(Team2) {
|
||||
|
||||
powerCount = "0";
|
||||
|
||||
new SimGroup(spawnspheres) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new SimGroup(ObserverDropPoints) {
|
||||
|
||||
powerCount = "0";
|
||||
};
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
||||
// break out the terraformer here
|
||||
Game.breakOutTerraformer(
|
||||
$pref::trainingDifficulty
|
||||
);
|
||||
|
||||
Game.terrain = Game.terrain SPC "Randomizer";
|
||||
|
|
@ -1,232 +0,0 @@
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Compile it yo damn self.
|
||||
* @author Red Shifter
|
||||
*
|
||||
*/
|
||||
public class SkiFreeCreator {
|
||||
private static File inputFile;
|
||||
private static File outputFile;
|
||||
|
||||
private static List<String> outputText = new LinkedList<>();
|
||||
private static int ERRORLEVEL = 0;
|
||||
|
||||
public static void main(String[] args) {
|
||||
if( args.length == 0 || args.length > 2 ) {
|
||||
System.out.println("Parameters: inFile outFile");
|
||||
System.out.println("inFile should be the input CSV. Make sure it's saved as UTF-8.");
|
||||
System.out.println("outFile (optional) should be the output CS (if not included, output is printed to console). That CS will be overwritten.");
|
||||
System.exit(1);
|
||||
}
|
||||
inputFile = new File(args[0]);
|
||||
if( !inputFile.exists() ) {
|
||||
System.err.println("Input file doesn't exist.");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
if( args.length > 1 ) outputFile = new File(args[1]);
|
||||
|
||||
try {
|
||||
generate(args);
|
||||
}
|
||||
catch( Exception e ) {
|
||||
e.printStackTrace();
|
||||
ERRORLEVEL = 1;
|
||||
}
|
||||
System.exit(ERRORLEVEL);
|
||||
}
|
||||
|
||||
private static void generate(String[] args) throws IOException {
|
||||
println("// SkiFree Terrain List");
|
||||
println("// Input File Date: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(inputFile.lastModified()));
|
||||
println();
|
||||
println("// A good terrain has the following qualities:");
|
||||
println("// - doesn't have a bunch of flat ground, even if it's right outside the mission bounds (high octane)");
|
||||
println("// - is not fucking gigantic (stripmine, a bunch of other TR2 terrains)");
|
||||
println("// - doesn't have a bunch of steep plateaus");
|
||||
println("// - is not Magnum (a map where the fastest route is to discjump off a bunch of flat ridges)");
|
||||
println("// use $TerrainTest to test a terrain locally");
|
||||
println();
|
||||
println("%i = -1; // %i++ is pre-increment for some reason; it's -1 so it can start at 0");
|
||||
println("%j = -1; // %j++ is pre-increment for some reason; it's -1 so it can start at 0");
|
||||
println();
|
||||
|
||||
List<String> fileLines = Files.readAllLines(inputFile.toPath(), Charset.forName("UTF-8"));
|
||||
List<Terrain> terrainList = new LinkedList<>();
|
||||
|
||||
for( String line : fileLines ) {
|
||||
String[] split = line.split(",");
|
||||
if( split.length == 0 ) continue;
|
||||
if( !split[0].endsWith(".ter") ) continue;
|
||||
|
||||
Terrain ter = new Terrain(split);
|
||||
if( !ter.hasErrors )
|
||||
terrainList.add(ter);
|
||||
else
|
||||
ERRORLEVEL = 1;
|
||||
}
|
||||
|
||||
// if you don't want me at my new String[][] {}, you don't deserve me at my ______________
|
||||
for( String[] output : new String[][] {
|
||||
{"ACCEPTED TERRAINS", ""},
|
||||
{"SUPERHARD (APRIL FOOLS)", "SUPERHARD"},
|
||||
{"REJECTED FOR DEADSTOPS", "DEADSTOP"},
|
||||
{"REJECTED FOR BEING UNSKIIABLE", "VARIANCE"},
|
||||
{"REJECTED FOR SOME OTHER REASON", "OVERRIDE"},
|
||||
{"DUPLICATES", "DUPLICATE"}
|
||||
}) {
|
||||
String listName = output[0];
|
||||
String rejectReason = output[1];
|
||||
|
||||
// count up how many there are
|
||||
int count = 0;
|
||||
for( Terrain ter : terrainList ) {
|
||||
if( rejectReason.equals(ter.rejectReason) ) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
println("// " + listName + " (" + count + ")");
|
||||
for( Terrain ter : terrainList ) {
|
||||
if( rejectReason.equals(ter.rejectReason) ) {
|
||||
println(ter.toString());
|
||||
}
|
||||
}
|
||||
|
||||
println();
|
||||
}
|
||||
|
||||
println("$SkiFreeTerrainListMAX = %i;");
|
||||
println("$SkiFreeTerrainListSuperHardMAX = %j;");
|
||||
|
||||
writeFile();
|
||||
|
||||
if( outputFile != null ) {
|
||||
if( ERRORLEVEL == 0 ) {
|
||||
System.out.println("Task completed successfully");
|
||||
}
|
||||
else {
|
||||
System.out.println("Task completed with errors");
|
||||
}
|
||||
}
|
||||
else if( ERRORLEVEL == 1 ) {
|
||||
System.out.println("");
|
||||
System.out.println("Script generated with errors. Please correct them.");
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeFile() throws IOException {
|
||||
if( outputFile != null) {
|
||||
Files.write(outputFile.toPath(), outputText, StandardOpenOption.TRUNCATE_EXISTING);
|
||||
}
|
||||
else {
|
||||
for( String line : outputText ) {
|
||||
System.out.println(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void println() {
|
||||
println("");
|
||||
}
|
||||
|
||||
private static void println(String line) {
|
||||
outputText.add(line);
|
||||
}
|
||||
|
||||
static class Terrain {
|
||||
String terrainName;
|
||||
String result;
|
||||
String rejectReason;
|
||||
String comment;
|
||||
boolean hasErrors = false;
|
||||
|
||||
public Terrain(String[] split) {
|
||||
terrainName = split[0];
|
||||
result = split[4];
|
||||
|
||||
// validation
|
||||
switch( result ) {
|
||||
case "Accept":
|
||||
if( "Yes".equals(split[1]) || "Yes".equals(split[2]) || "Yes".equals(split[3]) ) {
|
||||
System.err.println(terrainName + " is Accept but has a rejection reason!");
|
||||
hasErrors = true;
|
||||
}
|
||||
break;
|
||||
case "Reject":
|
||||
case "Superhard":
|
||||
if( !"Yes".equals(split[1]) && !"Yes".equals(split[2]) && !"Yes".equals(split[3]) ) {
|
||||
System.err.println(terrainName + " is Reject but has no rejection reason!");
|
||||
hasErrors = true;
|
||||
}
|
||||
break;
|
||||
case "Duplicate":
|
||||
break;
|
||||
case "":
|
||||
default:
|
||||
System.err.println(terrainName + " has unknown result " + result);
|
||||
hasErrors = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if( "Superhard".equals(result) ) {
|
||||
rejectReason = "SUPERHARD";
|
||||
}
|
||||
else if( "Yes".equals(split[1]) ) {
|
||||
rejectReason = "DEADSTOP";
|
||||
}
|
||||
else if( "Yes".equals(split[2]) ) {
|
||||
rejectReason = "VARIANCE";
|
||||
}
|
||||
else if( "Yes".equals(split[3]) ) {
|
||||
rejectReason = "OVERRIDE";
|
||||
}
|
||||
else if ( "Duplicate".equals(result) ) {
|
||||
rejectReason = "DUPLICATE";
|
||||
}
|
||||
else {
|
||||
rejectReason = "";
|
||||
}
|
||||
|
||||
if( split.length > 5 ) {
|
||||
comment = split[5];
|
||||
if( comment.startsWith("\"") ) {
|
||||
comment = comment.substring(1, comment.length() - 1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
comment = "";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String value;
|
||||
if( "Accept".equals(result) ) {
|
||||
value = "$SkiFreeTerrainList[%i++] = \"";
|
||||
}
|
||||
else if( "SUPERHARD".equals(rejectReason) ) {
|
||||
value = "$SkiFreeTerrainListSuperHard[%j++] = \"";
|
||||
}
|
||||
else {
|
||||
value = "//$SkiFreeTerrainList[%i++] = \"";
|
||||
}
|
||||
|
||||
// automatically makes string builder on real versions of java, fuck you
|
||||
return
|
||||
value
|
||||
+ terrainName
|
||||
+ "\";"
|
||||
+ (!comment.isEmpty() ? (" // " + comment) : "")
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,236 +0,0 @@
|
|||
TERRAIN,FLAT,VARIANCE,OVERRIDE,RESULT,REVIEW
|
||||
Abominable.ter,Yes,Yes,,Reject,
|
||||
AcidRain.ter,Yes,No,,Reject,
|
||||
AgentsOfFortune.ter,Yes,Yes,,Reject,
|
||||
Alcatraz.ter,Trace,No,,Accept,yeah. seems fine
|
||||
Archipelago.ter,No,Yes,,Reject,
|
||||
AshesToAshes.ter,Yes,Yes,,Reject,
|
||||
Attrition.ter,Trace,No,,Accept,
|
||||
BastardForge.ter,No,No,,Accept,
|
||||
BeggarsRun.ter,Duplicate,Duplicate,,Duplicate,
|
||||
Broadside_nef.ter,No,No,,Accept,
|
||||
Bunkered.ter,No,Yes,,Reject,
|
||||
Caldera.ter,No,No,,Accept,
|
||||
Cardiac.ter,No,No,,Accept,
|
||||
Casern_Cavite.ter,Yes,Yes,,Reject,
|
||||
CCD.ter,Trace,No,,Accept,
|
||||
CeleritySE.ter,Trace,No,,Accept,I was on the fence on this one
|
||||
Chasmaclysmic.ter,Trace,Kinda,Yes,Reject,this level is really kinda boring if it spawns right (which it can not do)
|
||||
Cinerarium.ter,Trace,No,,Accept,
|
||||
cloak.ter,No,Yes,,Reject,the terrain is just too big for a fun race
|
||||
CompUSA_Melee.ter,No,Yes,,Reject,the hill is causing too much grief and the rest of the map doesn’t have enough value to justify it
|
||||
Confusco.ter,No,Yes,,Superhard,WAY too big.
|
||||
Coppera.ter,No,No,,Accept,this seems fine. just gotta keep jumping over the mesas? plateaus? fjordr? Whatever
|
||||
Crater71.ter,No,Yes,,Reject,this almost always generates something very unfun
|
||||
Damnation.ter,Duplicate,Duplicate,,Duplicate,
|
||||
DangerousCrossing_nef.ter,No,No,,Accept,this level is fine
|
||||
DBS_Smoothed.ter,Trace,Yes,,Reject,
|
||||
DeathBirdsFly.ter,Trace,No,,Accept,
|
||||
DesertofDeath_nef.ter,No,No,,Accept,
|
||||
Desiccator.ter,Duplicate,Duplicate,,Duplicate,Things clearly seem to be at 4 plateaus of height. which doesn't make for good skiing.
|
||||
DMP_Pantheon.ter,Trace,Kinda,Yes,Reject,there isn't enough value to this map to risk deadstopping
|
||||
DustToDust.ter,Yes,Yes,,Reject,
|
||||
DX_Badlands.ter,Duplicate,Duplicate,,Duplicate,
|
||||
DX_Desert.ter,Duplicate,Duplicate,,Duplicate,
|
||||
DX_Ice.ter,Duplicate,Duplicate,,Duplicate,
|
||||
EB_Hades.ter,No,Yes,,Reject,not only is it extreme but you kinda have trouble reading the terrain too
|
||||
Embers.ter,Trace,No,,Accept,
|
||||
Equinox.ter,Yes,No,,Reject,
|
||||
Escalade.ter,No,Yes,,Reject,
|
||||
Euro_Drifts_SE.ter,Trace,Yes,,Reject,
|
||||
Euro4_Bleed.ter,Trace,No,,Accept,
|
||||
Euro4_Dissention.ter,Trace,No,,Accept,
|
||||
Euro4_FrozenHope.ter,No,No,,Accept,seems fine?
|
||||
Extra_Badlands1.ter,Yes,Likely,,Reject,
|
||||
Firestorm.ter,Yes,,,Reject,
|
||||
Flashpoint.ter,Yes,,,Reject,
|
||||
Fracas.ter,Yes,,,Reject,
|
||||
FrozenFury.ter,No,Yes,,Superhard,even the parts inside mission bounds are unskiiable garbage
|
||||
Gauntlet.ter,Yes,No,,Reject,
|
||||
Gehenna.ter,Yes,,,Reject,
|
||||
Geothermal.ter,Trace,Yes,,Reject,spawn is usually on the plateau. It can generate good starts and bad starts but it's usually a mess
|
||||
GodsRift.ter,No,Yes,,Reject,
|
||||
Gorgon.ter,No,No,,Accept,
|
||||
Haven.ter,Yes,Kinda,,Reject,
|
||||
Hildebrand.ter,No,No,,Accept,
|
||||
HillKing.ter,No,Yes,,Reject,
|
||||
Hillside.ter,Yes,Yes,,Superhard,accepted into april fools set (though it really shouldn’t be – too many deadstops)
|
||||
HO_Badlands.ter,Yes,,,Reject,
|
||||
HO_Desert.ter,Yes,,,Reject,
|
||||
HO_Ice.ter,Yes,,,Reject,
|
||||
HO_Lush.ter,Yes,,,Reject,
|
||||
Hoth.ter,No,Yes,Yes,Reject,why would you name a terrain hoth if it isn't snowy
|
||||
IceBound.ter,Yes,,,Reject,
|
||||
icedagger.ter,No,No,,Accept,
|
||||
IceGiant.ter,No,Yes,,Reject,terrain is kinda extreme
|
||||
IceRidge_nef.ter,No,Yes,,Reject,canyons are just bad for this
|
||||
Insalubria.ter,No,Yes,,Reject,
|
||||
Invictus.ter,Yes,,,Reject,
|
||||
JacobsLadder.ter,Trace,Yes,,Reject,hills are WAY too extreme
|
||||
jaggedclaw.ter,No,No,,Accept,
|
||||
Katabatic.ter,Duplicate,Duplicate,,Duplicate,
|
||||
Lakefront.ter,Trace,Likely,Yes,Reject,just kinda hate this map tbh
|
||||
LavaGods.ter,No,No,,Accept,this is fine
|
||||
Magellan.ter,No,No,,Accept,
|
||||
Magmatic.ter,Trace,No,,Accept,a bit on the hard side
|
||||
MapAssets.ter,Yes,,,Reject,
|
||||
Masada.ter,Yes,,,Reject,tiny dicked map
|
||||
Minotaur.ter,No,Yes,,Reject,
|
||||
mmd.ter,Yes,,,Reject,
|
||||
MoonDance2.ter,Yes,No,,Reject,too many deadstop splotches
|
||||
Moonwalk.ter,No,No,Yes,Reject,magnum-like terrain
|
||||
mountking.ter,No,Yes,,Reject,
|
||||
MyrkWood.ter,No,No,Yes,Reject,we don't need this when we have woodymyrk
|
||||
norty.ter,No,Yes,,Reject,too extreme
|
||||
Oasis.ter,No,No,,Accept,
|
||||
Octane.ter,Yes,,,Reject,
|
||||
Ocular.ter,No,No,,Accept,
|
||||
Overreach.ter,Yes,Yes,,Reject,
|
||||
Paranoia.ter,Trace,Kinda,Yes,Reject,this map is basically flat garbage with a few hills to get in your way
|
||||
Pariah.ter,Trace,Yes,,Reject,these hills are too fucking steep
|
||||
Pariah2.ter,Trace,Yes,,Reject,ditto
|
||||
PhasmaDust.ter,Yes,,,Reject,
|
||||
PlanetX2.ter,Trace,No,,Accept,
|
||||
PuliVeivari.ter,No,Yes,,Reject,
|
||||
Pyroclasm.ter,Yes,,,Reject,
|
||||
Quagmire.ter,Yes,,,Reject,
|
||||
Raindance_nef.ter,No,No,,Accept,
|
||||
Ramparts.ter,No,Likely,Yes,Reject,biased against copyright violation map
|
||||
RandomTer1.ter,No,No,,Accept,
|
||||
RandomTer10.ter,No,No,,Accept,
|
||||
RandomTer2.ter,No,No,,Accept,
|
||||
RandomTer3.ter,No,Yes,,Reject,canyon fractal
|
||||
RandomTer4.ter,No,No,,Accept,
|
||||
RandomTer5.ter,No,No,,Accept,
|
||||
RandomTer6.ter,No,No,,Accept,
|
||||
RandomTer7.ter,No,No,,Accept,
|
||||
RandomTer8.ter,No,No,,Accept,
|
||||
RandomTer9.ter,No,No,,Accept,this canyon works somehow
|
||||
Rasp.ter,Trace,Yes,,Reject,
|
||||
Ravine.ter,Duplicate,Duplicate,,Duplicate,
|
||||
RavineV.ter,Trace,Yes,,Reject,
|
||||
Recalescence.ter,Yes,,,Reject,
|
||||
Respite.ter,No,No,,Accept,
|
||||
Reversion.ter,Yes,Kinda,,Reject,
|
||||
Rimehold.ter,No,Yes,,Reject,
|
||||
RiverDance.ter,Yes,,,Reject,
|
||||
Rollercoaster_nef.ter,No,No,,Accept,unlike most canyon maps this actually turns out to be skiiable
|
||||
rst_agroleon.ter,Trace,Kinda,Yes,Reject,the outer half of the terrain is too flat. and I deadstopped somewhere weird
|
||||
rst_Astro.ter,No,No,,Accept,
|
||||
rst_bittergorge.ter,No,No,,Accept,
|
||||
rst_crumpie.ter,No,No,,Accept,
|
||||
rst_dermcity.ter,No,No,Yes,Reject,whatever the fuck this is doesn't seem good for this
|
||||
rst_FaceCrossing.ter,No,No,,Accept,
|
||||
rst_isledebatalla.ter,Yes,,,Reject,
|
||||
Rst_ScorchedEarth.ter,Trace,No,,Accept,it's fine
|
||||
rst_SimpleFlagArena.ter,No,Yes,,Reject,literally squares
|
||||
rst_spit.ter,No,No,,Accept,i got to gate 5 on a discless discjump launch run
|
||||
Rush.ter,No,No,,Accept,
|
||||
S5_Centaur.ter,No,No,,Accept,
|
||||
S5_Drache.ter,No,No,,Accept,
|
||||
S5_Icedance.ter,No,No,,Accept,
|
||||
S5_massive.ter,Trace,No,,Accept,this is fine? I remember writing about deadstops but I don't see any?
|
||||
S5_Mordacity.ter,No,No,,Accept,
|
||||
S5_rst_hawkingheat.ter,Trace,Yes,,Reject,
|
||||
S5_rst_misadventure.ter,No,No,,Accept,
|
||||
S5_rst_reynard.ter,No,Yes,,Reject,this map is pushing the bounds of variance
|
||||
S5_rst_silenus.ter,No,Yes,,Reject,
|
||||
S5_Sherman.ter,No,No,,Accept,
|
||||
S5-Icedance.ter,Duplicate,Duplicate,,Duplicate,
|
||||
S5-massive.ter,Duplicate,Duplicate,,Duplicate,
|
||||
S5-Mordacity.ter,Duplicate,Duplicate,,Duplicate,
|
||||
S8_rst_dogma.ter,No,No,,Accept,
|
||||
S8_rst_opus.ter,Trace,No,,Accept,
|
||||
S8_zilch.ter,No,Yes,,Reject,
|
||||
Sanctuary.ter,Trace,Yes,,Reject,
|
||||
Sandstorm.ter,No,No,,Accept,
|
||||
SC_Badlands.ter,Yes,,,Reject,
|
||||
SC_Desert.ter,Yes,,,Reject,
|
||||
SC_Ice.ter,Yes,,,Reject,
|
||||
SC_Lush.ter,Yes,,,Reject,
|
||||
SC_Night.ter,Yes,,,Reject,
|
||||
SC_Normal.ter,Yes,,,Reject,
|
||||
Scarabrae_nef.ter,Yes,,,Reject,
|
||||
ShockRidge.ter,No,Yes,,Reject,not a fan of these canyon levels
|
||||
Sirocco.ter,Yes,,,Reject,
|
||||
SkinnyDip.ter,Trace,No,,Accept,really wanted to use one of the TR2 maps. This has a big scale but also nice hills
|
||||
Slapdash.ter,Duplicate,Duplicate,,Duplicate,
|
||||
Snowblind_nef.ter,Trace,Yes,,Reject,already knew this is a bad idea before I even started
|
||||
SolsDescent.ter,Yes,,,Reject,
|
||||
SpinCycle.ter,No,No,,Accept,this was borderline rejected
|
||||
StarFallCTF2.ter,Trace,No,,Accept,
|
||||
Starfallen.ter,Trace,No,,Accept,
|
||||
Stonehenge_nef.ter,No,Yes,,Reject,kryand tried to tell me this was a skiiable terrain. so I put the flags in different places. he no longer believes it's a skiiable terrain
|
||||
SubZero.ter,Duplicate,Duplicate,,Duplicate,
|
||||
SunDried.ter,Yes,,,Reject,
|
||||
Surreal.ter,Trace,Yes,,Reject,
|
||||
Talus.ter,Trace,Yes,,Reject,
|
||||
ThinIce.ter,Yes,,,Reject,
|
||||
Titan.ter,Trace,Yes,,Reject,why did I even open this. probably not stupid enough as a terrain choice for april fools
|
||||
TL_Drorck.ter,No,No,,Accept,
|
||||
TL_Magnum.ter,No,No,Yes,Reject,the best route is “discjump and keep landing on the flat parts at the top” – this is not compelling gameplay
|
||||
TL_MuddySwamp.ter,Yes,,,Reject,
|
||||
TL_RoughLand.ter,No,No,,Accept,this is kinda a finicky terrain but it works
|
||||
TL_Skylight.ter,Trace,Yes,,Superhard,
|
||||
Tombstone.ter,No,No,,Accept,
|
||||
Training1.ter,Yes,,,Reject,
|
||||
Training2.ter,Yes,,,Reject,
|
||||
Training3.ter,Yes,,,Reject,
|
||||
Training4.ter,Yes,,,Reject,
|
||||
Training5.ter,Trace,Likely,Yes,Reject,Terrain is WAY too dark and you can't tell features on it.
|
||||
TreasureIsland.ter,Yes,,,Reject,
|
||||
TWL_Crossfire.ter,Yes,,,Reject,
|
||||
TWL-Abaddon.ter,No,Yes,,Reject,
|
||||
TWL-BaNsHee.ter,Yes,,,Reject,
|
||||
TWL-BeachBlitz.ter,Trace,No,,Accept,
|
||||
TWL-BeggarsRun.ter,No,Yes,,Reject,
|
||||
TWL-BlueMoon.ter,Duplicate,Duplicate,,Duplicate,
|
||||
TWL-Boss.ter,No,No,,Accept,this level is acceptable
|
||||
TWL-Chokepoint.ter,Trace,Yes,,Reject,
|
||||
TWL-Cinereous.ter,Trace,No,,Accept,
|
||||
TWL-Clusterfuct.ter,No,Yes,,Reject,
|
||||
TWL-Curtilage.ter,Yes,,,Reject,
|
||||
TWL-Damnation.ter,Trace,No,,Accept,
|
||||
TWL-DeadlyBirdsSong.ter,Duplicate,Duplicate,,Duplicate,DBS_Smoothed.ter
|
||||
TWL-Deserted.ter,Trace,No,,Accept,
|
||||
TWL-Desiccator.ter,No,Yes,,Reject,
|
||||
TWL-Drifts.ter,Trace,Likely,Yes,Reject,there's nothing really to this map outside the mission bounds
|
||||
TWL-Euro_Feign.ter,No,Yes,,Reject,come on man
|
||||
TWL-Frostclaw.ter,No,Yes,,Reject,
|
||||
TWL-Frozen.ter,No,No,,Accept,
|
||||
TWL-Harvester.ter,No,No,,Accept,why did I take this one
|
||||
TWL-Horde.ter,Yes,,,Reject,
|
||||
TWL-Katabatic.ter,Yes,Yes,,Superhard,oob still bad. this was accepted into april fools because you always need a katabatic joke somewhere
|
||||
TWL-Neve.ter,Yes,,,Reject,it's trace amounts but they're in places you would probably do routes
|
||||
TWL-NoShelter.ter,Yes,,,Reject,
|
||||
TWL-Os_Iris.ter,Trace,No,,Accept,
|
||||
TWL-Pandemonium.ter,No,No,,Accept,
|
||||
TWL-Runenmacht.ter,Trace,Yes,,Reject,nah
|
||||
TWL-Slapdash.ter,Yes,,,Reject,crapdash
|
||||
TWL-SubZero.ter,No,Yes,,Reject,
|
||||
TWL-WilderZone.ter,Trace,No,,Accept,
|
||||
TWL-WoodyMyrk.ter,No,No,,Accept,
|
||||
TWL2_Crevice.ter,No,No,,Accept,
|
||||
TWL2_Frozenglory.ter,No,No,,Accept,
|
||||
TWL2_Ruined.ter,Yes,No,,Reject,looks like a decent terrain but isn’t
|
||||
Tyre.ter,Yes,Yes,,Reject,
|
||||
UltimaThule.ter,Trace,Yes,,Reject,
|
||||
Underhill.ter,Trace,Yes,,Reject,
|
||||
Wasteland.ter,No,No,,Accept,whatever sure
|
||||
WhiteDwarf.ter,Trace,Yes,,Reject,
|
||||
Whiteout.ter,No,Yes,,Reject,
|
||||
WoodyMyrkSE.ter,No,No,,Accept,
|
||||
Xtra_AshenPowder.ter,Trace,No,Yes,Reject,can’t read that fucking terrain so i’m removing
|
||||
Xtra_Bastage.ter,Trace,No,,Accept,
|
||||
Xtra_Birthright.ter,No,Yes,,Reject,
|
||||
Xtra_Crown.ter,Trace,Yes,,Reject,
|
||||
Xtra_DesertedSE.ter,Trace,Yes,,Reject,This is a VERY jagged terrain.
|
||||
Xtra_Helion.ter,Likely,No,Yes,Reject,this is just a really boring terrain
|
||||
Xtra_SoupLadle.ter,No,No,,Accept,
|
||||
Xtra_StarFall_T1.ter,Yes,,,Reject,
|
||||
Xtra_Stripmine.ter,Yes,Yes,,Superhard,
|
||||
Xtra_ThunderGiant.ter,Trace,No,,Accept,this map is garbage but it's fun to try to ski on it
|
||||
Xtra_VanDamned.ter,No,No,,Accept,
|
||||
Xtra_Voodoo.ter,No,Yes,,Reject,
|
||||
Xtra_Xerxes.ter,Likely,Yes,,Reject,
|
||||
Xtra_ziggurat.ter,Yes,,,Reject,
|
||||
|
|
|
@ -1,647 +0,0 @@
|
|||
// SkiFreeAI.cs
|
||||
// no, not aiSkiFree.cs - that naming convention is stupid
|
||||
|
||||
// level 1 - the bot will just be handled by the game
|
||||
// level 2 - ski down hills, everything else the same (skiing doesn't work very well because bots are too afraid of fall damage)
|
||||
// level 3 - don't be afraid of fall damage, ski down hills, jet up/over hills
|
||||
// level 4 - don't ski down hills that are sloped to the side (to avoid going way off-course)
|
||||
|
||||
// yeti - just wrecks your shit if you're not going fast enough
|
||||
|
||||
function SkiFreeGame::addNamedBot(%game, %name) {
|
||||
// why did i do this lol
|
||||
return aiConnect(%name, 1, 1.00);
|
||||
// TODO make more methods for rooster's stupid marbles parody
|
||||
}
|
||||
|
||||
function SkiFreeGame::addBots(%game) {
|
||||
// please don't call this more than once
|
||||
for( %i = 0; %i < ClientGroup.getCount(); %i++ ) {
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if( %cl.isAIControlled() ) return;
|
||||
}
|
||||
|
||||
// note: there's something fucky with this code so it should be BELOW the skill level seen in AIHasJoined method
|
||||
aiConnect("Level 4", 1, 1.00);
|
||||
aiConnect("Level 3", 1, 0.70);
|
||||
aiConnect("Level 2", 1, 0.45);
|
||||
aiConnect("Level 1", 1, 0.20);
|
||||
}
|
||||
|
||||
function SkiFreeGame::AIHasJoined(%game, %client) {
|
||||
%skill = %client.getSkillLevel();
|
||||
if( %skill <= 0.25 ) {
|
||||
%client.AI_skiFreeBotLevel = 1;
|
||||
}
|
||||
else if( %skill <= 0.50 ) {
|
||||
%client.AI_skiFreeBotLevel = 2;
|
||||
}
|
||||
else if( %skill <= 0.75 ) {
|
||||
%client.AI_skiFreeBotLevel = 3;
|
||||
}
|
||||
else {
|
||||
%client.AI_skiFreeBotLevel = 4;
|
||||
}
|
||||
|
||||
if( %client.bestTime $= "" ) {
|
||||
%client.bestTime = %game.trialDefaultTime;
|
||||
}
|
||||
}
|
||||
|
||||
function SkiFreeGame::AIinit(%game) {
|
||||
// keeps ai from spamming the console - no idea what else it does
|
||||
AIInit();
|
||||
}
|
||||
|
||||
function SkiFreeGame::onAIRespawn(%game, %client) {
|
||||
// start a heartbeat
|
||||
%player = %client.player;
|
||||
%game.schedule(1000, AI_heartbeat, %client, %player);
|
||||
|
||||
// give a vgcg (but reduce the amount of spam that comes out)
|
||||
if( !$SkiFreeYetiSpawning && getSimTime() - 1000 >= %game.AI_lastGoodGame ) {
|
||||
if( getRandom(0, ClientGroup.getCount()) < 3 ) {
|
||||
schedule(100, 0, AIPlay3DSound, %client, "gbl.goodgame");
|
||||
%game.AI_lastGoodGame = getSimTime();
|
||||
}
|
||||
}
|
||||
|
||||
%player.schedule(0, use, TargetingLaser); // have you ever heard 16 bots all with disc launchers out? it's LOUD
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_heartbeat(%game, %client, %player) {
|
||||
if( !isObject(%player.client) ) return;
|
||||
if( %player.getState() $= "Dead" ) return;
|
||||
|
||||
// check what our current task is
|
||||
if( !$missionRunning || !$MatchStarted ) {
|
||||
// no task yet - check back later
|
||||
%heartbeat = 1000;
|
||||
}
|
||||
else if( %client == $SkiFreeYeti ) {
|
||||
// this is the yeti - do yeti things
|
||||
%heartbeat = %game.AI_Yeti(%client, %player);
|
||||
}
|
||||
else if( %player.getControllingClient() != %player.client ) {
|
||||
// we're possessed (probably for debugging purposes) - don't do anything weird
|
||||
%heartbeat = 1000;
|
||||
}
|
||||
else if( !%player.AI_meantToLaunch ) {
|
||||
%game.AI_mingle(%client, %player);
|
||||
%heartbeat = 1000;
|
||||
}
|
||||
else if( %client.AI_skiFreeBotLevel <= 1 ) {
|
||||
// level 1 is just "turn off the heartbeat and use the standard bot behavior"
|
||||
// it already knows where it needs to go, t2 can handle that much
|
||||
%heartbeat = -1;
|
||||
}
|
||||
else if( %client.AI_skiFreeBotLevel == 2 ) {
|
||||
// level 2 is "ski down hills, otherwise let t2 handle it"
|
||||
// weaknesses:
|
||||
// - it uses jets to try and avoid fall damage because that's the default t2 behavior
|
||||
// - it's really not much better than level 1
|
||||
%game.AI_playGameLevel2(%client, %player);
|
||||
%heartbeat = 20;
|
||||
}
|
||||
else if( %client.AI_skiFreeBotLevel == 3 ) {
|
||||
// level 3 is "ski down hills, jet over hills"
|
||||
// weaknesses:
|
||||
// - it doesn't see whether skiing down is actually a good idea or not
|
||||
// - it doesn't understand what to do once it has the speed
|
||||
// - sometimes it misses the downhill directly and lands on the next uphill
|
||||
// - sometimes it overshoots the gate because it's going too fast
|
||||
%game.AI_playGameLevel3(%client, %player);
|
||||
%heartbeat = 20;
|
||||
}
|
||||
else if( %client.AI_skiFreeBotLevel == 4 ) {
|
||||
// level 4 is level 3, except it doesn't ski off slopes that'll send the bot way off-course
|
||||
%game.AI_playGameLevel4(%client, %player);
|
||||
%heartbeat = 20;
|
||||
}
|
||||
|
||||
// continue calling heartbeat to see what we should be doing
|
||||
if( %heartbeat <= 1000 && %heartbeat > 0 ) {
|
||||
%game.schedule(%heartbeat, AI_heartbeat, %client, %player);
|
||||
}
|
||||
else if( %heartbeat > 1000 || %heartbeat == 0 ) {
|
||||
// heartbeat isn't set correctly - throw an error
|
||||
messageAll(0, 'AI heartbeat error. See console for details.~wfx/powered/station_denied.wav');
|
||||
error("Heartbeat error for cl=" @ %client @ " pl=" @ %player @ " heartbeat=" @ %heartbeat);
|
||||
}
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_mingle(%game, %client, %player) {
|
||||
// PRIORITY 1. if alone in the game for 5 beats (no non-AI players on team1) and none of the AI are in the field, start a run
|
||||
%alone = true;
|
||||
for( %i = 0; %i < ClientGroup.getCount(); %i++ ) {
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if( !%cl.isAIControlled() && %cl.team == 1 ) {
|
||||
// player in game, don't go on your own
|
||||
%alone = false;
|
||||
break;
|
||||
}
|
||||
else if( %cl.isAIControlled() ) {
|
||||
if( !isObject(%cl.player) ) {
|
||||
// a bot is dead, so they're respawning
|
||||
%alone = false;
|
||||
break;
|
||||
}
|
||||
else if( %cl.player.launchTime !$= "" ) {
|
||||
// a bot is still in the field, don't desync
|
||||
%alone = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( %alone ) {
|
||||
%player.AI_alone++;
|
||||
if( %player.AI_alone >= 5 ) {
|
||||
%game.AI_startRun(%client, %player);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
%player.AI_alone = 0;
|
||||
}
|
||||
|
||||
// PRIORITY 2. if someone just jumped off the platform, start a run behind them
|
||||
if( getSimTime() - 2000 < %game.lastLaunchTime ) {
|
||||
%game.AI_startRun(%client, %player);
|
||||
return;
|
||||
}
|
||||
|
||||
// PRIORITY 3. if a new (non-AI) player spawned, say hello
|
||||
for( %i = 0; %i < ClientGroup.getCount(); %i++ ) {
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if( !%cl.isAIControlled()
|
||||
&& %cl.team == 1
|
||||
&& isObject(%cl.player)
|
||||
&& !%cl.player.AI_sentGreeting
|
||||
&& isObject(%cl.player.client)
|
||||
&& %cl.player.getState() !$= "Dead"
|
||||
) {
|
||||
%cl.player.AI_sentGreeting = true; // only one bot should greet the player
|
||||
schedule(250, %client, "AIPlayAnimSound", %client, %cl.player.position, "gbl.hi", $AIAnimWave, $AIAnimWave, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_startRun(%game, %client, %player) {
|
||||
// start the run
|
||||
%player.AI_meantToLaunch = 1;
|
||||
%client.stepMove(GatePoint1.position, 5);
|
||||
%player.use(Disc);
|
||||
|
||||
// tell the other bots that it's time to go
|
||||
%game.lastLaunchTime = getSimTime();
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_crossedGate(%game, %client, %player) {
|
||||
// is there anything else to do here
|
||||
%client.stepMove(nameToID("GatePoint" @ %player.gate).position, 5);
|
||||
}
|
||||
|
||||
// in case some asshole knocks a bot off the platform
|
||||
function SkiFreeGame::AI_resetPosition(%game, %client, %player) {
|
||||
// what the fuck did you do to him?!
|
||||
if( !isObject(%player.client) ) return;
|
||||
if( %player.getState() $= "Dead" ) return;
|
||||
|
||||
%player.setTransform(Game.pickPlayerSpawn(%client));
|
||||
%player.setVelocity("0 0 0");
|
||||
%player.setDamageLevel(0);
|
||||
%player.resetThread = "";
|
||||
|
||||
// watch where you're shooting
|
||||
schedule(100, 0, AIPlay3DSound, %client, "wrn.watchit");
|
||||
}
|
||||
|
||||
function SkiFreeGame::getAverageBotTime(%game) {
|
||||
%time = 0;
|
||||
%count = 0;
|
||||
for(%i = 0; %i < ClientGroup.getCount(); %i ++) {
|
||||
%client = ClientGroup.getObject(%i);
|
||||
if( %client.isAIControlled() ) {
|
||||
if( %client.lastTime !$= "" ) {
|
||||
%time += %client.lastTime;
|
||||
%count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo(%time / %count);
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_playGameLevel2(%game, %client, %player) {
|
||||
// return if we haven't launched yet - just do standard bot things up to that point
|
||||
if( %player.launchTime $= "" ) return;
|
||||
|
||||
// this is little more than "is the target point downhill? hold ski" bot
|
||||
%objDir = VectorSub(%player.position, nameToID("GatePoint" @ %player.gate).position);
|
||||
%objDir = VectorNormalize(getWords(%objDir, 0, 1) SPC "0");
|
||||
%objDir = VectorScale(%objDir, 2);
|
||||
%x = getWord(%player.position, 0);
|
||||
%y = getWord(%player.position, 1);
|
||||
|
||||
%terrainHeight = %game.findHeight(%x SPC %y);
|
||||
|
||||
%xslope = %x + getWord(%objDir, 0);
|
||||
%yslope = %y + getWord(%objDir, 1);
|
||||
%hslope = %game.findHeight(%xslope SPC %yslope);
|
||||
%slope = %terrainHeight - %hslope;
|
||||
|
||||
if( %slope < 0.02 ) {
|
||||
// going downhill, try skiing?
|
||||
%client.pressjump();
|
||||
%aiHandled = true;
|
||||
}
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_playGameLevel3(%game, %client, %player) {
|
||||
// return if we haven't launched yet - just do standard bot things up to that point
|
||||
if( %player.launchTime $= "" ) return;
|
||||
|
||||
// disable the bot's jets when i don't tell you to use them
|
||||
if( %player.storedEnergy > 0 ) {
|
||||
%player.setEnergyLevel(%player.getEnergyLevel() + %player.storedEnergy);
|
||||
%player.storedEnergy = 0;
|
||||
}
|
||||
%fireJets = false;
|
||||
|
||||
%aiHandled = false;
|
||||
|
||||
// PRIORITY 1. check distance to gate - if we're very close, return from method (use default bot behavior)
|
||||
%dist = VectorDist(%player.position, nameToID("GatePoint" @ %player.gate));
|
||||
%vel = %player.getVelocity();
|
||||
if( %dist < 100 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
%objDir = VectorSub(%player.position, nameToID("GatePoint" @ %player.gate).position);
|
||||
%objDir = VectorNormalize(getWords(%objDir, 0, 1) SPC "0");
|
||||
%x = getWord(%player.position, 0);
|
||||
%y = getWord(%player.position, 1);
|
||||
%terrainHeight = %game.findHeight(%x SPC %y);
|
||||
|
||||
// PRIORITY 2. check slope
|
||||
// going down slope - hold jump
|
||||
// going up slope - hit the jets, unless too high (if there's a mountain in front of you, there's no such thing as too high)
|
||||
if( !%aiHandled ) {
|
||||
%xslope = %x + getWord(%objDir, 0);
|
||||
%yslope = %y + getWord(%objDir, 1);
|
||||
%hslope = %game.findHeight(%xslope SPC %yslope);
|
||||
%slope = %terrainHeight - %hslope;
|
||||
|
||||
if( %slope < 0.02 ) {
|
||||
// going down
|
||||
%client.pressjump();
|
||||
%aiHandled = true;
|
||||
}
|
||||
else {
|
||||
// going up
|
||||
// make sure we aren't too high off the ground - 10m is plenty
|
||||
if( getWord(%player.position,2) - %terrainHeight < 10 ) {
|
||||
%fireJets = true;
|
||||
%aiHandled = true;
|
||||
}
|
||||
else {
|
||||
%hit = ContainerRayCast(%player.position, VectorScale(%objDir, 50) SPC getWord(%player.position,2) - 25, $TypeMasks::TerrainObjectType);
|
||||
if( VectorDist(%player.position, getWords(%hit, 1, 3)) < 25 ) {
|
||||
%fireJets = true;
|
||||
%aiHandled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( %fireJets ) {
|
||||
%client.pressjump();
|
||||
%client.pressjet();
|
||||
}
|
||||
else {
|
||||
%player.storedEnergy = %player.getEnergyLevel();
|
||||
%player.setEnergyLevel(0);
|
||||
}
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_playGameLevel4(%game, %client, %player) {
|
||||
// return if we haven't launched yet - just do standard bot things up to that point
|
||||
if( %player.launchTime $= "" ) return;
|
||||
|
||||
// disable the bot's jets when i don't tell you to use them
|
||||
if( %player.storedEnergy > 0 ) {
|
||||
%player.setEnergyLevel(%player.getEnergyLevel() + %player.storedEnergy);
|
||||
%player.storedEnergy = 0;
|
||||
}
|
||||
%fireJets = false;
|
||||
|
||||
%aiHandled = false;
|
||||
|
||||
// PRIORITY 1. check distance to gate - if we're very close, return from method (use default bot behavior)
|
||||
// TODO check distance to gate - if we're going fast, check trajectory. if we're off, return from method (use default bot behavior)
|
||||
%dist = VectorDist(%player.position, nameToID("GatePoint" @ %player.gate));
|
||||
%vel = %player.getVelocity();
|
||||
// TODO remove this shit and make it good
|
||||
if( %dist < 100 ) {
|
||||
return;
|
||||
}
|
||||
//%speed = VectorLen(%vel);
|
||||
//if( %speed >= 70 ) {
|
||||
// i have no idea how to do this shit
|
||||
//}
|
||||
|
||||
//%objDir = VectorNormalize(getWords(%vel,0,1) SPC "0");
|
||||
%objDir = VectorSub(%player.position, nameToID("GatePoint" @ %player.gate).position);
|
||||
%objDir = VectorNormalize(getWords(%objDir, 0, 1) SPC "0");
|
||||
//%objDir = VectorScale(%objDir, 2); // why are we doing this?
|
||||
%x = getWord(%player.position, 0);
|
||||
%y = getWord(%player.position, 1);
|
||||
%terrainHeight = %game.findHeight(%x SPC %y);
|
||||
|
||||
// PRIORITY 2. check slope
|
||||
// going down slope - hold jump
|
||||
// going up slope - hit the jets, unless too high (if there's a mountain in front of you, there's no such thing as too high)
|
||||
// TODO use parabolas
|
||||
|
||||
if( !%aiHandled ) {
|
||||
%xslope = %x + getWord(%objDir, 0);
|
||||
%yslope = %y + getWord(%objDir, 1);
|
||||
%hslope = %game.findHeight(%xslope SPC %yslope);
|
||||
%slope = %terrainHeight - %hslope;
|
||||
|
||||
// check perpendicular slope to make sure we're going to send ourselves off-course
|
||||
%xhor1 = %x - getWord(%objDir, 1);
|
||||
%yhor1 = %y + getWord(%objDir, 0);
|
||||
%hor1slope = %game.findHeight(%xhor1 SPC %yhor1);
|
||||
%xhor2 = %x + getWord(%objDir, 1);
|
||||
%yhor2 = %y - getWord(%objDir, 0);
|
||||
%hor2slope = %game.findHeight(%xhor2 SPC %yhor2);
|
||||
%horislope = mAbs(%hor1slope - %hor2slope);
|
||||
|
||||
if( %horislope < 0.5 && %slope < 0.02 ) {
|
||||
// going down
|
||||
%client.pressjump();
|
||||
%aiHandled = true;
|
||||
}
|
||||
else {
|
||||
// going up
|
||||
// make sure we aren't too high off the ground - 10m is plenty
|
||||
// TODO we need to do a distance check
|
||||
if( getWord(%player.position,2) - %terrainHeight < 10 ) {
|
||||
%fireJets = true;
|
||||
%aiHandled = true;
|
||||
}
|
||||
else {
|
||||
%hit = ContainerRayCast(%player.position, VectorScale(%objDir, 50) SPC getWord(%player.position,2) - 25, $TypeMasks::TerrainObjectType);
|
||||
if( VectorDist(%player.position, getWords(%hit, 1, 3)) < 25 ) {
|
||||
%fireJets = true;
|
||||
%aiHandled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( %fireJets ) {
|
||||
%client.pressjump();
|
||||
%client.pressjet();
|
||||
}
|
||||
else {
|
||||
%player.storedEnergy = %player.getEnergyLevel();
|
||||
%player.setEnergyLevel(0);
|
||||
}
|
||||
}
|
||||
|
||||
// spawns the yeti (SINGLE PLAYER ONLY)
|
||||
function SkiFreeGame::createYetiFor(%game, %player, %spawnPosition) {
|
||||
if( !%game.isSinglePlayer() ) {
|
||||
error("wtf you trying to pull? yeti doesn't spawn online!");
|
||||
return;
|
||||
}
|
||||
if( !isObject(%player) ) return;
|
||||
if( !isObject(%player.client) ) return;
|
||||
if( %player.getState() $= "Dead" ) return;
|
||||
if( isObject($SkiFreeYeti) ) return;
|
||||
|
||||
%voice = "Derm"@getRandom(1,2); // do humans taste like chicken or fish?
|
||||
%voicePitch = 1 - ((getRandom(20) - 10)/100);
|
||||
|
||||
// it doesn't get the client id until it's too late for certain things, so we need to hack around it
|
||||
$SkiFreeYetiSpawning = 1;
|
||||
%lastMissionType = $currentMissionType;
|
||||
$currentMissionType = "SinglePlayer"; // surpress yeti's join message
|
||||
$SkiFreeYeti = aiConnect("Yeti", 0, 1.00, true, %voice, %voicePitch);
|
||||
$SkiFreeYetiSpawning = "";
|
||||
$currentMissionType = %lastMissionType;
|
||||
|
||||
$SkiFreeYeti.skin = getTaggedString("base");
|
||||
setTargetSkin( $SkiFreeYeti.target, 'base' );
|
||||
|
||||
$SkiFreeYeti.stalkClient = %player.client;
|
||||
$SkiFreeYeti.stalkPlayer = %player;
|
||||
$SkiFreeYeti.race = "Bioderm";
|
||||
$SkiFreeYeti.player.setArmor("Heavy");
|
||||
|
||||
if( %spawnPosition !$= "" ) {
|
||||
$SkiFreeYeti.player.schedule(0, setTransform, %spawnPosition);
|
||||
}
|
||||
}
|
||||
|
||||
function SkiFreeGame::AI_Yeti(%game, %client, %player) {
|
||||
// always face the stalked player (if they still exist)
|
||||
if( isObject(%client.stalkPlayer) ) {
|
||||
%client.aimAt(%client.stalkPlayer.getWorldBoxCenter());
|
||||
}
|
||||
|
||||
if( %player.AI_meantToLaunch == 0 ) {
|
||||
// yeti only has one thing on his mind
|
||||
%player.setInventory(ShockLance,1);
|
||||
%player.setInventory(Disc, 0);
|
||||
%player.schedule(0, use, Shocklance);
|
||||
%player.AI_meantToLaunch = 1;
|
||||
|
||||
// remove this shit and make the yeti fuck people up directly by doing a direct velocity check
|
||||
//%client.clientDetected($SkiFreeYeti.stalkClient);
|
||||
//%client.stepEngage($SkiFreeYeti.stalkClient);
|
||||
|
||||
return 20;
|
||||
}
|
||||
else if(
|
||||
%client.stalkClient.player != 0
|
||||
&& %client.stalkClient.player != %client.stalkPlayer
|
||||
) {
|
||||
// player respawned - yeti drops
|
||||
%player.setCloaked(true);
|
||||
%client.drop();
|
||||
|
||||
return -1;
|
||||
}
|
||||
else if( %client.throwTime > 600 ) {
|
||||
// you've made your point, now go eat the idiot
|
||||
%client.throwTime = 0;
|
||||
return 20;
|
||||
}
|
||||
else if( %client.throwTime > 0 ) {
|
||||
// throwing platform into the air
|
||||
%x = getWord(SpawnPlatform.position, 0);
|
||||
%y = getWord(SpawnPlatform.originalTransform, 1) + (%client.throwTime * %client.throwDir);
|
||||
|
||||
// put the spawn platform in the air
|
||||
%z = getWord(SpawnPlatform.originalTransform, 2);
|
||||
|
||||
// make an arc
|
||||
%arc = (-0.003 * mPow(%client.throwTime, 2)) + (1.3 * %client.throwTime);
|
||||
%z += %arc;
|
||||
|
||||
%spin = (%client.throwTime / 2) < 180 ? (%client.throwTime / 2) : 179;
|
||||
|
||||
SpawnPlatform.position = %x SPC %y SPC %z;
|
||||
SpawnPlatform.rotation = %client.throwDir SPC "0 0" SPC %spin;
|
||||
SpawnPlatform.setTransform(SpawnPlatform.getTransform());
|
||||
%client.throwTime++;
|
||||
return 10;
|
||||
}
|
||||
else if( %client.throwPlatform == 1 ) {
|
||||
// fuck this platform
|
||||
%client.throwDir = (getRandom(0, 100) % 2 == 0) ? 1 : -1;
|
||||
%client.throwTime = 1;
|
||||
%client.throwPlatform = 2;
|
||||
return 20;
|
||||
}
|
||||
else if( %client.yetiDone ) {
|
||||
// we're done, only task left is to despawn the yeti
|
||||
return 100;
|
||||
}
|
||||
else if( %client.yetiTaunt ) {
|
||||
// walk towards the corpse and taunt
|
||||
%player.setVelocity("0 0 0");
|
||||
%client.yetiTaunt = 0;
|
||||
%client.yetiDone = 0;
|
||||
%client.stepMove(%client.stalkPlayer.position, 5);
|
||||
schedule(1000, 0, AIPlay3DSound, %client, "gbl.obnoxious");
|
||||
return 100;
|
||||
}
|
||||
else if( !isObject(%client.stalkPlayer) || %client.stalkPlayer.getState() $= "Dead" ) {
|
||||
// player is dead, fuck it
|
||||
%player.setVelocity("0 0 0");
|
||||
%client.yetiDone = 1;
|
||||
%client.stepMove(%client.stalkPlayer.position, 5);
|
||||
return 100;
|
||||
}
|
||||
else if( %client.stunned ) {
|
||||
// yeti has been stunned, stun them for a few seconds
|
||||
%client.stunned = 0;
|
||||
%client.stunRecover += (3000 / 20);
|
||||
return 20;
|
||||
}
|
||||
else if( %client.stunRecover > 0 ) {
|
||||
// wait out the stun time
|
||||
%client.stunRecover--;
|
||||
return 20;
|
||||
}
|
||||
else {
|
||||
// workaround if we get deadstopped on the terrain
|
||||
if( %player.lastPosition == %player.position ) {
|
||||
%jetUp = 1;
|
||||
}
|
||||
|
||||
// accelerate towards the player at like 3000kph
|
||||
%objDir = VectorSub(%client.stalkPlayer.position, %player.position);
|
||||
%dist = VectorDist(%player.position, %client.stalkPlayer.position);
|
||||
%objDir = VectorNormalize(%objDir);
|
||||
|
||||
if( %dist > 300 ) {
|
||||
// cheat to get the yeti within your range
|
||||
%scale = %dist * 8.0;
|
||||
}
|
||||
else {
|
||||
// set scale based on how far away the player is (yeti gets closer but never actually reaches you)
|
||||
%scale = %dist * 5;
|
||||
}
|
||||
|
||||
if( %scale > 800 ) %scale = 800; // speed limit to keep the yeti from crashing t2
|
||||
|
||||
%objDir = VectorScale(%objDir, %scale);
|
||||
if( %jetUp ) {
|
||||
%objDir = getWords(%objDir, 0, 1) SPC (getWord(%objDir, 2) + 10);
|
||||
}
|
||||
%player.setVelocity(%objDir);
|
||||
%player.lastPosition = %player.position;
|
||||
|
||||
// increase the yeti's anger each second (if player is going less kph than yeti's anger, lance will hit)
|
||||
if( %client.anger $= "" ) {
|
||||
%client.anger = 190;
|
||||
}
|
||||
%client.angerTicks++;
|
||||
if( %client.angerTicks >= 1000 / 20 ) {
|
||||
%client.angerTicks = 0;
|
||||
%client.anger++;
|
||||
}
|
||||
|
||||
// too close to the yeti - check if the player dies
|
||||
if( %dist < 15 && getSimTime() - %client.zapTime >= 2500 ) {
|
||||
// yeti uses his shocklance
|
||||
%client.zapTime = getSimTime();
|
||||
%playerVelocity = VectorLen(%client.stalkPlayer.getVelocity()) * 3.6;
|
||||
|
||||
if( %playerVelocity < %client.anger ) {
|
||||
// yeti actually uses his shocklance (this can still miss for some reason)
|
||||
%client.pressFire();
|
||||
|
||||
%client.fireAttempts++;
|
||||
if( %client.fireAttempts == 3 ) {
|
||||
// on yeti's third attempt, he automatically hits you - not going to leave this up to the AI
|
||||
%player.playAudio(0, ShockLanceHitSound);
|
||||
|
||||
%p = new ShockLanceProjectile() {
|
||||
dataBlock = BasicShocker;
|
||||
initialDirection = %player.getMuzzleVector($WeaponSlot);
|
||||
initialPosition = %player.getMuzzlePoint($WeaponSlot);
|
||||
sourceObject = %player;
|
||||
sourceSlot = $WeaponSlot;
|
||||
targetId = %client.stalkPlayer;
|
||||
};
|
||||
MissionCleanup.add(%p);
|
||||
|
||||
%client.stalkPlayer.getDataBlock().damageObject(%client.stalkPlayer, %p.sourceObject, %client.stalkPlayer.getWorldBoxCenter(), 100, $DamageType::ShockLance);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// you're outside the yeti's speed range, so the attack misses. simulate a swing and a miss
|
||||
%player.playAudio($WeaponSlot, ShockLanceDryFireSound);
|
||||
%player.schedule(500, playAudio, 0, ShockLanceMissSound);
|
||||
|
||||
%p = new ShockLanceProjectile() {
|
||||
dataBlock = BasicShocker;
|
||||
initialDirection = %player.getMuzzleVector($WeaponSlot);
|
||||
initialPosition = %player.getMuzzlePoint($WeaponSlot);
|
||||
sourceObject = %player;
|
||||
sourceSlot = $WeaponSlot;
|
||||
};
|
||||
MissionCleanup.add(%p);
|
||||
}
|
||||
}
|
||||
|
||||
// check to see if the client is camping behind the spawn platform
|
||||
if( %client.throwPlatform == 0 ) {
|
||||
%distSpawn = VectorDist(%player.position, SpawnPlatform.position);
|
||||
if( %distSpawn < 100 ) {
|
||||
%client.rage++;
|
||||
if( %client.rage >= 5000 / 20 ) {
|
||||
// fuck this spawn platform, yeti is angry
|
||||
if( SpawnPlatform.originalTransform $= "" ) {
|
||||
SpawnPlatform.originalTransform = SpawnPlatform.getTransform();
|
||||
}
|
||||
messageAll(0, '~wfx/vehicles/tank_mortar_fire.wav');
|
||||
%client.throwPlatform = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
%client.rage = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 20;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,220 +0,0 @@
|
|||
// SkiFreeDatablock.cs
|
||||
// contains datablocks for SkiFree gametype
|
||||
|
||||
// datablocks should only load once
|
||||
if( !isObject(SkiFreeGateField) ) {
|
||||
|
||||
// special gate - gives an ugly white complexion - they look weird when you aren't playing so i assume nobody will actually use them in maps...
|
||||
datablock ForceFieldBareData(SkiFreeGateField) : defaultAllSlowFieldBare {
|
||||
fadeMS = 1000;
|
||||
baseTranslucency = 1.0; // if you were close enough to watch, it would look pretty cool, but you're not
|
||||
powerOffTranslucency = 0.2;
|
||||
powerOffColor = "1.0 1.0 1.0";
|
||||
|
||||
scrollSpeed = 1;
|
||||
};
|
||||
|
||||
// decorative gates
|
||||
datablock ForceFieldBareData(SkiFreeGateField1) : SkiFreeGateField {
|
||||
powerOffColor = "1 0 0";
|
||||
};
|
||||
datablock ForceFieldBareData(SkiFreeGateField2) : SkiFreeGateField {
|
||||
powerOffColor = "1 0.5 0";
|
||||
};
|
||||
datablock ForceFieldBareData(SkiFreeGateField3) : SkiFreeGateField {
|
||||
powerOffColor = "1 1 0";
|
||||
};
|
||||
datablock ForceFieldBareData(SkiFreeGateField4) : SkiFreeGateField {
|
||||
powerOffColor = "0 1 0";
|
||||
};
|
||||
datablock ForceFieldBareData(SkiFreeGateField5) : SkiFreeGateField {
|
||||
powerOffColor = "0 0 1";
|
||||
};
|
||||
datablock ForceFieldBareData(SkiFreeGateField6) : SkiFreeGateField {
|
||||
powerOffColor = "0.5 0 1";
|
||||
};
|
||||
datablock ForceFieldBareData(SkiFreeGateField7) : SkiFreeGateField {
|
||||
powerOffColor = "1 0 1";
|
||||
};
|
||||
|
||||
// triggers needed for game
|
||||
datablock TriggerData(SkiFreeTriggerSpawn) {
|
||||
tickPeriodMS = 50;
|
||||
};
|
||||
|
||||
datablock TriggerData(SkiFreeTriggerGate) {
|
||||
tickPeriodMS = 50;
|
||||
};
|
||||
|
||||
// you can't just summon an explosion; you need to blow something up. an overridden satchel charge will be blown up when i need an explosion
|
||||
datablock ItemData(SatchelChargeDeadstop) : SatchelChargeThrown
|
||||
{
|
||||
explosion = VehicleBombExplosion;
|
||||
underwaterExplosion = VehicleBombExplosion;
|
||||
maxDamage = 0.1;
|
||||
kickBackStrength = 0;
|
||||
armDelay = 1;
|
||||
computeCRC = false;
|
||||
};
|
||||
|
||||
// SkiFreeSpawnPlatform just explodes into a platform (though i didn't use the actual object wired to explode, that would just be tacky)
|
||||
datablock StaticShapeData(SkiFreeSpawnPlatform) {
|
||||
catagory = "SkiFree Objects";
|
||||
className = "Spawn Platform";
|
||||
isInvincible = true;
|
||||
needsNoPower = true;
|
||||
alwaysAmbient = true;
|
||||
shapeFile = "beacon.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(SkiFreeCustomGate) {
|
||||
catagory = "SkiFree Objects";
|
||||
className = "Gate Marker";
|
||||
isInvincible = true;
|
||||
needsNoPower = true;
|
||||
alwaysAmbient = true;
|
||||
shapeFile = "beacon.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(SkiFreeMapConverter) {
|
||||
catagory = "SkiFree Objects";
|
||||
className = "Map Converter";
|
||||
isInvincible = true;
|
||||
needsNoPower = true;
|
||||
alwaysAmbient = true;
|
||||
shapeFile = "beacon.dts";
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
function SkiFreeTriggerSpawn::onEnterTrigger(%this, %trigger, %player) {
|
||||
if( !$missionRunning ) return; // this check is needed so it doesn't call this at end of mission
|
||||
if( Game.class $= "SkiFreeGame" )
|
||||
Game.enterSpawnTrigger(%player);
|
||||
}
|
||||
|
||||
function SkiFreeTriggerSpawn::onTickTrigger(%this, %trigger) {
|
||||
// who dat
|
||||
}
|
||||
|
||||
function SkiFreeTriggerSpawn::onLeaveTrigger(%this, %trigger, %player) {
|
||||
if( !$missionRunning ) return; // this check is needed so it doesn't call this at end of mission
|
||||
if( Game.class $= "SkiFreeGame" )
|
||||
Game.leaveSpawnTrigger(%player);
|
||||
}
|
||||
|
||||
function SkiFreeTriggerGate::onEnterTrigger(%this, %trigger, %player) {
|
||||
if( !$missionRunning ) return; // this check is needed so it doesn't call this at end of mission
|
||||
if( Game.class $= "SkiFreeGame" )
|
||||
Game.enterGateTrigger(%trigger, %player);
|
||||
}
|
||||
|
||||
function SkiFreeTriggerGate::onTickTrigger(%this, %trigger) {
|
||||
// it's dat boi
|
||||
}
|
||||
|
||||
function SkiFreeTriggerGate::onLeaveTrigger(%this, %trigger, %player) {
|
||||
// o shit wut up
|
||||
}
|
||||
|
||||
function SatchelChargeDeadstop::onCollision(%data,%obj,%col) {
|
||||
// please don't try to pick up the exploding bomb, even if it's only decorative
|
||||
}
|
||||
|
||||
function SkiFreeSpawnPlatform::onAdd(%this, %obj) {
|
||||
// come back when we know where this object is
|
||||
%this.schedule(0, doAdd, %obj);
|
||||
}
|
||||
|
||||
function SkiFreeSpawnPlatform::doAdd(%this, %obj) {
|
||||
// delete SpawnPlatform from MissionCleanup
|
||||
if( isObject(SpawnPlatform) ) {
|
||||
for( %i = 0; %i < MissionCleanup.getCount(); %i++ ) {
|
||||
if( MissionCleanup.getObject(%i) == nameToID(SpawnPlatform) ) {
|
||||
SpawnPlatform.delete();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !isObject(SpawnPlatform) ) {
|
||||
%spawnPlatform = new InteriorInstance("SpawnPlatform") {
|
||||
position = %obj.position;
|
||||
rotation = "1 0 0 0";
|
||||
scale = "3 3 3";
|
||||
interiorFile = "bwall4.dif";
|
||||
showTerrainInside = "0";
|
||||
};
|
||||
MissionGroup.add(%spawnPlatform);
|
||||
}
|
||||
else {
|
||||
messageAll(0, "~wfx/powered/station_denied.wav");
|
||||
}
|
||||
|
||||
%obj.delete();
|
||||
}
|
||||
|
||||
function SkiFreeCustomGate::onAdd(%this, %obj) {
|
||||
Parent::onAdd(%this, %obj);
|
||||
|
||||
%obj.target = ""; // we don't need a target
|
||||
|
||||
if( %obj.gateNum__ $= "" ) {
|
||||
// automatically add dynamic fields if they aren't there
|
||||
if( %obj.gateNum__ $= "" ) %obj.gateNum__ = 0;
|
||||
if( %obj.isFinish__ $= "" )%obj.isFinish__ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function SkiFreeMapConverter::onAdd(%this, %obj) {
|
||||
%convert = false;
|
||||
// check spawnplatform - if it's not in missioncleanup, this is a misclick
|
||||
if( isObject(SpawnPlatform) ) {
|
||||
for( %i = 0; %i < MissionCleanup.getCount(); %i++ ) {
|
||||
if( MissionCleanup.getObject(%i) == nameToID(SpawnPlatform) ) {
|
||||
%convert = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !%convert ) {
|
||||
messageAll(0, "~wfx/powered/station_denied.wav");
|
||||
}
|
||||
else {
|
||||
// move the spawn platform into MissionGroup
|
||||
MissionGroup.add(SpawnPlatform);
|
||||
|
||||
// go find the gates
|
||||
for( %i = 1; %i < 420; %i++ ) {
|
||||
%gate = nameToID("GatePoint" @ %i);
|
||||
|
||||
if( !isObject(%gate) ) {
|
||||
if( %i == 1 ) {
|
||||
messageAll(0, "~wfx/powered/station_denied.wav");
|
||||
}
|
||||
else {
|
||||
%newObj.isFinish__ = "1";
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
%gatePos = getWords(%gate.position, 0, 1) SPC (getWord(%gate.position,2) - 25);
|
||||
|
||||
%newObj = new StaticShape() {
|
||||
position = %gatePos;
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "SkiFreeCustomGate";
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
|
||||
gateNum__ = %i;
|
||||
isFinish__ = "0";
|
||||
};
|
||||
MissionGroup.add(%newObj);
|
||||
}
|
||||
}
|
||||
|
||||
%obj.schedule(0, delete);
|
||||
}
|
||||
|
|
@ -1,295 +0,0 @@
|
|||
// SkiFreeOverrides.cs
|
||||
|
||||
package SkiFreeGame {
|
||||
|
||||
// players can only damage themselves. however they can apply impulse to others
|
||||
function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC) {
|
||||
//error("Armor::damageObject( "@%data@", "@%targetObject@", "@%sourceObject@", "@%position@", "@%amount@", "@%damageType@", "@%momVec@" )");
|
||||
%oldVector = %targetObject.getVelocity();
|
||||
%sourceClient = isObject(%sourceObject) ? %sourceObject.getOwnerClient() : 0; // don't hurt others
|
||||
|
||||
if( isObject(%targetObject.client) && %targetObject.client == $SkiFreeYeti ) {
|
||||
if( %damageType $= $DamageType::Disc ) {
|
||||
// stun the yeti
|
||||
$SkiFreeYeti.stunned = 1;
|
||||
%amount = 0;
|
||||
}
|
||||
|
||||
if( %damageType != 0 ) {
|
||||
// yeti don't take damage except from scriptkill
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// absolutely devasate someone hit by teh yeti
|
||||
if( %damageType == $DamageType::Shocklance ) {
|
||||
%amount = 100;
|
||||
%sourceClient.yetiTaunt = 1;
|
||||
|
||||
%targetObject.blowup();
|
||||
%targetObject.setVelocity("0 0 0");
|
||||
|
||||
%yetiKill = 1;
|
||||
}
|
||||
|
||||
// why did i even write this shite
|
||||
if( %damageType == $DamageType::Ground ) {
|
||||
Game.schedule(0, checkDeadstop, %targetObject, %oldVector);
|
||||
}
|
||||
|
||||
// check interference
|
||||
if( %damageType == $DamageType::Disc && %targetObject != %sourceObject ) {
|
||||
Game.schedule(0, checkInterference, %targetObject, %sourceObject, %oldVector);
|
||||
}
|
||||
|
||||
// players cannot damage each other (except the yeti who can destroy everything in its path)
|
||||
if( !%sourceClient || %targetObject == %sourceObject || %yetiKill ) {
|
||||
// copy/pasta from classix 1.5.2, with modifications
|
||||
|
||||
if(%targetObject.invincible || %targetObject.getState() $= "Dead")
|
||||
return;
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// z0dd - ZOD, 6/09/02. Check to see if this vehicle is destroyed,
|
||||
// if it is do no damage. Fixes vehicle ghosting bug. We do not
|
||||
// check for isObject here, destroyed objects fail it even though
|
||||
// they exist as objects, go figure.
|
||||
if(%damageType == $DamageType::Impact)
|
||||
if(%sourceObject.getDamageState() $= "Destroyed")
|
||||
return;
|
||||
|
||||
if (%targetObject.isMounted() && %targetObject.scriptKilled $= "")
|
||||
{
|
||||
%mount = %targetObject.getObjectMount();
|
||||
if(%mount.team == %targetObject.team)
|
||||
{
|
||||
%found = -1;
|
||||
for (%i = 0; %i < %mount.getDataBlock().numMountPoints; %i++)
|
||||
{
|
||||
if (%mount.getMountNodeObject(%i) == %targetObject)
|
||||
{
|
||||
%found = %i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (%found != -1)
|
||||
{
|
||||
if (%mount.getDataBlock().isProtectedMountPoint[%found])
|
||||
{
|
||||
// z0dd - ZOD, 5/07/04. Let players be damaged if gameplay changes in affect.
|
||||
if(!$Host::ClassicLoadPlayerChanges)
|
||||
{
|
||||
%mount.getDataBlock().damageObject(%mount, %sourceObject, %position, %amount, %damageType);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(%damageType != $DamageType::Laser && %damageType != $DamageType::Bullet && %damageType != $DamageType::Blaster)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%targetClient = %targetObject.getOwnerClient();
|
||||
if(isObject(%mineSC))
|
||||
%sourceClient = %mineSC;
|
||||
else
|
||||
%sourceClient = isObject(%sourceObject) ? %sourceObject.getOwnerClient() : 0;
|
||||
|
||||
%targetTeam = %targetClient.team;
|
||||
|
||||
//if the source object is a player object, player's don't have sensor groups
|
||||
// if it's a turret, get the sensor group of the target
|
||||
// if its a vehicle (of any type) use the sensor group
|
||||
if (%sourceClient)
|
||||
%sourceTeam = %sourceClient.getSensorGroup();
|
||||
else if(%damageType == $DamageType::Suicide)
|
||||
%sourceTeam = 0;
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
// z0dd - ZOD, 4/8/02. Check to see if this turret has a valid owner, if not clear the variable.
|
||||
else if(isObject(%sourceObject) && %sourceObject.getClassName() $= "Turret")
|
||||
{
|
||||
%sourceTeam = getTargetSensorGroup(%sourceObject.getTarget());
|
||||
if(%sourceObject.owner !$="" && (%sourceObject.owner.team != %sourceObject.team || !isObject(%sourceObject.owner)))
|
||||
{
|
||||
%sourceObject.owner = "";
|
||||
}
|
||||
}
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
else if( isObject(%sourceObject) &&
|
||||
( %sourceObject.getClassName() $= "FlyingVehicle" || %sourceObject.getClassName() $= "WheeledVehicle" || %sourceObject.getClassName() $= "HoverVehicle"))
|
||||
%sourceTeam = getTargetSensorGroup(%sourceObject.getTarget());
|
||||
else
|
||||
{
|
||||
if (isObject(%sourceObject) && %sourceObject.getTarget() >= 0 )
|
||||
{
|
||||
%sourceTeam = getTargetSensorGroup(%sourceObject.getTarget());
|
||||
}
|
||||
else
|
||||
{
|
||||
%sourceTeam = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// if teamdamage is off, and both parties are on the same team
|
||||
// (but are not the same person), apply no damage
|
||||
if(!$teamDamage && (%targetClient != %sourceClient) && (%targetTeam == %sourceTeam))
|
||||
return;
|
||||
|
||||
if(%targetObject.isShielded && %damageType != $DamageType::Blaster)
|
||||
%amount = %data.checkShields(%targetObject, %position, %amount, %damageType);
|
||||
|
||||
if(%amount == 0)
|
||||
return;
|
||||
|
||||
// Set the damage flash
|
||||
%damageScale = %data.damageScale[%damageType];
|
||||
if(%damageScale !$= "")
|
||||
%amount *= %damageScale;
|
||||
|
||||
// if the damage of a discjump would kill, override
|
||||
if( %damageType == $DamageType::Disc ) {
|
||||
%targetObject.hasDiscjumped = 1;
|
||||
if( %targetObject.getDamageLevel() + %amount > 0.66 ) {
|
||||
if( %targetObject.launchTime $= "" ) {
|
||||
%amount = (0.65 - %targetObject.getDamageLevel());
|
||||
if( %amount <= 0 ) return;
|
||||
}
|
||||
else {
|
||||
if( %targetObject.safetyFeature $= "" ) {
|
||||
%targetObject.safetyFeature = 1;
|
||||
messageClient(%targetClient, 0, 'NOT ENOUGH HEALTH FOR DISCJUMP~wfx/misc/red_alert_short.wav');
|
||||
}
|
||||
else {
|
||||
messageClient(%targetClient, 0, '~wfx/misc/red_alert_short.wav');
|
||||
}
|
||||
%targetObject.schedule(0, setVelocity, %oldVector);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%flash = %targetObject.getDamageFlash() + (%amount * 2);
|
||||
if (%flash > 0.75)
|
||||
%flash = 0.75;
|
||||
|
||||
%previousDamage = %targetObject.getDamagePercent();
|
||||
%targetObject.setDamageFlash(%flash);
|
||||
|
||||
%targetObject.applyDamage(%amount);
|
||||
Game.onClientDamaged(%targetClient, %sourceClient, %damageType, %sourceObject);
|
||||
|
||||
%targetClient.lastDamagedBy = %damagingClient;
|
||||
%targetClient.lastDamaged = getSimTime();
|
||||
|
||||
//now call the "onKilled" method if the client was... you know...
|
||||
if(%targetObject.getState() $= "Dead")
|
||||
{
|
||||
// where did this guy get it?
|
||||
%damLoc = %targetObject.getDamageLocation(%position);
|
||||
|
||||
// should this guy be blown apart?
|
||||
if( %damageType == $DamageType::Explosion ||
|
||||
%damageType == $DamageType::TankMortar ||
|
||||
%damageType == $DamageType::Mortar ||
|
||||
%damageType == $DamageType::MortarTurret ||
|
||||
%damageType == $DamageType::BomberBombs ||
|
||||
%damageType == $DamageType::SatchelCharge ||
|
||||
%damageType == $DamageType::Missile )
|
||||
{
|
||||
if( %previousDamage >= 0.35 ) // only if <= 35 percent damage remaining
|
||||
{
|
||||
%targetObject.setMomentumVector(%momVec);
|
||||
%targetObject.blowup();
|
||||
}
|
||||
}
|
||||
|
||||
// this should be funny...
|
||||
if( %damageType == $DamageType::VehicleSpawn )
|
||||
{
|
||||
%targetObject.setMomentumVector("0 0 1");
|
||||
%targetObject.blowup();
|
||||
}
|
||||
|
||||
// If we were killed, max out the flash
|
||||
%targetObject.setDamageFlash(0.75);
|
||||
|
||||
%damLoc = %targetObject.getDamageLocation(%position);
|
||||
Game.onClientKilled(%targetClient, %sourceClient, %damageType, %sourceObject, %damLoc);
|
||||
}
|
||||
else if ( %amount > 0.1 )
|
||||
{
|
||||
if( %targetObject.station $= "" && %targetObject.isCloaked() )
|
||||
{
|
||||
%targetObject.setCloaked( false );
|
||||
%targetObject.reCloak = %targetObject.schedule( 500, "setCloaked", true );
|
||||
}
|
||||
|
||||
playPain( %targetObject );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ForceFieldBareData::onAdd(%data, %obj) {
|
||||
// skip ForceFieldBareData::onAdd - keeps it from creating a physical zone
|
||||
GameBaseData::onAdd(%data, %obj);
|
||||
%obj.open();
|
||||
}
|
||||
|
||||
// can't get items back after tossing them - this prevents cheating the handicap modes
|
||||
function EnergyPack::onCollision(%data, %obj, %col) {}
|
||||
function Disc::onCollision(%data, %obj, %col) {}
|
||||
function DiscAmmo::onCollision(%data, %obj, %col) {}
|
||||
function RepairKit::onCollision(%data, %obj, %col) {}
|
||||
function ShockLance::onCollision(%data, %obj, %col) {}
|
||||
|
||||
// no looting either
|
||||
function Armor::onCollision(%this,%obj,%col,%forceVehicleNode) {}
|
||||
|
||||
// turn the player to glass if they throw their repair kit away
|
||||
function ShapeBase::throwItem(%this, %data) {
|
||||
Parent::throwItem(%this, %data);
|
||||
if( %data $= RepairKit && %this.launchTime $= "" ) {
|
||||
// turn the player to glass
|
||||
%this.setDamageLevel(0.65);
|
||||
}
|
||||
}
|
||||
|
||||
// turn phasing on/off
|
||||
function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %playerVote) {
|
||||
Parent::serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %playerVote);
|
||||
|
||||
if( %client.isAdmin ) {
|
||||
Game.checkSkiFreeVote(%client, %typeName);
|
||||
}
|
||||
}
|
||||
|
||||
// turn off phasing (this is a client method used for listen servers only - you do NOT want this to stay on)
|
||||
function lobbyDisconnect() {
|
||||
Game.phaseThroughPlayers(false); // make sure this is OFF
|
||||
Parent::lobbyDisconnect();
|
||||
}
|
||||
|
||||
// show the things
|
||||
function toggleEditor(%make) {
|
||||
if( %make ) Game.runEditorTasks();
|
||||
Parent::toggleEditor(%make);
|
||||
}
|
||||
|
||||
// surpress yeti's quit message ($SkiFreeYeti will be 0 outside single player)
|
||||
function GameConnection::onDrop(%client, %reason) {
|
||||
if( %client == $SkiFreeYeti ) {
|
||||
%lastMissionType = $currentMissionType;
|
||||
$currentMissionType = "SinglePlayer";
|
||||
Parent::onDrop(%client, %reason);
|
||||
$currentMissionType = %lastMissionType;
|
||||
}
|
||||
else {
|
||||
Parent::onDrop(%client, %reason);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
|
@ -1,262 +0,0 @@
|
|||
// SkiFree Terrain List
|
||||
// Input File Date: 2021-03-29 19:50:29
|
||||
|
||||
// A good terrain has the following qualities:
|
||||
// - doesn't have a bunch of flat ground, even if it's right outside the mission bounds (high octane)
|
||||
// - is not fucking gigantic (stripmine, a bunch of other TR2 terrains)
|
||||
// - doesn't have a bunch of steep plateaus
|
||||
// - is not Magnum (a map where the fastest route is to discjump off a bunch of flat ridges)
|
||||
// use $TerrainTest to test a terrain locally
|
||||
|
||||
%i = -1; // %i++ is pre-increment for some reason; it's -1 so it can start at 0
|
||||
%j = -1; // %j++ is pre-increment for some reason; it's -1 so it can start at 0
|
||||
|
||||
// ACCEPTED TERRAINS (82)
|
||||
$SkiFreeTerrainList[%i++] = "Alcatraz.ter"; // yeah. seems fine
|
||||
$SkiFreeTerrainList[%i++] = "Attrition.ter";
|
||||
$SkiFreeTerrainList[%i++] = "BastardForge.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Broadside_nef.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Caldera.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Cardiac.ter";
|
||||
$SkiFreeTerrainList[%i++] = "CCD.ter";
|
||||
$SkiFreeTerrainList[%i++] = "CeleritySE.ter"; // I was on the fence on this one
|
||||
$SkiFreeTerrainList[%i++] = "Cinerarium.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Coppera.ter"; // this seems fine. just gotta keep jumping over the mesas? plateaus? fjordr? Whatever
|
||||
$SkiFreeTerrainList[%i++] = "DangerousCrossing_nef.ter"; // this level is fine
|
||||
$SkiFreeTerrainList[%i++] = "DeathBirdsFly.ter";
|
||||
$SkiFreeTerrainList[%i++] = "DesertofDeath_nef.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Embers.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Euro4_Bleed.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Euro4_Dissention.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Euro4_FrozenHope.ter"; // seems fine?
|
||||
$SkiFreeTerrainList[%i++] = "Gorgon.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Hildebrand.ter";
|
||||
$SkiFreeTerrainList[%i++] = "icedagger.ter";
|
||||
$SkiFreeTerrainList[%i++] = "jaggedclaw.ter";
|
||||
$SkiFreeTerrainList[%i++] = "LavaGods.ter"; // this is fine
|
||||
$SkiFreeTerrainList[%i++] = "Magellan.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Magmatic.ter"; // a bit on the hard side
|
||||
$SkiFreeTerrainList[%i++] = "Oasis.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Ocular.ter";
|
||||
$SkiFreeTerrainList[%i++] = "PlanetX2.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Raindance_nef.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer1.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer10.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer2.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer4.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer5.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer6.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer7.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer8.ter";
|
||||
$SkiFreeTerrainList[%i++] = "RandomTer9.ter"; // this canyon works somehow
|
||||
$SkiFreeTerrainList[%i++] = "Respite.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Rollercoaster_nef.ter"; // unlike most canyon maps this actually turns out to be skiiable
|
||||
$SkiFreeTerrainList[%i++] = "rst_Astro.ter";
|
||||
$SkiFreeTerrainList[%i++] = "rst_bittergorge.ter";
|
||||
$SkiFreeTerrainList[%i++] = "rst_crumpie.ter";
|
||||
$SkiFreeTerrainList[%i++] = "rst_FaceCrossing.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Rst_ScorchedEarth.ter"; // it's fine
|
||||
$SkiFreeTerrainList[%i++] = "rst_spit.ter"; // i got to gate 5 on a discless discjump launch run
|
||||
$SkiFreeTerrainList[%i++] = "Rush.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S5_Centaur.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S5_Drache.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S5_Icedance.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S5_massive.ter"; // this is fine? I remember writing about deadstops but I don't see any?
|
||||
$SkiFreeTerrainList[%i++] = "S5_Mordacity.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S5_rst_misadventure.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S5_Sherman.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S8_rst_dogma.ter";
|
||||
$SkiFreeTerrainList[%i++] = "S8_rst_opus.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Sandstorm.ter";
|
||||
$SkiFreeTerrainList[%i++] = "SkinnyDip.ter"; // really wanted to use one of the TR2 maps. This has a big scale but also nice hills
|
||||
$SkiFreeTerrainList[%i++] = "SpinCycle.ter"; // this was borderline rejected
|
||||
$SkiFreeTerrainList[%i++] = "StarFallCTF2.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Starfallen.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TL_Drorck.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TL_RoughLand.ter"; // this is kinda a finicky terrain but it works
|
||||
$SkiFreeTerrainList[%i++] = "Tombstone.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-BeachBlitz.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Boss.ter"; // this level is acceptable
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Cinereous.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Damnation.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Deserted.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Frozen.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Harvester.ter"; // why did I take this one
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Os_Iris.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-Pandemonium.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-WilderZone.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL-WoodyMyrk.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL2_Crevice.ter";
|
||||
$SkiFreeTerrainList[%i++] = "TWL2_Frozenglory.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Wasteland.ter"; // whatever sure
|
||||
$SkiFreeTerrainList[%i++] = "WoodyMyrkSE.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Xtra_Bastage.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Xtra_SoupLadle.ter";
|
||||
$SkiFreeTerrainList[%i++] = "Xtra_ThunderGiant.ter"; // this map is garbage but it's fun to try to ski on it
|
||||
$SkiFreeTerrainList[%i++] = "Xtra_VanDamned.ter";
|
||||
|
||||
// SUPERHARD (APRIL FOOLS) (6)
|
||||
$SkiFreeTerrainListSuperHard[%j++] = "Confusco.ter"; // WAY too big.
|
||||
$SkiFreeTerrainListSuperHard[%j++] = "FrozenFury.ter"; // even the parts inside mission bounds are unskiiable garbage
|
||||
$SkiFreeTerrainListSuperHard[%j++] = "Hillside.ter"; // accepted into april fools set (though it really shouldn’t be – too many deadstops)
|
||||
$SkiFreeTerrainListSuperHard[%j++] = "TL_Skylight.ter";
|
||||
$SkiFreeTerrainListSuperHard[%j++] = "TWL-Katabatic.ter"; // oob still bad. this was accepted into april fools because you always need a katabatic joke somewhere
|
||||
$SkiFreeTerrainListSuperHard[%j++] = "Xtra_Stripmine.ter";
|
||||
|
||||
// REJECTED FOR DEADSTOPS (61)
|
||||
//$SkiFreeTerrainList[%i++] = "Abominable.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "AcidRain.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "AgentsOfFortune.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "AshesToAshes.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Casern_Cavite.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "DustToDust.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Equinox.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Extra_Badlands1.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Firestorm.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Flashpoint.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Fracas.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Gauntlet.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Gehenna.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Haven.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "HO_Badlands.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "HO_Desert.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "HO_Ice.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "HO_Lush.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "IceBound.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Invictus.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "MapAssets.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Masada.ter"; // tiny dicked map
|
||||
//$SkiFreeTerrainList[%i++] = "mmd.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "MoonDance2.ter"; // too many deadstop splotches
|
||||
//$SkiFreeTerrainList[%i++] = "Octane.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Overreach.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "PhasmaDust.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Pyroclasm.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Quagmire.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Recalescence.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Reversion.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "RiverDance.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "rst_isledebatalla.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SC_Badlands.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SC_Desert.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SC_Ice.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SC_Lush.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SC_Night.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SC_Normal.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Scarabrae_nef.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Sirocco.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SolsDescent.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SunDried.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "ThinIce.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TL_MuddySwamp.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Training1.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Training2.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Training3.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Training4.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TreasureIsland.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL_Crossfire.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-BaNsHee.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Curtilage.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Horde.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Neve.ter"; // it's trace amounts but they're in places you would probably do routes
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-NoShelter.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Slapdash.ter"; // crapdash
|
||||
//$SkiFreeTerrainList[%i++] = "TWL2_Ruined.ter"; // looks like a decent terrain but isn’t
|
||||
//$SkiFreeTerrainList[%i++] = "Tyre.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_StarFall_T1.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_ziggurat.ter";
|
||||
|
||||
// REJECTED FOR BEING UNSKIIABLE (57)
|
||||
//$SkiFreeTerrainList[%i++] = "Archipelago.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Bunkered.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "cloak.ter"; // the terrain is just too big for a fun race
|
||||
//$SkiFreeTerrainList[%i++] = "CompUSA_Melee.ter"; // the hill is causing too much grief and the rest of the map doesn’t have enough value to justify it
|
||||
//$SkiFreeTerrainList[%i++] = "Crater71.ter"; // this almost always generates something very unfun
|
||||
//$SkiFreeTerrainList[%i++] = "DBS_Smoothed.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "EB_Hades.ter"; // not only is it extreme but you kinda have trouble reading the terrain too
|
||||
//$SkiFreeTerrainList[%i++] = "Escalade.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Euro_Drifts_SE.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Geothermal.ter"; // spawn is usually on the plateau. It can generate good starts and bad starts but it's usually a mess
|
||||
//$SkiFreeTerrainList[%i++] = "GodsRift.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "HillKing.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Hoth.ter"; // why would you name a terrain hoth if it isn't snowy
|
||||
//$SkiFreeTerrainList[%i++] = "IceGiant.ter"; // terrain is kinda extreme
|
||||
//$SkiFreeTerrainList[%i++] = "IceRidge_nef.ter"; // canyons are just bad for this
|
||||
//$SkiFreeTerrainList[%i++] = "Insalubria.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "JacobsLadder.ter"; // hills are WAY too extreme
|
||||
//$SkiFreeTerrainList[%i++] = "Minotaur.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "mountking.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "norty.ter"; // too extreme
|
||||
//$SkiFreeTerrainList[%i++] = "Pariah.ter"; // these hills are too fucking steep
|
||||
//$SkiFreeTerrainList[%i++] = "Pariah2.ter"; // ditto
|
||||
//$SkiFreeTerrainList[%i++] = "PuliVeivari.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "RandomTer3.ter"; // canyon fractal
|
||||
//$SkiFreeTerrainList[%i++] = "Rasp.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "RavineV.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Rimehold.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "rst_SimpleFlagArena.ter"; // literally squares
|
||||
//$SkiFreeTerrainList[%i++] = "S5_rst_hawkingheat.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "S5_rst_reynard.ter"; // this map is pushing the bounds of variance
|
||||
//$SkiFreeTerrainList[%i++] = "S5_rst_silenus.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "S8_zilch.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Sanctuary.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "ShockRidge.ter"; // not a fan of these canyon levels
|
||||
//$SkiFreeTerrainList[%i++] = "Snowblind_nef.ter"; // already knew this is a bad idea before I even started
|
||||
//$SkiFreeTerrainList[%i++] = "Stonehenge_nef.ter"; // kryand tried to tell me this was a skiiable terrain. so I put the flags in different places. he no longer believes it's a skiiable terrain
|
||||
//$SkiFreeTerrainList[%i++] = "Surreal.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Talus.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Titan.ter"; // why did I even open this. probably not stupid enough as a terrain choice for april fools
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Abaddon.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-BeggarsRun.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Chokepoint.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Clusterfuct.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Desiccator.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Euro_Feign.ter"; // come on man
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Frostclaw.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Runenmacht.ter"; // nah
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-SubZero.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "UltimaThule.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Underhill.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "WhiteDwarf.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Whiteout.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_Birthright.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_Crown.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_DesertedSE.ter"; // This is a VERY jagged terrain.
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_Voodoo.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_Xerxes.ter";
|
||||
|
||||
// REJECTED FOR SOME OTHER REASON (14)
|
||||
//$SkiFreeTerrainList[%i++] = "Chasmaclysmic.ter"; // this level is really kinda boring if it spawns right (which it can not do)
|
||||
//$SkiFreeTerrainList[%i++] = "DMP_Pantheon.ter"; // there isn't enough value to this map to risk deadstopping
|
||||
//$SkiFreeTerrainList[%i++] = "Lakefront.ter"; // just kinda hate this map tbh
|
||||
//$SkiFreeTerrainList[%i++] = "Moonwalk.ter"; // magnum-like terrain
|
||||
//$SkiFreeTerrainList[%i++] = "MyrkWood.ter"; // we don't need this when we have woodymyrk
|
||||
//$SkiFreeTerrainList[%i++] = "Paranoia.ter"; // this map is basically flat garbage with a few hills to get in your way
|
||||
//$SkiFreeTerrainList[%i++] = "Ramparts.ter"; // biased against copyright violation map
|
||||
//$SkiFreeTerrainList[%i++] = "rst_agroleon.ter"; // the outer half of the terrain is too flat. and I deadstopped somewhere weird
|
||||
//$SkiFreeTerrainList[%i++] = "rst_dermcity.ter"; // whatever the fuck this is doesn't seem good for this
|
||||
//$SkiFreeTerrainList[%i++] = "TL_Magnum.ter"; // the best route is “discjump and keep landing on the flat parts at the top” – this is not compelling gameplay
|
||||
//$SkiFreeTerrainList[%i++] = "Training5.ter"; // Terrain is WAY too dark and you can't tell features on it.
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-Drifts.ter"; // there's nothing really to this map outside the mission bounds
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_AshenPowder.ter"; // can’t read that fucking terrain so i’m removing
|
||||
//$SkiFreeTerrainList[%i++] = "Xtra_Helion.ter"; // this is just a really boring terrain
|
||||
|
||||
// DUPLICATES (15)
|
||||
//$SkiFreeTerrainList[%i++] = "BeggarsRun.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Damnation.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Desiccator.ter"; // Things clearly seem to be at 4 plateaus of height. which doesn't make for good skiing.
|
||||
//$SkiFreeTerrainList[%i++] = "DX_Badlands.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "DX_Desert.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "DX_Ice.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Katabatic.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Ravine.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "S5-Icedance.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "S5-massive.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "S5-Mordacity.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "Slapdash.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "SubZero.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-BlueMoon.ter";
|
||||
//$SkiFreeTerrainList[%i++] = "TWL-DeadlyBirdsSong.ter"; // DBS_Smoothed.ter
|
||||
|
||||
$SkiFreeTerrainListMAX = %i;
|
||||
$SkiFreeTerrainListSuperHardMAX = %j;
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
package SkiFreeSinglePlayerShit {
|
||||
|
||||
// special loading for skifree maps
|
||||
function TrainingGui::startTraining( %this ) {
|
||||
%file = getField( TrainingMissionList.getValue(), 1 );
|
||||
|
||||
if( %file $= "SkiFree_Daily"
|
||||
|| %file $= "SkiFree_Randomizer"
|
||||
|| %file $= "SkiFreeZ_Championship_2021"
|
||||
) {
|
||||
MessagePopup( "STARTING MISSION", "Initializing, please wait..." );
|
||||
Canvas.repaint();
|
||||
cancelServerQuery();
|
||||
|
||||
$ServerName = "SkiFree - Single Player";
|
||||
|
||||
// setting $HostGameType to single player here keeps it off of the master server listing
|
||||
$HostGameType = "SinglePlayer";
|
||||
CreateServer( %file, "SkiFree" );
|
||||
|
||||
%playerPref = $pref::Player[$pref::Player::Current];
|
||||
%playerName = getField( %playerPref, 0 );
|
||||
%playerRaceGender = getField( %playerPref, 1 );
|
||||
%playerSkin = getField( %playerPref, 2 );
|
||||
%playerVoice = getField( %playerPref, 3 );
|
||||
%playerVoicePitch = getField( %playerPref, 4 );
|
||||
localConnect( %playerName, %playerRaceGender, %playerSkin, %playerVoice, %playerVoicePitch );
|
||||
}
|
||||
else {
|
||||
Parent::startTraining( %this );
|
||||
}
|
||||
}
|
||||
|
||||
// change the skifree challenge menu into the standard single player dialog
|
||||
function escapeFromGame()
|
||||
{
|
||||
if( $CurrentMission $= "SkiFree_Daily"
|
||||
|| $CurrentMission $= "SkiFree_Randomizer"
|
||||
|| $CurrentMission $= "SkiFreeZ_Championship_2021"
|
||||
) {
|
||||
Canvas.pushDialog( SinglePlayerEscapeDlg );
|
||||
}
|
||||
else {
|
||||
Parent::escapeFromGame();
|
||||
}
|
||||
}
|
||||
|
||||
// why would you put the i18n object ON THE FUCKING CLIENT OBJECT
|
||||
function SinglePlayerEscapeDlg::leaveGame( %this )
|
||||
{
|
||||
if( $CurrentMission $= "SkiFree_Daily" ) {
|
||||
%line = "Thank you for playing";
|
||||
|
||||
%client = ClientGroup.getObject(0);
|
||||
if( %client.bestTime != Game.trialDefaultTime ) {
|
||||
%line = %line @ ".\n\nDaily: " @ Game.terrain;
|
||||
%line = %line @ "\nTime: " @ %client.bestTime;
|
||||
%line = %line @ "\n\nVersion " @ $SkiFreeVersionString;
|
||||
|
||||
if( %client.bestHandicap !$= "" ) {
|
||||
%line = %line @ "\n" @ %client.bestHandicap;
|
||||
}
|
||||
}
|
||||
else {
|
||||
%line = %line @ "\nin The Daily.";
|
||||
}
|
||||
|
||||
Canvas.popDialog( SinglePlayerEscapeDlg );
|
||||
MessageBoxYesNo( "LEAVE GAME", %line, "forceFinish();", "$timeScale = 1;" );
|
||||
}
|
||||
else if( $CurrentMission $= "SkiFree_Randomizer" ) {
|
||||
Canvas.popDialog( SinglePlayerEscapeDlg );
|
||||
MessageBoxYesNo( "LEAVE GAME", "Are you sure? You'll never see this terrain again.", "forceFinish();", "$timeScale = 1;" );
|
||||
}
|
||||
else if( $CurrentMission $= "SkiFreeZ_Championship_2021" ) {
|
||||
%line = "Thank you for playing";
|
||||
|
||||
%client = ClientGroup.getObject(0);
|
||||
if( %client.bestTime != Game.trialDefaultTime ) {
|
||||
%line = %line @ ".\n\n" @ Game.terrain;
|
||||
%line = %line @ "\nTime: " @ %client.bestTime;
|
||||
%line = %line @ "\n\nVersion " @ $SkiFreeVersionString;
|
||||
|
||||
if( %client.bestHandicap !$= "" ) {
|
||||
%line = %line @ "\n" @ %client.bestHandicap;
|
||||
}
|
||||
}
|
||||
else {
|
||||
%line = %line @ "\nin the Championship.";
|
||||
}
|
||||
|
||||
Canvas.popDialog( SinglePlayerEscapeDlg );
|
||||
MessageBoxYesNo( "LEAVE GAME", %line, "forceFinish();", "$timeScale = 1;" );
|
||||
}
|
||||
else {
|
||||
Parent::leaveGame(%this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
activatePackage(SkiFreeSinglePlayerShit);
|
||||
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
|
@ -1 +0,0 @@
|
|||
Heightfield::add("General\tTab_general\tgeneral_min_height\t50\tgeneral_scale\t300\tgeneral_water\t0.000\tgeneral_centerx\t0\tgeneral_centery\t0");
|
||||
|
Before Width: | Height: | Size: 109 KiB |
|
|
@ -1,190 +0,0 @@
|
|||
$IRCClient::NickName = getField(wonGetAuthInfo(),0);
|
||||
$IRCClient::NickName = strReplace($IRCClient::NickName," ","_");
|
||||
$IRCClient::NickName = stripChars($IRCClient::NickName,"~@#$!+%/|^{&*()<>");
|
||||
|
||||
package t2csri_ircfix {
|
||||
function GetIRCServerList(%arg1) {
|
||||
return "IP:irc.arloria.net:6667";
|
||||
}
|
||||
function IRCClient::notify(%event)
|
||||
{
|
||||
if (isObject(ServerConnection) && getSubStr(%event,0,9) $= "IDIRC_ERR") return;
|
||||
Parent::notify(%event);
|
||||
}
|
||||
function IRCClient::away(%params)
|
||||
{
|
||||
%me = $IRCClient::people.getObject(0);
|
||||
%me.flags = %me.flags & ~$PERSON_AWAY;
|
||||
if (strlen(%params))
|
||||
{
|
||||
if ($IRCClient::awaytimeout)
|
||||
{
|
||||
cancel($IRCClient::awaytimeout);
|
||||
$IRCClient::awaytimeout = 0;
|
||||
}
|
||||
IRCClient::send("AWAY :" @ %params);
|
||||
} else IRCClient::send("AWAY");
|
||||
}
|
||||
function IRCTCP::onDisconnect(%this)
|
||||
{
|
||||
$IRCClient::state = IDIRC_DISCONNECTED;
|
||||
IRCClient::reset();
|
||||
//IRCClient::notify(IDIRC_ERR_DROPPED);
|
||||
parent::onDisconnect(%this);
|
||||
}
|
||||
function IRCClient::onVersion(%prefix,%params)
|
||||
{
|
||||
nextToken(%prefix,prefix,"!");
|
||||
parent::onVersion(%prefix,%params);
|
||||
}
|
||||
function IRCTCP::onConnected(%this)
|
||||
{
|
||||
IRCClient::newMessage("","IRCClient: Established TCP/IP connection");
|
||||
%me = $IRCClient::people.getObject(0);
|
||||
%me.displayName = $IRCClient::NickName;
|
||||
%me.setName(%me.displayName);
|
||||
$IRCClient::tcp.schedule(500, "send", "NICK " @ $IRCClient::NickName @ "\r\n");
|
||||
$IRCClient::tcp.schedule(500, "send", "USER " @ $IRCClient::NickName @ " x x :" @ $IRCClient::NickName @ "\r\n");
|
||||
$IRCClient::tcp.schedule(2000, "send", "WHOIS " @ $IRCClient::NickName @ "\r\n");
|
||||
$IRCClient::state = IDIRC_CONNECTING_WAITING;
|
||||
}
|
||||
function IRCClient::relogin()
|
||||
{
|
||||
if($IRCClient::state !$= IDIRC_CONNECTED)
|
||||
IRCClient::connect();
|
||||
%me = $IRCClient::people.getObject(0);
|
||||
%me.displayName = $IRCClient::NickName;
|
||||
%me.setName(%me.displayName);
|
||||
%me.tagged = %me.displayName;
|
||||
IRCClient::correctNick(%me);
|
||||
IRCClient::newMessage("","IRCClient: Reauthentication starting");
|
||||
$IRCClient::tcp.schedule(500, "send", "NICK " @ $IRCClient::NickName @ "\r\n");
|
||||
$IRCClient::tcp.schedule(500, "send", "USER " @ $IRCClient::NickName @ " x x :" @ $IRCClient::NickName @ "\r\n");
|
||||
$IRCClient::tcp.schedule(2000, "send", "WHOIS " @ $IRCClient::NickName @ "\r\n");
|
||||
$IRCClient::state = IDIRC_CONNECTING_WAITING;
|
||||
}
|
||||
function IRCClient::dispatch(%prefix,%command,%params)
|
||||
{
|
||||
if (%command == 378) {IRCClient::onConFrom(%prefix,%params); return true;}
|
||||
else parent::dispatch(%prefix,%command,%params);
|
||||
}
|
||||
function chatMemberPopup::add(%this,%name,%index) {
|
||||
if (%index == 10 || %index == 11) return;
|
||||
parent::add(%this,%name,%index);
|
||||
}
|
||||
function JoinChatDlg::onWake(%this)
|
||||
{
|
||||
if ($IRCClient::state $= IDIRC_CONNECTING_WAITING)
|
||||
MessageBoxOK("CONNECTING...","Waiting for IRC server to respond, please wait.");
|
||||
else
|
||||
parent::onWake(%this);
|
||||
}
|
||||
function ChatTabView::onSelect(%this,%obj,%name)
|
||||
{
|
||||
parent::onSelect(%this,%obj,%name);
|
||||
if (%name $= "welcome" && $IRCClient::channels.getObject(0) != %obj)
|
||||
{
|
||||
ChatPanel.setVisible(true);
|
||||
WelcomePanel.setVisible(false);
|
||||
ChatEditOptionsBtn.setVisible(false);
|
||||
}
|
||||
}
|
||||
function IRCClient::onConFrom(%prefix,%params)
|
||||
{
|
||||
//IP acquisition test... may remove
|
||||
//Krash-T2 Krash-T2 :is connecting from *@24.108.153.184 24.108.153.184
|
||||
if ($IPv4::InetAddress $= "" && getWord(%params,0) $= $IRCClient::people.getObject(0).displayName) $IPv4::InetAddress = getWord(%params,getWordCount(%params)-1);
|
||||
}
|
||||
function IRCClient::onBadNick(%prefix,%params)
|
||||
{
|
||||
$IRCClient::NickName = getField(wonGetAuthInfo(),0) @ "-"@getRandom(0,99);
|
||||
$IRCClient::NickName = strReplace($IRCClient::NickName," ","_");
|
||||
IRCClient::relogin();
|
||||
}
|
||||
function IRCClient::onNick(%prefix,%params)
|
||||
{
|
||||
%person = IRCClient::findPerson2(%prefix,false);
|
||||
if (%person) {
|
||||
%person.displayName = %params;
|
||||
%person.tagged = %params;
|
||||
IRCClient::correctNick(%person);
|
||||
ChatRoomMemberList_rebuild();
|
||||
}
|
||||
parent::onNick(%prefix,%params);
|
||||
|
||||
}
|
||||
function IRCClient::newMessage(%channel,%message)
|
||||
{
|
||||
//quick UE fix, rewrite later
|
||||
for (%i = 0;%i < getWordCount(%message);%i++) {
|
||||
%word = getWord(%message,%i);
|
||||
%first = strstr(%word,"<");
|
||||
if (%first != -1) {
|
||||
%word1 = getSubstr(%word,%first,strlen(%word));
|
||||
%second = strstr(%word1,">");
|
||||
if (%second == -1)
|
||||
%message = stripChars(%message,"<>");
|
||||
}
|
||||
}
|
||||
parent::newMessage(%channel,%message);
|
||||
}
|
||||
function IRCClient::setIdentity(%p,%ident)
|
||||
{
|
||||
parent::setIdentity(%p,%ident);
|
||||
if(%p.getName() !$= %p.displayName) %p.setName(%p.displayName);
|
||||
if(%p.untagged $= "")%p.untagged = %p.displayName;
|
||||
}
|
||||
function IRCClient::onMode(%prefix,%params)
|
||||
{
|
||||
parent::onMode(%prefix,%params);
|
||||
ChatRoomMemberList_rebuild();
|
||||
}
|
||||
function IRCClient::onJoinServer(%mission,%server,%address,%mayprequire,%prequire)
|
||||
{
|
||||
if(strstr(strlwr($IRCClient::currentChannel.getName(),"tribes")) == -1) return;
|
||||
parent::onJoinServer(%mission,%server,%address,%mayprequire,%prequire);
|
||||
}
|
||||
function IRCClient::onNameReply(%prefix,%params)
|
||||
{
|
||||
|
||||
%params = strreplace(%params,"~","@");
|
||||
%params = strreplace(%params,"&","@");
|
||||
%params = strreplace(%params,"*","@");
|
||||
%params = strreplace(%params,"%","@");
|
||||
%params = strreplace(%params,"^","@");
|
||||
parent::onNameReply(%prefix,%params);
|
||||
}
|
||||
function IRCClient::onPing(%prefix,%params)
|
||||
{
|
||||
//echo(%prefix SPC %params);
|
||||
if (!$PingStarted) {
|
||||
$IRCClient::tcp.schedule(1000, "send", "PONG " @ %params @ "\r\n");
|
||||
$PingStarted = true;
|
||||
} else $IRCClient::tcp.send("PONG " @ %params @ "\r\n");
|
||||
|
||||
}
|
||||
function IRCClient::onPart(%prefix,%params)
|
||||
{
|
||||
%params = firstWord(%params);
|
||||
parent::onPart(%prefix,%params);
|
||||
ChatRoomMemberList_rebuild();
|
||||
}
|
||||
function IRCClient::notify(%event)
|
||||
{
|
||||
if (%event $= IDIRC_CHANNEL_LIST) {
|
||||
JoinChatList.clear();
|
||||
for (%i = 0; %i < $IRCClient::numChannels; %i++)
|
||||
{
|
||||
switch$ ( $IRCClient::channelNames[%i] ) {
|
||||
case "#the_construct" or "#help" or "#welcome": %temp = 1;
|
||||
default: %temp = 0;
|
||||
}
|
||||
if (strStr(strlwr($IRCClient::channelNames[%i]),"tribes") != -1) %temp = 1;
|
||||
JoinChatList.addRow(%i, IRCClient::displayChannel( $IRCClient::channelNames[%i]) TAB $IRCClient::channelUsers[%i] TAB %temp );
|
||||
JoinChatList.setRowStyle( %i, %temp > 0 );
|
||||
}
|
||||
JoinChatList.sort();
|
||||
JoinChatName.onCharInput();
|
||||
} else parent::notify(%event);
|
||||
}
|
||||
}; activatePackage(t2csri_ircfix);
|
||||
|
|
@ -1,456 +0,0 @@
|
|||
// Tribes 2 Unofficial Authentication System
|
||||
// http://www.tribesnext.com/
|
||||
// Written by Krash
|
||||
// Copyright 2008 by Krash and the Tribes 2 Community System Reengineering Intitiative
|
||||
|
||||
// Master listing / Queries.
|
||||
|
||||
if ($Host::TN::beat $= "") $Host::TN::beat = 3; //Time between beats in minutes.
|
||||
if ($Host::TN::echo $= "") $Host::TN::echo = 1; //Enable the MS echoes.
|
||||
|
||||
|
||||
function NewsGui::onWake( %this )
|
||||
{
|
||||
Canvas.pushDialog( LaunchToolbarDlg );
|
||||
%this.pane = "News";
|
||||
NM_TabView.setSelected( 1 );
|
||||
}
|
||||
function NM_TabView::onAdd( %this )
|
||||
{
|
||||
%this.addSet( 1, "gui/shll_horztabbuttonB", "5 5 5", "50 50 0", "5 5 5" );
|
||||
%this.addTab(1,"NEWS",1);
|
||||
%this.addTab(2,"FORUMS");
|
||||
%this.setTabActive(2,0);
|
||||
%this.addTab(3,"DOWNLOADS");
|
||||
%this.setTabActive(3,0);
|
||||
}
|
||||
function NM_TabView::onSelect( %this, %id, %text )
|
||||
{
|
||||
NM_NewsPane.setVisible( %id == 1 );
|
||||
//NM_ForumPane.setVisible( %id == 2 );
|
||||
//NM_FilePane.setVisible( %id == 3 );
|
||||
NM_TabFrame.setAltColor( %id == 1 );
|
||||
|
||||
%ctrl = "NM_" @ NewsGui.pane @ "Pane";
|
||||
if ( isObject( %ctrl ) )
|
||||
%ctrl.onDeactivate();
|
||||
|
||||
switch ( %id )
|
||||
{
|
||||
case 1: // News
|
||||
NM_NewsPane.onActivate();
|
||||
}
|
||||
}
|
||||
function NM_NewsPane::onActivate(%this) {
|
||||
NewsGui.pane = "News";
|
||||
|
||||
}
|
||||
function NM_NewsPane::onDeactivate(%this) {}
|
||||
function NewsGui::setKey(%this) {}
|
||||
function LaunchNews() {
|
||||
if (!isObject(NewsGui)){
|
||||
new GuiChunkedBitmapCtrl(NewsGui) {
|
||||
profile = "GuiContentProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "height";
|
||||
position = "0 0";
|
||||
extent = "640 480";
|
||||
minExtent = "8 8";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
variable = "$ShellBackground";
|
||||
helpTag = "0";
|
||||
useVariable = "1";
|
||||
|
||||
new ShellPaneCtrl() {
|
||||
profile = "ShellPaneProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "height";
|
||||
position = "12 13";
|
||||
extent = "620 423";
|
||||
minExtent = "48 92";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
text = "TRIBESNEXT";
|
||||
maxLength = "255";
|
||||
noTitleBar = "0";
|
||||
|
||||
|
||||
new ShellTabFrame(NM_TabFrame) {
|
||||
profile = "ShellHorzTabFrameProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "height";
|
||||
position = "22 54";
|
||||
extent = "576 351";
|
||||
minExtent = "26 254";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
isVertical = "0";
|
||||
useCloseButton = "0";
|
||||
edgeInset = "0";
|
||||
};
|
||||
new ShellTabGroupCtrl(NM_TabView) {
|
||||
profile = "TabGroupProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "bottom";
|
||||
position = "30 25";
|
||||
extent = "560 29";
|
||||
minExtent = "38 29";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
glowOffset = "7";
|
||||
tabSpacing = "2";
|
||||
maxTabWidth = "150";
|
||||
stretchToFit = "0";
|
||||
};
|
||||
new GuiControl(NM_NewsPane) {
|
||||
profile = "GuiDefaultProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "height";
|
||||
position = "0 0";
|
||||
extent = "586 423";
|
||||
minExtent = "8 8";
|
||||
visible = "0";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
|
||||
new ShellFieldCtrl(NewsPanel) {
|
||||
profile = "ShellFieldProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "height";
|
||||
position = "31 92";
|
||||
extent = "559 315";
|
||||
minExtent = "16 18";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
|
||||
new ShellScrollCtrl() {
|
||||
profile = "NewScrollCtrlProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "height";
|
||||
position = "195 5";
|
||||
extent = "360 303";
|
||||
minExtent = "24 52";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
willFirstRespond = "1";
|
||||
hScrollBar = "alwaysOff";
|
||||
vScrollBar = "alwaysOn";
|
||||
constantThumbHeight = "0";
|
||||
defaultLineHeight = "15";
|
||||
childMargin = "0 2";
|
||||
fieldBase = "gui/shll_field";
|
||||
|
||||
new GuiScrollContentCtrl() {
|
||||
profile = "GuiDefaultProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "height";
|
||||
position = "4 6";
|
||||
extent = "336 291";
|
||||
minExtent = "8 8";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
|
||||
new GuiMLTextCtrl(NewsText) {
|
||||
profile = "NewTextEditProfile";
|
||||
horizSizing = "width";
|
||||
vertSizing = "bottom";
|
||||
position = "0 0";
|
||||
extent = "362 2376";
|
||||
minExtent = "8 8";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
lineSpacing = "2";
|
||||
allowColorChars = "0";
|
||||
maxChars = "-1";
|
||||
deniedSound = "InputDeniedSound";
|
||||
};
|
||||
};
|
||||
};
|
||||
new ShellScrollCtrl() {
|
||||
profile = "NewScrollCtrlProfile";
|
||||
horizSizing = "right";
|
||||
vertSizing = "height";
|
||||
position = "2 21";
|
||||
extent = "195 287";
|
||||
minExtent = "24 52";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
willFirstRespond = "1";
|
||||
hScrollBar = "alwaysOff";
|
||||
vScrollBar = "dynamic";
|
||||
constantThumbHeight = "0";
|
||||
defaultLineHeight = "15";
|
||||
childMargin = "0 3";
|
||||
fieldBase = "gui/shll_field";
|
||||
|
||||
new GuiScrollContentCtrl() {
|
||||
profile = "GuiDefaultProfile";
|
||||
horizSizing = "right";
|
||||
vertSizing = "bottom";
|
||||
position = "4 7";
|
||||
extent = "187 273";
|
||||
minExtent = "8 8";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
|
||||
new ShellTextList(NewsHeadlines) {
|
||||
profile = "ShellTextArrayProfile";
|
||||
horizSizing = "right";
|
||||
vertSizing = "bottom";
|
||||
position = "0 0";
|
||||
extent = "187 180";
|
||||
minExtent = "8 8";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
enumerate = "0";
|
||||
resizeCell = "1";
|
||||
columns = "0";
|
||||
fitParentWidth = "1";
|
||||
clipColumnText = "0";
|
||||
};
|
||||
};
|
||||
};
|
||||
new GuiTextCtrl() {
|
||||
profile = "ShellAltTextProfile";
|
||||
horizSizing = "right";
|
||||
vertSizing = "bottom";
|
||||
position = "12 6";
|
||||
extent = "72 20";
|
||||
minExtent = "8 8";
|
||||
visible = "1";
|
||||
hideCursor = "0";
|
||||
bypassHideCursor = "0";
|
||||
helpTag = "0";
|
||||
text = "HEADLINES:";
|
||||
longTextBuffer = "0";
|
||||
maxLength = "255";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
};
|
||||
} else LaunchTabView.viewTab( "TRIBESNEXT", NewsGui, 0 );
|
||||
}
|
||||
//================================================================
|
||||
|
||||
function queryTNServers(%filter,%mod,%maptype,%minplayers,%maxplayers,%maxBots,%flags) {
|
||||
|
||||
%server = "master.tribesnext.com:80";
|
||||
if (!isObject(TNbite))
|
||||
%bite = new TCPObject(TNbite){};
|
||||
else %bite = TNbite;
|
||||
%bite.mode = 0;
|
||||
%filename = "/list";
|
||||
if (%filter)
|
||||
%filename = "/list/"@%mod@"/"@%maptype@"/"@%minplayers@"/"@%maxplayers@"/"@%maxBots@"/"@%flags;
|
||||
if (%filter $= "types") {
|
||||
%filename = "/listtypes";
|
||||
%bite.mode = 2;
|
||||
} else queryFavoriteServers(); // Filtering fix, since the old master query isn't used.
|
||||
|
||||
%bite.get(%server, %filename);
|
||||
}
|
||||
|
||||
function queryMasterGameTypes(){
|
||||
clearGameTypes();
|
||||
clearMissionTypes();
|
||||
queryTNServers("types");
|
||||
}
|
||||
|
||||
function queryMasterServer(%port, %flags, %rulesSet, %missionType, %minPlayers, %maxPlayers, %maxBots, %regionMask, %maxPing, %minCpu, %filtFlags, %buddy )
|
||||
{
|
||||
if (%flags !$= "") queryTNServers(1,%rulesSet,%missionType,%minplayers,%maxplayers,%maxBots,%filtFlags SPC %buddy);
|
||||
else queryTNServers();
|
||||
}
|
||||
|
||||
function TNbite::onLine(%this, %line) {
|
||||
if (trim(%line) $= "") {
|
||||
if (!%this.primed) %this.primed = true;
|
||||
if (%this.mode != 5) return;
|
||||
}
|
||||
if (!%this.primed) return;
|
||||
|
||||
if (%this.mode == 1)
|
||||
switch (%line) { // heartbeats
|
||||
case 0: if ($Host::TN::echo) echo(" - Server added to list.");
|
||||
case 1: if ($Host::TN::echo) { echo(" - Your server could not be contacted.");
|
||||
echo(" - Check your IP / port configuration."); }
|
||||
case 2: if ($Host::TN::echo) echo(" - Heartbeat confirmed.");
|
||||
}
|
||||
else if (%this.mode == 2) //filter retrieval
|
||||
switch (firstWord(%line)) {
|
||||
case 0: addGameType( restWords(%line) );
|
||||
case 1: addMissionType( restWords(%line) );
|
||||
}
|
||||
else if (%this.mode == 5) // news retrieval
|
||||
NewsGui.addLine(%line);
|
||||
else // and finally, the server list...
|
||||
if ( strpos(%line,":") != -1 && strstr(%line,".") != -1) {
|
||||
querySingleServer( %line );
|
||||
if (!%this.fnd) %this.fnd = true;
|
||||
}
|
||||
}
|
||||
|
||||
function TNbite::onConnectFailed(%this) {
|
||||
if ($Host::TN::echo) echo("-- Could not connect to master server.");
|
||||
}
|
||||
|
||||
function TNbite::onDNSFailed(%this) {
|
||||
if ($Host::TN::echo) echo("-- Could not connect to DNS server.");
|
||||
}
|
||||
|
||||
function TNbite::onDisconnect(%this) {
|
||||
if (!%this.fnd && %this.mode == 0)
|
||||
if (!GMJ_Browser.rowCount())
|
||||
updateServerBrowserStatus( "No servers found.", 0 );
|
||||
%this.delete();
|
||||
}
|
||||
|
||||
function TNbite::get(%this, %server, %query)
|
||||
{
|
||||
%this.server = %server;
|
||||
%this.query = %query;
|
||||
%this.connect(%server);
|
||||
}
|
||||
|
||||
function TNbite::onConnected(%this)
|
||||
{
|
||||
if (%this.query !$= "") {
|
||||
%query = "GET " @ %this.query @ " HTTP/1.1\r\nHost: " @ %this.server @ "\r\nUser-Agent: Tribes 2\r\nConnection: close\r\n\r\n";
|
||||
%this.send(%query);
|
||||
}
|
||||
}
|
||||
|
||||
function NewsGui::addLine( %this, %line ) {
|
||||
%this = NewsText;
|
||||
if (firstWord(%line) $= "<tag>") {
|
||||
%line = setWord(%line,0,"<tag:"@%this.index++@">");
|
||||
NewsHeadlines.addRow(%this.index,stripMLControlChars(%line));
|
||||
}
|
||||
if (%line $= "#EOF") {NewsText.upToDate = true; NewsHeadlines.setSelectedRow(0); return;}
|
||||
%text = %this.getText();
|
||||
%line = detag( %line );
|
||||
%text = (%text $= "") ? %line : %text NL %line;
|
||||
%this.setText( %text );
|
||||
}
|
||||
|
||||
function NewsText::update( %this, %online ) {
|
||||
%this.setText("");
|
||||
NewsHeadlines.clear();
|
||||
%this.index = -1;
|
||||
if (%online) {
|
||||
%server = "www.tribesnext.com:80";
|
||||
if (!isObject(TNbite))
|
||||
%bite = new TCPObject(TNbite){};
|
||||
else %bite = TNbite;
|
||||
%bite.mode = 5;
|
||||
%filename = "/news";
|
||||
%bite.get(%server, %filename);
|
||||
}
|
||||
}
|
||||
function NewsHeadlines::onSelect( %this, %id, %text )
|
||||
{
|
||||
NewsText.scrollToTag( %id );
|
||||
}
|
||||
//================================================================
|
||||
package t2csri_webs {
|
||||
|
||||
function CheckEmail( %bool ) {
|
||||
if ($LaunchMode $= "Normal") return; // Do nothing for now
|
||||
parent::CheckEmail( %bool );
|
||||
}
|
||||
|
||||
function LaunchTabView::addLaunchTab( %this, %text, %gui, %makeInactive ) {
|
||||
// disable currently unused tabs
|
||||
if (%text $= "EMAIL" || %text $= "BROWSER") parent::addLaunchTab( %this, %text, %gui, 1 );
|
||||
else parent::addLaunchTab( %this, %text, %gui, %makeInactive );
|
||||
}
|
||||
function LaunchToolbarMenu::add(%this,%id,%text) {
|
||||
parent::add(%this,%id,%text);
|
||||
if ($PlayingOnline && %text $= "BROWSER") {
|
||||
LaunchToolbarMenu.add( 1, "TRAINING" );
|
||||
LaunchToolbarMenu.add( 2, "TRIBESNEXT" );
|
||||
}
|
||||
}
|
||||
|
||||
function OpenLaunchTabs( %gotoWarriorSetup ) {
|
||||
parent::OpenLaunchTabs( %gotoWarriorSetup );
|
||||
if ($PlayingOnline && !TrainingGui.added) {
|
||||
LaunchTabView.addLaunchTab( "TRAINING", TrainingGui );
|
||||
LaunchTabView.addLaunchTab( "TRIBESNEXT", NewsGui );
|
||||
LaunchNews();
|
||||
NewsText.update(1);
|
||||
TrainingGui.added = true;
|
||||
}
|
||||
}
|
||||
|
||||
function JoinSelectedGame() {
|
||||
if (($IPv4::InetAddress $= "" || strstr($IPv4::InetAddress,".") == -1) && $PlayingOnline) {
|
||||
messageBoxOK("IP ERROR","Your external address has not been set or is set incorrectly. \n\nAttempting to reset...");
|
||||
ipv4_getInetAddress();
|
||||
return;
|
||||
} else parent::JoinSelectedGame();
|
||||
}
|
||||
function ClientReceivedDataBlock(%index, %total)
|
||||
{
|
||||
DB_LoadingProgress.setValue( %index / %total );
|
||||
parent::ClientReceivedDataBlock(%index, %total);
|
||||
}
|
||||
|
||||
function CreateServer(%mission, %missionType) {
|
||||
parent::CreateServer(%mission, %missionType);
|
||||
if (!isActivePackage(t2csri_server)) exec("t2csri/serverGlue.cs");
|
||||
}
|
||||
|
||||
function StartHeartbeat() {
|
||||
if ($playingOnline) {
|
||||
if(isEventPending($TNBeat)) cancel($TNBeat);
|
||||
%server = "master.tribesnext.com:80";
|
||||
if ($Host::BindAddress !$= "")
|
||||
%path = "/add/" @ $Host::Port @"/"@ $Host::BindAddress;
|
||||
else %path = "/add/" @ $Host::Port;
|
||||
if (!isObject(TNbite))
|
||||
%bite = new TCPObject(TNbite){};
|
||||
else %bite = TNbite;
|
||||
%bite.mode = 1;
|
||||
%bite.get(%server, %path);
|
||||
if ($Host::TN::echo)
|
||||
echo("-- Sent heartbeat to TN Master. ("@%server@")");
|
||||
$TNBeat = schedule($Host::TN::beat*60000,0,"StartHeartBeat");
|
||||
} else parent::StartHeartbeat();
|
||||
}
|
||||
|
||||
function StopHeartbeat() {
|
||||
if ($playingOnline) {
|
||||
if(isEventPending($TNBeat)) cancel($TNBeat);
|
||||
} else parent::StartHeartbeat();
|
||||
}
|
||||
//================================================================
|
||||
};
|
||||
if (!isActivePackage(t2csri_webs)) activatepackage (t2csri_webs);
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
// Tribes 2 Unofficial Authentication System
|
||||
// http://www.tribesnext.com/
|
||||
// Written by Electricutioner/Thyth
|
||||
// Copyright 2008 by Electricutioner/Thyth and the Tribes 2 Community System Reengineering Intitiative
|
||||
|
||||
// Version 1.0 initialization and glue file (server side)
|
||||
|
||||
schedule(0, 0, exec, "t2csri/serverglue.cs");
|
||||
|
|
@ -1,87 +1,70 @@
|
|||
// Tribes 2 Unofficial Authentication System
|
||||
// http://www.tribesnext.com/
|
||||
// Written by Electricutioner/Thyth
|
||||
// Copyright 2008 by Electricutioner/Thyth and the Tribes 2 Community System Reengineering Intitiative
|
||||
|
||||
// Authentication Server Connector Version 1.0: 11/06/2008
|
||||
|
||||
function authConnect_findAuthServer()
|
||||
{
|
||||
if ($AuthServer::Address !$= "")
|
||||
return;
|
||||
echo("Looking up Authentication Server...");
|
||||
if (isObject(AuthConnection))
|
||||
{
|
||||
AuthConnection.disconnect();
|
||||
AuthConnection.delete();
|
||||
}
|
||||
new TCPObject(AuthConnection);
|
||||
|
||||
%data = "GET /auth HTTP/1.1\r\nHost: www.tribesnext.com\r\nUser-Agent: Tribes 2\r\nConnection: close\r\n\r\n";
|
||||
AuthConnection.data = %data;
|
||||
AuthConnection.connect("www.tribesnext.com:80");
|
||||
$AuthServer::Primed = 0;
|
||||
}
|
||||
|
||||
function AuthConnection::onLine(%this, %line)
|
||||
{
|
||||
if (%line == 411)
|
||||
return;
|
||||
if (trim(%line) $= "")
|
||||
{
|
||||
$AuthServer::Primed = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
if ($AuthServer::Primed)
|
||||
{
|
||||
$AuthServer::Address = %line;
|
||||
%this.disconnect();
|
||||
authConnect_verifyLookup();
|
||||
}
|
||||
}
|
||||
|
||||
function AuthConnection::onConnected(%this)
|
||||
{
|
||||
%this.send(%this.data);
|
||||
}
|
||||
|
||||
function authConnect_verifyLookup()
|
||||
{
|
||||
|
||||
if (getFieldCount($AuthServer::Address) != 2)
|
||||
{
|
||||
$AuthServer::Address = "";
|
||||
error("Authentication server lookup failed.");
|
||||
return;
|
||||
}
|
||||
%address = getField($AuthServer::Address, 0);
|
||||
%signature = getField($AuthServer::Address, 1);
|
||||
|
||||
%sha1sum = sha1sum(%address);
|
||||
%verifSum = t2csri_verify_auth_signature(%signature);
|
||||
while (strlen(%verifSum) < 40)
|
||||
%verifSum = "0" @ %verifSum;
|
||||
if (%sha1sum !$= %verifSum)
|
||||
{
|
||||
// signature verification failed... someone has subverted the auth server lookup
|
||||
error("Authentication server lookup returned an address with an invalid signature.");
|
||||
error("Unable to contact the authentication server.");
|
||||
$AuthServer::Address = "";
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo("Authentication server found at " @ %address @ ". Ready to authenticate.");
|
||||
$AuthServer::Address = %address;
|
||||
$AuthServer::Primed = "";
|
||||
}
|
||||
}
|
||||
|
||||
// perform signature verification to prove that the auth server has designated the
|
||||
// provided address
|
||||
function t2csri_verify_auth_signature(%sig)
|
||||
{
|
||||
rubyEval("tsEval '$temp=\"' + t2csri_verify_auth_signature('" @ %sig @ "').to_s(16) + '\";'");
|
||||
return $temp;
|
||||
}
|
||||
// Tribes 2 Unofficial Authentication System
|
||||
// http://www.tribesnext.com/
|
||||
// Written by Electricutioner/Thyth
|
||||
// Copyright 2008 by Electricutioner/Thyth and the Tribes 2 Community System Reengineering Intitiative
|
||||
|
||||
// Authentication Server Connector Version 1.0: 11/06/2008
|
||||
|
||||
function authConnect_findAuthServer()
|
||||
{
|
||||
if ($AuthServer::Address !$= "")
|
||||
return;
|
||||
|
||||
echo("Looking up Authentication Server...");
|
||||
|
||||
if (isObject(AuthConnection))
|
||||
{
|
||||
AuthConnection.disconnect();
|
||||
AuthConnection.delete();
|
||||
}
|
||||
|
||||
new HTTPObject(AuthConnection);
|
||||
AuthConnection.setHeader("Accept", "text/plain");
|
||||
AuthConnection.get("www.tribesnext.com", "auth");
|
||||
}
|
||||
|
||||
function AuthConnection::onLine(%this, %line)
|
||||
{
|
||||
if (getFieldCount(%line) != 2)
|
||||
return;
|
||||
|
||||
%address = getField(%line, 0);
|
||||
%signature = getField(%line, 1);
|
||||
|
||||
%sha1sum = sha1sum(%address);
|
||||
%verifSum = t2csri_verify_auth_signature(%signature);
|
||||
while (strlen(%verifSum) < 40)
|
||||
%verifSum = "0" @ %verifSum;
|
||||
|
||||
if (%sha1sum !$= %verifSum)
|
||||
{
|
||||
error("Authentication server lookup returned an address with an invalid signature.");
|
||||
error("Unable to contact the authentication server.");
|
||||
$AuthServer::Address = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
echo("Authentication server found at " @ %address @ ". Ready to authenticate.");
|
||||
$AuthServer::Address = %address;
|
||||
}
|
||||
}
|
||||
|
||||
function AuthConnection::onDisconnect(%this)
|
||||
{
|
||||
if ($AuthServer::Address $= "")
|
||||
{
|
||||
error("Authentication server lookup failed.");
|
||||
}
|
||||
|
||||
%this.delete();
|
||||
}
|
||||
|
||||
function AuthConnection::onConnectFailed(%this)
|
||||
{
|
||||
%this.delete();
|
||||
}
|
||||
|
||||
function AuthConnection::onDNSFailed(%this)
|
||||
{
|
||||
%this.delete();
|
||||
}
|
||||
|
|
@ -14,9 +14,9 @@ $Authentication::Settings::Timeout = 30000;
|
|||
|
||||
function AuthenticationInterface::onLine(%this, %line)
|
||||
{
|
||||
//warn(%line);
|
||||
if (isEventPending($Authentication::TransactionCompletionSchedule))
|
||||
cancel($Authentication::TransactionCompletionSchedule);
|
||||
|
||||
$Authentication::TransactionCompletionSchedule = schedule(700, 0, Authentication_transactionComplete);
|
||||
|
||||
if ($Authentication::Status::ActiveMode != 0)
|
||||
|
|
@ -102,12 +102,8 @@ function Authentication_transactionComplete()
|
|||
}
|
||||
else if (getWord(%buffer, 0) $= "CERT:")
|
||||
{
|
||||
%cert = getSubStr(%buffer, 0, strstr(%buffer, "\n"));
|
||||
%buffer = getSubStr(%buffer, strstr(%buffer, "\n") + 1, strlen(%buffer));
|
||||
%exp = getSubStr(%buffer, 0, (strstr(%buffer, "\n") == -1 ? strlen(%buffer) : strstr(%buffer, "\n")));
|
||||
|
||||
$Authentication::Status::LastCert = %cert;
|
||||
$Authentication::Status::LastExp = %exp;
|
||||
$Authentication::Status::LastCert = getRecord(%buffer, 0);
|
||||
$Authentication::Status::LastExp = getRecord(%buffer, 1);
|
||||
echo("Authentication: Successfully downloaded certificate and encrypted key.");
|
||||
}
|
||||
else
|
||||
|
|
@ -167,6 +163,7 @@ function Authentication_checkAvail()
|
|||
|
||||
if (isObject(AuthenticationInterface))
|
||||
AuthenticationInterface.delete();
|
||||
|
||||
new TCPObject(AuthenticationInterface);
|
||||
|
||||
AuthenticationInterface.data = "AVAIL\n";
|
||||
|
|
@ -188,6 +185,7 @@ function Authentication_checkName(%name)
|
|||
|
||||
if (isObject(AuthenticationInterface))
|
||||
AuthenticationInterface.delete();
|
||||
|
||||
new TCPObject(AuthenticationInterface);
|
||||
|
||||
AuthenticationInterface.data = "NAME\t" @ %name @ "\n";
|
||||
|
|
@ -209,6 +207,7 @@ function Authentication_recoverAccount(%payload)
|
|||
|
||||
if (isObject(AuthenticationInterface))
|
||||
AuthenticationInterface.delete();
|
||||
|
||||
new TCPObject(AuthenticationInterface);
|
||||
|
||||
AuthenticationInterface.data = "RECOVER\t" @ %payload @ "\n";
|
||||
|
|
@ -230,9 +229,11 @@ function Authentication_registerAccount(%payload)
|
|||
|
||||
if (isObject(AuthenticationInterface))
|
||||
AuthenticationInterface.delete();
|
||||
|
||||
new TCPObject(AuthenticationInterface);
|
||||
|
||||
AuthenticationInterface.data = "SIGN\t" @ %payload @ "\n";
|
||||
|
||||
AuthenticationInterface.connect($AuthServer::Address);
|
||||
$Authentication::TransactionCompletionSchedule = schedule($Authentication::Settings::Timeout, 0, Authentication_transactionComplete);
|
||||
}
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
// Tribes 2 Unofficial Authentication System
|
||||
// http://www.tribesnext.com/
|
||||
// Written by Electricutioner/Thyth
|
||||
// Copyright 2008 by Electricutioner/Thyth and the Tribes 2 Community System Reengineering Intitiative
|
||||
|
||||
// Bare Bones Auto Update System Version 1.0: 11/06/2008
|
||||
|
||||
function authConnect_findAutoUpdater()
|
||||
{
|
||||
if ($AutoUpdater::Address !$= "")
|
||||
return;
|
||||
|
||||
if (isObject(AutoUpdateConnection))
|
||||
{
|
||||
AutoUpdateConnection.disconnect();
|
||||
AutoUpdateConnection.delete();
|
||||
}
|
||||
new TCPObject(AutoUpdateConnection);
|
||||
|
||||
%data = "GET /update HTTP/1.1\r\nHost: www.tribesnext.com\r\nUser-Agent: Tribes 2\r\nConnection: close\r\n\r\n";
|
||||
AutoUpdateConnection.connect("www.tribesnext.com:80");
|
||||
AutoUpdateConnection.schedule(1000, send, %data);
|
||||
}
|
||||
|
||||
function AutoUpdateConnection::onLine(%this, %line)
|
||||
{
|
||||
if (!$AutoUpdater::UpdateFound)
|
||||
{
|
||||
$AutoUpdater::Address = %line;
|
||||
%this.disconnect();
|
||||
autoUpdate_verifyLookup();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isEventPending($AutoUpdate::LastLineSch))
|
||||
cancel($AutoUpdate::LastLineSch);
|
||||
$AutoUpdate::LastLineSch = autoUpdate_applyUpdate();
|
||||
if ($AutoUpdate::UpdateStarted)
|
||||
$AutoUpdate::Buffer = $AutoUpdate::Buffer @ "\n" @ %line;
|
||||
else if (strlen(%line) == 0)
|
||||
$AutoUpdate::UpdateStarted = 1;
|
||||
}
|
||||
}
|
||||
|
||||
function autoUpdate_verifyLookup()
|
||||
{
|
||||
if (getFieldCount($AutoUpdate::Address) != 2)
|
||||
{
|
||||
$AutoUpdater::Address = "";
|
||||
error("No valid update address found.");
|
||||
return;
|
||||
}
|
||||
%address = getField($AutoUpdater::Address, 0);
|
||||
%signature = getField($AutoUpdater::Address, 1);
|
||||
|
||||
%sha1sum = sha1sum(%address);
|
||||
if (%sha1sum !$= t2csri_verify_update_signature(%signature))
|
||||
{
|
||||
// signature verification failed... someone has subverted the auth server lookup
|
||||
error("Auto update lookup returned an address with an invalid signature.");
|
||||
error("Unable to download update without a correct signature.");
|
||||
$AutoUpdater::Address = "";
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo("New update found at " @ %address @ ". Ready to download.");
|
||||
$AutoUpdater::Address = %address;
|
||||
$AutoUpdater::UpdateFound = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// perform signature verification to prove that the update server has designated the
|
||||
// provided URL for a download, we don't want people injecting arbitrary code into
|
||||
// user installations
|
||||
function t2csri_verify_update_signature(%sig)
|
||||
{
|
||||
rubyEval("tsEval '$temp=\"' + t2csri_verify_update_signature('" @ %sig @ "') + '\";'");
|
||||
return $temp;
|
||||
}
|
||||
|
||||
function autoUpdate_performUpdate()
|
||||
{
|
||||
if ($AutoUpdater::Address $= "")
|
||||
return;
|
||||
|
||||
if (isObject(AutoUpdateConnection))
|
||||
{
|
||||
AutoUpdateConnection.disconnect();
|
||||
AutoUpdateConnection.delete();
|
||||
}
|
||||
new TCPObject(AutoUpdateConnection);
|
||||
|
||||
%host = getSubStr($AutoUpdater::Address, 0, strstr("/"));
|
||||
%uri = getSubStr($AutoUpdater::Address, strlen(%host), strlen($AutoUpdater::Address));
|
||||
|
||||
%data = "GET " @ %uri @ " HTTP/1.1\nHost: " @ %host @ "\nUser-Agent: Tribes 2\nConnection: close\n\n";
|
||||
AutoUpdateConnection.connect(%host);
|
||||
AutoUpdateConnection.schedule(1000, send, %data);
|
||||
}
|
||||
|
||||
function autoUpdate_applyUpdate()
|
||||
{
|
||||
new FileObject(AutoUpdateFile);
|
||||
AutoUpdateFile.openForWrite("autoUpdate.rb");
|
||||
AutoUpdateFile.writeline($AutoUpdate::Buffer);
|
||||
AutoUpdateFile.close();
|
||||
AutoUpdateFile.delete();
|
||||
|
||||
rubyExec("autoUpdate.rb");
|
||||
}
|
||||