From c5978d0dbeb76a51393a9b52e8a135f7ee63d35e Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Fri, 31 Oct 2014 19:54:05 +0100 Subject: [PATCH 1/7] Ported Survival01 to lua --- OpenRA.sln | 1 + mods/ra/maps/survival01/map.bin | Bin 0 -> 30725 bytes mods/ra/maps/survival01/map.png | Bin 0 -> 29220 bytes mods/ra/maps/survival01/map.yaml | 1367 ++++++++++++++++++++++++ mods/ra/maps/survival01/survival01.lua | 395 +++++++ mods/ra/notifications.yaml | 1 + 6 files changed, 1764 insertions(+) create mode 100644 mods/ra/maps/survival01/map.bin create mode 100644 mods/ra/maps/survival01/map.png create mode 100644 mods/ra/maps/survival01/map.yaml create mode 100644 mods/ra/maps/survival01/survival01.lua diff --git a/OpenRA.sln b/OpenRA.sln index 3cccb24b9b..36602c2f7a 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -49,6 +49,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re mods\ra\maps\intervention\intervention.lua = mods\ra\maps\intervention\intervention.lua mods\ra\maps\fort-lonestar\fort-lonestar.lua = mods\ra\maps\fort-lonestar\fort-lonestar.lua mods\ra\maps\monster-tank-madness\monster-tank-madness.lua = mods\ra\maps\monster-tank-madness\monster-tank-madness.lua + mods\ra\maps\survival01\survival01.lua = mods\ra\maps\survival01\survival01.lua EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System Lua scripts", "System Lua scripts", "{A4D6AEA4-8009-4256-903B-8D227E50452B}" diff --git a/mods/ra/maps/survival01/map.bin b/mods/ra/maps/survival01/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..942e6c2de72bd85c01ff8e69f4b095550e780057 GIT binary patch literal 30725 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 CEkq*# literal 0 HcmV?d00001 diff --git a/mods/ra/maps/survival01/map.png b/mods/ra/maps/survival01/map.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa1507d66ccb1d68db1b2c9e87a2e88f8ad2db2 GIT binary patch literal 29220 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 HWghlFSUJlV literal 0 HcmV?d00001 diff --git a/mods/ra/maps/survival01/map.yaml b/mods/ra/maps/survival01/map.yaml new file mode 100644 index 0000000000..a8f77c20d1 --- /dev/null +++ b/mods/ra/maps/survival01/map.yaml @@ -0,0 +1,1367 @@ +Selectable: False + +MapFormat: 6 + +RequiresMod: ra + +Title: Survival 01 + +Description: LANDCOM 66 HQS.\nTOP SECRET.\nTO: FIELD COMMANDER A34\n\nTHE SOVIETS STARTED HEAVY ATTACKS AT OUR POSITION.\n SURVIVE AND HOLD THE BASE UNTIL OUR FRENCH ALLIES ARRIVE.\n\nCONFIRMATION CODE 5593.\n\nTRANSMISSION ENDS. + +Author: Nuke'm Bro + +Tileset: TEMPERAT + +MapSize: 96,64 + +Bounds: 4,4,88,56 + +UseAsShellmap: False + +Type: Mission + +Options: + Crates: False + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 5000 + ConfigurableStartingUnits: False + Difficulties: Easy, Medium, Hard + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: allies + PlayerReference@Allies: + Name: Allies + Playable: True + AllowBots: False + Required: True + LockRace: True + Race: allies + LockColor: True + ColorRamp: 115,240,130 + LockSpawn: True + LockTeam: True + Enemies: Soviets + PlayerReference@Soviets: + Name: Soviets + Race: soviet + ColorRamp: 0,255,128 + Enemies: Allies + +Actors: + Actor113: fenc + Location: 46,54 + Owner: Allies + Actor115: fenc + Location: 46,55 + Owner: Allies + Actor88: brik + Location: 48,54 + Owner: Allies + Actor84: hpad + Location: 66,47 + Owner: Allies + Actor5: brik + Location: 72,55 + Owner: Allies + Actor4: brik + Location: 72,54 + Owner: Allies + Actor6: brik + Location: 72,53 + Owner: Allies + Actor77: brik + Location: 67,57 + Owner: Allies + Actor8: brik + Location: 72,52 + Owner: Allies + Actor9: brik + Location: 72,51 + Owner: Allies + Actor13: brik + Location: 75,50 + Owner: Allies + Actor12: brik + Location: 75,51 + Owner: Allies + Actor11: brik + Location: 74,51 + Owner: Allies + Actor10: brik + Location: 73,51 + Owner: Allies + Actor14: brik + Location: 75,49 + Owner: Allies + Actor15: brik + Location: 75,48 + Owner: Allies + Actor16: brik + Location: 76,48 + Owner: Allies + Actor17: brik + Location: 76,47 + Owner: Allies + Actor18: brik + Location: 75,47 + Owner: Allies + Actor19: brik + Location: 75,41 + Owner: Allies + Actor20: brik + Location: 75,42 + Owner: Allies + Actor21: brik + Location: 76,42 + Owner: Allies + Actor22: brik + Location: 76,41 + Owner: Allies + Actor23: brik + Location: 74,41 + Owner: Allies + Actor24: brik + Location: 73,41 + Owner: Allies + Actor25: brik + Location: 72,41 + Owner: Allies + Actor26: brik + Location: 71,41 + Owner: Allies + Actor27: brik + Location: 71,40 + Owner: Allies + Actor28: brik + Location: 70,40 + Owner: Allies + Actor29: brik + Location: 70,41 + Owner: Allies + Actor30: brik + Location: 61,40 + Owner: Allies + Actor31: brik + Location: 61,41 + Owner: Allies + Actor83: hpad + Location: 57,48 + Owner: Allies + Actor33: brik + Location: 60,40 + Owner: Allies + Actor1: brik + Location: 57,56 + Owner: Allies + Actor35: brik + Location: 59,40 + Owner: Allies + Actor36: brik + Location: 58,40 + Owner: Allies + Actor37: brik + Location: 57,40 + Owner: Allies + Actor38: brik + Location: 57,41 + Owner: Allies + Actor39: brik + Location: 56,41 + Owner: Allies + Actor40: brik + Location: 55,41 + Owner: Allies + Actor41: brik + Location: 54,41 + Owner: Allies + Actor42: brik + Location: 53,41 + Owner: Allies + Actor43: brik + Location: 53,42 + Owner: Allies + Actor44: brik + Location: 52,42 + Owner: Allies + Actor45: brik + Location: 51,42 + Owner: Allies + Actor46: brik + Location: 50,42 + Owner: Allies + Actor47: brik + Location: 49,42 + Owner: Allies + Actor48: brik + Location: 48,42 + Owner: Allies + Actor49: brik + Location: 48,43 + Owner: Allies + Actor50: brik + Location: 49,43 + Owner: Allies + Actor51: brik + Location: 48,52 + Owner: Allies + Actor52: brik + Location: 48,51 + Owner: Allies + Actor53: brik + Location: 48,50 + Owner: Allies + Actor54: brik + Location: 48,49 + Owner: Allies + Actor55: brik + Location: 48,48 + Owner: Allies + Actor71: brik + Location: 64,56 + Owner: Allies + Actor58: brik + Location: 46,47 + Owner: Allies + Actor57: brik + Location: 46,48 + Owner: Allies + Actor56: brik + Location: 47,48 + Owner: Allies + Actor59: brik + Location: 47,47 + Owner: Allies + Actor72: brik + Location: 64,57 + Owner: Allies + Actor65: brik + Location: 51,57 + Owner: Allies + Actor66: brik + Location: 50,57 + Owner: Allies + Actor61: brik + Location: 55,57 + Owner: Allies + Actor2: brik + Location: 57,57 + Owner: Allies + Actor34: brik + Location: 56,57 + Owner: Allies + Actor62: brik + Location: 54,57 + Owner: Allies + Actor74: brik + Location: 63,56 + Owner: Allies + Actor79: brik + Location: 65,57 + Owner: Allies + Actor80: apwr + Location: 68,53 + Owner: Allies + Actor81: powr + Location: 65,53 + Owner: Allies + Actor63: brik + Location: 53,57 + Owner: Allies + Actor64: brik + Location: 52,57 + Owner: Allies + Actor68: brik + Location: 72,57 + Owner: Allies + Actor73: brik + Location: 63,57 + Owner: Allies + Actor69: brik + Location: 71,57 + Owner: Allies + Actor76: brik + Location: 68,57 + Owner: Allies + Actor78: brik + Location: 66,57 + Owner: Allies + Actor75: brik + Location: 69,57 + Owner: Allies + Actor70: brik + Location: 70,57 + Owner: Allies + Actor7: brik + Location: 72,56 + Owner: Allies + Actor60: brik + Location: 56,56 + Owner: Allies + Actor 408: weap + Location: 53,46 + Owner: Allies + Actor32: tent + Location: 62,47 + Owner: Allies + Actor0: brik + Location: 48,53 + Owner: Allies + Actor111: proc + Location: 43,55 + Owner: Allies + Actor112: fenc + Location: 45,54 + Owner: Allies + Actor116: fenc + Location: 46,56 + Owner: Allies + Actor89: fenc + Location: 65,46 + Owner: Allies + Actor90: fenc + Location: 66,46 + Owner: Allies + Actor91: fenc + Location: 67,46 + Owner: Allies + Actor92: fenc + Location: 68,46 + Owner: Allies + Actor93: fenc + Location: 68,47 + Owner: Allies + Actor94: fenc + Location: 68,48 + Owner: Allies + Actor95: fenc + Location: 68,49 + Owner: Allies + Actor96: fenc + Location: 57,47 + Owner: Allies + Actor97: fenc + Location: 58,47 + Owner: Allies + Actor98: fenc + Location: 59,47 + Owner: Allies + Actor99: fenc + Location: 59,48 + Owner: Allies + Actor100: fenc + Location: 59,49 + Owner: Allies + Actor101: fix + Location: 50,52 + Owner: Allies + Actor102: dome + Location: 55,53 + Owner: Allies + Actor103: powr + Location: 58,41 + Owner: Allies + Actor104: apwr + Location: 71,47 + Owner: Allies + Actor105: fact + Location: 59,51 + Owner: Allies + Actor106: powr + Location: 55,42 + Owner: Allies + Actor107: gun + Location: 64,42 + Owner: Allies + Actor108: pbox + Location: 67,42 + Owner: Allies + Actor109: pbox + Location: 74,45 + Owner: Allies + Actor110: gun + Location: 50,45 + Owner: Allies + Actor114: fenc + Location: 44,54 + Owner: Allies + Actor118: fenc + Location: 42,57 + Owner: Allies + Actor117: fenc + Location: 46,57 + Owner: Allies + Actor67: brik + Location: 49,57 + Owner: Allies + Actor82: brik + Location: 48,57 + Owner: Allies + Actor85: brik + Location: 48,56 + Owner: Allies + Actor87: brik + Location: 48,55 + Owner: Allies + Actor86: brik + Location: 49,56 + Owner: Allies + Actor119: fenc + Location: 42,56 + Owner: Allies + Actor120: mine + Location: 30,58 + Owner: Neutral + Actor121: oilb + Location: 43,38 + Owner: Neutral + Actor122: oilb + Location: 36,37 + Owner: Neutral + Actor124: oilb + Location: 88,46 + Owner: Allies + Actor123: oilb + Location: 80,46 + Owner: Allies + Actor130: fenc + Location: 88,48 + Owner: Neutral + Actor129: fenc + Location: 89,48 + Owner: Neutral + Actor125: fenc + Location: 90,45 + Owner: Neutral + Actor127: fenc + Location: 90,47 + Owner: Neutral + Actor126: fenc + Location: 90,46 + Owner: Neutral + Actor128: fenc + Location: 90,48 + Owner: Neutral + Actor131: fenc + Location: 87,48 + Owner: Neutral + Actor141: fenc + Location: 78,11 + Owner: Neutral + Sam3: sam + Location: 76,11 + Owner: Soviets + SovietAirfield1: afld.mission + Location: 86,5 + Owner: Soviets + SovietAirfield2: afld.mission + Location: 80,6 + Owner: Soviets + SovietAirfield3: afld.mission + Location: 75,5 + Owner: Soviets + Actor160: fenc + Location: 77,4 + Owner: Neutral + Actor159: fenc + Location: 76,4 + Owner: Neutral + Actor162: fenc + Location: 74,4 + Owner: Neutral + Actor161: fenc + Location: 78,4 + Owner: Neutral + Actor136: fenc + Location: 75,11 + Owner: Neutral + Actor137: fenc + Location: 75,10 + Owner: Neutral + Actor138: fenc + Location: 76,10 + Owner: Neutral + Actor139: fenc + Location: 77,10 + Owner: Neutral + Actor140: fenc + Location: 78,10 + Owner: Neutral + Actor143: barl + Location: 79,6 + Owner: Soviets + Actor144: brl3 + Location: 74,5 + Owner: Soviets + Actor145: brl3 + Location: 75,7 + Owner: Soviets + Actor146: barl + Location: 74,6 + Owner: Soviets + Actor147: barl + Location: 80,5 + Owner: Soviets + Actor148: brl3 + Location: 84,6 + Owner: Soviets + Actor149: brl3 + Location: 85,5 + Owner: Soviets + Actor150: brl3 + Location: 83,6 + Owner: Soviets + Actor151: barl + Location: 84,5 + Owner: Soviets + Actor142: brl3 + Location: 79,5 + Owner: Soviets + Actor152: barl + Location: 82,6 + Owner: Soviets + Actor153: barl + Location: 84,7 + Owner: Soviets + Actor154: barl + Location: 85,6 + Owner: Soviets + Actor155: barl + Location: 89,5 + Owner: Soviets + Actor171: fenc + Location: 87,4 + Owner: Neutral + Actor172: fenc + Location: 88,4 + Owner: Neutral + Actor156: brl3 + Location: 90,5 + Owner: Soviets + Actor170: fenc + Location: 86,4 + Owner: Neutral + Actor169: fenc + Location: 85,4 + Owner: Neutral + Actor158: fenc + Location: 75,4 + Owner: Neutral + Actor168: fenc + Location: 84,4 + Owner: Neutral + Actor157: barl + Location: 90,6 + Owner: Soviets + Actor167: fenc + Location: 83,4 + Owner: Neutral + Actor166: fenc + Location: 82,4 + Owner: Neutral + Actor165: fenc + Location: 81,4 + Owner: Neutral + Actor164: fenc + Location: 80,4 + Owner: Neutral + Actor163: fenc + Location: 79,4 + Owner: Neutral + Actor173: fenc + Location: 89,4 + Owner: Neutral + Actor174: fenc + Location: 90,4 + Owner: Neutral + Actor175: fenc + Location: 91,4 + Owner: Neutral + Actor176: fenc + Location: 91,5 + Owner: Neutral + Actor177: fenc + Location: 91,6 + Owner: Neutral + Actor178: fenc + Location: 91,7 + Owner: Neutral + Actor179: fenc + Location: 91,8 + Owner: Neutral + Actor180: fenc + Location: 90,8 + Owner: Neutral + Actor181: fenc + Location: 90,7 + Owner: Neutral + Refinery: proc + Location: 81,11 + Owner: Soviets + Actor187: t11 + Location: 69,10 + Owner: Neutral + Actor186: t16 + Location: 58,6 + Owner: Neutral + Actor185: tc04 + Location: 57,8 + Owner: Neutral + Actor184: mine + Location: 85,22 + Owner: Neutral + Actor188: tc01 + Location: 69,6 + Owner: Neutral + Actor189: t12 + Location: 62,13 + Owner: Neutral + Actor193: fenc + Location: 75,16 + Owner: Neutral + Actor194: fenc + Location: 75,15 + Owner: Neutral + Actor191: fenc + Location: 74,15 + Owner: Neutral + Actor192: fenc + Location: 74,16 + Owner: Neutral + FlameTower3: ftur + Location: 78,17 + Owner: Soviets + Actor190: fenc + Location: 74,14 + Owner: Neutral + AdvancedPowerPlant3: apwr + Location: 88,12 + Owner: Soviets + Silo1: silo + Location: 84,13 + Owner: Soviets + Silo2: silo + Location: 84,12 + Owner: Soviets + Actor199: e1 + Location: 79,15 + Owner: Soviets + Actor200: e2 + Location: 81,17 + Owner: Soviets + Actor201: v2rl + Location: 76,15 + Owner: Soviets + Actor202: tc04 + Location: 4,15 + Owner: Neutral + Actor203: tc01 + Location: 7,17 + Owner: Neutral + Actor204: t15 + Location: 9,16 + Owner: Neutral + Actor205: tc05 + Location: 4,26 + Owner: Neutral + Actor206: tc02 + Location: 5,24 + Owner: Neutral + Actor207: tc04 + Location: 7,25 + Owner: Neutral + Actor208: tc03 + Location: 40,21 + Owner: Neutral + Sam1: sam + Location: 62,27 + Owner: Soviets + Actor210: tc04 + Location: 34,22 + Owner: Neutral + Actor211: tc02 + Location: 32,33 + Owner: Neutral + Actor212: t16 + Location: 35,33 + Owner: Neutral + Actor213: t11 + Location: 49,37 + Owner: Neutral + Actor214: tc04 + Location: 82,39 + Owner: Neutral + Actor215: tc01 + Location: 89,39 + Owner: Neutral + Actor216: tc05 + Location: 85,39 + Owner: Neutral + Actor217: t16 + Location: 80,41 + Owner: Neutral + Actor218: fenc + Location: 79,48 + Owner: Neutral + Actor219: fenc + Location: 80,48 + Owner: Neutral + Actor220: fenc + Location: 81,48 + Owner: Neutral + Actor221: fenc + Location: 82,48 + Owner: Neutral + Actor222: fenc + Location: 82,47 + Owner: Neutral + Actor223: tc02 + Location: 21,41 + Owner: Neutral + Actor224: tc04 + Location: 35,43 + Owner: Neutral + Actor225: tc02 + Location: 38,44 + Owner: Neutral + Actor226: t16 + Location: 38,42 + Owner: Neutral + Actor227: t13 + Location: 44,33 + Owner: Neutral + Actor228: t02 + Location: 39,31 + Owner: Neutral + Actor229: tc04 + Location: 54,13 + Owner: Neutral + Actor230: t07 + Location: 47,12 + Owner: Neutral + Actor235: brik + Location: 12,18 + Owner: Neutral + Actor267: brik + Location: 33,17 + Owner: Neutral + Actor237: brik + Location: 11,19 + Owner: Neutral + Actor231: brik + Location: 11,16 + Owner: Neutral + Actor238: brik + Location: 12,19 + Owner: Neutral + Actor232: brik + Location: 11,17 + Owner: Neutral + FlameTower1: ftur + Location: 23,16 + Owner: Soviets + FlameTower2: ftur + Location: 29,13 + Owner: Soviets + Actor307: v2rl + Location: 31,9 + Owner: Soviets + Actor306: v2rl + Location: 31,18 + Owner: Soviets + RadarDome: dome + Location: 14,16 + Owner: Soviets + AdvancedPowerPlant1: apwr + Location: 24,5 + Owner: Soviets + Actor234: brik + Location: 12,16 + Owner: Neutral + Actor233: brik + Location: 12,17 + Owner: Neutral + Actor236: brik + Location: 11,18 + Owner: Neutral + Actor293: brik + Location: 25,4 + Owner: Neutral + Actor291: brik + Location: 26,4 + Owner: Neutral + Actor295: brik + Location: 23,4 + Owner: Neutral + Actor294: brik + Location: 24,4 + Owner: Neutral + Actor290: brik + Location: 27,4 + Owner: Neutral + Actor289: brik + Location: 28,4 + Owner: Neutral + Actor288: brik + Location: 29,4 + Owner: Neutral + Actor287: brik + Location: 30,4 + Owner: Neutral + Actor286: brik + Location: 31,4 + Owner: Neutral + Actor285: brik + Location: 32,5 + Owner: Neutral + Actor284: brik + Location: 32,4 + Owner: Neutral + Actor283: brik + Location: 33,4 + Owner: Neutral + Actor261: brik + Location: 29,19 + Owner: Neutral + Actor262: brik + Location: 30,19 + Owner: Neutral + Actor260: brik + Location: 28,19 + Owner: Neutral + Actor265: brik + Location: 32,18 + Owner: Neutral + Actor259: brik + Location: 27,19 + Owner: Neutral + Sam2: sam + Location: 17,31 + Owner: Soviets + Actor264: brik + Location: 32,19 + Owner: Neutral + Actor246: brik + Location: 14,19 + Owner: Neutral + Actor242: brik + Location: 13,19 + Owner: Neutral + Actor263: brik + Location: 31,19 + Owner: Neutral + Actor266: brik + Location: 33,18 + Owner: Neutral + Actor247: brik + Location: 15,19 + Owner: Neutral + Actor248: brik + Location: 16,19 + Owner: Neutral + Actor249: brik + Location: 17,19 + Owner: Neutral + Actor251: brik + Location: 19,19 + Owner: Neutral + Actor250: brik + Location: 18,19 + Owner: Neutral + Actor254: brik + Location: 19,18 + Owner: Neutral + Actor253: brik + Location: 20,18 + Owner: Neutral + Actor252: brik + Location: 20,19 + Owner: Neutral + Actor281: brik + Location: 33,6 + Owner: Neutral + Actor277: brik + Location: 33,9 + Owner: Neutral + Actor276: brik + Location: 32,10 + Owner: Neutral + Actor270: brik + Location: 33,15 + Owner: Neutral + Actor278: brik + Location: 33,8 + Owner: Neutral + Actor275: brik + Location: 33,10 + Owner: Neutral + Actor274: brik + Location: 33,11 + Owner: Neutral + Actor273: brik + Location: 32,15 + Owner: Neutral + Actor271: brik + Location: 32,16 + Owner: Neutral + Actor282: brik + Location: 33,5 + Owner: Neutral + Actor272: brik + Location: 32,11 + Owner: Neutral + Actor279: brik + Location: 33,7 + Owner: Neutral + Actor269: brik + Location: 33,16 + Owner: Neutral + Actor268: brik + Location: 33,19 + Owner: Neutral + WarFactory: weap + Location: 22,12 + Owner: Soviets + AdvancedPowerPlant2: apwr + Location: 16,13 + Owner: Soviets + Actor258: brik + Location: 26,18 + Owner: Neutral + Actor255: brik + Location: 25,18 + Owner: Neutral + Actor256: brik + Location: 25,19 + Owner: Neutral + Actor257: brik + Location: 26,19 + Owner: Neutral + Actor309: e1 + Location: 52,44 + Owner: Allies + Barrack1: barr + Location: 28,7 + Owner: Soviets + Actor305: v2rl + Location: 17,18 + Owner: Soviets + Actor304: e3 + Location: 17,17 + Owner: Soviets + Actor303: e1 + Location: 29,15 + Owner: Soviets + Actor300: e1 + Location: 25,16 + Owner: Soviets + Actor301: e2 + Location: 21,17 + Owner: Soviets + Actor302: e3 + Location: 28,10 + Owner: Soviets + Sam4: sam + Location: 29,17 + Owner: Soviets + Actor310: e1 + Location: 50,47 + Owner: Allies + Actor311: e1 + Location: 62,43 + Owner: Allies + Actor312: e1 + Location: 64,44 + Owner: Allies + Actor313: e3 + Location: 66,44 + Owner: Allies + Actor314: e1 + Location: 69,43 + Owner: Allies + Actor315: e1 + Location: 73,43 + Owner: Allies + Actor316: jeep + Location: 54,49 + Owner: Allies + Actor317: 1tnk + Location: 69,45 + Owner: Allies + Actor318: 1tnk + Location: 52,46 + Owner: Allies + Actor296: tc02 + Location: 73,32 + Owner: Neutral + Actor298: tc01 + Location: 77,34 + Owner: Neutral + Actor299: tc04 + Location: 83,35 + Owner: Neutral + Actor308: tc01 + Location: 86,35 + Owner: Neutral + Actor319: t07 + Location: 90,27 + Owner: Neutral + Actor320: tc01 + Location: 80,26 + Owner: Neutral + Actor321: brik + Location: 60,41 + Owner: Allies + Actor135: e1 + Location: 63,39 + Owner: Soviets + Actor209: e2 + Location: 65,40 + Owner: Soviets + Actor280: e1 + Location: 68,40 + Owner: Soviets + Actor292: e1 + Location: 76,44 + Owner: Soviets + Actor322: e2 + Location: 78,46 + Owner: Soviets + Actor323: e1 + Location: 46,44 + Owner: Soviets + Actor324: e3 + Location: 45,46 + Owner: Soviets + Actor325: e3 + Location: 66,39 + Owner: Soviets + Actor326: v2rl + Location: 61,37 + Owner: Soviets + Actor327: brl3 + Location: 79,47 + Owner: Allies + Actor328: barl + Location: 79,46 + Owner: Allies + Actor329: brl3 + Location: 87,45 + Owner: Allies + Actor330: barl + Location: 87,46 + Owner: Allies + Actor331: barl + Location: 88,45 + Owner: Allies + Actor332: oilb + Location: 74,53 + Owner: Allies + Actor333: fenc + Location: 73,55 + Owner: Allies + Actor334: fenc + Location: 74,55 + Owner: Allies + Actor335: fenc + Location: 75,55 + Owner: Allies + Actor336: fenc + Location: 75,52 + Owner: Allies + Actor337: fenc + Location: 76,52 + Owner: Allies + Actor338: fenc + Location: 74,52 + Owner: Allies + Actor339: brl3 + Location: 73,53 + Owner: Allies + Actor340: barl + Location: 73,52 + Owner: Allies + SubPen: spen + Location: 13,9 + Owner: Soviets + Actor297: brik + Location: 22,4 + Owner: Neutral + Actor341: brik + Location: 21,4 + Owner: Neutral + Actor342: brik + Location: 21,5 + Owner: Neutral + Actor343: brik + Location: 22,5 + Owner: Neutral + Actor346: t15 + Location: 57,24 + Owner: Neutral + Actor1000: camera.large + Location: 1,1 + Owner: Soviets + BadgerEntryPoint1: waypoint + Location: 1,54 + Owner: Neutral + BadgerEntryPoint2: waypoint + Location: 1,47 + Owner: Neutral + ParaDrop1: waypoint + Location: 54,51 + Owner: Neutral + ParaDrop2: waypoint + Location: 67,51 + Owner: Neutral + Alliesbase: waypoint + Location: 60,48 + Owner: Neutral + Alliesbase1: waypoint + Location: 66,45 + Owner: Neutral + Alliesbase2: waypoint + Location: 51,46 + Owner: Neutral + Alliesbase3: waypoint + Location: 72,45 + Owner: Neutral + AlliesEntryPoint: waypoint + Location: 60,59 + Owner: Neutral + AlliesBaseGate1: waypoint + Location: 64,33 + Owner: Neutral + AlliesBaseGate2: waypoint + Location: 42,42 + Owner: Neutral + SovietEntryPoint1: waypoint + Location: 4,31 + Owner: Neutral + SovietEntryPoint2: waypoint + Location: 4,21 + Owner: Neutral + SovietEntryPoint3: waypoint + Location: 37,4 + Owner: Neutral + SovietEntryPoint4: waypoint + Location: 65,4 + Owner: Neutral + SovietEntryPoint5: waypoint + Location: 91,19 + Owner: Neutral + SovietEntryPoint7: waypoint + Location: 91,43 + Owner: Neutral + SovietRallyPoint1: waypoint + Location: 23,39 + Owner: Neutral + SovietRallyPoint2: waypoint + Location: 23,21 + Owner: Neutral + SovietRallyPoint3: waypoint + Location: 37,13 + Owner: Neutral + SovietRallyPoint4: waypoint + Location: 65,13 + Owner: Neutral + SovietRallyPoint5: waypoint + Location: 80,19 + Owner: Neutral + SovietInfantryEntry1: waypoint + Location: 28,9 + Owner: Neutral + SovietInfantryRally1: waypoint + Location: 23,26 + Owner: Neutral + NavalEntryPoint: waypoint + Location: 4,59 + Owner: Neutral + NavalWaypoint1: waypoint + Location: 41,48 + Owner: Neutral + NavalWaypoint2: waypoint + Location: 26,54 + Owner: Neutral + NavalWaypoint3: waypoint + Location: 42,53 + Owner: Neutral + AirReinforcementsEntry1: waypoint + Location: 95,59 + Owner: Neutral + AirReinforcementsEntry2: waypoint + Location: 63,26 + Owner: Neutral + AirReinforcementsRally1: waypoint + Location: 88,63 + Owner: Neutral + AirReinforcementsRally2: waypoint + Location: 17,31 + Owner: Neutral + HiddenATEK: waypoint + Location: 58,61 + Owner: Neutral + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + LuaScript: + Scripts: survival01.lua + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + ^Infantry: + MustBeDestroyed: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Tank: + MustBeDestroyed: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Vehicle: + MustBeDestroyed: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Building: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Wall: + Tooltip: + ShowOwnerRow: false + ^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + CAMERA.sam: + Inherits: CAMERA + RevealsShroud: + Range: 4c0 + CAMERA.Large: + Inherits: CAMERA + RevealsShroud: + Range: 1000 + ARTY: + Parachutable: + KilledOnImpassableTerrain: false + ParachuteSequence: parach + AFLD.mission: + Inherits: AFLD + -AirstrikePower: + -ParatroopersPower: + -SupportPowerChargeBar: + RenderBuilding: + Image: AFLD + ATEK.mission: + Inherits: ATEK + GpsPower: + ChargeTime: 0 + Power: + Amount: 0 + -Selectable: + -TargetableBuilding: + -GivesBuildableArea: + -Huntable: + RenderBuilding: + Image: ATEK + GUN: + Valued: + Cost: 1000 + E7: + Buildable: + Prerequisites: ~disabled + SHOK: + Buildable: + Prerequisites: ~disabled + MIG: + Buildable: + Prerequisites: ~disabled + HELI: + Buildable: + Prerequisites: ~disabled + MSLO: + Buildable: + Prerequisites: ~disabled + GAP: + Buildable: + Prerequisites: ~disabled + SYRD: + Buildable: + Prerequisites: ~disabled + PDOX: + Buildable: + Prerequisites: ~disabled + AGUN: + Buildable: + Prerequisites: ~disabled + ATEK: + Buildable: + Prerequisites: ~disabled + 4TNK: + Buildable: + Prerequisites: ~disabled + MCV: + Buildable: + Prerequisites: ~disabled + MNLY.AP: + Buildable: + Prerequisites: ~disabled + MNLY.AT: + Buildable: + Prerequisites: ~disabled + TTNK: + Buildable: + Prerequisites: ~disabled + CTNK: + Buildable: + Prerequisites: ~disabled + DOME: + Buildable: + Prerequisites: ~disabled + BRIK: + Buildable: + Prerequisites: ~disabled + MRJ: + Buildable: + Prerequisites: ~disabled + MGG: + Buildable: + Prerequisites: ~disabled + STNK: + Buildable: + Prerequisites: ~disabled + QTNK: + Buildable: + Prerequisites: ~disabled + DTRK: + Buildable: + Prerequisites: ~disabled + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/ra/maps/survival01/survival01.lua b/mods/ra/maps/survival01/survival01.lua new file mode 100644 index 0000000000..07baa6c804 --- /dev/null +++ b/mods/ra/maps/survival01/survival01.lua @@ -0,0 +1,395 @@ +Difficulty = "Medium" + +if Difficulty == "Easy" then + AttackAtFrameIncrement = DateTime.Seconds(22) + AttackAtFrameIncrementInf = DateTime.Seconds(16) + TimerTicks = DateTime.Minutes(15) + IncrementTurningPoint = TimerTicks / 2 + DamageModifier = 0.5 + LongBowReinforcements = { "heli", "heli" } + ParadropArtillery = true +elseif Difficulty == "Medium" then + AttackAtFrameIncrement = DateTime.Seconds(18) + AttackAtFrameIncrementInf = DateTime.Seconds(12) + TimerTicks = DateTime.Minutes(20) + IncrementTurningPoint = TimerTicks / 2 + MoreParas = true + DamageModifier = 0.75 + LongBowReinforcements = { "heli", "heli" } +else --Difficulty == "Hard" + AttackAtFrameIncrement = DateTime.Seconds(14) + AttackAtFrameIncrementInf = DateTime.Seconds(8) + TimerTicks = DateTime.Minutes(25) + IncrementTurningPoint = DateTime.Minutes(10) + MoreParas = true + AttackAtFrameNaval = DateTime.Minutes(3) + DateTime.Seconds(45) + SpawnNavalUnits = true + DamageModifier = 1 + LongBowReinforcements = { "heli" } +end + +AlliedArtilleryParadrops = { "arty", "arty", "arty" } +AlliedAirReinforcementsWaypoints = +{ + { AirReinforcementsEntry1.Location, AirReinforcementsEntry2.Location }, + { AirReinforcementsRally1.Location, AirReinforcementsRally2.Location } +} +FrenchReinforcements = { "2tnk", "2tnk", "2tnk", "2tnk", "2tnk", "1tnk", "1tnk", "1tnk", "arty", "arty", "arty", "jeep", "jeep" } + +SpawningSovietUnits = true +SpawningInfantry = true +AttackAtFrameInf = DateTime.Seconds(12) +AttackAtFrame = DateTime.Seconds(18) +SovietAttackGroupSize = 5 +SovietInfantryGroupSize = 7 +FactoryClearRange = 10 +ParadropTicks = DateTime.Seconds(30) +BadgerPassengers = { "e1", "e1", "e1", "e2", "e2" } +ParadropWaypoints = +{ + { BadgerEntryPoint1.Location, ParaDrop1.Location }, + { BadgerEntryPoint2.Location, ParaDrop2.Location }, + { BadgerEntryPoint1.Location, Alliesbase2.Location }, + { BadgerEntryPoint2.Location, Alliesbase1.Location } +} +NavalTransportPassengers = { "e1", "e1", "e2", "e4", "e4" } +NavalReinforcementsWaypoints = { NavalWaypoint1, NavalWaypoint2, NavalWaypoint2, NavalWaypoint3 } +Squad1 = { "e1", "e1" } +Squad2 = { "e2", "e2" } +SovietVehicles = { "3tnk", "3tnk", "3tnk", "3tnk", "3tnk", "3tnk", "v2rl", "v2rl", "ftrk", "ftrk", "ftrk", "apc", "apc" } +SovietInfantry = { "e1", "e1", "e1", "e1", "e2", "e2", "e2", "e4", "e4", "e3" } +SovietEntryPoints = { SovietEntryPoint1, SovietEntryPoint2, SovietEntryPoint3, SovietEntryPoint4, SovietEntryPoint5 } +SovietRallyPoints = { SovietRallyPoint1, SovietRallyPoint2, SovietRallyPoint3, SovietRallyPoint4, SovietRallyPoint5 } +SovietGateRallyPoints = { AlliesBaseGate2, AlliesBaseGate2, AlliesBaseGate1, AlliesBaseGate1, AlliesBaseGate1 } + +Airfields = { SovietAirfield1, SovietAirfield2, SovietAirfield3 } +SovietBuildings = { Barrack1, SubPen, RadarDome, AdvancedPowerPlant1, AdvancedPowerPlant2, AdvancedPowerPlant3, WarFactory, Refinery, Silo1, Silo2, FlameTower1, FlameTower2, FlameTower3, Sam3, Sam4 } + +IdleTrigger = function(units, dest) + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function() + local bool = Utils.All(units, function(unit) return unit.IsIdle end) + if bool then + Utils.Do(units, function(unit) + if not unit.IsDead then + Trigger.ClearAll(unit) + Trigger.AfterDelay(0, function() + if not unit.IsDead then + if dest then unit.AttackMove(dest, 3) end + Trigger.OnIdle(unit, unit.Hunt) + end + end) + end + end) + end + end) + Trigger.OnDamaged(unit, function() + Utils.Do(units, function(unit) + if not unit.IsDead then + Trigger.ClearAll(unit) + Trigger.AfterDelay(0, function() + if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end + end) + end + end) + end) + end) +end + +Tick = function() + if KillObj and soviets.HasNoRequiredUnits() then + allies.MarkCompletedObjective(KillObj) + end + + if allies.HasNoRequiredUnits() then + soviets.MarkCompletedObjective(SovietObj) + end + + if soviets.Resources > soviets.ResourceCapacity / 2 then + soviets.Resources = soviets.ResourceCapacity / 2 + end + + if DateTime.Minutes(20) == TimerTicks - DateTime.GameTime then + Media.PlaySpeechNotification(allies, "TwentyMinutesRemaining") + elseif DateTime.Minutes(10) == TimerTicks - DateTime.GameTime then + Media.PlaySpeechNotification(allies, "TenMinutesRemaining") + elseif DateTime.Minutes(5) == TimerTicks - DateTime.GameTime then + Media.PlaySpeechNotification(allies, "WarningFiveMinutesRemaining") + InitTimer() + end +end + +SendSovietParadrops = function(table) + local plane = Actor.Create("badr", true, { Owner = soviets, Location = table[1] }) + Utils.Do(BadgerPassengers, function(type) + local unit = Actor.Create(type, false, { Owner = soviets }) + plane.LoadPassenger(unit) + Trigger.OnIdle(unit, unit.Hunt) + end) + plane.Paradrop(table[2]) +end + +SendSovietNavalReinforcements = function() + if SpawnNavalUnits then + local entry = NavalEntryPoint.Location + local units = Reinforcements.ReinforceWithTransport(soviets, "lst", NavalTransportPassengers, { entry, Utils.Random(NavalReinforcementsWaypoints).Location }, { entry })[2] + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, unit.Hunt) + end) + + local delay = Utils.RandomInteger(AttackAtFrameNaval, AttackAtFrameNaval + DateTime.Minutes(2)) + + Trigger.AfterDelay(delay, SendSovietNavalReinforcements) + end +end + +SpawnSovietInfantry = function() + local units = { } + for i = 0, SovietInfantryGroupSize - 1, 1 do + local type = Utils.Random(SovietInfantry) + units[i] = type + end + + soviets.Build(units, function(soldiers) + Trigger.AfterDelay(25, function() IdleTrigger(soldiers) end) + end) +end + +SpawnSovietUnits = function() + local units = { } + for i = 0, SovietAttackGroupSize - 1, 1 do + local type = Utils.Random(SovietVehicles) + units[i] = type + end + + local route = Utils.RandomInteger(1, #SovietEntryPoints + 1) + local attackers = Reinforcements.Reinforce(soviets, units, { SovietEntryPoints[route].Location, SovietRallyPoints[route].Location }) + Trigger.AfterDelay(25, function() + IdleTrigger(attackers, SovietGateRallyPoints[route].Location) + end) +end + +SendInfantryWave = function() + if SpawningInfantry then + SpawnSovietInfantry() + + if DateTime.GameTime < IncrementTurningPoint then + AttackAtFrameIncrementInf = AttackAtFrameIncrementInf + Utils.RandomInteger(DateTime.Seconds(2), DateTime.Seconds(3)) + elseif not (AttackAtFrameIncrementInf <= DateTime.Seconds(4)) then + AttackAtFrameIncrementInf = AttackAtFrameIncrementInf - Utils.RandomInteger(DateTime.Seconds(2), DateTime.Seconds(3)) + end + + Trigger.AfterDelay(AttackAtFrameInf + AttackAtFrameIncrementInf, SendInfantryWave) + end +end + +SendVehicleWave = function() + if SpawningSovietUnits then + SpawnSovietUnits() + + if DateTime.GameTime < IncrementTurningPoint then + AttackAtFrameIncrement = AttackAtFrameIncrement + Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(6)) + elseif not (AttackAtFrameIncrement <= DateTime.Seconds(4)) then + AttackAtFrameIncrement = AttackAtFrameIncrement - Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(6)) + end + + Trigger.AfterDelay(AttackAtFrame + AttackAtFrameIncrement, SendVehicleWave) + end +end + +InitTimer = function() + Trigger.AfterDelay(DateTime.Minutes(1), function() + Media.PlaySpeechNotification(allies, "WarningFourMinutesRemaining") + + Trigger.AfterDelay(ParadropTicks, function() + SendSovietParadrops(ParadropWaypoints[3]) + SendSovietParadrops(ParadropWaypoints[2]) + end) + Trigger.AfterDelay(ParadropTicks * 2, function() + SendSovietParadrops(ParadropWaypoints[4]) + SendSovietParadrops(ParadropWaypoints[1]) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(2), function() Media.PlaySpeechNotification(allies, "WarningThreeMinutesRemaining") end) + Trigger.AfterDelay(DateTime.Minutes(3), function() + Media.PlaySpeechNotification(allies, "WarningTwoMinutesRemaining") + + AttackAtFrameIncrement = DateTime.Seconds(4) + AttackAtFrameIncrementInf = DateTime.Seconds(4) + end) + + Trigger.AfterDelay(DateTime.Minutes(4), function() Media.PlaySpeechNotification(allies, "WarningOneMinuteRemaining") end) + Trigger.AfterDelay(DateTime.Minutes(4) + DateTime.Seconds(45), function() Media.PlaySpeechNotification(allies, "AlliedForcesApproaching") end) + Trigger.AfterDelay(DateTime.Minutes(5), TimerExpired) +end + +TimerExpired = function() + SpawningSovietUnits = false + SpawningInfantry = false + SpawnNavalUnits = false + + Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived") + Reinforcements.Reinforce(allies, FrenchReinforcements, { SovietEntryPoint7.Location, Alliesbase.Location }) + + if DestroyObj then + KillObj = allies.AddPrimaryObjective("Take control of French reinforcements and\nkill all remaining soviet forces.") + else + DestroyObj = allies.AddPrimaryObjective("Take control of French reinforcements and\ndismantle the nearby Soviet base.") + end + + allies.MarkCompletedObjective(SurviveObj) + if not allies.IsObjectiveCompleted(KillSams) then + allies.MarkFailedObjective(KillSams) + end +end + +DropAlliedArtillery = function(table) + local plane = Actor.Create("badr", true, { Owner = allies, Location = table[1] }) + Utils.Do(AlliedArtilleryParadrops, function(type) + local unit = Actor.Create(type, false, { Owner = allies }) + plane.LoadPassenger(unit) + end) + plane.Paradrop(table[2]) +end + +SendLongBowReinforcements = function() + Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived") + Reinforcements.Reinforce(allies, LongBowReinforcements, AlliedAirReinforcementsWaypoints[1]) + Reinforcements.Reinforce(allies, LongBowReinforcements, AlliedAirReinforcementsWaypoints[2]) + if ParadropArtillery then + DropAlliedArtillery({ Utils.Random(AlliedAirReinforcementsWaypoints)[1], Alliesbase.Location }) + end +end + +InitObjectives = function() + Trigger.OnObjectiveAdded(allies, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + SurviveObj = allies.AddPrimaryObjective("Enforce your position and hold-out the onslaught\nuntil reinforcements arrive.") + KillSams = allies.AddSecondaryObjective("Destroy the two SAM Sites before reinforcements\narrive.") + Media.DisplayMessage("The soviets are blocking our GPS. We need to investigate their new technology.") + CaptureAirfields = allies.AddSecondaryObjective("Capture and hold the soviet airbase\nin the north east.") + SovietObj = soviets.AddPrimaryObjective("Eliminate all Allied forces.") + + Trigger.OnObjectiveCompleted(allies, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + Trigger.OnObjectiveFailed(allies, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + Trigger.OnPlayerLost(allies, function() + Media.PlaySpeechNotification(allies, "Lose") + end) + Trigger.OnPlayerWon(allies, function() + Media.PlaySpeechNotification(allies, "Win") + Media.DisplayMessage("The French forces have survived and dismantled the soviet presence in the area!") + end) +end + +InitMission = function() + Camera.Position = Alliesbase.CenterPosition + camera1 = Actor.Create("camera.sam", true, { Owner = allies, Location = Sam1.Location }) + camera2 = Actor.Create("camera.sam", true, { Owner = allies, Location = Sam2.Location }) + Trigger.OnKilled(Sam1, function() + if camera1.IsInWorld then camera1.Destroy() end + end) + Trigger.OnKilled(Sam2, function() + if camera2.IsInWorld then camera2.Destroy() end + end) + Trigger.OnAllKilledOrCaptured({ Sam1, Sam2 }, function() + if not allies.IsObjectiveFailed(KillSams) then + allies.MarkCompletedObjective(KillSams) + SendLongBowReinforcements() + end + end) + + local count = 0 + Utils.Do(Airfields, function(field) + Trigger.OnCapture(field, function() + count = count + 1 + if count == #Airfields then + allies.MarkCompletedObjective(CaptureAirfields) + local atek = Actor.Create("atek.mission", true, { Owner = allies, Location = HiddenATEK.Location }) + Trigger.AfterDelay(DateTime.Seconds(5), atek.Destroy) + end + end) + Trigger.OnKilled(field, function() + allies.MarkFailedObjective(CaptureAirfields) + end) + end) + + Trigger.OnAllKilled(SovietBuildings, function() + if DestroyObj then + if not soviets.HasNoRequiredUnits() then + KillObj = allies.AddPrimaryObjective("Kill all remaining soviet forces.") + end + allies.MarkCompletedObjective(DestroyObj) + else + DestroyObj = allies.AddPrimaryObjective("Dismantle the nearby Soviet base.") + allies.MarkCompletedObjective(DestroyObj) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end) +end + +SetupSoviets = function() + Barrack1.IsPrimaryBuilding = true + Barrack1.RallyPoint = SovietInfantryRally1.Location + Trigger.OnKilled(Barrack1, function() + SpawningInfantry = false + end) + Trigger.OnCapture(Barrack1, function() + SpawningInfantry = false + end) + + Trigger.AfterDelay(0, function() + local buildings = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(self) return self.Owner == soviets and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(actor) + Trigger.OnDamaged(actor, function(building) + if building.Owner == soviets and building.Health < building.MaxHealth * DamageModifier then + building.StartBuildingRepairs() + end + end) + end) + end) + + Reinforcements.Reinforce(soviets, Squad1, { AlliesBaseGate1.Location, Alliesbase1.Location }) + Reinforcements.Reinforce(soviets, Squad2, { AlliesBaseGate2.Location, Alliesbase2.Location }) + + Trigger.AfterDelay(ParadropTicks, function() + SendSovietParadrops(ParadropWaypoints[1]) + SendSovietParadrops(ParadropWaypoints[2]) + end) + Trigger.AfterDelay(ParadropTicks * 2, function() + SendSovietParadrops(ParadropWaypoints[3]) + SendSovietParadrops(ParadropWaypoints[4]) + end) + + Trigger.AfterDelay(AttackAtFrame, SendVehicleWave) + Trigger.AfterDelay(AttackAtFrameInf, SendInfantryWave) + + if MoreParas then + local delay = Utils.RandomInteger(TimerTicks/3, TimerTicks*2/3) + Trigger.AfterDelay(delay, function() + SendSovietParadrops(ParadropWaypoints[Utils.RandomInteger(1,3)]) + SendSovietParadrops(ParadropWaypoints[Utils.RandomInteger(3,5)]) + end) + end + if SpawnNavalUnits then + Trigger.AfterDelay(AttackAtFrameNaval, SendSovietNavalReinforcements) + end +end + +WorldLoaded = function() + + allies = Player.GetPlayer("Allies") + soviets = Player.GetPlayer("Soviets") + + InitObjectives() + InitMission() + SetupSoviets() +end diff --git a/mods/ra/notifications.yaml b/mods/ra/notifications.yaml index 7f470e7a85..b96f0f2863 100644 --- a/mods/ra/notifications.yaml +++ b/mods/ra/notifications.yaml @@ -47,6 +47,7 @@ Speech: WarningFiveMinutesRemaining: 5minr ControlCenterDeactivated: cntlded1 OperationControlTerminated: opterm1 + MissionTimerInitialised: mtimein1 Sounds: Notifications: From 19713a19f6e430f40622bb83096eab5aedc12f44 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Tue, 18 Nov 2014 21:47:09 +0100 Subject: [PATCH 2/7] Added support for selecting mission difficulty --- .../Widgets/Logic/MissionBrowserLogic.cs | 35 +++++++++++++++++++ mods/cnc/chrome/missionbrowser.yaml | 7 ++++ mods/ra/chrome/missionbrowser.yaml | 7 ++++ mods/ra/maps/intervention/intervention.lua | 20 ++++++++--- mods/ra/maps/survival01/survival01.lua | 2 +- 5 files changed, 65 insertions(+), 6 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs index 2d15e169c4..46edd5bb62 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs @@ -27,6 +27,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic readonly ScrollPanelWidget descriptionPanel; readonly LabelWidget description; readonly SpriteFont descriptionFont; + readonly DropDownButtonWidget difficultyButton; readonly ButtonWidget startVideoButton; readonly ButtonWidget stopVideoButton; readonly VqaPlayerWidget videoPlayer; @@ -39,6 +40,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic bool showVideoPlayer; + string difficulty; + [ObjectCreator.UseCtor] public MissionBrowserLogic(Widget widget, Action onStart, Action onExit) { @@ -67,6 +70,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic description = descriptionPanel.Get("MISSION_DESCRIPTION"); descriptionFont = Game.Renderer.Fonts[description.Font]; + difficultyButton = widget.Get("DIFFICULTY_DROPDOWNBUTTON"); + startVideoButton = widget.Get("START_VIDEO_BUTTON"); stopVideoButton = widget.Get("STOP_VIDEO_BUTTON"); stopVideoButton.IsVisible = () => showVideoPlayer; @@ -176,6 +181,28 @@ namespace OpenRA.Mods.RA.Widgets.Logic description.Bounds.Height = descriptionFont.Measure(text).Y; descriptionPanel.ScrollToTop(); descriptionPanel.Layout.AdjustChildren(); + + difficultyButton.IsVisible = () => map.Options.Difficulties.Any(); + if (!map.Options.Difficulties.Any()) + return; + + difficulty = map.Options.Difficulties.First(); + difficultyButton.OnMouseDown = _ => + { + var options = map.Options.Difficulties.Select(d => new DropDownOption + { + Title = d, + IsSelected = () => difficulty == d, + OnClick = () => difficulty = d + }); + Func setupItem = (option, template) => + { + var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick); + item.Get("LABEL").GetText = () => option.Title; + return item; + }; + difficultyButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem); + }; } void StopVideo() @@ -202,6 +229,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic Action lobbyReady = null; lobbyReady = () => { + om.IssueOrder(Order.Command("difficulty {0}".F(difficulty))); Game.LobbyInfoChanged -= lobbyReady; onStart(); om.IssueOrder(Order.Command("state {0}".F(Session.ClientState.Ready))); @@ -210,5 +238,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic om = Game.JoinServer(IPAddress.Loopback.ToString(), Game.CreateLocalServer(selectedMapPreview.Uid), "", false); } + + class DropDownOption + { + public string Title; + public Func IsSelected; + public Action OnClick; + } } } diff --git a/mods/cnc/chrome/missionbrowser.yaml b/mods/cnc/chrome/missionbrowser.yaml index c4e27df95b..992e2613d9 100644 --- a/mods/cnc/chrome/missionbrowser.yaml +++ b/mods/cnc/chrome/missionbrowser.yaml @@ -102,6 +102,13 @@ Container@MISSIONBROWSER_PANEL: Height: 35 Text: Play Font: Bold + DropDownButton@DIFFICULTY_DROPDOWNBUTTON: + X: PARENT_RIGHT - 290 - 150 + Y: 376 + Width: 140 + Height: 35 + Text: Difficulty + Font: Bold Container@MISSION_BIN: Children: VqaPlayer@MISSION_VIDEO: diff --git a/mods/ra/chrome/missionbrowser.yaml b/mods/ra/chrome/missionbrowser.yaml index 65bfb17581..1200ec72d3 100644 --- a/mods/ra/chrome/missionbrowser.yaml +++ b/mods/ra/chrome/missionbrowser.yaml @@ -98,6 +98,13 @@ Background@MISSIONBROWSER_PANEL: Text: Back Font: Bold Key: escape + DropDownButton@DIFFICULTY_DROPDOWNBUTTON: + X: PARENT_RIGHT - 140 - 130 - 150 + Y: PARENT_BOTTOM - 45 + Width: 140 + Height: 25 + Text: Difficulty + Font: Bold Background@MISSION_BIN: X: 20 Y: 50 diff --git a/mods/ra/maps/intervention/intervention.lua b/mods/ra/maps/intervention/intervention.lua index 1c7d862900..29740d1cfd 100644 --- a/mods/ra/maps/intervention/intervention.lua +++ b/mods/ra/maps/intervention/intervention.lua @@ -9,11 +9,21 @@ BeachheadTrigger = CPos.New(137, 104), CPos.New(137, 105), CPos.New(137, 106), CPos.New(136, 106), CPos.New(136, 107) } -BaseRaidInterval = DateTime.Minutes(3) -BaseFrontAttackInterval = DateTime.Minutes(3) + DateTime.Seconds(30) -BaseRearAttackInterval = DateTime.Minutes(8) -UBoatPatrolDelay = DateTime.Minutes(2) + DateTime.Seconds(30) -BaseFrontAttackWpts = { PatrolWpt1.Location, BaseRaidWpt1.Location } +Difficulty = Map.Difficulty + +if Difficulty == "Medium" then + BaseRaidInterval = DateTime.Minutes(3) + BaseFrontAttackInterval = DateTime.Minutes(3) + DateTime.Seconds(30) + BaseRearAttackInterval = DateTime.Minutes(8) + UBoatPatrolDelay = DateTime.Minutes(2) + DateTime.Seconds(30) + BaseFrontAttackWpts = { PatrolWpt1.Location, BaseRaidWpt1.Location } +else + BaseRaidInterval = DateTime.Minutes(2) + BaseFrontAttackInterval = DateTime.Minutes(2) + DateTime.Seconds(30) + BaseRearAttackInterval = DateTime.Minutes(5) + UBoatPatrolDelay = DateTime.Minutes(2) + BaseFrontAttackWpts = { PatrolWpt1.Location } +end Village = { FarmHouse1, FarmHouse2, FarmHouse3, FarmHouse4, FarmHouse5, FarmHouse6, FarmHouse7, FarmHouse8, FarmHouse9, Church } VillageRaidInterval = DateTime.Minutes(3) diff --git a/mods/ra/maps/survival01/survival01.lua b/mods/ra/maps/survival01/survival01.lua index 07baa6c804..56d65c01e2 100644 --- a/mods/ra/maps/survival01/survival01.lua +++ b/mods/ra/maps/survival01/survival01.lua @@ -1,4 +1,4 @@ -Difficulty = "Medium" +Difficulty = Map.Difficulty if Difficulty == "Easy" then AttackAtFrameIncrement = DateTime.Seconds(22) From 71fa6b2aed764e92245b93e2eddddef40c516d2c Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Wed, 19 Nov 2014 18:09:12 +0100 Subject: [PATCH 3/7] Fixed a bug in Intervention https://github.com/OpenRA/OpenRA/pull/5483#issuecomment-44781904 broke the game. --- mods/ra/maps/intervention/intervention.lua | 15 ++++++++++++++- mods/ra/maps/intervention/map.yaml | 17 +++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/mods/ra/maps/intervention/intervention.lua b/mods/ra/maps/intervention/intervention.lua index 29740d1cfd..192222c144 100644 --- a/mods/ra/maps/intervention/intervention.lua +++ b/mods/ra/maps/intervention/intervention.lua @@ -234,7 +234,7 @@ WorldLoaded = function() sovietObjective = soviets.AddPrimaryObjective("Destroy the village.") villageObjective = player.AddPrimaryObjective("Save the village.") - beachheadObjective = player.AddSecondaryObjective("Get your MCV to the main island.") + beachheadObjective = player.AddPrimaryObjective("Get your MCV to the main island.") beachheadTrigger = false Trigger.OnExitedFootprint(BeachheadTrigger, function(a, id) @@ -244,6 +244,17 @@ WorldLoaded = function() player.MarkCompletedObjective(beachheadObjective) captureObjective = player.AddPrimaryObjective("Locate and capture the enemy's Air Force HQ.") + + if AirForceHQ.IsDead then + player.MarkFailedObjective(captureObjective) + return + end + if AirForceHQ.Owner == player then + player.MarkCompletedObjective(captureObjective) + player.MarkCompletedObjective(villageObjective) + return + end + Trigger.OnCapture(AirForceHQ, function() Trigger.AfterDelay(DateTime.Seconds(3), function() player.MarkCompletedObjective(captureObjective) @@ -252,6 +263,8 @@ WorldLoaded = function() end) Trigger.OnKilled(AirForceHQ, function() player.MarkFailedObjective(captureObjective) end) + Actor.Create("mainland", true, { Owner = player }) + Trigger.AfterDelay(BaseFrontAttackInterval, function() Build(BaseFrontAttackUnits, BaseFrontAttack) ParadropSovietUnits() diff --git a/mods/ra/maps/intervention/map.yaml b/mods/ra/maps/intervention/map.yaml index 238a9a0c31..73252e6c76 100644 --- a/mods/ra/maps/intervention/map.yaml +++ b/mods/ra/maps/intervention/map.yaml @@ -2248,10 +2248,23 @@ Rules: E6: Buildable: Prerequisites: ~disabled - HPAD: + TENT: + Buildable: + Prerequisites: anypower, ~structures.allies, ~techlevel.infonly, mainland + DOME: + Buildable: + Prerequisites: proc, ~techlevel.medium, mainland + WEAP: + Buildable: + Prerequisites: proc, ~techlevel.low, mainland ProvidesCustomPrerequisite: Prerequisite: givefix - WEAP: + MAINLAND: + Tooltip: + Name: Reach the mainland + ProvidesCustomPrerequisite: + Prerequisite: mainland + HPAD: ProvidesCustomPrerequisite: Prerequisite: givefix FIX: From 0899b2687465370748090c0dac7c2ae101980616 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Fri, 14 Nov 2014 15:26:55 +0100 Subject: [PATCH 4/7] Added some power functions --- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 1 + .../Scripting/Properties/PowerProperties.cs | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 OpenRA.Mods.RA/Scripting/Properties/PowerProperties.cs diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 30ee595c3d..0ac18fcaaf 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -408,6 +408,7 @@ + diff --git a/OpenRA.Mods.RA/Scripting/Properties/PowerProperties.cs b/OpenRA.Mods.RA/Scripting/Properties/PowerProperties.cs new file mode 100644 index 0000000000..dd1fd455df --- /dev/null +++ b/OpenRA.Mods.RA/Scripting/Properties/PowerProperties.cs @@ -0,0 +1,73 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using Eluant; +using OpenRA.Mods.Common.Power; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA.Scripting +{ + [ScriptPropertyGroup("Power")] + public class PlayerPowerProperties : ScriptPlayerProperties, Requires + { + readonly PowerManager pm; + + public PlayerPowerProperties(ScriptContext context, Player player) + : base(context, player) + { + pm = player.PlayerActor.Trait(); + } + + [Desc("Returns the total of the power the player has.")] + public int PowerProvided + { + get { return pm.PowerProvided; } + } + + [Desc("Returns the power used by the player.")] + public int PowerDrained + { + get { return pm.PowerDrained; } + } + + [Desc("Returns the player's power state " + + "(\"Normal\", \"Low\" or \"Critical\").")] + public string PowerState + { + get { return pm.PowerState.ToString(); } + } + + [Desc("Triggers low power for the chosen amount of ticks.")] + public void TriggerPowerOutage(int ticks) + { + pm.TriggerPowerOutage(ticks); + } + } + + [ScriptPropertyGroup("Power")] + public class ActorPowerProperties : ScriptActorProperties, Requires + { + readonly PowerInfo pi; + + public ActorPowerProperties(ScriptContext context, Actor self) + : base(context, self) + { + pi = self.Info.Traits.GetOrDefault(); + } + + [Desc("Returns the power drained/provided by this actor.")] + public int Power + { + get { return pi.Amount; } + } + } +} \ No newline at end of file From e29adf5f4f6b87526aa75469c44aaf58b47ee654 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Fri, 14 Nov 2014 16:36:13 +0100 Subject: [PATCH 5/7] Added proximity triggers --- OpenRA.Game/Traits/World/ActorMap.cs | 10 ++-- .../Scripting/Global/TriggerGlobal.cs | 58 +++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/OpenRA.Game/Traits/World/ActorMap.cs b/OpenRA.Game/Traits/World/ActorMap.cs index fa6014a108..c259eb4b5f 100644 --- a/OpenRA.Game/Traits/World/ActorMap.cs +++ b/OpenRA.Game/Traits/World/ActorMap.cs @@ -137,11 +137,13 @@ namespace OpenRA.Traits var entered = currentActors.Except(oldActors); var exited = oldActors.Except(currentActors); - foreach (var a in entered) - onActorEntered(a); + if (onActorEntered != null) + foreach (var a in entered) + onActorEntered(a); - foreach (var a in exited) - onActorExited(a); + if (onActorExited != null) + foreach (var a in exited) + onActorExited(a); Dirty = false; } diff --git a/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs b/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs index e2c6c9838c..62dc04a764 100644 --- a/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs +++ b/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs @@ -278,6 +278,64 @@ namespace OpenRA.Mods.RA.Scripting context.World.ActorMap.RemoveCellTrigger(id); } + [Desc("Call a function when an actor enters this range." + + "Returns the trigger id for later removal using RemoveProximityTrigger(int id)." + + "The callback function will be called as func(Actor a, int id).")] + public int OnEnteredProximityTrigger(WPos pos, WRange range, LuaFunction func) + { + var triggerId = 0; + var onEntry = (LuaFunction)func.CopyReference(); + Action invokeEntry = a => + { + try + { + using (var luaActor = a.ToLuaValue(context)) + using (var id = triggerId.ToLuaValue(context)) + onEntry.Call(luaActor, id).Dispose(); + } + catch (Exception e) + { + context.FatalError(e.Message); + } + }; + + triggerId = context.World.ActorMap.AddProximityTrigger(pos, range, invokeEntry, null); + + return triggerId; + } + + [Desc("Call a function when an actor leaves this range." + + "Returns the trigger id for later removal using RemoveProximityTrigger(int id)." + + "The callback function will be called as func(Actor a, int id).")] + public int OnExitedProximityTrigger(WPos pos, WRange range, LuaFunction func) + { + var triggerId = 0; + var onExit = (LuaFunction)func.CopyReference(); + Action invokeExit = a => + { + try + { + using (var luaActor = a.ToLuaValue(context)) + using (var id = triggerId.ToLuaValue(context)) + onExit.Call(luaActor, id).Dispose(); + } + catch (Exception e) + { + context.FatalError(e.Message); + } + }; + + triggerId = context.World.ActorMap.AddProximityTrigger(pos, range, null, invokeExit); + + return triggerId; + } + + [Desc("Removes a previously created proximitry trigger.")] + public void RemoveProximityTrigger(int id) + { + context.World.ActorMap.RemoveProximityTrigger(id); + } + [Desc("Call a function when this actor is infiltrated. The callback function " + "will be called as func(Actor self, Actor infiltrator).")] public void OnInfiltrated(Actor a, LuaFunction func) From 33eeee4680f2d6dc3a4e5ead5edabac5482bf873 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Fri, 21 Nov 2014 17:01:42 +0100 Subject: [PATCH 6/7] Added OnKilledOrCaptured and OnAllKilledOrCaptured --- .../Scripting/Global/TriggerGlobal.cs | 62 +++++++++++++++++++ OpenRA.Mods.RA/Scripting/ScriptTriggers.cs | 4 ++ mods/ra/maps/survival01/survival01.lua | 9 +-- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs b/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs index 62dc04a764..1c48768fa4 100644 --- a/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs +++ b/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs @@ -220,6 +220,68 @@ namespace OpenRA.Mods.RA.Scripting GetScriptTriggers(a).RegisterCallback(Trigger.OnCapture, func, context); } + [Desc("Call a function when this actor is killed or captured. " + + "The callback function will be called as func().")] + public void OnKilledOrCaptured(Actor a, LuaFunction func) + { + var called = false; + + var copy = (LuaFunction)func.CopyReference(); + Action OnKilledOrCaptured = m => + { + try + { + if (called) + return; + + copy.Call().Dispose(); + copy.Dispose(); + called = true; + } + catch (Exception e) + { + context.FatalError(e.Message); + } + }; + + GetScriptTriggers(a).OnCapturedInternal += OnKilledOrCaptured; + GetScriptTriggers(a).OnKilledInternal += OnKilledOrCaptured; + } + + [Desc("Call a function when all of the actors in a group have been killed or captured. " + + "The callback function will be called as func().")] + public void OnAllKilledOrCaptured(Actor[] actors, LuaFunction func) + { + var group = actors.ToList(); + + var copy = (LuaFunction)func.CopyReference(); + Action OnMemberKilledOrCaptured = m => + { + try + { + if (!group.Contains(m)) + return; + + group.Remove(m); + if (!group.Any()) + { + copy.Call().Dispose(); + copy.Dispose(); + } + } + catch (Exception e) + { + context.FatalError(e.Message); + } + }; + + foreach (var a in group) + { + GetScriptTriggers(a).OnCapturedInternal += OnMemberKilledOrCaptured; + GetScriptTriggers(a).OnKilledInternal += OnMemberKilledOrCaptured; + } + } + [Desc("Call a function when a ground-based actor enters this cell footprint." + "Returns the trigger id for later removal using RemoveFootprintTrigger(int id)." + "The callback function will be called as func(Actor a, int id).")] diff --git a/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs b/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs index ffbe4902b1..f2bcb6b922 100644 --- a/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs +++ b/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs @@ -32,6 +32,7 @@ namespace OpenRA.Mods.RA.Scripting readonly World world; public event Action OnKilledInternal = _ => { }; + public event Action OnCapturedInternal = _ => { }; public event Action OnRemovedInternal = _ => { }; public event Action OnProducedInternal = (a, b) => { }; public event Action OnOtherProducedInternal = (a, b) => { }; @@ -236,6 +237,9 @@ namespace OpenRA.Mods.RA.Scripting return; } } + + // Run any internally bound callbacks + OnCapturedInternal(self); } public void Infiltrated(Actor self, Actor infiltrator) diff --git a/mods/ra/maps/survival01/survival01.lua b/mods/ra/maps/survival01/survival01.lua index 56d65c01e2..4eb867d4c2 100644 --- a/mods/ra/maps/survival01/survival01.lua +++ b/mods/ra/maps/survival01/survival01.lua @@ -63,7 +63,7 @@ SovietRallyPoints = { SovietRallyPoint1, SovietRallyPoint2, SovietRallyPoint3, S SovietGateRallyPoints = { AlliesBaseGate2, AlliesBaseGate2, AlliesBaseGate1, AlliesBaseGate1, AlliesBaseGate1 } Airfields = { SovietAirfield1, SovietAirfield2, SovietAirfield3 } -SovietBuildings = { Barrack1, SubPen, RadarDome, AdvancedPowerPlant1, AdvancedPowerPlant2, AdvancedPowerPlant3, WarFactory, Refinery, Silo1, Silo2, FlameTower1, FlameTower2, FlameTower3, Sam3, Sam4 } +SovietBuildings = { Barrack1, SubPen, RadarDome, AdvancedPowerPlant1, AdvancedPowerPlant2, AdvancedPowerPlant3, WarFactory, Refinery, Silo1, Silo2, FlameTower1, FlameTower2, FlameTower3, Sam1, Sam2, Sam3, Sam4, SovietAirfield1, SovietAirfield2, SovietAirfield3 } IdleTrigger = function(units, dest) Utils.Do(units, function(unit) @@ -321,7 +321,7 @@ InitMission = function() end) end) - Trigger.OnAllKilled(SovietBuildings, function() + Trigger.OnAllKilledOrCaptured(SovietBuildings, function() if DestroyObj then if not soviets.HasNoRequiredUnits() then KillObj = allies.AddPrimaryObjective("Kill all remaining soviet forces.") @@ -339,10 +339,7 @@ end SetupSoviets = function() Barrack1.IsPrimaryBuilding = true Barrack1.RallyPoint = SovietInfantryRally1.Location - Trigger.OnKilled(Barrack1, function() - SpawningInfantry = false - end) - Trigger.OnCapture(Barrack1, function() + Trigger.OnKilledOrCaptured(Barrack1, function() SpawningInfantry = false end) From b492c412cd86e8d139b9d13903aeea76e9bbab1b Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Sat, 22 Nov 2014 11:45:44 +0100 Subject: [PATCH 7/7] Added "missiontimer initialized" speech notification to allies02 --- mods/ra/maps/allies-02/allies02.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ra/maps/allies-02/allies02.lua b/mods/ra/maps/allies-02/allies02.lua index ab0808283e..e4ab2a992a 100644 --- a/mods/ra/maps/allies-02/allies02.lua +++ b/mods/ra/maps/allies-02/allies02.lua @@ -115,6 +115,8 @@ WorldLoaded = function() ukraine.AddPrimaryObjective("Destroy the convoy.") end) + Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end) + RunInitialActivities() SendConstructionVehicleReinforcements()