From 7c46f42ff2378490cc03f4064e847632b3053ca4 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 19 Oct 2014 12:29:08 +1300 Subject: [PATCH 1/6] Remove GDI03. --- OpenRA.sln | 1 - mods/cnc/maps/gdi03/gdi03.lua | 41 -- mods/cnc/maps/gdi03/map.bin | Bin 20485 -> 0 bytes mods/cnc/maps/gdi03/map.png | Bin 51505 -> 0 bytes mods/cnc/maps/gdi03/map.yaml | 1061 --------------------------------- 5 files changed, 1103 deletions(-) delete mode 100644 mods/cnc/maps/gdi03/gdi03.lua delete mode 100644 mods/cnc/maps/gdi03/map.bin delete mode 100644 mods/cnc/maps/gdi03/map.png delete mode 100644 mods/cnc/maps/gdi03/map.yaml diff --git a/OpenRA.sln b/OpenRA.sln index 84606d62db..b03bf4976d 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -47,7 +47,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tiberian Dawn Lua scripts", ProjectSection(SolutionItems) = preProject mods\cnc\maps\gdi01\gdi01.lua = mods\cnc\maps\gdi01\gdi01.lua mods\cnc\maps\gdi02\gdi02.lua = mods\cnc\maps\gdi02\gdi02.lua - mods\cnc\maps\gdi03\gdi03.lua = mods\cnc\maps\gdi03\gdi03.lua mods\cnc\maps\gdi04a\gdi04a.lua = mods\cnc\maps\gdi04a\gdi04a.lua mods\cnc\maps\gdi04b\gdi04b.lua = mods\cnc\maps\gdi04b\gdi04b.lua mods\cnc\maps\gdi04c\gdi04c.lua = mods\cnc\maps\gdi04c\gdi04c.lua diff --git a/mods/cnc/maps/gdi03/gdi03.lua b/mods/cnc/maps/gdi03/gdi03.lua deleted file mode 100644 index 942a931a7e..0000000000 --- a/mods/cnc/maps/gdi03/gdi03.lua +++ /dev/null @@ -1,41 +0,0 @@ -MissionAccomplished = function() - Mission.MissionOver({ player }, nil, true) - Media.PlayMovieFullscreen("bombaway.vqa") -end - -MissionFailed = function() - Mission.MissionOver(nil, { player }, true) - Media.PlayMovieFullscreen("gameover.vqa") -end - -AttackPlayer = function() - if not Actor.IsDead(NodBarracks) then - Production.BuildWithPerFactoryQueue(NodBarracks, "e1", 5) - attackSquad = Team.New(Map.FindUnitsInCircle(enemy, NodBarracks, 3)) - Team.Do(attackSquad, function(unit) - Actor.AttackMove(unit, waypoint9.location) - Actor.Hunt(unit) - end) - Team.AddEventHandler(attackSquad.OnAllKilled, OpenRA.RunAfterDelay(Utils.Seconds(15), AttackPlayer)) - end -end - -WorldLoaded = function() - player = OpenRA.GetPlayer("GDI") - enemy = OpenRA.GetPlayer("Nod") - - Media.PlayMovieFullscreen("samdie.vqa") - - samSites = Team.New({ Sam1, Sam2, Sam3, Sam4 }) - Team.AddEventHandler(samSites.OnAllKilled, function() Actor.Create("PowerProxy.AirSupport", { Owner = player }) end) - OpenRA.RunAfterDelay(Utils.Seconds(15), AttackPlayer) -end - -Tick = function() - if Mission.RequiredUnitsAreDestroyed(player) then - MissionFailed() - end - if Mission.RequiredUnitsAreDestroyed(enemy) then - MissionAccomplished() - end -end diff --git a/mods/cnc/maps/gdi03/map.bin b/mods/cnc/maps/gdi03/map.bin deleted file mode 100644 index 626001a409c94f510c4c3b1dae05d515718880ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20485 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 diff --git a/mods/cnc/maps/gdi03/map.yaml b/mods/cnc/maps/gdi03/map.yaml deleted file mode 100644 index 60fa5d3f1d..0000000000 --- a/mods/cnc/maps/gdi03/map.yaml +++ /dev/null @@ -1,1061 +0,0 @@ -Selectable: False - -MapFormat: 6 - -RequiresMod: cnc - -Title: Destroy The SAM Sites - -Description: Build up forces to destroy Nod base.\n\nOnce all Nod SAM sites are neutralized then air support will be provided to combat obstacles such as turrets.\n\nDestroy all units and structures to complete the mission objective. - -PreviewVideo: gdi3.vqa - -Author: Westwood Studios - -Tileset: TEMPERAT - -MapSize: 64,64 - -Bounds: 1,25,45,37 - -UseAsShellmap: False - -Type: Campaign - -Options: - Crates: False - Fog: False - Shroud: True - AllyBuildRadius: False - FragileAlliances: False - StartingCash: 5000 - ConfigurableStartingUnits: False - -Players: - PlayerReference@Nod: - Name: Nod - Race: nod - ColorRamp: 3,255,127 - Allies: Nod - Enemies: GDI - PlayerReference@Neutral: - Name: Neutral - OwnsWorld: True - NonCombatant: True - Race: gdi - Enemies: Nod - PlayerReference@GDI: - Name: GDI - Playable: True - AllowBots: False - Required: True - LockRace: True - Race: gdi - LockColor: True - ColorRamp: 31,222,183 - LockSpawn: True - LockTeam: True - Allies: GDI - Enemies: Nod - PlayerReference@Creeps: - Name: Creeps - NonCombatant: True - Race: Random - Enemies: Nod,GDI - -Actors: - Actor0: wood - Location: 45,59 - Owner: Neutral - Actor1: wood - Location: 44,59 - Owner: Neutral - Actor2: wood - Location: 43,59 - Owner: Neutral - Actor3: wood - Location: 42,59 - Owner: Neutral - Actor4: wood - Location: 45,58 - Owner: Neutral - Actor5: v14 - Location: 44,58 - Owner: Neutral - Actor6: v15 - Location: 43,58 - Owner: Neutral - Actor7: wood - Location: 42,58 - Owner: Neutral - Actor8: wood - Location: 45,57 - Owner: Neutral - Actor9: v17 - Location: 44,57 - Owner: Neutral - Actor10: v17 - Location: 43,57 - Owner: Neutral - Actor11: wood - Location: 42,57 - Owner: Neutral - Actor12: sbag - Location: 35,33 - Owner: Neutral - Actor13: sbag - Location: 34,33 - Owner: Neutral - Actor14: sbag - Location: 33,33 - Owner: Neutral - Actor15: sbag - Location: 32,33 - Owner: Neutral - Actor16: sbag - Location: 31,33 - Owner: Neutral - Actor17: sbag - Location: 30,33 - Owner: Neutral - Actor18: sbag - Location: 29,33 - Owner: Neutral - Actor19: sbag - Location: 28,33 - Owner: Neutral - Actor20: sbag - Location: 23,33 - Owner: Neutral - Actor21: sbag - Location: 22,33 - Owner: Neutral - Actor22: sbag - Location: 21,33 - Owner: Neutral - Actor23: sbag - Location: 20,33 - Owner: Neutral - Actor24: sbag - Location: 35,32 - Owner: Neutral - Actor25: sbag - Location: 29,32 - Owner: Neutral - Actor26: sbag - Location: 28,32 - Owner: Neutral - Actor27: sbag - Location: 23,32 - Owner: Neutral - Actor28: sbag - Location: 22,32 - Owner: Neutral - Actor29: sbag - Location: 20,32 - Owner: Neutral - Actor30: sbag - Location: 35,31 - Owner: Neutral - Actor31: sbag - Location: 20,31 - Owner: Neutral - Actor32: sbag - Location: 35,30 - Owner: Neutral - Actor33: sbag - Location: 20,30 - Owner: Neutral - Actor34: sbag - Location: 35,29 - Owner: Neutral - Actor35: sbag - Location: 20,29 - Owner: Neutral - Actor36: sbag - Location: 35,28 - Owner: Neutral - Actor37: sbag - Location: 20,28 - Owner: Neutral - Actor38: sbag - Location: 35,27 - Owner: Neutral - Actor39: sbag - Location: 20,27 - Owner: Neutral - Actor40: sbag - Location: 35,26 - Owner: Neutral - Actor41: sbag - Location: 20,26 - Owner: Neutral - Actor42: sbag - Location: 35,25 - Owner: Neutral - Actor43: sbag - Location: 34,25 - Owner: Neutral - Actor44: sbag - Location: 33,25 - Owner: Neutral - Actor45: sbag - Location: 32,25 - Owner: Neutral - Actor46: sbag - Location: 31,25 - Owner: Neutral - Actor47: sbag - Location: 30,25 - Owner: Neutral - Actor48: sbag - Location: 29,25 - Owner: Neutral - Actor49: sbag - Location: 28,25 - Owner: Neutral - Actor50: sbag - Location: 27,25 - Owner: Neutral - Actor51: sbag - Location: 26,25 - Owner: Neutral - Actor52: sbag - Location: 25,25 - Owner: Neutral - Actor53: sbag - Location: 24,25 - Owner: Neutral - Actor54: sbag - Location: 23,25 - Owner: Neutral - Actor55: sbag - Location: 22,25 - Owner: Neutral - Actor56: sbag - Location: 21,25 - Owner: Neutral - Actor57: sbag - Location: 20,25 - Owner: Neutral - Actor58: t01 - Location: 21,51 - Owner: Neutral - Actor59: tc04 - Location: 11,34 - Owner: Neutral - Actor60: t01 - Location: 43,59 - Owner: Neutral - Actor61: t01 - Location: 41,58 - Owner: Neutral - Actor62: t05 - Location: 12,38 - Owner: Neutral - Actor63: tc01 - Location: 22,44 - Owner: Neutral - Actor64: t02 - Location: 3,34 - Owner: Neutral - Actor65: tc02 - Location: 24,57 - Owner: Neutral - Actor66: tc02 - Location: 3,35 - Owner: Neutral - Actor67: tc02 - Location: 2,48 - Owner: Neutral - Actor68: t03 - Location: 41,57 - Owner: Neutral - Actor69: t03 - Location: 45,55 - Owner: Neutral - Actor70: t06 - Location: 45,53 - Owner: Neutral - Actor71: t16 - Location: 40,60 - Owner: Neutral - Actor72: tc01 - Location: 44,52 - Owner: Neutral - Actor73: tc04 - Location: 39,53 - Owner: Neutral - Actor74: t01 - Location: 36,38 - Owner: Neutral - Actor75: t06 - Location: 36,43 - Owner: Neutral - Actor76: t06 - Location: 35,42 - Owner: Neutral - Actor77: t05 - Location: 24,56 - Owner: Neutral - Actor78: tc02 - Location: 30,51 - Owner: Neutral - Actor79: t01 - Location: 30,53 - Owner: Neutral - Actor80: tc05 - Location: 34,56 - Owner: Neutral - Actor81: tc04 - Location: 24,49 - Owner: Neutral - Actor82: t07 - Location: 4,36 - Owner: Neutral - Actor83: t06 - Location: 2,37 - Owner: Neutral - Actor84: t08 - Location: 3,38 - Owner: Neutral - Actor85: t11 - Location: 2,36 - Owner: Neutral - Actor86: tc05 - Location: 17,31 - Owner: Neutral - Actor87: t12 - Location: 19,26 - Owner: Neutral - Actor88: t12 - Location: 33,44 - Owner: Neutral - Actor89: t08 - Location: 36,42 - Owner: Neutral - Actor90: tc01 - Location: 39,43 - Owner: Neutral - Actor91: tc02 - Location: 22,51 - Owner: Neutral - Actor92: tc04 - Location: 20,50 - Owner: Neutral - Actor93: tc01 - Location: 43,33 - Owner: Neutral - Actor94: t17 - Location: 14,33 - Owner: Neutral - Actor95: t12 - Location: 36,30 - Owner: Neutral - Actor96: tc04 - Location: 38,25 - Owner: Neutral - Actor97: tc01 - Location: 36,28 - Owner: Neutral - Actor98: t16 - Location: 38,28 - Owner: Neutral - Actor99: tc01 - Location: 34,45 - Owner: Neutral - Actor100: tc04 - Location: 20,42 - Owner: Neutral - Actor101: t16 - Location: 19,43 - Owner: Neutral - Actor102: tc04 - Location: 16,26 - Owner: Neutral - Actor103: tc01 - Location: 4,31 - Owner: Neutral - Actor104: t17 - Location: 6,31 - Owner: Neutral - Actor105: t01 - Location: 20,38 - Owner: Neutral - Actor106: t02 - Location: 23,40 - Owner: Neutral - Actor107: t02 - Location: 31,42 - Owner: Neutral - Actor108: t07 - Location: 32,39 - Owner: Neutral - Actor109: t07 - Location: 21,33 - Owner: Neutral - Actor110: nuke - Location: 29,26 - Owner: Nod - Health: 1 - Facing: 0 - NodBarracks: hand - Location: 24,26 - Owner: Nod - Health: 1 - Facing: 0 - Actor112: silo - Location: 33,26 - Owner: Nod - Health: 1 - Facing: 0 - Actor113: silo - Location: 31,26 - Owner: Nod - Health: 1 - Facing: 0 - Actor114: proc - Location: 31,28 - Owner: Nod - Health: 1 - Facing: 0 - Actor115: nuke - Location: 22,26 - Owner: Nod - Health: 1 - Facing: 0 - Actor116: fact - Location: 26,26 - Owner: Nod - Health: 1 - Facing: 0 - Actor117: gun - Location: 20,34 - Owner: Nod - Health: 1 - Facing: 160 - Actor118: v07 - Location: 40,55 - Owner: Neutral - Health: 1 - Facing: 0 - Actor119: v11 - Location: 44,60 - Owner: Neutral - Health: 1 - Facing: 0 - Actor120: v08 - Location: 40,56 - Owner: Neutral - Health: 1 - Facing: 0 - Actor121: v01 - Location: 44,54 - Owner: Neutral - Health: 1 - Facing: 0 - Sam1: sam - Location: 28,52 - Owner: Nod - Health: 1 - Facing: 0 - Sam2: sam - Location: 22,46 - Owner: Nod - Health: 1 - Facing: 0 - Sam3: sam - Location: 35,47 - Owner: Nod - Health: 1 - Facing: 0 - Actor125: gun - Location: 36,30 - Owner: Nod - Health: 1 - Facing: 96 - Sam4: sam - Location: 12,34 - Owner: Nod - Health: 1 - Facing: 0 - Actor127: gun - Location: 29,34 - Owner: Nod - Health: 1 - Facing: 96 - Actor129: bggy - Location: 22,29 - Owner: Nod - Health: 1 - Facing: 128 - Actor130: mcv - Location: 9,60 - Owner: GDI - Health: 1 - Facing: 0 - Actor131: jeep - Location: 8,58 - Owner: GDI - Health: 1 - Facing: 0 - Actor132: jeep - Location: 10,58 - Owner: GDI - Health: 1 - Facing: 0 - Actor133: jeep - Location: 9,58 - Owner: GDI - Health: 1 - Facing: 0 - Actor134: bggy - Location: 21,29 - Owner: Nod - Health: 1 - Facing: 128 - Actor135: bggy - Location: 28,50 - Owner: Nod - Health: 1 - Facing: 160 - Actor136: bggy - Location: 6,25 - Owner: Nod - Health: 1 - Facing: 0 - Actor137: bggy - Location: 21,30 - Owner: Nod - Health: 1 - Facing: 128 - Actor138: bggy - Location: 22,30 - Owner: Nod - Health: 1 - Facing: 128 - Actor139: e3 - Location: 17,28 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 0 - Actor140: e1 - Location: 19,29 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 4 - Actor141: e1 - Location: 18,28 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 4 - Actor142: e1 - Location: 19,28 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 0 - Actor143: e1 - Location: 31,32 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 0 - Actor144: e1 - Location: 34,32 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 4 - Actor145: e3 - Location: 34,31 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 4 - Actor146: e3 - Location: 34,32 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 1 - Actor147: e3 - Location: 18,29 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 3 - Actor148: e3 - Location: 30,51 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 0 - Actor149: e1 - Location: 20,42 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 0 - Actor150: e1 - Location: 23,44 - Owner: Nod - Health: 1 - Facing: 224 - SubCell: 4 - Actor151: e1 - Location: 24,33 - Owner: Nod - Health: 1 - Facing: 192 - SubCell: 0 - Actor152: e1 - Location: 22,34 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 4 - Actor153: e1 - Location: 27,33 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 2 - Actor154: e1 - Location: 30,34 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 1 - Actor155: e1 - Location: 14,33 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 4 - Actor156: e1 - Location: 34,45 - Owner: Nod - Health: 1 - Facing: 64 - SubCell: 1 - Actor157: e1 - Location: 36,45 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 1 - Actor158: e3 - Location: 30,32 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 3 - Actor159: e3 - Location: 21,32 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 3 - Actor160: e3 - Location: 14,32 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 3 - Actor161: e1 - Location: 11,31 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 4 - Actor162: e1 - Location: 10,31 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 2 - Actor163: c6 - Location: 42,56 - Owner: Neutral - Health: 1 - Facing: 0 - SubCell: 1 - Actor164: c3 - Location: 43,56 - Owner: Neutral - Health: 1 - Facing: 0 - SubCell: 1 - Actor165: c2 - Location: 40,58 - Owner: Neutral - Health: 1 - Facing: 0 - SubCell: 1 - Actor166: e3 - Location: 40,43 - Owner: Nod - Health: 1 - Facing: 0 - SubCell: 3 - Actor167: e3 - Location: 19,45 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 2 - Actor168: e3 - Location: 43,33 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 4 - Actor169: e1 - Location: 11,58 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 2 - Actor170: e1 - Location: 11,58 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 1 - Actor171: e1 - Location: 11,57 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 4 - Actor172: e1 - Location: 11,57 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 3 - Actor173: e2 - Location: 7,58 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 1 - Actor174: e2 - Location: 7,57 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 3 - Actor175: e2 - Location: 7,57 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 4 - Actor176: e2 - Location: 7,58 - Owner: GDI - Health: 1 - Facing: 0 - SubCell: 2 - Actor177: e3 - Location: 14,32 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 1 - Actor178: e1 - Location: 9,31 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 1 - Actor179: e3 - Location: 13,36 - Owner: Nod - Health: 1 - Facing: 96 - SubCell: 2 - Actor180: e3 - Location: 11,34 - Owner: Nod - Health: 1 - Facing: 64 - SubCell: 4 - Actor181: e3 - Location: 20,45 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 3 - Actor182: e1 - Location: 25,51 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 0 - Actor183: e1 - Location: 24,52 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 0 - Actor184: e3 - Location: 33,46 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 0 - Actor185: e3 - Location: 37,47 - Owner: Nod - Health: 1 - Facing: 160 - SubCell: 3 - Actor186: e3 - Location: 37,28 - Owner: Nod - Health: 1 - Facing: 0 - SubCell: 3 - Actor187: e3 - Location: 38,28 - Owner: Nod - Health: 1 - Facing: 0 - SubCell: 0 - Actor188: e3 - Location: 14,32 - Owner: Nod - Health: 1 - Facing: 0 - SubCell: 4 - Actor189: e1 - Location: 10,31 - Owner: Nod - Health: 1 - Facing: 0 - SubCell: 3 - Actor190: e1 - Location: 10,31 - Owner: Nod - Health: 1 - Facing: 0 - SubCell: 4 - Actor191: e3 - Location: 24,46 - Owner: Nod - Health: 1 - Facing: 128 - SubCell: 1 - waypoint26: waypoint - Location: 2,54 - Owner: Neutral - waypoint12: waypoint - Location: 11,37 - Owner: Neutral - waypoint11: waypoint - Location: 32,41 - Owner: Neutral - waypoint10: waypoint - Location: 29,50 - Owner: Neutral - waypoint9: waypoint - Location: 6,52 - Owner: Neutral - waypoint8: waypoint - Location: 14,35 - Owner: Neutral - waypoint7: waypoint - Location: 36,35 - Owner: Neutral - waypoint6: waypoint - Location: 36,32 - Owner: Neutral - waypoint5: waypoint - Location: 17,41 - Owner: Neutral - waypoint4: waypoint - Location: 24,54 - Owner: Neutral - waypoint3: waypoint - Location: 42,51 - Owner: Neutral - waypoint2: waypoint - Location: 43,37 - Owner: Neutral - waypoint1: waypoint - Location: 34,37 - Owner: Neutral - waypoint0: waypoint - Location: 26,37 - Owner: Neutral - -Smudges: - -Rules: - World: - -SpawnMPUnits: - -MPStartLocations: - -CrateSpawner: - LuaScriptInterface: - LuaScripts: gdi03.lua - ObjectivesPanel: - PanelName: MISSION_OBJECTIVES - Player: - -ConquestVictoryConditions: - MissionObjectives: - EarlyGameOver: true - ^Vehicle: - MustBeDestroyed: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - ^Tank: - MustBeDestroyed: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - ^Helicopter: - MustBeDestroyed: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - ^Infantry: - MustBeDestroyed: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - ^Plane: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - ^Ship: - 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 - HARV: - -MustBeDestroyed: - WEAP: - Buildable: - Prerequisites: ~disabled - NUK2: - Buildable: - Prerequisites: ~disabled - FIX: - Buildable: - Prerequisites: ~disabled - HPAD: - Buildable: - Prerequisites: ~disabled - EYE: - Buildable: - Prerequisites: ~disabled - GUN: - Buildable: - Prerequisites: ~disabled - ATWR: - Buildable: - Prerequisites: ~disabled - E3: - Buildable: - Prerequisites: ~disabled - E4: - Buildable: - Prerequisites: ~disabled - E5: - Buildable: - Prerequisites: ~disabled - RMBO: - Buildable: - Prerequisites: ~disabled - AFLD: - Buildable: - Prerequisites: ~disabled - TMPL: - Buildable: - Prerequisites: ~disabled - OBLI: - Buildable: - Prerequisites: ~disabled - SAM: - Buildable: - Prerequisites: ~disabled - Building: - Power: - Amount: -10 - HQ: - Buildable: - Prerequisites: ~disabled - NOHQ: - RequiresPower: - CanPowerDown: - Inherits: ^BaseBuilding - Valued: - Cost: 1000 - Tooltip: - Name: Communications Center - Description: Provides an overview of the battlefield.\n Requires power to operate. - ProvidesCustomPrerequisite: - Prerequisite: anyhq - Buildable: - BuildPaletteOrder: 70 - Prerequisites: proc - Queue: Building.GDI - Building: - Footprint: x_ xx - Dimensions: 2,2 - Health: - HP: 750 - RevealsShroud: - Range: 10 - Bib: - ProvidesRadar: - RenderBuilding: - Image: hq - Power: - Amount: -40 - PowerProxy.AirSupport: - AirstrikePower: - Icon: airstrike - ChargeTime: 30 - SquadSize: 3 - QuantizedFacings: 8 - Description: Air Strike - LongDesc: Deploy an aerial napalm strike.\nBurns buildings and infantry along a line. - EndChargeSound: airredy1.aud - SelectTargetSound: select1.aud - IncomingSound: enemya.aud - UnitType: a10 - DisplayBeacon: True - BeaconPoster: airstrike - DisplayRadarPing: True - CameraActor: camera - -Sequences: - -VoxelSequences: - -Weapons: - -Voices: - -Notifications: - -Translations: From 5207fcc83b222436d149f9610f1635a72848e2af Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 19 Oct 2014 12:29:33 +1300 Subject: [PATCH 2/6] Remove legacy Lua API traits. --- mods/cnc/rules/defaults.yaml | 16 ---------------- mods/d2k/rules/defaults.yaml | 7 ------- mods/ra/rules/defaults.yaml | 11 ----------- mods/ts/rules/defaults.yaml | 7 ------- 4 files changed, 41 deletions(-) diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index db7de46166..d08506f1d4 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -40,7 +40,6 @@ CloakSound: trans1.aud UncloakSound: trans1.aud Huntable: - LuaScriptEvents: ScriptTriggers: GainsStatUpgrades: SelfHealing@ELITE: @@ -96,7 +95,6 @@ CloakSound: trans1.aud UncloakSound: trans1.aud Huntable: - LuaScriptEvents: ScriptTriggers: GainsStatUpgrades: SelfHealing@ELITE: @@ -135,7 +133,6 @@ BodyOrientation: UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: ScriptTriggers: Tooltip: GenericName: Helicopter @@ -210,7 +207,6 @@ Prerequisites: hosp UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: DetectCloaked: Range: 1 ScriptTriggers: @@ -307,7 +303,6 @@ AttackFrontal: UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: ScriptTriggers: DeathSounds: @@ -328,7 +323,6 @@ BodyOrientation: Huntable: AttackMove: - LuaScriptEvents: ScriptTriggers: GainsStatUpgrades: SelfHealing@ELITE: @@ -362,7 +356,6 @@ BodyOrientation: UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: ScriptTriggers: GainsStatUpgrades: SelfHealing@ELITE: @@ -414,7 +407,6 @@ FrozenUnderFog: UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: Demolishable: ScriptTriggers: WithMakeAnimation: @@ -459,7 +451,6 @@ BodyOrientation: FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: ScriptTriggers: WithMakeAnimation: @@ -505,7 +496,6 @@ Palette: terrain FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: ScriptTriggers: WithMakeAnimation: @@ -539,7 +529,6 @@ Guardable: BodyOrientation: FrozenUnderFog: - LuaScriptEvents: ScriptTriggers: ^Tree: @@ -564,7 +553,6 @@ BodyOrientation: FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: ScriptTriggers: WithMakeAnimation: @@ -583,7 +571,6 @@ BodyOrientation: FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: WithMakeAnimation: ^Rock: @@ -602,7 +589,6 @@ BodyOrientation: FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: ScriptTriggers: WithMakeAnimation: @@ -630,7 +616,6 @@ BodyOrientation: Tooltip: GenericName: Destroyed Vehicle - LuaScriptEvents: DisabledOverlay: ScriptTriggers: @@ -660,6 +645,5 @@ DamagedSound: xplos.aud DestroyedSound: xplobig4.aud BodyOrientation: - LuaScriptEvents: ScriptTriggers: diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index f0db34c4c1..661906e392 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -36,7 +36,6 @@ BodyOrientation: UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: Demolishable: ScriptTriggers: GainsStatUpgrades: @@ -86,7 +85,6 @@ BodyOrientation: UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: Demolishable: ScriptTriggers: GainsStatUpgrades: @@ -113,7 +111,6 @@ Tooltip: Name: Wreck BodyOrientation: - LuaScriptEvents: TargetableUnit: TargetTypes: Ground RequiresForceFire: yes @@ -144,7 +141,6 @@ ProximityCaptor: Types: Husk BodyOrientation: - LuaScriptEvents: ScriptTriggers: ^AircraftHusk: @@ -211,7 +207,6 @@ BodyOrientation: UpdatesPlayerStatistics: Huntable: - LuaScriptEvents: ScriptTriggers: DeathSounds: Parachutable: @@ -247,7 +242,6 @@ UpdatesPlayerStatistics: Huntable: AttackMove: - LuaScriptEvents: ScriptTriggers: GainsStatUpgrades: SelfHealing@ELITE: @@ -306,7 +300,6 @@ UpdatesPlayerStatistics: WithCrumbleOverlay: Huntable: - LuaScriptEvents: Demolishable: DamagedWithoutFoundation: ThrowsShrapnel: diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 2ca4addc2f..51c9356b1d 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -46,7 +46,6 @@ EjectInAir: false AllowUnsuitableCell: false Huntable: - LuaScriptEvents: Capturable: Type: vehicle CaptureThreshold: 1 @@ -117,7 +116,6 @@ EjectInAir: false AllowUnsuitableCell: false Huntable: - LuaScriptEvents: Capturable: Type: vehicle CaptureThreshold: 1 @@ -199,7 +197,6 @@ Upgrades: hospitalheal Prerequisites: hosp Huntable: - LuaScriptEvents: ScriptTriggers: DeathSounds@NORMAL: DeathTypes: 1, 2, 3, 4 @@ -259,7 +256,6 @@ Tooltip: GenericName: Ship Huntable: - LuaScriptEvents: ScriptTriggers: GainsStatUpgrades: SelfHealing@ELITE: @@ -311,7 +307,6 @@ Tooltip: GenericName: Plane Huntable: - LuaScriptEvents: ScriptTriggers: GainsStatUpgrades: SelfHealing@ELITE: @@ -383,7 +378,6 @@ GpsDot: String: Structure Huntable: - LuaScriptEvents: Demolishable: ScriptTriggers: UpgradeManager: @@ -435,7 +429,6 @@ Guardable: BodyOrientation: FrozenUnderFog: - LuaScriptEvents: ScriptTriggers: ^TechBuilding: @@ -544,7 +537,6 @@ BodyOrientation: FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: ScriptTriggers: ^Husk: @@ -563,7 +555,6 @@ BelowUnits: BodyOrientation: Chronoshiftable: - LuaScriptEvents: TargetableUnit: TargetTypes: Ground RequiresForceFire: true @@ -621,7 +612,6 @@ Type: Concrete AutoTargetIgnore: BodyOrientation: - LuaScriptEvents: ScriptTriggers: ^Rock: @@ -643,7 +633,6 @@ BodyOrientation: FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: ScriptTriggers: ^DesertCivBuilding: diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index ec4f85a01c..b2bf081521 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -40,7 +40,6 @@ Range: 3 BodyOrientation: Huntable: - LuaScriptEvents: Demolishable: ScriptTriggers: WithMakeAnimation: @@ -84,7 +83,6 @@ SellSounds: cashturn.aud UpdatesPlayerStatistics: BodyOrientation: - LuaScriptEvents: Demolishable: ScriptTriggers: UpgradeManager: @@ -158,7 +156,6 @@ Guardable: BodyOrientation: Huntable: - LuaScriptEvents: ScriptTriggers: DeathSounds@NORMAL: DeathTypes: 1, 2, 3 @@ -255,7 +252,6 @@ BodyOrientation: CameraPitch: 90 Huntable: - LuaScriptEvents: ScriptTriggers: Explodes: Weapon: UnitExplodeSmall @@ -328,7 +324,6 @@ BodyOrientation: CameraPitch: 90 Huntable: - LuaScriptEvents: ScriptTriggers: Explodes: Weapon: UnitExplodeSmall @@ -388,7 +383,6 @@ BodyOrientation: CameraPitch: 90 Huntable: - LuaScriptEvents: ScriptTriggers: Guard: Guardable: @@ -408,7 +402,6 @@ BodyOrientation: FrozenUnderFog: StartsRevealed: true - LuaScriptEvents: SeedsResource: ResourceType: Tiberium Interval: 55 From b1fba883a9b35712822047ded37e75f6139ada8d Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 19 Oct 2014 12:33:16 +1300 Subject: [PATCH 3/6] Remove legacy Lua API. --- AUTHORS | 7 - Makefile | 4 +- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 11 - OpenRA.Mods.RA/Scripting/LuaScriptContext.cs | 142 ------ OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs | 65 --- .../Scripting/LuaScriptInterface.cs | 470 ------------------ mods/common/lua/actor.lua | 236 --------- mods/common/lua/facing.lua | 10 - mods/common/lua/map.lua | 109 ---- mods/common/lua/media.lua | 20 - mods/common/lua/mission.lua | 37 -- mods/common/lua/openra.lua | 83 ---- mods/common/lua/production.lua | 94 ---- mods/common/lua/reinforcements.lua | 82 --- mods/common/lua/rules.lua | 21 - mods/common/lua/supportpowers.lua | 44 -- mods/common/lua/team.lua | 73 --- mods/common/lua/utils.lua | 94 ---- packaging/package-all.sh | 6 +- packaging/windows/OpenRA.nsi | 4 - thirdparty/KopiLua.dll | Bin 245248 -> 0 bytes thirdparty/NLua.dll | Bin 75776 -> 0 bytes 22 files changed, 2 insertions(+), 1610 deletions(-) delete mode 100644 OpenRA.Mods.RA/Scripting/LuaScriptContext.cs delete mode 100644 OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs delete mode 100644 OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs delete mode 100644 mods/common/lua/actor.lua delete mode 100644 mods/common/lua/facing.lua delete mode 100644 mods/common/lua/map.lua delete mode 100644 mods/common/lua/media.lua delete mode 100644 mods/common/lua/mission.lua delete mode 100644 mods/common/lua/openra.lua delete mode 100644 mods/common/lua/production.lua delete mode 100644 mods/common/lua/reinforcements.lua delete mode 100644 mods/common/lua/rules.lua delete mode 100644 mods/common/lua/supportpowers.lua delete mode 100644 mods/common/lua/team.lua delete mode 100644 mods/common/lua/utils.lua delete mode 100644 thirdparty/KopiLua.dll delete mode 100644 thirdparty/NLua.dll diff --git a/AUTHORS b/AUTHORS index f99bd317ac..32b7426e38 100644 --- a/AUTHORS +++ b/AUTHORS @@ -111,13 +111,6 @@ the Apache 2.0 license. Using GeoLite2 data created by MaxMind and distributed under the CC BY-SA 3.0 license. -Using KopiLua created by Mark Feldman and -maintained by Vinicius Jarina and distributed -under the MIT license. - -Using NLua created by Vinicius Jarina and -distributed under the MIT license. - Using SharpFont created by Robert Rouhani and distributed under the MIT license. diff --git a/Makefile b/Makefile index d407aa0682..2986ec25aa 100644 --- a/Makefile +++ b/Makefile @@ -120,7 +120,7 @@ mod_common: $(mod_common_TARGET) ##### Official Mods ##### -STD_MOD_LIBS = $(game_TARGET) thirdparty/KopiLua.dll thirdparty/NLua.dll +STD_MOD_LIBS = $(game_TARGET) STD_MOD_DEPS = $(STD_MOD_LIBS) $(ralint_TARGET) @@ -341,8 +341,6 @@ install-core: default @$(INSTALL_PROGRAM) SharpFont.dll "$(DATA_INSTALL_DIR)" @$(CP) SharpFont.dll.config "$(DATA_INSTALL_DIR)" @$(INSTALL_PROGRAM) Mono.Nat.dll "$(DATA_INSTALL_DIR)" - @$(INSTALL_PROGRAM) KopiLua.dll "$(DATA_INSTALL_DIR)" - @$(INSTALL_PROGRAM) NLua.dll "$(DATA_INSTALL_DIR)" @$(INSTALL_PROGRAM) MaxMind.Db.dll "$(DATA_INSTALL_DIR)" @$(INSTALL_PROGRAM) MaxMind.GeoIP2.dll "$(DATA_INSTALL_DIR)" @$(INSTALL_PROGRAM) Newtonsoft.Json.dll "$(DATA_INSTALL_DIR)" diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 84ed13657c..ff41de2412 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -53,14 +53,6 @@ ..\thirdparty\FuzzyLogicLibrary.dll False - - ..\thirdparty\KopiLua.dll - False - - - ..\thirdparty\NLua.dll - False - @@ -324,10 +316,7 @@ - - - diff --git a/OpenRA.Mods.RA/Scripting/LuaScriptContext.cs b/OpenRA.Mods.RA/Scripting/LuaScriptContext.cs deleted file mode 100644 index cf9af09840..0000000000 --- a/OpenRA.Mods.RA/Scripting/LuaScriptContext.cs +++ /dev/null @@ -1,142 +0,0 @@ -#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 System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NLua; -using NLua.Event; -using OpenRA.Primitives; - -namespace OpenRA.Mods.RA.Scripting -{ - [Desc("Part of the legacy Lua API.")] - public sealed class LuaScriptContext : IDisposable - { - public Lua Lua { get; private set; } - readonly Cache functionCache; - - public LuaScriptContext() - { - Log.AddChannel("lua", "lua.log"); - Log.Write("lua", "Creating Lua script context"); - Lua = new Lua(); - Lua.HookException += OnLuaException; - functionCache = new Cache(Lua.GetFunction); - } - - public void RegisterObject(object target, string tableName, bool exposeAllMethods) - { - Log.Write("lua", "Registering object {0}", target); - - if (tableName != null && Lua.GetTable(tableName) == null) - Lua.NewTable(tableName); - - var type = target.GetType(); - - var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance); - RegisterMethods(tableName, target, methods, exposeAllMethods); - } - - public void RegisterType(Type type, string tableName, bool exposeAllMethods) - { - Log.Write("lua", "Registering type {0}", type); - - if (tableName != null && Lua.GetTable(tableName) == null) - Lua.NewTable(tableName); - - var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static); - RegisterMethods(tableName, null, methods, exposeAllMethods); - } - - void RegisterMethods(string tableName, object target, IEnumerable methods, bool allMethods) - { - foreach (var method in methods) - { - string methodName; - - var attr = method.GetCustomAttributes(true).FirstOrDefault(); - if (attr == null) - { - if (allMethods) - methodName = method.Name; - else - continue; - } - else - methodName = attr.Name ?? method.Name; - - var methodTarget = method.IsStatic ? null : target; - - if (tableName != null) - Lua.RegisterFunction(tableName + "." + methodName, methodTarget, method); - else - Lua.RegisterFunction(methodName, methodTarget, method); - } - } - - void OnLuaException(object sender, HookExceptionEventArgs e) - { - ShowException(e.Exception); - } - - void ShowException(Exception e) - { - ShowErrorMessage(e.Message, e.ToString()); - } - - public void ShowErrorMessage(string shortMessage, string longMessage) - { - Game.Debug("{0}", shortMessage); - Game.Debug("See lua.log for details"); - Log.Write("lua", "{0}", longMessage ?? shortMessage); - } - - public void LoadLuaScripts(Func getFileContents, params string[] files) - { - foreach (var file in files) - { - try - { - Log.Write("lua", "Loading Lua script {0}", file); - var content = getFileContents(file); - Lua.DoString(content, file); - } - catch (Exception e) - { - ShowException(e); - } - } - } - - public object[] InvokeLuaFunction(string name, params object[] args) - { - try - { - var function = functionCache[name]; - if (function == null) - return null; - return function.Call(args); - } - catch (Exception e) - { - ShowException(e); - return null; - } - } - - public void Dispose() - { - if (Lua != null) - Lua.Dispose(); - } - } -} diff --git a/OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs b/OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs deleted file mode 100644 index 7dfdc049b6..0000000000 --- a/OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs +++ /dev/null @@ -1,65 +0,0 @@ -#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 OpenRA.Traits; - -namespace OpenRA.Mods.RA.Scripting -{ - [Desc("Part of the legacy Lua API.")] - public class LuaScriptEventsInfo : TraitInfo { } - - public class LuaScriptEvents : INotifyKilled, INotifyAddedToWorld, INotifyRemovedFromWorld, - INotifyCapture, INotifyDamage, INotifyIdle, INotifyProduction - { - public event Action OnKilled = (self, e) => { }; - public event Action OnAddedToWorld = self => { }; - public event Action OnRemovedFromWorld = self => { }; - public event Action OnCaptured = (self, captor, oldOwner, newOwner) => { }; - public event Action OnDamaged = (self, e) => { }; - public event Action OnIdle = self => { }; - public event Action OnProduced = (self, other, exit) => { }; - - public void Killed(Actor self, AttackInfo e) - { - OnKilled(self, e); - } - - public void AddedToWorld(Actor self) - { - OnAddedToWorld(self); - } - - public void RemovedFromWorld(Actor self) - { - OnRemovedFromWorld(self); - } - - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) - { - OnCaptured(self, captor, oldOwner, newOwner); - } - - public void Damaged(Actor self, AttackInfo e) - { - OnDamaged(self, e); - } - - public void TickIdle(Actor self) - { - OnIdle(self); - } - - public void UnitProduced(Actor self, Actor other, CPos exit) - { - OnProduced(self, other, exit); - } - } -} diff --git a/OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs b/OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs deleted file mode 100644 index fe8e22b888..0000000000 --- a/OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs +++ /dev/null @@ -1,470 +0,0 @@ -#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 System.Collections; -using System.Collections.Generic; -using System.Linq; -using NLua; -using OpenRA.Effects; -using OpenRA.FileSystem; -using OpenRA.Mods.RA.Activities; -using OpenRA.Mods.RA.Air; -using OpenRA.Network; -using OpenRA.Scripting; -using OpenRA.Support; -using OpenRA.Traits; -using WorldRenderer = OpenRA.Graphics.WorldRenderer; - -namespace OpenRA.Mods.RA.Scripting -{ - [Desc("Part of the legacy Lua API.")] - public class LuaScriptInterfaceInfo : ITraitInfo, Requires - { - public readonly string[] LuaScripts = { }; - - public object Create(ActorInitializer init) { return new LuaScriptInterface(this); } - } - - public sealed class LuaScriptInterface : IWorldLoaded, ITick, IDisposable - { - World world; - SpawnMapActors sma; - readonly LuaScriptContext context = new LuaScriptContext(); - readonly LuaScriptInterfaceInfo info; - - public LuaScriptInterface(LuaScriptInterfaceInfo info) - { - this.info = info; - } - - public void WorldLoaded(World w, WorldRenderer wr) - { - world = w; - sma = world.WorldActor.Trait(); - - context.Lua["World"] = w; - context.Lua["WorldRenderer"] = wr; - context.RegisterObject(this, "Internal", false); - context.RegisterType(typeof(WVec), "WVec", true); - context.RegisterType(typeof(CVec), "CVec", true); - context.RegisterType(typeof(WPos), "WPos", true); - context.RegisterType(typeof(CPos), "CPos", true); - context.RegisterType(typeof(WRot), "WRot", true); - context.RegisterType(typeof(WAngle), "WAngle", true); - context.RegisterType(typeof(WRange), "WRange", true); - context.RegisterType(typeof(int2), "int2", true); - context.RegisterType(typeof(float2), "float2", true); - - context.LoadLuaScripts(f => GlobalFileSystem.Open(f).ReadAllText(), Game.modData.Manifest.LuaScripts); - - AddMapActorGlobals(); - - context.LoadLuaScripts(f => w.Map.Container.GetContent(f).ReadAllText(), info.LuaScripts); - - context.InvokeLuaFunction("WorldLoaded"); - } - - void AddMapActorGlobals() - { - foreach (var kv in sma.Actors) - { - if (context.Lua[kv.Key] != null) - context.ShowErrorMessage("{0}: The global name '{1}' is reserved and may not be used by map actor {2}".F(GetType().Name, kv.Key, kv.Value), null); - else - context.Lua[kv.Key] = kv.Value; - } - } - - public void Tick(Actor self) - { - using (new PerfSample("tick_lua")) - context.InvokeLuaFunction("Tick"); - } - - public void Dispose() - { - context.Dispose(); - } - - [LuaGlobal] - public object New(string typeName, LuaTable args) - { - var type = Game.modData.ObjectCreator.FindType(typeName); - if (type == null) - throw new InvalidOperationException("Cannot locate type: {0}".F(typeName)); - if (args == null) - return Activator.CreateInstance(type); - var argsArray = ConvertArgs(args); - return Activator.CreateInstance(type, argsArray); - } - - static object[] ConvertArgs(LuaTable args) - { - var argsArray = new object[args.Keys.Count]; - for (var i = 1; i <= args.Keys.Count; i++) - { - var arg = args[i] as LuaTable; - if (arg != null && arg[1] != null && arg[2] != null) - argsArray[i - 1] = Convert.ChangeType(arg[1], Enum.Parse(arg[2].ToString())); - else - argsArray[i - 1] = args[i]; - } - return argsArray; - } - - [LuaGlobal] - public void Debug(object obj) - { - if (obj != null) - Game.Debug(obj.ToString()); - } - - [LuaGlobal] - public object TraitOrDefault(Actor actor, string className) - { - var type = Game.modData.ObjectCreator.FindType(className); - if (type == null) - return null; - - var method = typeof(Actor).GetMethod("TraitOrDefault"); - var genericMethod = method.MakeGenericMethod(type); - return genericMethod.Invoke(actor, null); - } - - [LuaGlobal] - public object Trait(Actor actor, string className) - { - var ret = TraitOrDefault(actor, className); - if (ret == null) - throw new InvalidOperationException("Actor {0} does not have trait of type {1}".F(actor, className)); - return ret; - } - - [LuaGlobal] - public bool HasTrait(Actor actor, string className) - { - var ret = TraitOrDefault(actor, className); - return ret != null; - } - - [LuaGlobal] - public object[] ActorsWithTrait(string className) - { - var type = Game.modData.ObjectCreator.FindType(className); - if (type == null) - throw new InvalidOperationException("Cannot locate type: {0}".F(className)); - - var method = typeof(World).GetMethod("ActorsWithTrait"); - var genericMethod = method.MakeGenericMethod(type); - var result = ((IEnumerable)genericMethod.Invoke(world, null)).Cast().ToArray(); - return result; - } - - [LuaGlobal] - public object TraitInfoOrDefault(string actorType, string className) - { - var type = Game.modData.ObjectCreator.FindType(className); - if (type == null || !world.Map.Rules.Actors.ContainsKey(actorType)) - return null; - - return world.Map.Rules.Actors[actorType].Traits.GetOrDefault(type); - } - - [LuaGlobal] - public object TraitInfo(string actorType, string className) - { - var ret = TraitInfoOrDefault(actorType, className); - if (ret == null) - throw new InvalidOperationException("Actor type {0} does not have trait info of type {1}".F(actorType, className)); - return ret; - } - - [LuaGlobal] - public bool HasTraitInfo(string actorType, string className) - { - var ret = TraitInfoOrDefault(actorType, className); - return ret != null; - } - - [LuaGlobal] - public void RunAfterDelay(double delay, Action func) - { - world.AddFrameEndTask(w => w.Add(new DelayedAction((int)delay, func))); - } - - [LuaGlobal] - public void PlaySpeechNotification(Player player, string notification) - { - Sound.PlayNotification(world.Map.Rules, player, "Speech", notification, player != null ? player.Country.Race : null); - } - - [LuaGlobal] - public void PlaySoundNotification(Player player, string notification) - { - Sound.PlayNotification(world.Map.Rules, player, "Sounds", notification, player != null ? player.Country.Race : null); - } - - [LuaGlobal] - public void WaitFor(Actor actor, Func func) - { - actor.QueueActivity(new WaitFor(func)); - } - - [LuaGlobal] - public void CallFunc(Actor actor, Action func) - { - actor.QueueActivity(new CallFunc(func)); - } - - [LuaGlobal] - public int GetFacing(object vec, double currentFacing) - { - if (vec is CVec) - return world.Map.FacingBetween(CPos.Zero, CPos.Zero + (CVec)vec, (int)currentFacing); - if (vec is WVec) - return Util.GetFacing((WVec)vec, (int)currentFacing); - throw new ArgumentException("Unsupported vector type: {0}".F(vec.GetType())); - } - - [LuaGlobal] - public WRange GetWRangeFromCells(double cells) - { - return WRange.FromCells((int)cells); - } - - [LuaGlobal] - public void SetWinState(Player player, string winState) - { - player.WinState = Enum.Parse(winState); - } - - [LuaGlobal] - public void PlayRandomMusic() - { - if (!Game.Settings.Sound.MapMusic || !world.Map.Rules.InstalledMusic.Any()) - return; - Game.ConnectionStateChanged += StopMusic; - PlayMusic(); - } - - void PlayMusic() - { - var track = world.Map.Rules.InstalledMusic.Random(Game.CosmeticRandom); - Sound.PlayMusicThen(track.Value, PlayMusic); - } - - void StopMusic(OrderManager orderManager) - { - if (!orderManager.GameStarted) - { - Sound.StopMusic(); - Game.ConnectionStateChanged -= StopMusic; - } - } - - [LuaGlobal] - public bool IsDead(Actor actor) - { - return actor.IsDead(); - } - - [LuaGlobal] - public void PlayMovieFullscreen(string movie, Action onComplete) - { - Media.PlayFMVFullscreen(world, movie, onComplete); - } - - [LuaGlobal] - public void FlyToPos(Actor actor, WPos pos) - { - actor.QueueActivity(new Fly(actor, Target.FromPos(pos))); - } - - [LuaGlobal] - public void FlyAttackActor(Actor actor, Actor targetActor) - { - actor.QueueActivity(new FlyAttack(Target.FromActor(targetActor))); - } - - [LuaGlobal] - public void FlyAttackCell(Actor actor, CPos location) - { - actor.QueueActivity(new FlyAttack(Target.FromCell(actor.World, location))); - } - - [LuaGlobal] - public void HeliFlyToPos(Actor actor, WPos pos) - { - actor.QueueActivity(new HeliFly(actor, Target.FromPos(pos))); - } - - [LuaGlobal] - public void SetUnitStance(Actor actor, string stance) - { - var at = actor.TraitOrDefault(); - if (at != null) - at.Stance = Enum.Parse(stance); - } - - [LuaGlobal] - public bool RequiredUnitsAreDestroyed(Player player) - { - return player.HasNoRequiredUnits(); - } - - [LuaGlobal] - public void AttackMove(Actor actor, CPos location, double nearEnough) - { - if (actor.HasTrait()) - actor.QueueActivity(new AttackMove.AttackMoveActivity(actor, new Move.Move(actor, location, (int)nearEnough))); - else - actor.QueueActivity(new Move.Move(actor, location, (int)nearEnough)); - } - - [LuaGlobal] - public int GetRandomInteger(double low, double high) - { - return world.SharedRandom.Next((int)low, (int)high); - } - - [LuaGlobal] - public CPos GetRandomCell() - { - return world.Map.ChooseRandomCell(world.SharedRandom); - } - - [LuaGlobal] - public CPos GetRandomEdgeCell() - { - return world.Map.ChooseRandomEdgeCell(world.SharedRandom); - } - - [LuaGlobal] - public Actor GetNamedActor(string actorName) - { - return sma.Actors[actorName]; - } - - [LuaGlobal] - public bool IsNamedActor(Actor actor) - { - return actor.ActorID <= sma.LastMapActorID && actor.ActorID > sma.LastMapActorID - sma.Actors.Count; - } - - [LuaGlobal] - public IEnumerable GetNamedActors() - { - return sma.Actors.Values; - } - - [LuaGlobal] - public Actor[] FindActorsInBox(WPos topLeft, WPos bottomRight) - { - return world.ActorMap.ActorsInBox(topLeft, bottomRight).ToArray(); - } - - [LuaGlobal] - public Actor[] FindActorsInCircle(WPos location, WRange radius) - { - return world.FindActorsInCircle(location, radius).ToArray(); - } - - ClassicProductionQueue GetSharedQueueForCategory(Player player, string category) - { - return world.ActorsWithTrait() - .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category) - .Select(a => a.Trait).FirstOrDefault(); - } - - ClassicProductionQueue GetSharedQueueForUnit(Player player, string unit) - { - var ri = world.Map.Rules.Actors[unit]; - - var bi = ri.Traits.GetOrDefault(); - if (bi == null) - return null; - - return bi.Queue.Select(q => GetSharedQueueForCategory(player, q)).FirstOrDefault(); - } - - [LuaGlobal] - public void BuildWithSharedQueue(Player player, string unit, double amount) - { - var queue = GetSharedQueueForUnit(player, unit); - - if (queue != null) - queue.ResolveOrder(queue.Actor, Order.StartProduction(queue.Actor, unit, (int)amount)); - } - - [LuaGlobal] - public void BuildWithPerFactoryQueue(Actor factory, string unit, double amount) - { - var ri = world.Map.Rules.Actors[unit]; - - var bi = ri.Traits.GetOrDefault(); - if (bi == null) - return; - - var queue = factory.TraitsImplementing() - .FirstOrDefault(q => q.Enabled); - - if (queue != null) - queue.ResolveOrder(factory, Order.StartProduction(factory, unit, (int)amount)); - } - - [LuaGlobal] - public bool SharedQueueIsBusy(Player player, string category) - { - var queue = GetSharedQueueForCategory(player, category); - - if (queue == null) - return true; - - return queue.CurrentItem() != null; - } - - [LuaGlobal] - public bool PerFactoryQueueIsBusy(Actor factory) - { - var queue = factory.TraitsImplementing() - .FirstOrDefault(q => q.Enabled); - - if (queue == null) - return true; - - return queue.CurrentItem() != null; - } - - [LuaGlobal] - public void Guard(Actor guard, Actor target) - { - if (target.HasTrait()) - { - var gt = guard.TraitOrDefault(); - - if (gt != null) - gt.GuardTarget(guard, Target.FromActor(target)); - } - } - - [LuaGlobal] - public IEnumerable ExpandFootprint(LuaTable cells, bool allowDiagonal) - { - return Util.ExpandFootprint(cells.Values.Cast(), allowDiagonal); - } - - [LuaGlobal] - public WPos CenterOfCell(CPos position) - { - return world.Map.CenterOfCell(position); - } - } -} diff --git a/mods/common/lua/actor.lua b/mods/common/lua/actor.lua deleted file mode 100644 index 0ace58e364..0000000000 --- a/mods/common/lua/actor.lua +++ /dev/null @@ -1,236 +0,0 @@ -Actor = { } - -Actor.Create = function(name, init) - if name == nil then error("No actor name specified", 2) end - if init.Owner == nil then error("No actor owner specified", 2) end - local td = OpenRA.New("TypeDictionary") - local addToWorld = true - for key, value in pairs(init) do - if key == "AddToWorld" then - addToWorld = value - else - td:Add(OpenRA.New(key .. "Init", { value })) - end - end - return World:CreateActor(addToWorld, name, td) -end - -Actor.Turn = function(actor, facing) - actor:QueueActivity(OpenRA.New("Turn", { actor, { facing, "Int32" } })) -end - -Actor.Move = function(actor, location) - Actor.MoveNear(actor, location, 0) -end - -Actor.MoveNear = function(actor, location, nearEnough) - actor:QueueActivity(OpenRA.New("Move", { actor, location, WRange.FromCells(nearEnough) })) -end - -Actor.ScriptedMove = function(actor, location) - if Actor.HasTrait(actor, "Helicopter") then - Internal.HeliFlyToPos(actor, Map.CenterOfCell(location)) - else - actor:QueueActivity(OpenRA.New("Move", { actor, location })) - end -end - -Actor.AfterMove = function(actor) - local heli = Actor.TraitOrDefault(actor, "Helicopter") - if heli ~= nil then - Actor.Turn(actor, heli.Info.InitialFacing) - Actor.HeliLand(actor, true) - end -end - -Actor.Teleport = function(actor, location) - actor:QueueActivity(OpenRA.New("SimpleTeleport", { location })) -end - -Actor.AttackMove = function(actor, location, nearEnough) - Internal.AttackMove(actor, location, nearEnough or 0) -end - -Actor.HeliFly = function(actor, position) - Internal.HeliFlyToPos(actor, position) -end - -Actor.HeliLand = function(actor, requireSpace) - actor:QueueActivity(OpenRA.New("HeliLand", { requireSpace })) -end - -Actor.Fly = function(actor, position) - Internal.FlyToPos(actor, position) -end - -Actor.FlyAttackActor = function(actor, targetActor) - Internal.FlyAttackActor(actor, targetActor) -end - -Actor.FlyAttackCell = function(actor, location) - Internal.FlyAttackCell(actor, location) -end - -Actor.FlyOffMap = function(actor) - actor:QueueActivity(OpenRA.New("FlyOffMap")) -end - -Actor.Hunt = function(actor) - if Actor.HasTrait(actor, "AttackBase") and Actor.HasTrait(actor, "IMove") then - actor:QueueActivity(OpenRA.New("Hunt", { actor })) - end -end - -Actor.CargoIsEmpty = function(actor) - local cargo = Actor.TraitOrDefault(actor, "Cargo") - return cargo == nil or cargo:IsEmpty(actor) -end - -Actor.UnloadCargo = function(actor, unloadAll) - actor:QueueActivity(OpenRA.New("UnloadCargo", { actor, unloadAll })) -end - -Actor.Harvest = function(actor) - actor:QueueActivity(OpenRA.New("FindResources")) -end - -Actor.Scatter = function(actor) - local mobile = Actor.Trait(actor, "Mobile") - mobile:Nudge(actor, actor, true) -end - -Actor.Wait = function(actor, period) - actor:QueueActivity(OpenRA.New("Wait", { { period, "Int32" } })) -end - -Actor.WaitFor = function(actor, func) - Internal.WaitFor(actor, func) -end - -Actor.CallFunc = function(actor, func) - Internal.CallFunc(actor, func) -end - -Actor.DeployTransform = function(actor) - Actor.CallFunc(actor, function() - -- Queue the transform order - Actor.Trait(actor, "Transforms"):DeployTransform(true) - end) -end - -Actor.RemoveSelf = function(actor) - actor:QueueActivity(OpenRA.New("RemoveSelf")) -end - -Actor.Stop = function(actor) - actor:CancelActivity() -end - -Actor.IsDead = function(actor) - return Internal.IsDead(actor) -end - -Actor.IsInWorld = function(actor) - return actor.IsInWorld -end - -Actor.Owner = function(actor) - return actor.Owner -end - -Actor.Facing = function(actor) - return Actor.Trait(actor, "IFacing"):get_Facing() -end - -Actor.IsIdle = function(actor) - return actor.IsIdle -end - -Actor.SetStance = function(actor, stance) - Internal.SetUnitStance(actor, stance) -end - -Actor.RepairBuilding = function(actor) - local rb = Actor.TraitOrDefault(actor, "RepairableBuilding") - if rb ~= nil and not rb.RepairActive then - rb:RepairBuilding(actor, Actor.Owner(actor)) - end -end - -Actor.OnDamaged = function(actor, eh) - Actor.Trait(actor, "LuaScriptEvents").OnDamaged:Add(eh) -end - -Actor.OnKilled = function(actor, eh) - Actor.Trait(actor, "LuaScriptEvents").OnKilled:Add(eh) -end - -Actor.OnAddedToWorld = function(actor, eh) - Actor.Trait(actor, "LuaScriptEvents").OnAddedToWorld:Add(eh) -end - -Actor.OnRemovedFromWorld = function(actor, eh) - Actor.Trait(actor, "LuaScriptEvents").OnRemovedFromWorld:Add(eh) -end - -Actor.OnCaptured = function(actor, eh) - Actor.Trait(actor, "LuaScriptEvents").OnCaptured:Add(eh) -end - -Actor.OnIdle = function(actor, eh) - Actor.Trait(actor, "LuaScriptEvents").OnIdle:Add(eh) -end - -Actor.OnProduced = function(actor, eh) - Actor.Trait(actor, "LuaScriptEvents").OnProduced:Add(eh) -end - -Actor.ActorsWithTrait = function(className) - local ret = { } - for item in Utils.Enumerate(Internal.ActorsWithTrait(className)) do - table.insert(ret, item.Actor) - end - return ret -end - -Actor.HasTrait = function(actor, className) - return Internal.HasTrait(actor, className) -end - -Actor.TraitOrDefault = function(actor, className) - return Internal.TraitOrDefault(actor, className) -end - -Actor.Trait = function(actor, className) - return Internal.Trait(actor, className) -end - -Actor.ReturnToBase = function(actor, airfield) - actor:QueueActivity(OpenRA.New("ReturnToBase", { actor, airfield })) -end - -Actor.Guard = function(actor, target) - Internal.Guard(actor, target) -end - -Actor.Patrol = function(actor, waypoints, wait, loop) - if not Actor.IsDead(actor) then - Utils.Do(waypoints, function(wpt) - Actor.AttackMove(actor, wpt.Location, 3) - Actor.Wait(actor, wait or 0) - end) - if loop or loop == nil then - Actor.CallFunc(actor, function() Actor.Patrol(actor, waypoints, wait, loop) end) - end - end -end - -Actor.PatrolUntil = function(actor, waypoints, wait, func) - if func == nil then error("No function specified", 2) end - if not Actor.IsDead(actor) then - Actor.Patrol(actor, waypoints, wait, false) - if not func(actor) then - Actor.CallFunc(actor, function() Actor.PatrolUntil(actor, waypoints, wait, func) end) - end - end -end diff --git a/mods/common/lua/facing.lua b/mods/common/lua/facing.lua deleted file mode 100644 index 827d3c6890..0000000000 --- a/mods/common/lua/facing.lua +++ /dev/null @@ -1,10 +0,0 @@ -Facing = { } - -Facing.North = { 0, "Int32" } -Facing.NorthWest = { 32, "Int32" } -Facing.West = { 64, "Int32" } -Facing.SouthWest = { 96, "Int32" } -Facing.South = { 128, "Int32" } -Facing.SouthEast = { 160, "Int32" } -Facing.East = { 192, "Int32" } -Facing.NorthEast = { 224, "Int32" } diff --git a/mods/common/lua/map.lua b/mods/common/lua/map.lua deleted file mode 100644 index f1ed30ce9c..0000000000 --- a/mods/common/lua/map.lua +++ /dev/null @@ -1,109 +0,0 @@ -Map = { } - -Map.GetFacing = function(vec, currentFacing) - return Internal.GetFacing(vec, currentFacing) -end - -Map.GetRandomCell = function() - return Internal.GetRandomCell() -end - -Map.GetRandomEdgeCell = function() - return Internal.GetRandomEdgeCell() -end - -Map.IsNamedActor = function(actor) - return Internal.IsNamedActor(actor) -end - -Map.GetNamedActor = function(actorName) - return Internal.GetNamedActor(actorName) -end - -Map.GetNamedActors = function() - return Internal.GetNamedActors() -end - -Map.FindActorsInCircle = function(location, radius, func) - local actors = Internal.FindActorsInCircle(location.CenterPosition, WRange.FromCells(radius)) - return Utils.EnumerableWhere(actors, func) -end - -Map.FindActorsInBox = function(topLeft, bottomRight, func) - local actors = Internal.FindActorsInBox(topLeft.CenterPosition, bottomRight.CenterPosition) - return Utils.EnumerableWhere(actors, func) -end - -Map.__FilterByTrait = function(a, player, trait) - return Actor.Owner(a) == player and Actor.HasTrait(a, trait) -end - -Map.__FilterByTraitAndIdle = function(a, player, trait) - return Map.__FilterByTrait(a, player, trait) and Actor.IsIdle(a) -end - -Map.FindUnitsInCircle = function(player, location, radius) - return Map.FindActorsInCircle(location, radius, function(a) return Map.__FilterByTrait(a, player, "Mobile") end) -end - -Map.FindUnitsInBox = function(player, topLeft, bottomRight) - return Map.FindActorsInBox(topLeft, bottomRight, function(a) return Map.__FilterByTrait(a, player, "Mobile") end) -end - -Map.FindStructuresInCircle = function(player, location, radius) - return Map.FindActorsInCircle(location, radius, function(a) return Map.__FilterByTrait(a, player, "Building") end) -end - -Map.FindStructuresInBox = function(player, topLeft, bottomRight) - return Map.FindActorsInBox(topLeft, bottomRight, function(a) return Map.__FilterByTrait(a, player, "Building") end) -end - -Map.FindIdleUnitsInCircle = function(player, location, radius) - return Map.FindActorsInCircle(location, radius, function(a) return Map.__FilterByTraitAndIdle(a, player, "Mobile") end) -end - -Map.FindIdleUnitsInBox = function(player, topLeft, bottomRight) - return Map.FindActorsInBox(topLeft, bottomRight, function(a) return Map.__FilterByTraitAndIdle(a, player, "Mobile") end) -end - -Map.ExpandFootprint = function(cells, allowDiagonal) - return Utils.EnumerableToTable(Internal.ExpandFootprint(cells, allowDiagonal)) -end - -Map.CenterOfCell = function(position) - return Internal.CenterOfCell(position) -end - -CPos.New = function(x, y) - return OpenRA.New("CPos", { { x, "Int32" }, { y, "Int32" } }) -end - -WPos.New = function(x, y, z) - if z == nil then - z = 0 - end - return OpenRA.New("WPos", { { x, "Int32" }, { y, "Int32" }, { z, "Int32" } }) -end - -WPos.FromCPos = function(location) - return WPos.New(location.X * 1024, location.Y * 1024, 0) -end - -CVec.New = function(x, y) - return OpenRA.New("CVec", { { x, "Int32" }, { y, "Int32" } }) -end - -WVec.New = function(x, y, z) - if z == nil then - z = 0 - end - return OpenRA.New("WVec", { { x, "Int32" }, { y, "Int32" }, { z, "Int32" } }) -end - -WRange.New = function(r) - return OpenRA.New("WRange", { { r, "Int32" } }) -end - -WRange.FromCells = function(cells) - return WRange.New(cells * 1024) -end diff --git a/mods/common/lua/media.lua b/mods/common/lua/media.lua deleted file mode 100644 index 7400551f46..0000000000 --- a/mods/common/lua/media.lua +++ /dev/null @@ -1,20 +0,0 @@ -Media = { } - -Media.PlaySpeechNotification = function(notification, player) - Internal.PlaySpeechNotification(player, notification) -end - -Media.PlaySoundNotification = function(notification, player) - Internal.PlaySoundNotification(player, notification) -end - -Media.PlayRandomMusic = function() - Internal.PlayRandomMusic() -end - -Media.PlayMovieFullscreen = function(movie, onComplete) - if onComplete == nil then - onComplete = function() end - end - Internal.PlayMovieFullscreen(movie, onComplete) -end \ No newline at end of file diff --git a/mods/common/lua/mission.lua b/mods/common/lua/mission.lua deleted file mode 100644 index ae942766ea..0000000000 --- a/mods/common/lua/mission.lua +++ /dev/null @@ -1,37 +0,0 @@ -Mission = { } - -Mission.MissionOver = function(winners, losers, setWinStates) - World:SetLocalPauseState(true) - World:set_PauseStateLocked(true) - if winners then - for i, player in ipairs(winners) do - Media.PlaySpeechNotification("Win", player) - if setWinStates then - OpenRA.SetWinState(player, "Won") - end - end - end - if losers then - for i, player in ipairs(losers) do - Media.PlaySpeechNotification("Lose", player) - if setWinStates then - OpenRA.SetWinState(player, "Lost") - end - end - end - Mission.MissionIsOver = true -end - -Mission.GetGroundAttackersOf = function(player) - return Utils.Where(Actor.ActorsWithTrait("AttackBase"), function(actor) - return not Actor.IsDead(actor) and Actor.IsInWorld(actor) and Actor.Owner(actor) == player and Actor.HasTrait(actor, "Mobile") - end) -end - -Mission.TickTakeOre = function(player) - OpenRA.TakeOre(player, 0.01 * OpenRA.GetOreCapacity(player) / 25) -end - -Mission.RequiredUnitsAreDestroyed = function(player) - return Internal.RequiredUnitsAreDestroyed(player) -end \ No newline at end of file diff --git a/mods/common/lua/openra.lua b/mods/common/lua/openra.lua deleted file mode 100644 index 5d1fe6096e..0000000000 --- a/mods/common/lua/openra.lua +++ /dev/null @@ -1,83 +0,0 @@ -print = Internal.Debug - -OpenRA = { } - -OpenRA.New = function(className, args) - if args == nil then - args = { } - end - return Internal.New(className, args) -end - -OpenRA.RunAfterDelay = function(delay, func) - if func == nil then error("No function specified", 2) end - Internal.RunAfterDelay(delay, func) -end - -OpenRA.SetViewportCenterPosition = function(position) - WorldRenderer.Viewport:Center(position) -end - -OpenRA.GetViewportCenterPosition = function() - return WorldRenderer.Viewport.CenterPosition -end - -OpenRA.GetDifficulty = function() - return World.LobbyInfo.GlobalSettings.Difficulty -end - -OpenRA.IsSinglePlayer = function() - return World.LobbyInfo:get_IsSinglePlayer() -end - -OpenRA.GetPlayer = function(internalName) - return Utils.EnumerableFirstOrNil(World.Players, function(p) return p.InternalName == internalName end) -end - -OpenRA.GetPlayers = function(func) - return Utils.EnumerableWhere(World.Players, func) -end - -OpenRA.SetWinState = function(player, winState) - Internal.SetWinState(player, winState) -end - -OpenRA.GetRandomInteger = function(low, high) - if high <= low then - return low - else - return Internal.GetRandomInteger(low, high) - end -end - -OpenRA.TakeOre = function(player, amount) - Actor.Trait(player.PlayerActor, "PlayerResources"):TakeResources(amount) -end - -OpenRA.TakeCash = function(player, amount) - Actor.Trait(player.PlayerActor, "PlayerResources"):TakeCash(amount) -end - -OpenRA.GiveOre = function(player, amount) - Actor.Trait(player.PlayerActor, "PlayerResources"):GiveResources(amount) -end - -OpenRA.GiveCash = function(player, amount) - Actor.Trait(player.PlayerActor, "PlayerResources"):GiveCash(amount) -end - -OpenRA.CanGiveOre = function(player, amount) - return Actor.Trait(player.PlayerActor, "PlayerResources"):CanGiveResources(amount) -end - -OpenRA.GetOreCapacity = function(player) - return Actor.Trait(player.PlayerActor, "PlayerResources").ResourceCapacity -end - -OpenRA.GetOre = function(player) - return Actor.Trait(player.PlayerActor, "PlayerResources").Resources -end - -OpenRA.GetCash = function(player) - return Actor.Trait(player.PlayerActor, "PlayerResources").Cash -end diff --git a/mods/common/lua/production.lua b/mods/common/lua/production.lua deleted file mode 100644 index 09290015d3..0000000000 --- a/mods/common/lua/production.lua +++ /dev/null @@ -1,94 +0,0 @@ -Production = { } -Production.EventHandlers = { } - -Production.BuildWithSharedQueue = function(player, unit, amount) - Internal.BuildWithSharedQueue(player, unit, amount or 1) -end - -Production.BuildWithPerFactoryQueue = function(factory, unit, amount) - Internal.BuildWithPerFactoryQueue(factory, unit, amount or 1) -end - -Production.Build = function(factory, unit, amount) - if Actor.HasTrait(factory, "ProductionQueue") then - Production.BuildWithPerFactoryQueue(factory, unit, amount) - elseif Actor.HasTrait(factory, "Production") then - Production.SetPrimaryBuilding(factory) - Production.BuildWithSharedQueue(Actor.Owner(factory), unit, amount) - else - error("Production.Build: not a factory") - end -end - -Production.SharedQueueIsBusy = function(player, category) - return Internal.SharedQueueIsBusy(player, category) -end - -Production.PerFactoryQueueIsBusy = function(factory) - return Internal.PerFactoryQueueIsBusy(factory) -end - -Production.SetRallyPoint = function(factory, location) - local srp = Actor.Trait(factory, "RallyPoint") - if srp ~= nil then - srp.Location = location.Location - end -end - -Production.SetPrimaryBuilding = function(factory) - local pb = Actor.TraitOrDefault(factory, "PrimaryBuilding") - if pb ~= nil then - pb:SetPrimaryProducer(factory, true) - end -end - -Production.BuildTeamFromTemplate = function(player, template, func) - local factories = { } - Utils.Do(template, function(t) table.insert(factories, t[1]) end) - - if Utils.Any(factories, Actor.IsDead) then - return - end - - if Utils.Any(factories, function(fact) return Production.EventHandlers[fact] end) then - OpenRA.RunAfterDelay(Utils.Seconds(10), function() Production.BuildTeamFromTemplate(player, template, func) end) - return - end - - local team = Team.New({ }) - local teamSize = 0 - Utils.Do(template, function(t) teamSize = teamSize + #t[2] end) - - local eventHandler = function(unit) - Team.Add(team, unit) - - if #team.Actors >= teamSize then - func(team) - Utils.Do(factories, function(factory) - Production.EventHandlers[factory] = nil - end) - end - end - - Utils.Do(factories, function(factory) - Production.EventHandlers[factory] = eventHandler - end) - - Utils.Do(template, function(t) - Utils.Do(t[2], function(unit) - Production.Build(t[1], unit) - end) - end) -end - -Production.EventHandlers.Setup = function(player) - Utils.Do(Actor.ActorsWithTrait("Production"), function(factory) - if Actor.Owner(factory) == player then - Actor.OnProduced(factory, function(fact, unit) - if Production.EventHandlers[fact] then - Production.EventHandlers[fact](unit) - end - end) - end - end) -end diff --git a/mods/common/lua/reinforcements.lua b/mods/common/lua/reinforcements.lua deleted file mode 100644 index 7325acf014..0000000000 --- a/mods/common/lua/reinforcements.lua +++ /dev/null @@ -1,82 +0,0 @@ -Reinforcements = { } - -Reinforcements.Insert = function(owner, transportName, passengerNames, enterPath, exitPath) - local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" } - local center = WPos.op_Addition(Map.CenterOfCell(enterPath[1]), WVec.New(0, 0, Rules.InitialAltitude(transportName))) - local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], CenterPosition = center, Facing = facing }) - local cargo = Actor.Trait(transport, "Cargo") - local passengers = { } - - for i, passengerName in ipairs(passengerNames) do - local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner }) - passengers[i] = passenger - cargo:Load(transport, passenger) - end - - Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end) - Actor.AfterMove(transport) - Actor.UnloadCargo(transport, true) - Actor.Wait(transport, 25) - Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end) - Actor.RemoveSelf(transport) - return transport, passengers -end - -Reinforcements.Extract = function(owner, transportName, passengerNames, enterPath, exitPath) - local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" } - local center = WPos.op_Addition(Map.CenterOfCell(enterPath[1]), WVec.New(0, 0, Rules.InitialAltitude(transportName))) - local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], CenterPosition = center, Facing = facing }) - local cargo = Actor.Trait(transport, "Cargo") - - Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end) - Actor.AfterMove(transport) - Actor.WaitFor(transport, function() - return Utils.All(passengerNames, function(passenger) return cargo.Passengers:Contains(passenger) end) - end) - - Actor.Wait(transport, 125) - Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end) - Actor.RemoveSelf(transport) - return transport -end - -Reinforcements.Reinforce = function(owner, reinforcementNames, enterLocation, rallyPointLocation, interval, onCreateFunc) - local facing = { Map.GetFacing(CPos.op_Subtraction(rallyPointLocation, enterLocation), 0), "Int32" } - local reinforcements = { } - for i, reinforcementName in ipairs(reinforcementNames) do - local reinforcement = Actor.Create(reinforcementName, { AddToWorld = false, Owner = owner, Location = enterLocation, Facing = facing }) - reinforcements[i] = reinforcement - OpenRA.RunAfterDelay((i - 1) * interval, function() - World:Add(reinforcement) - Actor.MoveNear(reinforcement, rallyPointLocation, 2) - if onCreateFunc ~= nil then - onCreateFunc(reinforcement) - end - end) - end - return reinforcements -end - -Reinforcements.ReinforceWithCargo = function(owner, actorName, path, cargoNames, actionFunc) - local facing = { Map.GetFacing(CPos.op_Subtraction(path[2].Location, path[1].Location), 0), "Int32" } - local center = WPos.op_Addition(path[1].CenterPosition, WVec.New(0, 0, Rules.InitialAltitude(actorName))) - local actor = Actor.Create(actorName, { Owner = owner, Location = path[1].Location, CenterPosition = center, Facing = facing }) - local cargo = Actor.TraitOrDefault(actor, "Cargo") - local team = Team.New({}) - if cargo ~= nil and cargoNames ~= nil and #cargoNames > 0 then - local passengers = { } - - for i, cargoName in ipairs(cargoNames) do - local passenger = Actor.Create(cargoName, { AddToWorld = false, Owner = owner }) - Team.Add(team, passenger) - passengers[i] = passenger - cargo:Load(actor, passenger) - end - - end - - Utils.Do(Utils.Skip(path, 1), function(waypoint) Actor.ScriptedMove(actor, waypoint.Location) end) - - if actionFunc then actionFunc(actor, team) end - return actor, team -end diff --git a/mods/common/lua/rules.lua b/mods/common/lua/rules.lua deleted file mode 100644 index fe9f0fe86f..0000000000 --- a/mods/common/lua/rules.lua +++ /dev/null @@ -1,21 +0,0 @@ -Rules = { } - -Rules.HasTraitInfo = function(actorType, className) - return Internal.HasTraitInfo(actorType, className) -end - -Rules.TraitInfoOrDefault = function(actorType, className) - return Internal.TraitInfoOrDefault(actorType, className) -end - -Rules.TraitInfo = function(actorType, className) - return Internal.TraitInfo(actorType, className) -end - -Rules.InitialAltitude = function(actorType) - local ai = Rules.TraitInfoOrDefault(actorType, "AircraftInfo") - if ai ~= nil then - return ai.CruiseAltitude.Range - end - return 0 -end \ No newline at end of file diff --git a/mods/common/lua/supportpowers.lua b/mods/common/lua/supportpowers.lua deleted file mode 100644 index ac620f0120..0000000000 --- a/mods/common/lua/supportpowers.lua +++ /dev/null @@ -1,44 +0,0 @@ -SupportPowers = { } - -SupportPowers.Airstrike = function(owner, planeName, enterLocation, bombLocation) - local facing = { Map.GetFacing(CPos.op_Subtraction(bombLocation, enterLocation), 0), "Int32" } - local center = WPos.op_Addition(Map.CenterOfCell(enterLocation), WVec.New(0, 0, Rules.InitialAltitude(planeName))) - local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, CenterPosition = center }) - local bombLoc = Map.CenterOfCell(bombLocation) - Actor.Trait(plane, "AttackBomber"):SetTarget(bombLoc) - Actor.Fly(plane, bombLoc) - Actor.FlyOffMap(plane) - Actor.RemoveSelf(plane) - return plane -end - -SupportPowers.Paradrop = function(owner, planeName, passengerNames, enterLocation, dropLocation) - local facing = { Map.GetFacing(CPos.op_Subtraction(dropLocation, enterLocation), 0), "Int32" } - local center = WPos.op_Addition(Map.CenterOfCell(enterLocation), WVec.New(0, 0, Rules.InitialAltitude(planeName))) - local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, CenterPosition = center }) - Actor.Fly(plane, Map.CenterOfCell(dropLocation)) - Actor.Trait(plane, "ParaDrop"):SetLZ(dropLocation, true) - Actor.FlyOffMap(plane) - Actor.RemoveSelf(plane) - local cargo = Actor.Trait(plane, "Cargo") - local passengers = { } - for i, passengerName in ipairs(passengerNames) do - local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner }) - passengers[i] = passenger - cargo:Load(plane, passenger) - end - return plane, passengers -end - -SupportPowers.Chronoshift = function(unitLocationPairs, chronosphere, duration, killCargo) - duration = duration or -1 - killCargo = killCargo or true - Utils.Do(unitLocationPairs, function(pair) - local unit = pair[1] - local cell = pair[2] - local cs = Actor.TraitOrDefault(unit, "Chronoshiftable") - if cs ~= nil and cs:CanChronoshiftTo(unit, cell) then - cs:Teleport(unit, cell, duration, killCargo, chronosphere) - end - end) -end diff --git a/mods/common/lua/team.lua b/mods/common/lua/team.lua deleted file mode 100644 index 863e904019..0000000000 --- a/mods/common/lua/team.lua +++ /dev/null @@ -1,73 +0,0 @@ -Team = { } - -Team.New = function(actors) - local team = { } - team.Actors = actors - team.OnAllKilled = { } - team.OnAnyKilled = { } - team.OnAllRemovedFromWorld = { } - team.OnAnyRemovedFromWorld = { } - Team.Do(team, function(actor) Team.AddActorEventHandlers(team, actor) end) - return team -end - -Team.Add = function(team, actor) - table.insert(team.Actors, actor) - Team.AddActorEventHandlers(team, actor) -end - -Team.AddActorEventHandlers = function(team, actor) - Actor.OnKilled(actor, function() - Team.InvokeHandlers(team.OnAnyKilled) - if Team.AllAreDead(team) then Team.InvokeHandlers(team.OnAllKilled) end - end) - - Actor.OnRemovedFromWorld(actor, function() - Team.InvokeHandlers(team.OnAnyRemovedFromWorld) - if not Team.AnyAreInWorld(team) then Team.InvokeHandlers(team.OnAllRemovedFromWorld) end - end) -end - -Team.InvokeHandlers = function(event) - Utils.Do(event, function(handler) handler() end) -end - -Team.AllAreDead = function(team) - return Utils.All(team.Actors, Actor.IsDead) -end - -Team.AnyAreDead = function(team) - return Utils.Any(team.Actors, Actor.IsDead) -end - -Team.AllAreInWorld = function(team) - return Utils.All(team.Actors, Actor.IsInWorld) -end - -Team.AnyAreInWorld = function(team) - return Utils.Any(team.Actors, Actor.IsInWorld) -end - -Team.AddEventHandler = function(event, func) - table.insert(event, func) -end - -Team.Contains = function(team, actor) - return Utils.Any(team.Actors, function(a) return a == actor end) -end - -Team.Do = function(team, func) - Utils.Do(team.Actors, function(actor) - if not Actor.IsDead(actor) then - func(actor) - end - end) -end - -Team.Patrol = function(team, waypoints, wait, loop) - Team.Do(team, function(a) Actor.Patrol(a, waypoints, wait, loop) end) -end - -Team.PatrolUntil = function(team, waypoints, wait, func) - Team.Do(team, function(a) Actor.PatrolUntil(a, waypoints, wait, func) end) -end diff --git a/mods/common/lua/utils.lua b/mods/common/lua/utils.lua deleted file mode 100644 index 03f3ef0031..0000000000 --- a/mods/common/lua/utils.lua +++ /dev/null @@ -1,94 +0,0 @@ -Utils = { } - -Utils.Enumerate = function(netEnumerable) - local enum = netEnumerable:GetEnumerator() - return function() - if enum:MoveNext() then - return enum:get_Current() - end - end -end - -Utils.EnumerableFirstOrNil = function(netEnumerable, func) - for item in Utils.Enumerate(netEnumerable) do - if func(item) then - return item - end - end - return nil -end - -Utils.EnumerableWhere = function(netEnumerable, func) - local ret = { } - for item in Utils.Enumerate(netEnumerable) do - if func(item) then - table.insert(ret, item) - end - end - return ret -end - -Utils.EnumerableToTable = function(netEnumerable, func) - local ret = { } - for item in Utils.Enumerate(netEnumerable) do - table.insert(ret, item) - end - return ret -end - -Utils.Where = function(array, func) - local ret = { } - for i, item in ipairs(array) do - if func(item) then - table.insert(ret, item) - end - end - return ret -end - -Utils.All = function(array, func) - for i, item in ipairs(array) do - if not func(item) then - return false - end - end - return true -end - -Utils.Any = function(array, func) - for i, item in ipairs(array) do - if func(item) then - return true - end - end - return false -end - -Utils.Do = function(array, func) - for i, item in ipairs(array) do - func(item) - end -end - -Utils.Skip = function(array, n) - local ret = { } - for i, item in ipairs(array) do - if i > n then - table.insert(ret, item) - end - end - return ret -end - -Utils.TableToArray = function(luaTable) - return Internal.TableToArray(luaTable) -end - -Utils.Seconds = function(seconds) - local TicksPerSecond = 25 - return seconds * TicksPerSecond -end - -Utils.Minutes = function(minutes) - return Utils.Seconds(minutes * 60) -end diff --git a/packaging/package-all.sh b/packaging/package-all.sh index 9877f6a26d..7767970584 100755 --- a/packaging/package-all.sh +++ b/packaging/package-all.sh @@ -58,11 +58,7 @@ cp thirdparty/SDL2-CS* packaging/built # Mono.NAT for UPnP support cp thirdparty/Mono.Nat.dll packaging/built -# (legacy) Lua -cp thirdparty/KopiLua.dll packaging/built -cp thirdparty/NLua.dll packaging/built - -# Eluant (new lua) +# Eluant (Lua integration) cp thirdparty/Eluant* packaging/built # GeoIP database access diff --git a/packaging/windows/OpenRA.nsi b/packaging/windows/OpenRA.nsi index 6e015620ec..2caead9fe8 100644 --- a/packaging/windows/OpenRA.nsi +++ b/packaging/windows/OpenRA.nsi @@ -90,8 +90,6 @@ Section "Game" GAME File "${SRCDIR}\Newtonsoft.Json.dll" File "${SRCDIR}\RestSharp.dll" File "${SRCDIR}\GeoLite2-Country.mmdb" - File "${SRCDIR}\KopiLua.dll" - File "${SRCDIR}\NLua.dll" File "${SRCDIR}\eluant.dll" File "${DEPSDIR}\soft_oal.dll" File "${DEPSDIR}\SDL2.dll" @@ -212,8 +210,6 @@ Function ${UN}Clean Delete $INSTDIR\RestSharp.dll Delete $INSTDIR\GeoLite2-Country.mmdb Delete $INSTDIR\KopiLua.dll - Delete $INSTDIR\NLua.dll - Delete $INSTDIR\SDL2-CS.dll Delete $INSTDIR\soft_oal.dll Delete $INSTDIR\SDL2.dll Delete $INSTDIR\lua51.dll diff --git a/thirdparty/KopiLua.dll b/thirdparty/KopiLua.dll deleted file mode 100644 index 5b7b8daa0acf5d184876abf5e100daf694b140cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245248 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 From 10923d64386f4deca3e82f7f5722f42fd87c4d67 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 19 Oct 2014 12:42:12 +1300 Subject: [PATCH 4/6] Remove old IRC code. --- Makefile | 15 +- OpenRA.Game/Settings.cs | 18 - OpenRA.Irc/Channel.cs | 27 -- OpenRA.Irc/IrcClient.cs | 400 ------------------ OpenRA.Irc/IrcClientUser.cs | 112 ----- OpenRA.Irc/IrcConnection.cs | 72 ---- OpenRA.Irc/IrcUtils.cs | 67 --- OpenRA.Irc/Line.cs | 155 ------- OpenRA.Irc/NumericCommand.cs | 25 -- OpenRA.Irc/OpenRA.Irc.csproj | 59 --- OpenRA.Irc/Settings.StyleCop | 344 --------------- OpenRA.Irc/Topic.cs | 30 -- OpenRA.Irc/User.cs | 73 ---- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 6 - OpenRA.Mods.RA/Widgets/Logic/IrcLogic.cs | 252 ----------- .../Widgets/Logic/ServerBrowserLogic.cs | 1 - OpenRA.sln | 4 - mods/cnc/chrome/irc.yaml | 70 --- mods/cnc/mod.yaml | 1 - mods/d2k/mod.yaml | 1 - mods/ra/chrome/irc.yaml | 69 --- mods/ra/mod.yaml | 1 - mods/ts/mod.yaml | 1 - packaging/package-all.sh | 2 +- packaging/windows/OpenRA.nsi | 2 - 25 files changed, 4 insertions(+), 1803 deletions(-) delete mode 100644 OpenRA.Irc/Channel.cs delete mode 100644 OpenRA.Irc/IrcClient.cs delete mode 100644 OpenRA.Irc/IrcClientUser.cs delete mode 100644 OpenRA.Irc/IrcConnection.cs delete mode 100644 OpenRA.Irc/IrcUtils.cs delete mode 100644 OpenRA.Irc/Line.cs delete mode 100644 OpenRA.Irc/NumericCommand.cs delete mode 100644 OpenRA.Irc/OpenRA.Irc.csproj delete mode 100644 OpenRA.Irc/Settings.StyleCop delete mode 100644 OpenRA.Irc/Topic.cs delete mode 100644 OpenRA.Irc/User.cs delete mode 100644 OpenRA.Mods.RA/Widgets/Logic/IrcLogic.cs delete mode 100644 mods/cnc/chrome/irc.yaml delete mode 100644 mods/ra/chrome/irc.yaml diff --git a/Makefile b/Makefile index 2986ec25aa..1717c2e704 100644 --- a/Makefile +++ b/Makefile @@ -67,7 +67,7 @@ INSTALL_PROGRAM = $(INSTALL) -m755 INSTALL_DATA = $(INSTALL) -m644 # program targets -CORE = rsdl2 rnull game utility irc ralint +CORE = rsdl2 rnull game utility ralint TOOLS = editor tsbuild crashdialog VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`) @@ -86,14 +86,6 @@ game_FLAGS = -win32icon:OpenRA.Game/OpenRA.ico PROGRAMS += game game: $(game_TARGET) -irc_SRCS := $(shell find OpenRA.Irc/ -iname '*.cs') -irc_TARGET = OpenRA.Irc.dll -irc_KIND = library -irc_DEPS = $(game_TARGET) -irc_LIBS = $(COMMON_LIBS) $(irc_DEPS) -PROGRAMS += irc -irc: $(irc_TARGET) - # Renderer dlls rsdl2_SRCS := $(shell find OpenRA.Renderer.Sdl2/ -iname '*.cs') rsdl2_TARGET = OpenRA.Renderer.Sdl2.dll @@ -123,13 +115,12 @@ mod_common: $(mod_common_TARGET) STD_MOD_LIBS = $(game_TARGET) STD_MOD_DEPS = $(STD_MOD_LIBS) $(ralint_TARGET) - # Red Alert mod_ra_SRCS := $(shell find OpenRA.Mods.RA/ -iname '*.cs') mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll mod_ra_KIND = library -mod_ra_DEPS = $(STD_MOD_DEPS) $(mod_common_TARGET) $(irc_TARGET) -mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_common_TARGET) $(irc_TARGET) +mod_ra_DEPS = $(STD_MOD_DEPS) $(mod_common_TARGET) +mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_common_TARGET) PROGRAMS += mod_ra mod_ra: $(mod_ra_TARGET) diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index 781bffcad7..a8430f3da5 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -214,22 +214,6 @@ namespace OpenRA } } - public class IrcSettings - { - public string Hostname = "irc.openra.net"; - public int Port = 6667; - public string Nickname = null; - public string Username = "openra"; - public string Realname = null; - public string DefaultNickname = "Newbie"; - public string Channel = "global"; - public string TimestampFormat = "HH:mm:ss"; - public int ReconnectDelay = 10000; - public int ConnectionTimeout = 300000; - public bool Debug = false; - public bool ConnectAutomatically = false; - } - public class Settings { string settingsFile; @@ -241,7 +225,6 @@ namespace OpenRA public ServerSettings Server = new ServerSettings(); public DebugSettings Debug = new DebugSettings(); public KeySettings Keys = new KeySettings(); - public IrcSettings Irc = new IrcSettings(); public Dictionary Sections; @@ -257,7 +240,6 @@ namespace OpenRA { "Server", Server }, { "Debug", Debug }, { "Keys", Keys }, - { "Irc", Irc } }; // Override fieldloader to ignore invalid entries diff --git a/OpenRA.Irc/Channel.cs b/OpenRA.Irc/Channel.cs deleted file mode 100644 index 72df1f7fa4..0000000000 --- a/OpenRA.Irc/Channel.cs +++ /dev/null @@ -1,27 +0,0 @@ -#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 OpenRA.Primitives; - -namespace OpenRA.Irc -{ - public class Channel - { - public readonly string Name; - public readonly ObservableSortedDictionary Users = new ObservableSortedDictionary(StringComparer.OrdinalIgnoreCase); - public Topic Topic = new Topic(); - - public Channel(string name) - { - Name = name; - } - } -} diff --git a/OpenRA.Irc/IrcClient.cs b/OpenRA.Irc/IrcClient.cs deleted file mode 100644 index 03befd5dd1..0000000000 --- a/OpenRA.Irc/IrcClient.cs +++ /dev/null @@ -1,400 +0,0 @@ -#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 System.IO; -using System.Net.Sockets; -using System.Threading; -using OpenRA.Primitives; - -namespace OpenRA.Irc -{ - public sealed class IrcClient : IDisposable - { - public static readonly IrcClient Instance = new IrcClient(); - - public static string MainChannel { get { return '#' + Game.Settings.Irc.Channel; } } - - public static void AddHistory(string line) - { - Instance.History.Add("{0} {1}".F(DateTime.Now.ToString(Game.Settings.Irc.TimestampFormat), line)); - } - - public static void AddMessage(string nickname, string message) - { - AddHistory("{0}: {1}".F(nickname, message)); - } - - public static void AddNotice(string nickname, string message) - { - AddHistory("-{0}- {1}".F(nickname, message)); - } - - public static void AddSelfNotice(string nickname, string message) - { - AddHistory("-> -{0}- {1}".F(nickname, message)); - } - - public static void AddAction(string nickname, string message) - { - AddHistory("* {0} {1}".F(nickname, message)); - } - - static void InstanceInitialize() - { - var s = Game.Settings.Irc; - - Instance.OnPublicMessage += l => - { - var action = IrcUtils.FromAction(l.Message); - if (action != null) - AddAction(l.Prefix.Nickname, action); - else - AddMessage(l.Prefix.Nickname, l.Message); - }; - Instance.OnPrivateMessage += l => - { - var ctcp = IrcUtils.FromCtcp(l.Message); - if (ctcp == null) - return; - - var split = ctcp.Split(new[] { ' ' }, 2); - var command = split[0]; - if (command.EqualsIC("VERSION")) - { - var mod = Game.modData.Manifest.Mod; - Instance.CtcpRespond(l.Prefix.Nickname, command, "{0}: {1}".F(mod.Title, mod.Version)); - } - }; - Instance.OnPrivateNotice += l => - { - if (l.Target == "*") // Drop pre-register notices - return; - AddNotice(l.Prefix.Nickname, l.Message); - }; - Instance.OnRegister += l => - { - Instance.Join(MainChannel); - Game.Settings.Irc.Nickname = Instance.LocalUser.Nickname; - Game.Settings.Save(); - }; - Instance.OnConnecting += () => AddHistory("Connecting"); - Instance.OnConnect += () => AddHistory("Connected"); - Instance.OnPart += l => AddHistory("{0} left{1}".F(l.Prefix.Nickname, l.Message != null ? ": " + l.Message : "")); - Instance.OnJoin += l => AddHistory("{0} joined".F(l.Prefix.Nickname)); - Instance.OnQuit += l => AddHistory("{0} quit{1}".F(l.Prefix.Nickname, l.Message != null ? ": " + l.Message : "")); - Instance.OnKick += l => AddHistory("{0} kicked {1}{2}".F(l.Prefix.Nickname, l.KickeeNickname, l.Message != null ? ": " + l.Message : "")); - Instance.OnNicknameSet += l => - { - AddHistory("{0} set their nickname to {1}".F(l.Prefix.Nickname, l.NewNickname)); - if (l.NewNickname == Instance.LocalUser.Nickname) - { - Instance.Nickname = l.NewNickname; - Game.Settings.Irc.Nickname = l.NewNickname; - Game.Settings.Save(); - } - }; - Instance.OnTopicSet += l => AddHistory("{0} set the topic to {1}".F(l.Prefix.Nickname, l.Message)); - Instance.OnNumeric += l => - { - if (l.Numeric == NumericCommand.RPL_TOPIC) - { - var topic = Instance.GetChannel(MainChannel).Topic; - AddHistory("Topic is {0}".F(topic.Message)); - } - else if (l.Numeric == NumericCommand.RPL_TOPICWHOTIME) - { - var topic = Instance.GetChannel(MainChannel).Topic; - AddHistory("Topic set by {0} at {1}".F(topic.Author.Nickname, topic.Time.ToLocalTime())); - } - else if (l.Numeric == NumericCommand.RPL_NOTOPIC) - AddHistory("No topic is set"); - else if (l.Numeric == NumericCommand.ERR_NICKNAMEINUSE) - AddHistory("Nickname {0} is already in use".F(l.AltTarget)); - else if (l.Numeric == NumericCommand.ERR_ERRONEUSNICKNAME) - AddHistory("Nickname {0} is erroneus".F(l.AltTarget)); - }; - Instance.OnDisconnect += () => - { - if (Instance.ConnectionFailure != null) - { - AddHistory("Disconnected: {0}".F(Instance.ConnectionFailure.Message)); - if (s.ReconnectDelay >= 0) - { - AddHistory("Reconnecting in {0} seconds".F(s.ReconnectDelay / 1000)); - Instance.ConnectionState = IrcConnectionState.Reconnecting; - Game.RunAfterDelay(s.ReconnectDelay, () => - { - if (Instance.IsReconnecting) - Instance.Connect(Instance.Hostname, Instance.Port, Instance.ConnectionTimeout, Instance.Nickname, Instance.Username, Instance.Realname); - }); - } - } - else - AddHistory("Disconnected"); - }; - Instance.OnLineRead += l => - { - if (s.Debug) - AddHistory(l.RawString); - }; - Game.OnQuit += Instance.Disconnect; - } - - static IrcClient() - { - Log.AddChannel("irc", "irc.log"); - InstanceInitialize(); - } - - public readonly ObservableCollection History = new ObservableCollection(); - - IrcConnection connection; - Thread thread; - public IrcConnectionState ConnectionState { get; private set; } - public IrcClientUser LocalUser { get; private set; } - public Exception ConnectionFailure { get; private set; } - - public string Hostname { get; private set; } - public int Port { get; private set; } - public int ConnectionTimeout { get; private set; } - public string Nickname { get; private set; } - public string Username { get; private set; } - public string Realname { get; private set; } - - public bool IsConnected - { - get { return ConnectionState == IrcConnectionState.Connected; } - } - - public bool IsReconnecting - { - get { return ConnectionState == IrcConnectionState.Reconnecting; } - } - - public IrcClient() - { - ConnectionState = IrcConnectionState.Disconnected; - } - - public void Connect(string hostname, int port, int connectionTimeout, string nickname, string username, string realname) - { - ConnectionFailure = null; - if (IsConnected) - Disconnect(); - - Hostname = hostname; - Port = port; - ConnectionTimeout = connectionTimeout; - Nickname = nickname; - Username = username; - Realname = realname; - - thread = new Thread(() => - { - try - { - ConnectionState = IrcConnectionState.Connecting; - LocalUser = new IrcClientUser(this); - connection = new IrcConnection(); - OnConnecting(); - connection.Connect(hostname, port, connectionTimeout); - ConnectionState = IrcConnectionState.Connected; - OnConnect(); - SetNickname(nickname); - SetUser(username, realname); - ProcessLines(); - } - catch (Exception e) - { - Log.Write("irc", e.ToString()); - if (e is SocketException || e is IOException) - ConnectionFailure = e; - } - finally - { - Disconnect(); - } - }) { IsBackground = true }; - thread.Start(); - } - - public void WriteLine(string format, params object[] args) - { - try - { - connection.WriteLine(format, args); - } - catch (Exception e) - { - Log.Write("irc", e.ToString()); - if (e is SocketException || e is IOException) - ConnectionFailure = e; - Disconnect(); - } - } - - public void Disconnect() - { - if (!IsConnected || IsReconnecting) - { - ConnectionState = IrcConnectionState.Disconnected; - return; - } - - ConnectionState = IrcConnectionState.Disconnecting; - OnDisconnecting(); - if (connection != null) - connection.Close(); - ConnectionState = IrcConnectionState.Disconnected; - OnDisconnect(); - LocalUser = null; - connection = null; - } - - public void Dispose() - { - Disconnect(); - } - - void ProcessLines() - { - string line; - while (IsConnected && (line = connection.ReadLine()) != null) - ProcessLine(line); - } - - void ProcessLine(string line) - { - if (string.IsNullOrEmpty(line)) - return; - - var l = new Line(this, line); - OnLineRead(l); - - int numeric; - if (Exts.TryParseIntegerInvariant(l.Command, out numeric)) - { - var nl = new NumericLine(l, numeric); - LocalUser.OnNumeric(nl); - OnNumeric(nl); - switch (nl.Numeric) - { - case NumericCommand.RPL_WELCOME: - OnRegister(nl); - break; - case NumericCommand.RPL_ENDOFNAMES: - OnSync(nl); - break; - } - } - else - { - switch (l.Command) - { - case "PING": - Pong(l.Message); - OnPing(l); - break; - case "PRIVMSG": - if (IrcUtils.IsChannel(l.Target)) - OnPublicMessage(l); - else - OnPrivateMessage(l); - break; - case "NOTICE": - if (IrcUtils.IsChannel(l.Target)) - OnPublicNotice(l); - else - OnPrivateNotice(l); - break; - case "JOIN": - var jl = new JoinLine(l); - LocalUser.OnJoin(jl); - OnJoin(jl); - break; - case "PART": - LocalUser.OnPart(l); - OnPart(l); - break; - case "NICK": - var nsl = new NicknameSetLine(l); - LocalUser.OnNicknameSet(nsl); - OnNicknameSet(nsl); - break; - case "QUIT": - OnQuit(l); - LocalUser.OnQuit(l); - break; - case "KICK": - var kl = new KickLine(l); - LocalUser.OnKick(kl); - OnKick(kl); - break; - case "TOPIC": - LocalUser.OnTopicSet(l); - OnTopicSet(l); - break; - } - } - } - - public event Action OnRegister = l => { }; - public event Action OnSync = l => { }; - public event Action OnLineRead = _ => { }; - public event Action OnConnect = () => { }; - public event Action OnConnecting = () => { }; - public event Action OnDisconnect = () => { }; - public event Action OnDisconnecting = () => { }; - public event Action OnPublicMessage = _ => { }; - public event Action OnPublicNotice = _ => { }; - public event Action OnPrivateMessage = _ => { }; - public event Action OnPrivateNotice = _ => { }; - public event Action OnJoin = _ => { }; - public event Action OnPart = _ => { }; - public event Action OnNicknameSet = _ => { }; - public event Action OnQuit = _ => { }; - public event Action OnPing = _ => { }; - public event Action OnNumeric = _ => { }; - public event Action OnKick = _ => { }; - public event Action OnTopicSet = _ => { }; - - public void SetNickname(string nickname) { WriteLine("NICK {0}", nickname); } - public void SetUser(string username, string realname) { WriteLine("USER {0} 0 * :{1}", username, realname); } - public void Join(string channel) { WriteLine("JOIN {0}", channel); } - public void Part(string channel) { WriteLine("PART {0}", channel); } - public void Message(string target, string message) { WriteLine("PRIVMSG {0} :{1}", target, message); } - public void Notice(string target, string message) { WriteLine("NOTICE {0} :{1}", target, message); } - public void Pong(string reply) { WriteLine("PONG :{0}", reply); } - public void CtcpRequest(string target, string command, string request) { Message(target, IrcUtils.ToCtcp("{0} {1}".F(command, request))); } - public void CtcpRespond(string target, string command, string response) { Notice(target, IrcUtils.ToCtcp("{0} {1}".F(command, response))); } - public void Act(string target, string message) { Message(target, IrcUtils.ToAction(message)); } - public void GetTopic(string channel) { WriteLine("TOPIC {0}", channel); } - public void Quit(string message) { WriteLine("QUIT :{0}", message); } - - public Channel GetChannel(string channel) - { - if (!IsConnected) - return null; - Channel c; - LocalUser.Channels.TryGetValue(channel, out c); - return c; - } - } - - public enum IrcConnectionState - { - Disconnected, - Connected, - Disconnecting, - Connecting, - Reconnecting - } -} diff --git a/OpenRA.Irc/IrcClientUser.cs b/OpenRA.Irc/IrcClientUser.cs deleted file mode 100644 index 33be998592..0000000000 --- a/OpenRA.Irc/IrcClientUser.cs +++ /dev/null @@ -1,112 +0,0 @@ -#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 System.Linq; -using OpenRA.Primitives; - -namespace OpenRA.Irc -{ - public class IrcClientUser : User - { - public readonly ObservableDictionary Channels = new ObservableDictionary(StringComparer.OrdinalIgnoreCase); - public readonly IrcClient Client; - - public IrcClientUser(IrcClient client) - { - Client = client; - } - - public void OnNumeric(NumericLine line) - { - switch (line.Numeric) - { - case NumericCommand.RPL_WELCOME: - new User(line.Message.Substring(line.Message.LastIndexOf(' ') + 1)).CopyTo(this); - break; - case NumericCommand.RPL_NAMREPLY: - { - var channel = line.GetChannel(); - var nicknames = line.Message.Replace("~", "").Replace("&", "").Replace("@", "").Replace("%", "").Replace("+", "").Split(' '); - - foreach (var nickname in nicknames.Where(n => !channel.Users.ContainsKey(n))) - channel.Users.Add(nickname, new User { Nickname = nickname }); - } - break; - case NumericCommand.RPL_TOPIC: - line.GetChannel().Topic.Message = line.Message; - break; - case NumericCommand.RPL_TOPICWHOTIME: - { - var topic = line.GetChannel().Topic; - topic.Author = new User(line[4]); - topic.Time = IrcUtils.DateTimeFromUnixTime(Exts.ParseIntegerInvariant(line[5])); - } - break; - case NumericCommand.ERR_NICKNAMEINUSE: - if (line.Target == "*") // no nickname set yet - Client.SetNickname(Client.Nickname + new Random().Next(10000, 99999)); - break; - } - } - - public void OnJoin(Line line) - { - if (line.PrefixIsSelf()) - Channels.Add(line.Target, new Channel(line.Target)); - - line.GetChannel().Users.Add(line.Prefix.Nickname, new User(line.Prefix)); - } - - public void OnPart(Line line) - { - line.GetChannel().Users.Remove(line.Prefix.Nickname); - - if (line.PrefixIsSelf()) - Channels.Remove(line.Target); - } - - public void OnNicknameSet(NicknameSetLine line) - { - if (line.PrefixIsSelf()) - Nickname = line.NewNickname; - - foreach (var channel in Channels.Values.Where(c => c.Users.ContainsKey(line.Prefix.Nickname))) - { - var user = channel.Users[line.Prefix.Nickname]; - channel.Users.Remove(line.Prefix.Nickname); - user.Nickname = line.NewNickname; - channel.Users.Add(line.NewNickname, user); - } - } - - public void OnQuit(Line line) - { - foreach (var channel in Channels) - channel.Value.Users.Remove(line.Prefix.Nickname); - } - - public void OnKick(KickLine line) - { - line.GetChannel().Users.Remove(line.KickeeNickname); - - if (line.KickeeNickname.EqualsIC(Nickname)) - Channels.Remove(line.Target); - } - - public void OnTopicSet(Line line) - { - var topic = line.GetChannel().Topic; - topic.Message = line.Message; - topic.Author = line.Prefix; - topic.Time = DateTime.UtcNow; - } - } -} diff --git a/OpenRA.Irc/IrcConnection.cs b/OpenRA.Irc/IrcConnection.cs deleted file mode 100644 index 7359b90723..0000000000 --- a/OpenRA.Irc/IrcConnection.cs +++ /dev/null @@ -1,72 +0,0 @@ -#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 System.IO; -using System.Net.Sockets; - -namespace OpenRA.Irc -{ - public sealed class IrcConnection : IDisposable - { - TcpClient socket; - Stream stream; - StreamWriter writer; - StreamReader reader; - bool disposed; - - public void Connect(string hostname, int port, int connectionTimeout) - { - CheckDisposed(); - if (socket != null && socket.Connected) - throw new InvalidOperationException("Socket already connected"); - - socket = new TcpClient(hostname, port); - socket.ReceiveTimeout = socket.SendTimeout = connectionTimeout; - stream = socket.GetStream(); - writer = new StreamWriter(stream) { AutoFlush = true }; - reader = new StreamReader(stream); - } - - public void WriteLine(string format, params object[] args) - { - CheckDisposed(); - writer.WriteLine(format, args); - } - - public string ReadLine() - { - CheckDisposed(); - return reader.ReadLine(); - } - - public void Close() - { - if (disposed) - return; - disposed = true; - if (socket != null) socket.Close(); - if (stream != null) stream.Close(); - if (writer != null) writer.Close(); - if (reader != null) reader.Close(); - } - - public void Dispose() - { - Close(); - } - - void CheckDisposed() - { - if (disposed) - throw new ObjectDisposedException(GetType().FullName); - } - } -} diff --git a/OpenRA.Irc/IrcUtils.cs b/OpenRA.Irc/IrcUtils.cs deleted file mode 100644 index 5fdb50d129..0000000000 --- a/OpenRA.Irc/IrcUtils.cs +++ /dev/null @@ -1,67 +0,0 @@ -#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 System.Linq; - -namespace OpenRA.Irc -{ - public static class IrcUtils - { - public static bool IsChannel(string s) - { - return !string.IsNullOrEmpty(s) && s[0] == '#'; - } - - public static bool IsNickname(string s) - { - return !string.IsNullOrEmpty(s) && (char.IsLetter(s[0]) || NicknameSpecialChars.Contains(s[0])) - && s.Substring(1).All(c => char.IsLetterOrDigit(c) || NicknameSpecialChars.Contains(c) || c == '-'); - } - - const string NicknameSpecialChars = @"[]\`_^{|}"; - - public static DateTime DateTimeFromUnixTime(int seconds) - { - return new DateTime(1970, 1, 1).AddSeconds(seconds); - } - - public static bool EqualsIC(this string a, string b) - { - return a.Equals(b, StringComparison.OrdinalIgnoreCase); - } - - public static string FromCtcp(string message) - { - if (message.Length < 2 || !message.StartsWith("\x0001") || !message.EndsWith("\x0001")) - return null; - - return message.Substring(1, message.Length - 2); - } - - public static string ToCtcp(string message) - { - return "\x0001{0}\x0001".F(message); - } - - public static string FromAction(string message) - { - if (!message.StartsWith("\x0001ACTION ") || !message.EndsWith("\x0001")) - return null; - - return message.Substring(8, message.Length - 8 - 1); - } - - public static string ToAction(string message) - { - return "\x0001ACTION {0}\x0001".F(message); - } - } -} diff --git a/OpenRA.Irc/Line.cs b/OpenRA.Irc/Line.cs deleted file mode 100644 index c476913de9..0000000000 --- a/OpenRA.Irc/Line.cs +++ /dev/null @@ -1,155 +0,0 @@ -#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.Linq; - -namespace OpenRA.Irc -{ - public class Line - { - public readonly IrcClient Client; - public readonly string RawString; - public readonly string[] RawStringParts; - public readonly User Prefix; - public readonly string Command; - public string Target { get; protected set; } - public string Message { get; protected set; } - - public Line(Line line) - { - Client = line.Client; - RawString = line.RawString; - RawStringParts = line.RawStringParts; - Prefix = line.Prefix; - Command = line.Command; - Target = line.Target; - Message = line.Message; - } - - public Line(IrcClient client, string line) - { - RawString = line; - RawStringParts = line.Split(' '); - Client = client; - - if (line[0] == ':') - { - line = line.Substring(1); - var prefixDelim = line.Split(new[] { ' ' }, 2); - Prefix = new User(prefixDelim[0]); - - if (prefixDelim.Length > 1) - { - var messageDelim = prefixDelim[1].Split(new[] { ':' }, 2); - - var args = messageDelim[0].Trim().Split(' '); - - Command = args[0]; - if (args.Length > 1) - Target = args[1]; - - if (messageDelim.Length > 1) - Message = messageDelim[1]; - } - } - else - { - var messageDelim = line.Split(new[] { ':' }, 2); - - var args = messageDelim[0].Trim().Split(' '); - - Command = args[0]; - if (args.Length > 1) - Target = args[1]; - - if (messageDelim.Length > 1) - Message = messageDelim[1]; - } - } - - public virtual Channel GetChannel() - { - return Client.GetChannel(Target); - } - - public string this[int index] - { - get { return RawStringParts[index]; } - } - - public bool PrefixIsSelf() - { - return Client.LocalUser != null && Prefix.Nickname.EqualsIC(Client.LocalUser.Nickname); - } - - public bool TargetIsSelf() - { - return Target != null && Target.EqualsIC(Client.LocalUser.Nickname); - } - } - - public class NicknameSetLine : Line - { - public readonly string NewNickname; - - public NicknameSetLine(Line line) - : base(line) - { - NewNickname = Message; - } - } - - public class NumericLine : Line - { - public readonly NumericCommand Numeric; - public readonly string AltTarget; - - public override Channel GetChannel() - { - if (IrcUtils.IsChannel(AltTarget)) - return Client.GetChannel(AltTarget); - return Client.GetChannel(Target); - } - - public NumericLine(Line line, int numeric) - : base(line) - { - if (!IrcUtils.IsChannel(Target)) - { - var numericParts = line.RawStringParts.Skip(1).TakeWhile(p => !p.StartsWith(":")); - AltTarget = numericParts.LastOrDefault(IrcUtils.IsChannel); - if (AltTarget == null) - AltTarget = numericParts.LastOrDefault(); - } - Numeric = (NumericCommand)numeric; - } - } - - public class JoinLine : Line // for compatibility with certain IRCds - { - public JoinLine(Line line) - : base(line) - { - if (Message != null) // don't overwrite the target if it was already set properly by the IRCd - Target = Message; - } - } - - public class KickLine : Line - { - public readonly string KickeeNickname; - - public KickLine(Line line) - : base(line) - { - KickeeNickname = this[3]; - } - } -} diff --git a/OpenRA.Irc/NumericCommand.cs b/OpenRA.Irc/NumericCommand.cs deleted file mode 100644 index b4e8e5b787..0000000000 --- a/OpenRA.Irc/NumericCommand.cs +++ /dev/null @@ -1,25 +0,0 @@ -#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 - -namespace OpenRA.Irc -{ - public enum NumericCommand - { - Undefined = 0, - RPL_WELCOME = 001, - RPL_NOTOPIC = 331, - RPL_TOPIC = 332, - RPL_TOPICWHOTIME = 333, - RPL_NAMREPLY = 353, - RPL_ENDOFNAMES = 366, - ERR_ERRONEUSNICKNAME = 432, - ERR_NICKNAMEINUSE = 433 - } -} diff --git a/OpenRA.Irc/OpenRA.Irc.csproj b/OpenRA.Irc/OpenRA.Irc.csproj deleted file mode 100644 index 16be64721c..0000000000 --- a/OpenRA.Irc/OpenRA.Irc.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Debug - AnyCPU - {85B48234-8B31-4BE6-AF9C-665CC6866841} - Library - Properties - OpenRA.Irc - OpenRA.Irc - 512 - - - - - true - full - ..\ - DEBUG;TRACE - x86 - prompt - AllRules.ruleset - true - - - - - - - - - - - - - - - - - - {0DFB103F-2962-400F-8C6D-E2C28CCBA633} - OpenRA.Game - False - - - - - - - - - \ No newline at end of file diff --git a/OpenRA.Irc/Settings.StyleCop b/OpenRA.Irc/Settings.StyleCop deleted file mode 100644 index 1590d17baa..0000000000 --- a/OpenRA.Irc/Settings.StyleCop +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - - - - - - False - - - - - - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - - - - - - False - - - - - False - - - - - False - - - - - - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - - - - - - False - - - - - False - - - - - False - - - - - False - - - - - - - \ No newline at end of file diff --git a/OpenRA.Irc/Topic.cs b/OpenRA.Irc/Topic.cs deleted file mode 100644 index 36d5bdb387..0000000000 --- a/OpenRA.Irc/Topic.cs +++ /dev/null @@ -1,30 +0,0 @@ -#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; - -namespace OpenRA.Irc -{ - public class Topic - { - public string Message; - public User Author; - public DateTime Time; - - public Topic() { } - - public Topic(string message, User author, DateTime time) - { - Message = message; - Author = author; - Time = time; - } - } -} diff --git a/OpenRA.Irc/User.cs b/OpenRA.Irc/User.cs deleted file mode 100644 index f045c89d84..0000000000 --- a/OpenRA.Irc/User.cs +++ /dev/null @@ -1,73 +0,0 @@ -#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; - -namespace OpenRA.Irc -{ - public class User - { - public string Nickname; - public string Username; - public string Hostname; - - public User() { } - - public User(User user) - { - Nickname = user.Nickname; - Username = user.Username; - Hostname = user.Hostname; - } - - public void CopyTo(User user) - { - user.Nickname = Nickname; - user.Username = Username; - user.Hostname = Hostname; - } - - public User(string prefix) - { - if (string.IsNullOrEmpty(prefix)) - throw new ArgumentException("prefix"); - - var ex = prefix.IndexOf('!'); - var at = prefix.IndexOf('@'); - - if (ex >= 0 && at >= 0 && at < ex) - throw new ArgumentException("Bogus input string: @ before !"); - - if (ex >= 0) - { - Nickname = prefix.Substring(0, ex); - if (at >= 0) - { - Username = prefix.Substring(ex + 1, at - ex - 1); - Hostname = prefix.Substring(at + 1); - } - else - Username = prefix.Substring(ex + 1); - } - else - Nickname = prefix; - } - - public override string ToString() - { - var ret = "" + Nickname; - if (Username != null) - ret += "!" + Username; - if (Hostname != null) - ret += "@" + Hostname; - return ret; - } - } -} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index ff41de2412..50c4933903 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -357,7 +357,6 @@ - @@ -531,11 +530,6 @@ OpenRA.Game False - - {85B48234-8B31-4BE6-AF9C-665CC6866841} - OpenRA.Irc - False - {fe6c8cc0-2f07-442a-b29f-17617b3b7fc6} OpenRA.Mods.Common diff --git a/OpenRA.Mods.RA/Widgets/Logic/IrcLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IrcLogic.cs deleted file mode 100644 index b883992516..0000000000 --- a/OpenRA.Mods.RA/Widgets/Logic/IrcLogic.cs +++ /dev/null @@ -1,252 +0,0 @@ -#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 System.Collections.Generic; -using System.Linq; -using OpenRA.Irc; -using OpenRA.Widgets; - -namespace OpenRA.Mods.RA.Widgets.Logic -{ - class IrcLogic - { - TextFieldWidget inputBox; - TextFieldWidget nicknameBox; - Widget connectBG; - Widget ircContainer; - - [ObjectCreator.UseCtor] - public IrcLogic(Widget widget) - { - var historyPanel = widget.Get("HISTORY_PANEL"); - var historyTemplate = widget.Get("HISTORY_TEMPLATE"); - var nicknamePanel = widget.Get("NICKNAME_PANEL"); - var nicknameTemplate = widget.Get("NICKNAME_TEMPLATE"); - - inputBox = widget.Get("INPUT_BOX"); - inputBox.OnEnterKey = EnterPressed; - inputBox.OnTabKey = TabPressed; - inputBox.IsDisabled = () => IrcClient.Instance.GetChannel(IrcClient.MainChannel) == null; - - nicknameBox = widget.Get("NICKNAME_BOX"); - nicknameBox.Text = ChooseNickname(Game.Settings.Irc.Nickname); - - connectBG = widget.Get("IRC_CONNECT_BG"); - ircContainer = widget.Get("IRC_CONTAINER"); - - widget.Get("DISCONNECT_BUTTON").OnClick = IrcClient.Instance.Disconnect; - - MaybeShowConnectPanel(); - - historyPanel.Bind(IrcClient.Instance.History, item => MakeLabelWidget(historyTemplate, item), LabelItemEquals, true); - - var mainChannel = IrcClient.Instance.GetChannel(IrcClient.MainChannel); - if (mainChannel != null) - nicknamePanel.Bind(mainChannel.Users, item => MakeLabelWidget(nicknameTemplate, item), LabelItemEquals, false); - - IrcClient.Instance.OnSync += l => - { - var channel = l.GetChannel(); - if (channel.Name.EqualsIC(IrcClient.MainChannel)) - nicknamePanel.Bind(channel.Users, item => MakeLabelWidget(nicknameTemplate, item), LabelItemEquals, false); - }; - IrcClient.Instance.OnKick += l => - { - if (l.KickeeNickname.EqualsIC(IrcClient.Instance.LocalUser.Nickname) && l.Target.EqualsIC(IrcClient.MainChannel)) - nicknamePanel.Unbind(); - }; - IrcClient.Instance.OnPart += l => - { - if (l.PrefixIsSelf() && l.Target.EqualsIC(IrcClient.MainChannel)) - nicknamePanel.Unbind(); - }; - IrcClient.Instance.OnDisconnect += () => - { - nicknamePanel.Unbind(); - MaybeShowConnectPanel(); - }; - - commands.Add("me", args => - { - IrcClient.Instance.Act(IrcClient.MainChannel, args); - IrcClient.AddAction(IrcClient.Instance.LocalUser.Nickname, args); - }); - commands.Add("slap", args => - { - IrcClient.Instance.Act(IrcClient.MainChannel, "slaps {0} around a bit with a large trout".F(args)); - IrcClient.AddAction(IrcClient.Instance.LocalUser.Nickname, "slaps {0} around a bit with a large trout".F(args)); - }); - commands.Add("notice", args => - { - var split = args.Split(new[] { ' ' }, 2); - if (split.Length < 2) - { - IrcClient.AddHistory("/notice: Not enough arguments"); - return; - } - IrcClient.Instance.Notice(split[0], split[1]); - IrcClient.AddSelfNotice(split[0], split[1]); - }); - commands.Add("disconnect", args => - { - Game.Settings.Irc.ConnectAutomatically = false; - Game.Settings.Save(); - IrcClient.Instance.Disconnect(); - }); - commands.Add("quit", args => - { - Game.Settings.Irc.ConnectAutomatically = false; - Game.Settings.Save(); - if (IrcClient.Instance.IsConnected) - IrcClient.Instance.Quit(args); - else - IrcClient.Instance.Disconnect(); - }); - commands.Add("nick", args => IrcClient.Instance.SetNickname(args)); - commands.Add("topic", args => IrcClient.Instance.GetTopic(IrcClient.MainChannel)); - } - - void MaybeShowConnectPanel() - { - if (IrcClient.Instance.IsConnected || IrcClient.Instance.IsReconnecting) - { - ircContainer.Visible = true; - connectBG.Visible = false; - return; - } - - if (Game.Settings.Irc.ConnectAutomatically) - { - ircContainer.Visible = true; - connectBG.Visible = false; - Connect(); - return; - } - - ircContainer.Visible = false; - connectBG.Visible = true; - - var connectAutomaticallyCheckBox = connectBG.Get("CONNECT_AUTOMATICALLY_CHECKBOX"); - var connectAutomaticallyChecked = false; - connectAutomaticallyCheckBox.IsChecked = () => connectAutomaticallyChecked; - connectAutomaticallyCheckBox.OnClick = () => connectAutomaticallyChecked ^= true; - - var connectButton = connectBG.Get("CONNECT_BUTTON"); - - connectButton.OnClick = () => - { - ircContainer.Visible = true; - connectBG.Visible = false; - - Game.Settings.Irc.ConnectAutomatically = connectAutomaticallyCheckBox.IsChecked(); - Game.Settings.Save(); - Connect(); - }; - } - - static string ChooseNickname(string nickname) - { - if (!IrcUtils.IsNickname(nickname)) - { - nickname = Game.Settings.Player.Name; - if (!IrcUtils.IsNickname(nickname)) - nickname = Game.Settings.Irc.DefaultNickname; - } - return nickname; - } - - void Connect() - { - var nickname = ChooseNickname(nicknameBox.Text); - var s = Game.Settings.Irc; - s.Nickname = nickname; - Game.Settings.Save(); - IrcClient.Instance.Connect(s.Hostname, s.Port, s.ConnectionTimeout, nickname, s.Username ?? nickname, s.Realname ?? nickname); - } - - static Widget MakeLabelWidget(LabelWidget template, object item) - { - var itemString = item.ToString(); - var widget = (LabelWidget)template.Clone(); - var font = Game.Renderer.Fonts[widget.Font]; - itemString = WidgetUtils.WrapText(itemString, widget.Bounds.Width, font); - widget.Bounds.Height = font.Measure(itemString).Y; - widget.GetText = () => itemString; - return widget; - } - - bool LabelItemEquals(Widget widget, object item) - { - return item != null && ((LabelWidget)widget).GetText() == item.ToString(); - } - - bool EnterPressed() - { - if (!inputBox.Text.Any()) - return true; - - var text = inputBox.Text; - inputBox.Text = ""; - - if (text[0] == '/') - { - var parts = text.Split(new[] { ' ' }, 2); - var name = parts[0].Substring(1); - var args = parts.Length > 1 ? parts[1] : null; - - Action command; - if (!commands.TryGetValue(name, out command)) - { - IrcClient.AddHistory("{0}: Unknown command".F(name)); - return true; - } - command(args); - } - else - { - IrcClient.Instance.Message(IrcClient.MainChannel, text); - IrcClient.AddMessage(IrcClient.Instance.LocalUser.Nickname, text); - } - return true; - } - - Dictionary> commands = new Dictionary>(StringComparer.OrdinalIgnoreCase); - - List tabMatches = new List(); - int tabMatchesIndex = -1; - - bool TabPressed() - { - if (!inputBox.Text.Any()) - return true; - - var channel = IrcClient.Instance.GetChannel(IrcClient.MainChannel); - - if (channel == null) - return true; - - var spaceIndex = inputBox.Text.TrimEnd().LastIndexOf(' '); - var tabMatchtext = inputBox.Text.Substring(spaceIndex + 1); - - if (tabMatchesIndex < 0 || !tabMatches.Any() || tabMatchtext != tabMatches[tabMatchesIndex]) - tabMatches = channel.Users.Keys.Where(u => u.StartsWith(tabMatchtext, StringComparison.OrdinalIgnoreCase)).ToList(); - - if (!tabMatches.Any()) - return true; - - tabMatchesIndex = (tabMatchesIndex + 1) % tabMatches.Count; - inputBox.Text = inputBox.Text.Remove(spaceIndex + 1) + tabMatches[tabMatchesIndex]; - inputBox.CursorPosition = inputBox.Text.Length; - - return true; - } - } -} diff --git a/OpenRA.Mods.RA/Widgets/Logic/ServerBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ServerBrowserLogic.cs index bab0f4dd40..65da1d1834 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/ServerBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/ServerBrowserLogic.cs @@ -107,7 +107,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic showIncompatibleCheckbox.OnClick = () => { showIncompatible ^= true; RefreshServerList(); }; } - // Game.LoadWidget(null, "SERVERBROWSER_IRC", panel.Get("IRC_ROOT"), new WidgetArgs()); RefreshServerList(); } diff --git a/OpenRA.sln b/OpenRA.sln index b03bf4976d..89b342a0ab 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -21,8 +21,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.D2k", "OpenRA.M EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.TS", "OpenRA.Mods.TS\OpenRA.Mods.TS.csproj", "{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Irc", "OpenRA.Irc\OpenRA.Irc.csproj", "{85B48234-8B31-4BE6-AF9C-665CC6866841}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Renderer.Sdl2", "OpenRA.Renderer.Sdl2\OpenRA.Renderer.Sdl2.csproj", "{33D03738-C154-4028-8EA8-63A3C488A651}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.Common", "OpenRA.Mods.Common\OpenRA.Mods.Common.csproj", "{FE6C8CC0-2F07-442A-B29F-17617B3B7FC6}" @@ -101,8 +99,6 @@ Global {C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|x86.Build.0 = Debug|x86 {5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|x86.ActiveCfg = Debug|x86 {5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|x86.Build.0 = Debug|x86 - {85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|x86.ActiveCfg = Debug|x86 - {85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|x86.Build.0 = Debug|x86 {33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.ActiveCfg = Debug|x86 {33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.Build.0 = Debug|x86 {47F1B0EE-EB35-47F2-93E4-273C70909157}.Debug|x86.ActiveCfg = Debug|x86 diff --git a/mods/cnc/chrome/irc.yaml b/mods/cnc/chrome/irc.yaml deleted file mode 100644 index 0165e25cf3..0000000000 --- a/mods/cnc/chrome/irc.yaml +++ /dev/null @@ -1,70 +0,0 @@ -Container@SERVERBROWSER_IRC: - Logic: IrcLogic - Width: 700 - Height: 250 - Children: - Container@IRC_CONTAINER: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Children: - ScrollPanel@HISTORY_PANEL: - Width: 565 - Height: PARENT_BOTTOM - 30 - ItemSpacing: 5 - Label@HISTORY_TEMPLATE: - X: 5 - Width: 530 - Height: 25 - WordWrap: True - TextField@INPUT_BOX: - Y: PARENT_BOTTOM - 25 - Width: 565 - Height: 25 - ScrollPanel@NICKNAME_PANEL: - X: 570 - Width: 130 - Height: PARENT_BOTTOM - 30 - Label@NICKNAME_TEMPLATE: - X: 5 - Button@DISCONNECT_BUTTON: - X: 570 - Y: PARENT_BOTTOM - 25 - Width: 130 - Height: 25 - Text: Disconnect - Font: Bold - Background@IRC_CONNECT_BG: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Background: scrollpanel-bg - Children: - Label@GLOBAL_CHAT_LABEL: - Y: PARENT_BOTTOM / 4 - Width: PARENT_RIGHT - Align: Center - Text: Global Chat - Font: Bold - Label@NICKNAME_LABEL: - X: 200 - Y: PARENT_BOTTOM / 4 + 35 - Text: Nickname: - TextField@NICKNAME_BOX: - X: 270 - Y: PARENT_BOTTOM / 4 + 25 - Width: 150 - Height: 25 - Checkbox@CONNECT_AUTOMATICALLY_CHECKBOX: - X: 270 - Y: PARENT_BOTTOM / 4 + 75 - Height: 20 - Width: 180 - Font: Regular - Text: Connect Automatically - Button@CONNECT_BUTTON: - X: 430 - Y: PARENT_BOTTOM / 4 + 25 - Width: 100 - Height: 25 - Text: Connect - Font: Bold - diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index c7d0354c08..7f05f07f05 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -103,7 +103,6 @@ ChromeLayout: ./mods/cnc/chrome/credits.yaml ./mods/cnc/chrome/dialogs.yaml ./mods/cnc/chrome/tooltips.yaml - ./mods/cnc/chrome/irc.yaml ./mods/cnc/chrome/assetbrowser.yaml ./mods/cnc/chrome/missionbrowser.yaml diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 293fd183e8..64fe2a567e 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -91,7 +91,6 @@ ChromeLayout: ./mods/ra/chrome/musicplayer.yaml ./mods/d2k/chrome/tooltips.yaml ./mods/ra/chrome/assetbrowser.yaml - ./mods/ra/chrome/irc.yaml ./mods/ra/chrome/missionbrowser.yaml ./mods/ra/chrome/confirmation-dialogs.yaml diff --git a/mods/ra/chrome/irc.yaml b/mods/ra/chrome/irc.yaml deleted file mode 100644 index 7926b90704..0000000000 --- a/mods/ra/chrome/irc.yaml +++ /dev/null @@ -1,69 +0,0 @@ -Container@SERVERBROWSER_IRC: - Logic: IrcLogic - Width: 700 - Height: 250 - Children: - Container@IRC_CONTAINER: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Children: - ScrollPanel@HISTORY_PANEL: - Width: 565 - Height: PARENT_BOTTOM - 30 - ItemSpacing: 5 - Label@HISTORY_TEMPLATE: - X: 5 - Width: 530 - Height: 25 - WordWrap: True - TextField@INPUT_BOX: - Y: PARENT_BOTTOM - 25 - Width: 565 - Height: 25 - ScrollPanel@NICKNAME_PANEL: - X: 570 - Width: 130 - Height: PARENT_BOTTOM - 30 - Label@NICKNAME_TEMPLATE: - X: 5 - Button@DISCONNECT_BUTTON: - X: 570 - Y: PARENT_BOTTOM - 25 - Width: 130 - Height: 25 - Text: Disconnect - Font: Bold - Background@IRC_CONNECT_BG: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Background: scrollpanel-bg - Children: - Label@GLOBAL_CHAT_LABEL: - Y: PARENT_BOTTOM / 4 - Width: PARENT_RIGHT - Align: Center - Text: Global Chat - Font: Bold - Label@NICKNAME_LABEL: - X: 200 - Y: PARENT_BOTTOM / 4 + 35 - Text: Nickname: - TextField@NICKNAME_BOX: - X: 270 - Y: PARENT_BOTTOM / 4 + 25 - Width: 150 - Height: 25 - Checkbox@CONNECT_AUTOMATICALLY_CHECKBOX: - X: 270 - Y: PARENT_BOTTOM / 4 + 75 - Height: 20 - Width: 180 - Text: Connect Automatically - Button@CONNECT_BUTTON: - X: 430 - Y: PARENT_BOTTOM / 4 + 25 - Width: 100 - Height: 25 - Text: Connect - Font: Bold - diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 1231ab89f2..640a46fe29 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -104,7 +104,6 @@ ChromeLayout: ./mods/ra/chrome/musicplayer.yaml ./mods/ra/chrome/tooltips.yaml ./mods/ra/chrome/assetbrowser.yaml - ./mods/ra/chrome/irc.yaml ./mods/ra/chrome/missionbrowser.yaml ./mods/ra/chrome/confirmation-dialogs.yaml diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index cc905d1d50..8180d55692 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -133,7 +133,6 @@ ChromeLayout: ./mods/ra/chrome/musicplayer.yaml ./mods/ra/chrome/tooltips.yaml ./mods/ra/chrome/assetbrowser.yaml - ./mods/ra/chrome/irc.yaml ./mods/ra/chrome/missionbrowser.yaml ./mods/ra/chrome/confirmation-dialogs.yaml diff --git a/packaging/package-all.sh b/packaging/package-all.sh index 7767970584..4bf50a5194 100755 --- a/packaging/package-all.sh +++ b/packaging/package-all.sh @@ -31,7 +31,7 @@ markdown Lua-API.md > Lua-API.html # List of files that are packaged on all platforms FILES=('OpenRA.Game.exe' 'OpenRA.Editor.exe' 'OpenRA.Utility.exe' 'OpenRA.CrashDialog.exe' \ -'OpenRA.Renderer.Sdl2.dll' 'OpenRA.Renderer.Null.dll' 'OpenRA.Irc.dll' \ +'OpenRA.Renderer.Sdl2.dll' 'OpenRA.Renderer.Null.dll' \ 'FreeSans.ttf' 'FreeSansBold.ttf' 'lua' \ 'glsl' 'mods/common' 'mods/ra' 'mods/cnc' 'mods/d2k' 'mods/modchooser' \ 'AUTHORS' 'COPYING' \ diff --git a/packaging/windows/OpenRA.nsi b/packaging/windows/OpenRA.nsi index 2caead9fe8..f4f59bc98b 100644 --- a/packaging/windows/OpenRA.nsi +++ b/packaging/windows/OpenRA.nsi @@ -70,7 +70,6 @@ Section "Game" GAME File "${SRCDIR}\OpenRA.CrashDialog.exe" File "${SRCDIR}\OpenRA.Renderer.Null.dll" File "${SRCDIR}\OpenRA.Renderer.Sdl2.dll" - File "${SRCDIR}\OpenRA.Irc.dll" File "${SRCDIR}\ICSharpCode.SharpZipLib.dll" File "${SRCDIR}\FuzzyLogicLibrary.dll" File "${SRCDIR}\Mono.Nat.dll" @@ -190,7 +189,6 @@ Function ${UN}Clean Delete $INSTDIR\OpenRA.Editor.exe Delete $INSTDIR\OpenRA.Renderer.Null.dll Delete $INSTDIR\OpenRA.Renderer.Sdl2.dll - Delete $INSTDIR\OpenRA.Irc.dll Delete $INSTDIR\ICSharpCode.SharpZipLib.dll Delete $INSTDIR\FuzzyLogicLibrary.dll Delete $INSTDIR\Mono.Nat.dll From 9aab4b2be61991ac92ac6f1e04265365aae41879 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 19 Oct 2014 13:19:20 +1300 Subject: [PATCH 5/6] Move shared font files to the common mod directory. --- Makefile | 1 - mods/cnc/mod.yaml | 16 ++++++++-------- FreeSans.ttf => mods/common/FreeSans.ttf | Bin .../common/FreeSansBold.ttf | Bin mods/d2k/mod.yaml | 14 +++++++------- mods/modchooser/mod.yaml | 12 ++++++------ mods/ra/mod.yaml | 14 +++++++------- mods/ts/mod.yaml | 14 +++++++------- packaging/package-all.sh | 6 ++---- packaging/windows/OpenRA.nsi | 2 -- 10 files changed, 37 insertions(+), 42 deletions(-) rename FreeSans.ttf => mods/common/FreeSans.ttf (100%) rename FreeSansBold.ttf => mods/common/FreeSansBold.ttf (100%) diff --git a/Makefile b/Makefile index 1717c2e704..a1dcf74860 100644 --- a/Makefile +++ b/Makefile @@ -324,7 +324,6 @@ install-core: default @$(CP_R) glsl "$(DATA_INSTALL_DIR)" @$(CP_R) lua "$(DATA_INSTALL_DIR)" - @$(CP) *.ttf "$(DATA_INSTALL_DIR)" @$(CP) SDL2-CS* "$(DATA_INSTALL_DIR)" @$(CP) Eluant* "$(DATA_INSTALL_DIR)" @$(INSTALL_PROGRAM) ICSharpCode.SharpZipLib.dll "$(DATA_INSTALL_DIR)" diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 7f05f07f05..bb4653acb7 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -171,28 +171,28 @@ ChromeMetrics: Fonts: Small: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:12 Regular: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:14 Bold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:14 Title: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:32 MediumBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:18 BigBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:24 Tiny: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:10 TinyBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:10 LuaScripts: diff --git a/FreeSans.ttf b/mods/common/FreeSans.ttf similarity index 100% rename from FreeSans.ttf rename to mods/common/FreeSans.ttf diff --git a/FreeSansBold.ttf b/mods/common/FreeSansBold.ttf similarity index 100% rename from FreeSansBold.ttf rename to mods/common/FreeSansBold.ttf diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 64fe2a567e..1d35613ab1 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -152,28 +152,28 @@ ChromeMetrics: Fonts: Regular: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:14 Bold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:14 Title: Font:./mods/d2k/Dune2k.ttf Size:32 MediumBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:18 BigBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:24 Small: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:12 Tiny: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:10 TinyBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:10 LuaScripts: diff --git a/mods/modchooser/mod.yaml b/mods/modchooser/mod.yaml index 0d2981b346..4be6107424 100644 --- a/mods/modchooser/mod.yaml +++ b/mods/modchooser/mod.yaml @@ -31,22 +31,22 @@ ChromeMetrics: Fonts: Regular: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:14 Bold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:14 BigBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:24 MediumBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:18 Tiny: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:10 TinyBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:10 LobbyDefaults: diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 640a46fe29..6d631ef7ba 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -168,28 +168,28 @@ ChromeMetrics: Fonts: Regular: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:14 Bold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:14 Title: Font:./mods/ra/ZoodRangmah.ttf Size:48 MediumBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:18 BigBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:24 Small: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:12 Tiny: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:10 TinyBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:10 LuaScripts: diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 8180d55692..c281d83c3e 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -196,25 +196,25 @@ ChromeMetrics: Fonts: Regular: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:14 Bold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:14 Title: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:32 BigBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:24 Small: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:12 Tiny: - Font:./FreeSans.ttf + Font:./mods/common/FreeSans.ttf Size:10 TinyBold: - Font:./FreeSansBold.ttf + Font:./mods/common/FreeSansBold.ttf Size:10 LuaScripts: diff --git a/packaging/package-all.sh b/packaging/package-all.sh index 4bf50a5194..3944fc59e4 100755 --- a/packaging/package-all.sh +++ b/packaging/package-all.sh @@ -32,10 +32,8 @@ markdown Lua-API.md > Lua-API.html # List of files that are packaged on all platforms FILES=('OpenRA.Game.exe' 'OpenRA.Editor.exe' 'OpenRA.Utility.exe' 'OpenRA.CrashDialog.exe' \ 'OpenRA.Renderer.Sdl2.dll' 'OpenRA.Renderer.Null.dll' \ -'FreeSans.ttf' 'FreeSansBold.ttf' 'lua' \ -'glsl' 'mods/common' 'mods/ra' 'mods/cnc' 'mods/d2k' 'mods/modchooser' \ -'AUTHORS' 'COPYING' \ -'README.html' 'CONTRIBUTING.html' 'DOCUMENTATION.html' 'CHANGELOG.html' \ + 'lua' 'glsl' 'mods/common' 'mods/ra' 'mods/cnc' 'mods/d2k' 'mods/modchooser' \ +'AUTHORS' 'COPYING' 'README.html' 'CONTRIBUTING.html' 'DOCUMENTATION.html' 'CHANGELOG.html' \ 'global mix database.dat' 'GeoLite2-Country.mmdb') echo "Copying files..." diff --git a/packaging/windows/OpenRA.nsi b/packaging/windows/OpenRA.nsi index f4f59bc98b..9b5dfebb9f 100644 --- a/packaging/windows/OpenRA.nsi +++ b/packaging/windows/OpenRA.nsi @@ -79,7 +79,6 @@ Section "Game" GAME File "${SRCDIR}\CHANGELOG.html" File "${SRCDIR}\CONTRIBUTING.html" File "${SRCDIR}\DOCUMENTATION.html" - File "${SRCDIR}\*.ttf" File "${SRCDIR}\OpenRA.ico" File "${SRCDIR}\SharpFont.dll" File "${SRCDIR}\SDL2-CS.dll" @@ -200,7 +199,6 @@ Function ${UN}Clean Delete $INSTDIR\CONTRIBUTING.html Delete $INSTDIR\DOCUMENTATION.html Delete $INSTDIR\OpenRA.ico - Delete $INSTDIR\*.ttf Delete "$INSTDIR\global mix database.dat" Delete $INSTDIR\MaxMind.Db.dll Delete $INSTDIR\MaxMind.GeoIP2.dll From 6445e78385fee2e35eb6486c107fbf94d0b72c2d Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 19 Oct 2014 19:44:26 +1300 Subject: [PATCH 6/6] Add a reference to Eluant in AUTHORS. --- AUTHORS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index 32b7426e38..a54e89c1cc 100644 --- a/AUTHORS +++ b/AUTHORS @@ -120,6 +120,9 @@ MIT license. Using SDL2# created by Ethan Lee and released under the zlib license. +Using Eluant created by Chris Howie and released +under the MIT license. + Using FuzzyLogicLibrary (fuzzynet) by Dmitry Kaluzhny and released under the GNU GPL terms.