Merge pull request #9 from exogen/chore/updated-GameData-asset-export

re-export new GameData folder from fresh QoL install, updated DynamixThreeSpaceBlenderAddon
This commit is contained in:
Brian Beck 2025-11-30 16:47:13 -08:00 committed by GitHub
commit 69aa6158f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7281 changed files with 105218 additions and 119370 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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.

View file

@ -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 ---

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

View file

@ -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.
======================================

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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");

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

View file

@ -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);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

File diff suppressed because it is too large Load diff

View file

@ -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");

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

View file

@ -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);

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

View file

@ -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.

View file

@ -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 ---

View file

@ -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";

View file

@ -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";
}

View file

@ -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";

View file

@ -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) : "")
;
}
}
}

View file

@ -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 doesnt 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 shouldnt 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 isnt
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,cant read that fucking terrain so im 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 TERRAIN FLAT VARIANCE OVERRIDE RESULT REVIEW
2 Abominable.ter Yes Yes Reject
3 AcidRain.ter Yes No Reject
4 AgentsOfFortune.ter Yes Yes Reject
5 Alcatraz.ter Trace No Accept yeah. seems fine
6 Archipelago.ter No Yes Reject
7 AshesToAshes.ter Yes Yes Reject
8 Attrition.ter Trace No Accept
9 BastardForge.ter No No Accept
10 BeggarsRun.ter Duplicate Duplicate Duplicate
11 Broadside_nef.ter No No Accept
12 Bunkered.ter No Yes Reject
13 Caldera.ter No No Accept
14 Cardiac.ter No No Accept
15 Casern_Cavite.ter Yes Yes Reject
16 CCD.ter Trace No Accept
17 CeleritySE.ter Trace No Accept I was on the fence on this one
18 Chasmaclysmic.ter Trace Kinda Yes Reject this level is really kinda boring if it spawns right (which it can not do)
19 Cinerarium.ter Trace No Accept
20 cloak.ter No Yes Reject the terrain is just too big for a fun race
21 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
22 Confusco.ter No Yes Superhard WAY too big.
23 Coppera.ter No No Accept this seems fine. just gotta keep jumping over the mesas? plateaus? fjordr? Whatever
24 Crater71.ter No Yes Reject this almost always generates something very unfun
25 Damnation.ter Duplicate Duplicate Duplicate
26 DangerousCrossing_nef.ter No No Accept this level is fine
27 DBS_Smoothed.ter Trace Yes Reject
28 DeathBirdsFly.ter Trace No Accept
29 DesertofDeath_nef.ter No No Accept
30 Desiccator.ter Duplicate Duplicate Duplicate Things clearly seem to be at 4 plateaus of height. which doesn't make for good skiing.
31 DMP_Pantheon.ter Trace Kinda Yes Reject there isn't enough value to this map to risk deadstopping
32 DustToDust.ter Yes Yes Reject
33 DX_Badlands.ter Duplicate Duplicate Duplicate
34 DX_Desert.ter Duplicate Duplicate Duplicate
35 DX_Ice.ter Duplicate Duplicate Duplicate
36 EB_Hades.ter No Yes Reject not only is it extreme but you kinda have trouble reading the terrain too
37 Embers.ter Trace No Accept
38 Equinox.ter Yes No Reject
39 Escalade.ter No Yes Reject
40 Euro_Drifts_SE.ter Trace Yes Reject
41 Euro4_Bleed.ter Trace No Accept
42 Euro4_Dissention.ter Trace No Accept
43 Euro4_FrozenHope.ter No No Accept seems fine?
44 Extra_Badlands1.ter Yes Likely Reject
45 Firestorm.ter Yes Reject
46 Flashpoint.ter Yes Reject
47 Fracas.ter Yes Reject
48 FrozenFury.ter No Yes Superhard even the parts inside mission bounds are unskiiable garbage
49 Gauntlet.ter Yes No Reject
50 Gehenna.ter Yes Reject
51 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
52 GodsRift.ter No Yes Reject
53 Gorgon.ter No No Accept
54 Haven.ter Yes Kinda Reject
55 Hildebrand.ter No No Accept
56 HillKing.ter No Yes Reject
57 Hillside.ter Yes Yes Superhard accepted into april fools set (though it really shouldn’t be – too many deadstops)
58 HO_Badlands.ter Yes Reject
59 HO_Desert.ter Yes Reject
60 HO_Ice.ter Yes Reject
61 HO_Lush.ter Yes Reject
62 Hoth.ter No Yes Yes Reject why would you name a terrain hoth if it isn't snowy
63 IceBound.ter Yes Reject
64 icedagger.ter No No Accept
65 IceGiant.ter No Yes Reject terrain is kinda extreme
66 IceRidge_nef.ter No Yes Reject canyons are just bad for this
67 Insalubria.ter No Yes Reject
68 Invictus.ter Yes Reject
69 JacobsLadder.ter Trace Yes Reject hills are WAY too extreme
70 jaggedclaw.ter No No Accept
71 Katabatic.ter Duplicate Duplicate Duplicate
72 Lakefront.ter Trace Likely Yes Reject just kinda hate this map tbh
73 LavaGods.ter No No Accept this is fine
74 Magellan.ter No No Accept
75 Magmatic.ter Trace No Accept a bit on the hard side
76 MapAssets.ter Yes Reject
77 Masada.ter Yes Reject tiny dicked map
78 Minotaur.ter No Yes Reject
79 mmd.ter Yes Reject
80 MoonDance2.ter Yes No Reject too many deadstop splotches
81 Moonwalk.ter No No Yes Reject magnum-like terrain
82 mountking.ter No Yes Reject
83 MyrkWood.ter No No Yes Reject we don't need this when we have woodymyrk
84 norty.ter No Yes Reject too extreme
85 Oasis.ter No No Accept
86 Octane.ter Yes Reject
87 Ocular.ter No No Accept
88 Overreach.ter Yes Yes Reject
89 Paranoia.ter Trace Kinda Yes Reject this map is basically flat garbage with a few hills to get in your way
90 Pariah.ter Trace Yes Reject these hills are too fucking steep
91 Pariah2.ter Trace Yes Reject ditto
92 PhasmaDust.ter Yes Reject
93 PlanetX2.ter Trace No Accept
94 PuliVeivari.ter No Yes Reject
95 Pyroclasm.ter Yes Reject
96 Quagmire.ter Yes Reject
97 Raindance_nef.ter No No Accept
98 Ramparts.ter No Likely Yes Reject biased against copyright violation map
99 RandomTer1.ter No No Accept
100 RandomTer10.ter No No Accept
101 RandomTer2.ter No No Accept
102 RandomTer3.ter No Yes Reject canyon fractal
103 RandomTer4.ter No No Accept
104 RandomTer5.ter No No Accept
105 RandomTer6.ter No No Accept
106 RandomTer7.ter No No Accept
107 RandomTer8.ter No No Accept
108 RandomTer9.ter No No Accept this canyon works somehow
109 Rasp.ter Trace Yes Reject
110 Ravine.ter Duplicate Duplicate Duplicate
111 RavineV.ter Trace Yes Reject
112 Recalescence.ter Yes Reject
113 Respite.ter No No Accept
114 Reversion.ter Yes Kinda Reject
115 Rimehold.ter No Yes Reject
116 RiverDance.ter Yes Reject
117 Rollercoaster_nef.ter No No Accept unlike most canyon maps this actually turns out to be skiiable
118 rst_agroleon.ter Trace Kinda Yes Reject the outer half of the terrain is too flat. and I deadstopped somewhere weird
119 rst_Astro.ter No No Accept
120 rst_bittergorge.ter No No Accept
121 rst_crumpie.ter No No Accept
122 rst_dermcity.ter No No Yes Reject whatever the fuck this is doesn't seem good for this
123 rst_FaceCrossing.ter No No Accept
124 rst_isledebatalla.ter Yes Reject
125 Rst_ScorchedEarth.ter Trace No Accept it's fine
126 rst_SimpleFlagArena.ter No Yes Reject literally squares
127 rst_spit.ter No No Accept i got to gate 5 on a discless discjump launch run
128 Rush.ter No No Accept
129 S5_Centaur.ter No No Accept
130 S5_Drache.ter No No Accept
131 S5_Icedance.ter No No Accept
132 S5_massive.ter Trace No Accept this is fine? I remember writing about deadstops but I don't see any?
133 S5_Mordacity.ter No No Accept
134 S5_rst_hawkingheat.ter Trace Yes Reject
135 S5_rst_misadventure.ter No No Accept
136 S5_rst_reynard.ter No Yes Reject this map is pushing the bounds of variance
137 S5_rst_silenus.ter No Yes Reject
138 S5_Sherman.ter No No Accept
139 S5-Icedance.ter Duplicate Duplicate Duplicate
140 S5-massive.ter Duplicate Duplicate Duplicate
141 S5-Mordacity.ter Duplicate Duplicate Duplicate
142 S8_rst_dogma.ter No No Accept
143 S8_rst_opus.ter Trace No Accept
144 S8_zilch.ter No Yes Reject
145 Sanctuary.ter Trace Yes Reject
146 Sandstorm.ter No No Accept
147 SC_Badlands.ter Yes Reject
148 SC_Desert.ter Yes Reject
149 SC_Ice.ter Yes Reject
150 SC_Lush.ter Yes Reject
151 SC_Night.ter Yes Reject
152 SC_Normal.ter Yes Reject
153 Scarabrae_nef.ter Yes Reject
154 ShockRidge.ter No Yes Reject not a fan of these canyon levels
155 Sirocco.ter Yes Reject
156 SkinnyDip.ter Trace No Accept really wanted to use one of the TR2 maps. This has a big scale but also nice hills
157 Slapdash.ter Duplicate Duplicate Duplicate
158 Snowblind_nef.ter Trace Yes Reject already knew this is a bad idea before I even started
159 SolsDescent.ter Yes Reject
160 SpinCycle.ter No No Accept this was borderline rejected
161 StarFallCTF2.ter Trace No Accept
162 Starfallen.ter Trace No Accept
163 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
164 SubZero.ter Duplicate Duplicate Duplicate
165 SunDried.ter Yes Reject
166 Surreal.ter Trace Yes Reject
167 Talus.ter Trace Yes Reject
168 ThinIce.ter Yes Reject
169 Titan.ter Trace Yes Reject why did I even open this. probably not stupid enough as a terrain choice for april fools
170 TL_Drorck.ter No No Accept
171 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
172 TL_MuddySwamp.ter Yes Reject
173 TL_RoughLand.ter No No Accept this is kinda a finicky terrain but it works
174 TL_Skylight.ter Trace Yes Superhard
175 Tombstone.ter No No Accept
176 Training1.ter Yes Reject
177 Training2.ter Yes Reject
178 Training3.ter Yes Reject
179 Training4.ter Yes Reject
180 Training5.ter Trace Likely Yes Reject Terrain is WAY too dark and you can't tell features on it.
181 TreasureIsland.ter Yes Reject
182 TWL_Crossfire.ter Yes Reject
183 TWL-Abaddon.ter No Yes Reject
184 TWL-BaNsHee.ter Yes Reject
185 TWL-BeachBlitz.ter Trace No Accept
186 TWL-BeggarsRun.ter No Yes Reject
187 TWL-BlueMoon.ter Duplicate Duplicate Duplicate
188 TWL-Boss.ter No No Accept this level is acceptable
189 TWL-Chokepoint.ter Trace Yes Reject
190 TWL-Cinereous.ter Trace No Accept
191 TWL-Clusterfuct.ter No Yes Reject
192 TWL-Curtilage.ter Yes Reject
193 TWL-Damnation.ter Trace No Accept
194 TWL-DeadlyBirdsSong.ter Duplicate Duplicate Duplicate DBS_Smoothed.ter
195 TWL-Deserted.ter Trace No Accept
196 TWL-Desiccator.ter No Yes Reject
197 TWL-Drifts.ter Trace Likely Yes Reject there's nothing really to this map outside the mission bounds
198 TWL-Euro_Feign.ter No Yes Reject come on man
199 TWL-Frostclaw.ter No Yes Reject
200 TWL-Frozen.ter No No Accept
201 TWL-Harvester.ter No No Accept why did I take this one
202 TWL-Horde.ter Yes Reject
203 TWL-Katabatic.ter Yes Yes Superhard oob still bad. this was accepted into april fools because you always need a katabatic joke somewhere
204 TWL-Neve.ter Yes Reject it's trace amounts but they're in places you would probably do routes
205 TWL-NoShelter.ter Yes Reject
206 TWL-Os_Iris.ter Trace No Accept
207 TWL-Pandemonium.ter No No Accept
208 TWL-Runenmacht.ter Trace Yes Reject nah
209 TWL-Slapdash.ter Yes Reject crapdash
210 TWL-SubZero.ter No Yes Reject
211 TWL-WilderZone.ter Trace No Accept
212 TWL-WoodyMyrk.ter No No Accept
213 TWL2_Crevice.ter No No Accept
214 TWL2_Frozenglory.ter No No Accept
215 TWL2_Ruined.ter Yes No Reject looks like a decent terrain but isn’t
216 Tyre.ter Yes Yes Reject
217 UltimaThule.ter Trace Yes Reject
218 Underhill.ter Trace Yes Reject
219 Wasteland.ter No No Accept whatever sure
220 WhiteDwarf.ter Trace Yes Reject
221 Whiteout.ter No Yes Reject
222 WoodyMyrkSE.ter No No Accept
223 Xtra_AshenPowder.ter Trace No Yes Reject can’t read that fucking terrain so i’m removing
224 Xtra_Bastage.ter Trace No Accept
225 Xtra_Birthright.ter No Yes Reject
226 Xtra_Crown.ter Trace Yes Reject
227 Xtra_DesertedSE.ter Trace Yes Reject This is a VERY jagged terrain.
228 Xtra_Helion.ter Likely No Yes Reject this is just a really boring terrain
229 Xtra_SoupLadle.ter No No Accept
230 Xtra_StarFall_T1.ter Yes Reject
231 Xtra_Stripmine.ter Yes Yes Superhard
232 Xtra_ThunderGiant.ter Trace No Accept this map is garbage but it's fun to try to ski on it
233 Xtra_VanDamned.ter No No Accept
234 Xtra_Voodoo.ter No Yes Reject
235 Xtra_Xerxes.ter Likely Yes Reject
236 Xtra_ziggurat.ter Yes Reject

View file

@ -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;
}
}

View file

@ -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);
}

File diff suppressed because it is too large Load diff

View file

@ -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);
}
}
};

View file

@ -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 shouldnt 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 isnt
//$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 doesnt 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"; // cant read that fucking terrain so im 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;

View file

@ -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);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load diff

View file

@ -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");

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

File diff suppressed because it is too large Load diff

View file

@ -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);

View file

@ -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);

View file

@ -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");

View file

@ -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();
}

View file

@ -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);
}

View file

@ -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");
}

Some files were not shown because too many files have changed in this diff Show more