Ticket #2241: RemoveScriptingHost_OneCompartmentPerGUIPage_v1.1.diff

File RemoveScriptingHost_OneCompartmentPerGUIPage_v1.1.diff, 347.0 KB (added by Yves, 10 years ago)
  • binaries/data/mods/public/gui/summary/summary.js

     
    1414    {
    1515        if (i != panelNumber)
    1616        {
    17             getGUIObjectByName(panelNames[i]).hidden = true;
    18             getGUIObjectByName(panelButtonNames[i]).sprite = "BackgroundTab";
     17            Engine.GetGUIObjectByName(panelNames[i]).hidden = true;
     18            Engine.GetGUIObjectByName(panelButtonNames[i]).sprite = "BackgroundTab";
    1919        }
    2020        else
    2121        {
    22             getGUIObjectByName(panelNames[i]).hidden = false;
    23             getGUIObjectByName(panelButtonNames[i]).sprite = "ForegroundTab";
    24             adjustTabDividers(getGUIObjectByName(panelButtonNames[i]).size);
     22            Engine.GetGUIObjectByName(panelNames[i]).hidden = false;
     23            Engine.GetGUIObjectByName(panelButtonNames[i]).sprite = "ForegroundTab";
     24            adjustTabDividers(Engine.GetGUIObjectByName(panelButtonNames[i]).size);
    2525        }
    2626    }
    2727}
    2828
    2929function adjustTabDividers(tabSize)
    3030{
    31     var leftSpacer = getGUIObjectByName("tabDividerLeft");
    32     var rightSpacer = getGUIObjectByName("tabDividerRight");
     31    var leftSpacer = Engine.GetGUIObjectByName("tabDividerLeft");
     32    var rightSpacer = Engine.GetGUIObjectByName("tabDividerRight");
    3333    leftSpacer.size = "20 " + leftSpacer.size.top + " " + (tabSize.left + 2) + " " + leftSpacer.size.bottom;
    3434    rightSpacer.size = (tabSize.right - 2) + " " + rightSpacer.size.top + " 100%-20 " + rightSpacer.size.bottom;
    3535}
     
    3939    var civData = loadCivData();
    4040    var mapSize = "Scenario";
    4141
    42     getGUIObjectByName("timeElapsed").caption = "Time elapsed: " + timeToString(data.timeElapsed);
     42    Engine.GetGUIObjectByName("timeElapsed").caption = "Time elapsed: " + timeToString(data.timeElapsed);
    4343
    44     getGUIObjectByName("summaryText").caption = data.gameResult;
     44    Engine.GetGUIObjectByName("summaryText").caption = data.gameResult;
    4545
    4646    // This is only defined for random maps
    4747    if (data.mapSettings.Size)
     
    6060        }
    6161    }
    6262
    63     getGUIObjectByName("mapName").caption = data.mapSettings.Name + " - " + mapSize;
     63    Engine.GetGUIObjectByName("mapName").caption = data.mapSettings.Name + " - " + mapSize;
    6464
    6565    // Space player boxes
    6666    var boxSpacing = 32;
     
    6868    {
    6969        for (var j = 0; j < MAX_SLOTS; ++j)
    7070        {
    71             var box = getGUIObjectByName("playerBox"+i+"["+j+"]");
     71            var box = Engine.GetGUIObjectByName("playerBox"+i+"["+j+"]");
    7272            var boxSize = box.size;
    7373            var h = boxSize.bottom - boxSize.top;
    7474            boxSize.top = j * boxSpacing;
     
    8686    var playerNameHeadingWidth = 200;
    8787    // Special cased to make the (Sent / Received) part fit
    8888    var tributesWidth = 121;
    89     getGUIObjectByName("playerName0Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
    90     getGUIObjectByName("economyScoreHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    91     getGUIObjectByName("militaryScoreHeading").size = left +  " 16 " + (left + width) + " 100%"; left += width;
    92     getGUIObjectByName("explorationScoreHeading").size = left +  " 16 " + (left + width) + " 100%"; left += width;
    93     getGUIObjectByName("totalScoreHeading").size = left +  " 16 " + (left + width) + " 100%"; left += width;
     89    Engine.GetGUIObjectByName("playerName0Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
     90    Engine.GetGUIObjectByName("economyScoreHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     91    Engine.GetGUIObjectByName("militaryScoreHeading").size = left +  " 16 " + (left + width) + " 100%"; left += width;
     92    Engine.GetGUIObjectByName("explorationScoreHeading").size = left +  " 16 " + (left + width) + " 100%"; left += width;
     93    Engine.GetGUIObjectByName("totalScoreHeading").size = left +  " 16 " + (left + width) + " 100%"; left += width;
    9494   
    9595    left = 50;
    96     getGUIObjectByName("playerName1Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
    97     getGUIObjectByName("unitsTrainedHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    98     getGUIObjectByName("unitsLostHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    99     getGUIObjectByName("enemyUnitsKilledHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    100     getGUIObjectByName("buildingsConstructedHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    101     getGUIObjectByName("buildingsLostHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    102     getGUIObjectByName("enemyBuildingsDestroyedHeading").size = left + " 6 " + (left + width) + " 100%"; left += width;
     96    Engine.GetGUIObjectByName("playerName1Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
     97    Engine.GetGUIObjectByName("unitsTrainedHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     98    Engine.GetGUIObjectByName("unitsLostHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     99    Engine.GetGUIObjectByName("enemyUnitsKilledHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     100    Engine.GetGUIObjectByName("buildingsConstructedHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     101    Engine.GetGUIObjectByName("buildingsLostHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     102    Engine.GetGUIObjectByName("enemyBuildingsDestroyedHeading").size = left + " 6 " + (left + width) + " 100%"; left += width;
    103103
    104104    left = 50;
    105     getGUIObjectByName("playerName2Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
    106     getGUIObjectByName("civCentresBuiltHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    107     getGUIObjectByName("enemyCivCentresDestroyedHeading").size = left +  " 6 " + (left + width) + " 100%"; left += width;
    108     getGUIObjectByName("mapExplorationHeading").size = left +  " 6 " + (left + width) + " 100%"; left += width;
     105    Engine.GetGUIObjectByName("playerName2Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
     106    Engine.GetGUIObjectByName("civCentresBuiltHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     107    Engine.GetGUIObjectByName("enemyCivCentresDestroyedHeading").size = left +  " 6 " + (left + width) + " 100%"; left += width;
     108    Engine.GetGUIObjectByName("mapExplorationHeading").size = left +  " 6 " + (left + width) + " 100%"; left += width;
    109109
    110110    left = 50;
    111     getGUIObjectByName("playerName3Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
    112     getGUIObjectByName("resourceHeading").size = left + " 16 " + (left + width * 4) + " 100%";
    113     getGUIObjectByName("foodGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
    114     getGUIObjectByName("woodGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
    115     getGUIObjectByName("stoneGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
    116     getGUIObjectByName("metalGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
    117     getGUIObjectByName("vegetarianRatioHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    118     getGUIObjectByName("treasuresCollectedHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    119     getGUIObjectByName("resourcesTributedHeading").size = left + " 16 " + (left + tributesWidth) + " 100%"; left += tributesWidth;
     111    Engine.GetGUIObjectByName("playerName3Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
     112    Engine.GetGUIObjectByName("resourceHeading").size = left + " 16 " + (left + width * 4) + " 100%";
     113    Engine.GetGUIObjectByName("foodGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
     114    Engine.GetGUIObjectByName("woodGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
     115    Engine.GetGUIObjectByName("stoneGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
     116    Engine.GetGUIObjectByName("metalGatheredHeading").size = left + " 34 " + (left + width) + " 100%"; left += width;
     117    Engine.GetGUIObjectByName("vegetarianRatioHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     118    Engine.GetGUIObjectByName("treasuresCollectedHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     119    Engine.GetGUIObjectByName("resourcesTributedHeading").size = left + " 16 " + (left + tributesWidth) + " 100%"; left += tributesWidth;
    120120
    121121    left = 50;
    122     getGUIObjectByName("playerName4Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
    123     getGUIObjectByName("exchangedFoodHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    124     getGUIObjectByName("exchangedWoodHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    125     getGUIObjectByName("exchangedStoneHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    126     getGUIObjectByName("exchangedMetalHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    127     getGUIObjectByName("barterEfficiencyHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    128     getGUIObjectByName("tradeIncomeHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     122    Engine.GetGUIObjectByName("playerName4Heading").size = left + " 26 " + (left + playerNameHeadingWidth) + " 100%"; left += playerNameHeadingWidth;
     123    Engine.GetGUIObjectByName("exchangedFoodHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     124    Engine.GetGUIObjectByName("exchangedWoodHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     125    Engine.GetGUIObjectByName("exchangedStoneHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     126    Engine.GetGUIObjectByName("exchangedMetalHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     127    Engine.GetGUIObjectByName("barterEfficiencyHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
     128    Engine.GetGUIObjectByName("tradeIncomeHeading").size = left + " 16 " + (left + width) + " 100%"; left += width;
    129129
    130130    // Show counters
    131131    for (var i = 0; i < MAX_SLOTS; ++i)
     
    136136
    137137            for (var k = 0; k < panelNames.length; ++k)
    138138            {
    139                 var playerBox = getGUIObjectByName("playerBox"+k+"["+i+"]");
     139                var playerBox = Engine.GetGUIObjectByName("playerBox"+k+"["+i+"]");
    140140                playerBox.hidden = false;
    141141
    142142                var colourString = "colour: "
     
    144144                    + Math.floor(playerState.colour.g * 255) + " "
    145145                    + Math.floor(playerState.colour.b * 255);
    146146                playerBox.sprite = colourString + " 32";
    147                 var playerColourBox = getGUIObjectByName("playerColourBox"+k+"["+i+"]");
     147                var playerColourBox = Engine.GetGUIObjectByName("playerColourBox"+k+"["+i+"]");
    148148                playerColourBox.sprite = colourString + " 255";
    149149
    150150                // Show the multiplayer name, e.g. "Foobar" rather than "Player 1".
    151151                // TODO: Perhaps show both the multiplayer and map-specific name?
    152                 var playerName = getGUIObjectByName("playerName"+k+"["+i+"]");
     152                var playerName = Engine.GetGUIObjectByName("playerName"+k+"["+i+"]");
    153153                playerName.caption = data.players[i+1].name;
    154154
    155                 getGUIObjectByName("civIcon"+k+"["+i+"]").sprite = "stretched:"+civData[playerState.civ].Emblem;
    156                 getGUIObjectByName("civIcon"+k+"["+i+"]").tooltip = civData[playerState.civ].Name;
     155                Engine.GetGUIObjectByName("civIcon"+k+"["+i+"]").sprite = "stretched:"+civData[playerState.civ].Emblem;
     156                Engine.GetGUIObjectByName("civIcon"+k+"["+i+"]").tooltip = civData[playerState.civ].Name;
    157157            }
    158158
    159             var economyScore = getGUIObjectByName("economyScore["+i+"]");
    160             var militaryScore = getGUIObjectByName("militaryScore["+i+"]");
    161             var explorationScore = getGUIObjectByName("explorationScore["+i+"]");
    162             var totalScore = getGUIObjectByName("totalScore["+i+"]");
     159            var economyScore = Engine.GetGUIObjectByName("economyScore["+i+"]");
     160            var militaryScore = Engine.GetGUIObjectByName("militaryScore["+i+"]");
     161            var explorationScore = Engine.GetGUIObjectByName("explorationScore["+i+"]");
     162            var totalScore = Engine.GetGUIObjectByName("totalScore["+i+"]");
    163163
    164             var unitsTrained = getGUIObjectByName("unitsTrained["+i+"]");
    165             var unitsLost = getGUIObjectByName("unitsLost["+i+"]");
    166             var enemyUnitsKilled = getGUIObjectByName("enemyUnitsKilled["+i+"]");
    167             var buildingsConstructed = getGUIObjectByName("buildingsConstructed["+i+"]");
    168             var buildingsLost = getGUIObjectByName("buildingsLost["+i+"]");
    169             var enemyBuildingsDestroyed = getGUIObjectByName("enemyBuildingsDestroyed["+i+"]");
     164            var unitsTrained = Engine.GetGUIObjectByName("unitsTrained["+i+"]");
     165            var unitsLost = Engine.GetGUIObjectByName("unitsLost["+i+"]");
     166            var enemyUnitsKilled = Engine.GetGUIObjectByName("enemyUnitsKilled["+i+"]");
     167            var buildingsConstructed = Engine.GetGUIObjectByName("buildingsConstructed["+i+"]");
     168            var buildingsLost = Engine.GetGUIObjectByName("buildingsLost["+i+"]");
     169            var enemyBuildingsDestroyed = Engine.GetGUIObjectByName("enemyBuildingsDestroyed["+i+"]");
    170170
    171             var civCentresBuilt = getGUIObjectByName("civCentresBuilt["+i+"]");
    172             var enemyCivCentresDestroyed = getGUIObjectByName("enemyCivCentresDestroyed["+i+"]");
    173             var mapExploration = getGUIObjectByName("mapExploration["+i+"]");
     171            var civCentresBuilt = Engine.GetGUIObjectByName("civCentresBuilt["+i+"]");
     172            var enemyCivCentresDestroyed = Engine.GetGUIObjectByName("enemyCivCentresDestroyed["+i+"]");
     173            var mapExploration = Engine.GetGUIObjectByName("mapExploration["+i+"]");
    174174
    175             var foodGathered = getGUIObjectByName("foodGathered["+i+"]");
    176             var woodGathered = getGUIObjectByName("woodGathered["+i+"]");
    177             var stoneGathered = getGUIObjectByName("stoneGathered["+i+"]");
    178             var metalGathered = getGUIObjectByName("metalGathered["+i+"]");
    179             var vegetarianRatio = getGUIObjectByName("vegetarianRatio["+i+"]");
    180             var treasuresCollected = getGUIObjectByName("treasuresCollected["+i+"]");
    181             var resourcesTributed = getGUIObjectByName("resourcesTributed["+i+"]");
     175            var foodGathered = Engine.GetGUIObjectByName("foodGathered["+i+"]");
     176            var woodGathered = Engine.GetGUIObjectByName("woodGathered["+i+"]");
     177            var stoneGathered = Engine.GetGUIObjectByName("stoneGathered["+i+"]");
     178            var metalGathered = Engine.GetGUIObjectByName("metalGathered["+i+"]");
     179            var vegetarianRatio = Engine.GetGUIObjectByName("vegetarianRatio["+i+"]");
     180            var treasuresCollected = Engine.GetGUIObjectByName("treasuresCollected["+i+"]");
     181            var resourcesTributed = Engine.GetGUIObjectByName("resourcesTributed["+i+"]");
    182182
    183             var exchangedFood = getGUIObjectByName("exchangedFood["+i+"]");
    184             var exchangedWood = getGUIObjectByName("exchangedWood["+i+"]");
    185             var exchangedStone = getGUIObjectByName("exchangedStone["+i+"]");
    186             var exchangedMetal = getGUIObjectByName("exchangedMetal["+i+"]");
    187             var barterEfficiency = getGUIObjectByName("barterEfficiency["+i+"]");
    188             var tradeIncome = getGUIObjectByName("tradeIncome["+i+"]");
     183            var exchangedFood = Engine.GetGUIObjectByName("exchangedFood["+i+"]");
     184            var exchangedWood = Engine.GetGUIObjectByName("exchangedWood["+i+"]");
     185            var exchangedStone = Engine.GetGUIObjectByName("exchangedStone["+i+"]");
     186            var exchangedMetal = Engine.GetGUIObjectByName("exchangedMetal["+i+"]");
     187            var barterEfficiency = Engine.GetGUIObjectByName("barterEfficiency["+i+"]");
     188            var tradeIncome = Engine.GetGUIObjectByName("tradeIncome["+i+"]");
    189189
    190190            // align counters
    191191
     
    195195            militaryScore.size = left + " 2 " + (left + width) + " 100%"; left += width;
    196196            explorationScore.size = left + " 2 " + (left + width) + " 100%"; left += width;
    197197            totalScore.size = left + " 2 " + (left + width) + " 100%"; left += width;
    198             var size = getGUIObjectByName("playerBox0["+i+"]").size;
     198            var size = Engine.GetGUIObjectByName("playerBox0["+i+"]").size;
    199199            size.right = left + 10;
    200             getGUIObjectByName("playerBox0["+i+"]").size = size;
     200            Engine.GetGUIObjectByName("playerBox0["+i+"]").size = size;
    201201           
    202202            left = 240;
    203203            unitsTrained.size = left + " 2 " + (left + width) + " 100%"; left += width;
     
    206206            buildingsConstructed.size = left + " 2 " + (left + width) + " 100%"; left += width;
    207207            buildingsLost.size = left + " 2 " + (left + width) + " 100%"; left += width;
    208208            enemyBuildingsDestroyed.size = left + " 2 " + (left + width) + " 100%"; left += width;
    209             size = getGUIObjectByName("playerBox1["+i+"]").size;
     209            size = Engine.GetGUIObjectByName("playerBox1["+i+"]").size;
    210210            size.right = left + 10;
    211             getGUIObjectByName("playerBox1["+i+"]").size = size;
     211            Engine.GetGUIObjectByName("playerBox1["+i+"]").size = size;
    212212
    213213            left = 240;
    214214            civCentresBuilt.size = left + " 2 " + (left + width) + " 100%"; left += width;
    215215            enemyCivCentresDestroyed.size = left + " 2 " + (left + width) + " 100%"; left += width;
    216216            mapExploration.size = left + " 2 " + (left + width) + " 100%"; left += width;
    217             size = getGUIObjectByName("playerBox2["+i+"]").size;
     217            size = Engine.GetGUIObjectByName("playerBox2["+i+"]").size;
    218218            size.right = left + 10;
    219             getGUIObjectByName("playerBox2["+i+"]").size = size;
     219            Engine.GetGUIObjectByName("playerBox2["+i+"]").size = size;
    220220
    221221            left = 240;
    222222            foodGathered.size = left + " 2 " + (left + width) + " 100%"; left += width;
     
    226226            vegetarianRatio.size = left + " 2 " + (left + width) + " 100%"; left += width;
    227227            treasuresCollected.size = left + " 2 " + (left + width) + " 100%"; left += width;
    228228            resourcesTributed.size = left + " 2 " + (left + tributesWidth) + " 100%"; left += tributesWidth;
    229             size = getGUIObjectByName("playerBox3["+i+"]").size;
     229            size = Engine.GetGUIObjectByName("playerBox3["+i+"]").size;
    230230            size.right = left + 10;
    231             getGUIObjectByName("playerBox3["+i+"]").size = size;
     231            Engine.GetGUIObjectByName("playerBox3["+i+"]").size = size;
    232232
    233233            left = 240;
    234234            exchangedFood.size = left + " 2 " + (left + width) + " 100%"; left += width;
     
    237237            exchangedMetal.size = left + " 2 " + (left + width) + " 100%"; left += width;
    238238            barterEfficiency.size = left + " 2 " + (left + width) + " 100%"; left += width;
    239239            tradeIncome.size = left + " 2 " + (left + width) + " 100%"; left += width;
    240             size = getGUIObjectByName("playerBox4["+i+"]").size;
     240            size = Engine.GetGUIObjectByName("playerBox4["+i+"]").size;
    241241            size.right = left + 10;
    242             getGUIObjectByName("playerBox4["+i+"]").size = size;
     242            Engine.GetGUIObjectByName("playerBox4["+i+"]").size = size;
    243243
    244244            // display counters
    245245            economyScore.caption = Math.round((playerState.statistics.resourcesGathered.food + playerState.statistics.resourcesGathered.wood +
     
    297297            // hide player boxes
    298298            for (var k = 0; k < panelNames.length; ++k)
    299299            {
    300                 var playerBox = getGUIObjectByName("playerBox"+k+"["+i+"]");
     300                var playerBox = Engine.GetGUIObjectByName("playerBox"+k+"["+i+"]");
    301301                playerBox.hidden = true;
    302302            }
    303303        }
  • binaries/data/mods/public/gui/common/functions_utility_music.js

     
    5050    // Get names of sounds (attack, command, select, hit, pain).
    5151    // or
    5252    // Get names of "peace", "menu" (theme) and "battle" tracks.
    53     var soundArray = buildDirEntList(randomSoundPath, "*" + soundSubType + "*", false);
     53    var soundArray = Engine.BuildDirEntList(randomSoundPath, "*" + soundSubType + "*", false);
    5454    if (soundArray.length == 0)
    5555    {
    5656        Engine.Console_Write ("Failed to find sounds matching '*"+soundSubType+"*'");
  • binaries/data/mods/public/gui/common/functions_utility_error.js

     
    2525    }
    2626   
    2727    // Reset cursor
    28     setCursor("arrow-default");
     28    Engine.SetCursor("arrow-default");
    2929}
  • binaries/data/mods/public/gui/common/functions_utility_list.js

     
    1010// Remove the item at the given index (pos) from the given list object (objectName).
    1111function removeItem (objectName, pos)
    1212{
    13     if (getGUIObjectByName (objectName) == null)
     13    if (Engine.GetGUIObjectByName (objectName) == null)
    1414        Engine.Console_Write ("removeItem(): " + objectName + " not found.");
    1515
    16     var list = getGUIObjectByName (objectName).list;
    17     var selected = getGUIObjectByName (objectName).selected;
     16    var list = Engine.GetGUIObjectByName (objectName).list;
     17    var selected = Engine.GetGUIObjectByName (objectName).selected;
    1818
    1919    list.splice(pos, 1);
    2020
    21     getGUIObjectByName (objectName).list = list;
     21    Engine.GetGUIObjectByName (objectName).list = list;
    2222
    2323    // It's important that we update the selection *after*
    2424    //  we've committed the changes to the list.
     
    2626    // Update the selected so the same element remains selected.
    2727    if (selected == pos)
    2828    {
    29         getGUIObjectByName (objectName).selected = -1;
     29        Engine.GetGUIObjectByName (objectName).selected = -1;
    3030    }
    3131    else
    3232    if (selected > pos)
    3333    {
    34         getGUIObjectByName (objectName).selected = selected - 1;
     34        Engine.GetGUIObjectByName (objectName).selected = selected - 1;
    3535    }
    3636}
    3737
     
    4040// Add the item at the given index (pos) to the given list object (objectName) with the given value (value).
    4141function addItem (objectName, pos, value)
    4242{
    43     if (getGUIObjectByName (objectName) == null)
     43    if (Engine.GetGUIObjectByName (objectName) == null)
    4444        Engine.Console_Write ("addItem(): " + objectName + " not found.");
    4545
    46     var list = getGUIObjectByName (objectName).list;
    47     var selected = getGUIObjectByName (objectName).selected;
     46    var list = Engine.GetGUIObjectByName (objectName).list;
     47    var selected = Engine.GetGUIObjectByName (objectName).selected;
    4848
    4949    list.splice (pos, 0, value);
    5050
    51     getGUIObjectByName (objectName).list = list;
     51    Engine.GetGUIObjectByName (objectName).list = list;
    5252
    5353    // It's important that we update the selection *after*
    5454    //  we've committed the changes to the list.
     
    5656    // Update the selected so the same element remains selected.
    5757    if (selected >= pos)
    5858    {
    59         getGUIObjectByName (objectName).selected = selected + 1;
     59        Engine.GetGUIObjectByName (objectName).selected = selected + 1;
    6060    }
    6161}
    6262
     
    6565// Adds an element to the end of the list
    6666function pushItem (objectName, value)
    6767{
    68     if (getGUIObjectByName (objectName) == null)
     68    if (Engine.GetGUIObjectByName (objectName) == null)
    6969        Engine.Console_Write ("pushItem(): " + objectName + " not found.");
    7070
    71     var list = getGUIObjectByName (objectName).list;
     71    var list = Engine.GetGUIObjectByName (objectName).list;
    7272    list.push (value);
    73     getGUIObjectByName (objectName).list = list;
     73    Engine.GetGUIObjectByName (objectName).list = list;
    7474    // Point to the new item.
    75     getGUIObjectByName(objectName).selected = getNumItems(objectName)-1;
     75    Engine.GetGUIObjectByName(objectName).selected = getNumItems(objectName)-1;
    7676}
    7777
    7878// ====================================================================
     
    8080// Removes the last element
    8181function popItem (objectName)
    8282{
    83     if (getGUIObjectByName (objectName) == null)
     83    if (Engine.GetGUIObjectByName (objectName) == null)
    8484        Engine.Console_Write ("popItem(): " + objectName + " not found.");
    8585
    86     var selected = getGUIObjectByName (objectName).selected;
     86    var selected = Engine.GetGUIObjectByName (objectName).selected;
    8787    removeItem(objectName, getNumItems(objectName)-1);
    8888
    8989    if (selected == getNumItems(objectName)-1)
    9090    {
    91         getGUIObjectByName(objectName).selected = -1;
     91        Engine.GetGUIObjectByName(objectName).selected = -1;
    9292    }
    9393}
    9494
     
    9797// Retrieves the number of elements in the list
    9898function getNumItems (objectName)
    9999{
    100     if (getGUIObjectByName (objectName) == null)
     100    if (Engine.GetGUIObjectByName (objectName) == null)
    101101        Engine.Console_Write ("getNumItems(): " + objectName + " not found.");
    102102
    103     var list = getGUIObjectByName(objectName).list;
     103    var list = Engine.GetGUIObjectByName(objectName).list;
    104104    return list.length;
    105105}
    106106
     
    109109// Retrieves the value of the item at 'pos'
    110110function getItemValue (objectName, pos)
    111111{
    112     if (getGUIObjectByName (objectName) == null)
     112    if (Engine.GetGUIObjectByName (objectName) == null)
    113113        Engine.Console_Write ("getItemValue(): " + objectName + " not found.");
    114114
    115     var list = getGUIObjectByName(objectName).list;
     115    var list = Engine.GetGUIObjectByName(objectName).list;
    116116    return list[pos];
    117117}
    118118
     
    121121// Retrieves the value of the currently selected item
    122122function getCurrItemValue (objectName)
    123123{
    124     if (getGUIObjectByName (objectName) == null)
     124    if (Engine.GetGUIObjectByName (objectName) == null)
    125125        Engine.Console_Write ("getCurrItemValue(): " + objectName + " not found.");
    126126
    127     if (getGUIObjectByName(objectName).selected == -1)
     127    if (Engine.GetGUIObjectByName(objectName).selected == -1)
    128128        return "";
    129     var list = getGUIObjectByName(objectName).list;
    130     return list[getGUIObjectByName(objectName).selected];
     129    var list = Engine.GetGUIObjectByName(objectName).list;
     130    return list[Engine.GetGUIObjectByName(objectName).selected];
    131131}
    132132
    133133// ====================================================================
     
    136136// already in the list).
    137137function setCurrItemValue (objectName, string)
    138138{
    139     if (getGUIObjectByName(objectName) == null) {
     139    if (Engine.GetGUIObjectByName(objectName) == null) {
    140140        Engine.Console_Write ("setCurrItemValue(): " + objectName + " not found.");
    141141        return -1;
    142142    }
    143143
    144     if (getGUIObjectByName(objectName).selected == -1)
     144    if (Engine.GetGUIObjectByName(objectName).selected == -1)
    145145        return -1;  // Return -1 if nothing selected.
    146     var list = getGUIObjectByName(objectName).list;
     146    var list = Engine.GetGUIObjectByName(objectName).list;
    147147    // Seek through list.
    148148    for (var ctr = 0; ctr < list.length; ctr++)
    149149    {
     
    151151        if (list[ctr] == string)
    152152        {
    153153            // Point selected to this item.
    154             getGUIObjectByName(objectName).selected = ctr;
     154            Engine.GetGUIObjectByName(objectName).selected = ctr;
    155155            return ctr; // Return position of item.
    156156        }
    157157    }
  • binaries/data/mods/public/gui/common/functions_utility_test.js

     
    11function updateOrbital()
    22{
    3     if( !getGUIObjectByName( 'arena' ).hidden )
     3    if( !Engine.GetGUIObjectByName( 'arena' ).hidden )
    44    {
    55        g_ballx += g_balldx;
    66        g_bally += g_balldy;
     
    3636        g_balldx -= force * vect_x;
    3737        g_balldy -= force * vect_y;
    3838
    39         var ball = getGUIObjectByName('ball');
     39        var ball = Engine.GetGUIObjectByName('ball');
    4040        var r=5;
    4141        ball.size = new GUISize(g_ballx-r, g_bally-r, g_ballx+r, g_bally+r);
    4242    }
  • binaries/data/mods/public/gui/common/functions_utility.js

     
    2020// Get list of XML files in pathname with recursion, excepting those starting with _
    2121function getXMLFileList(pathname)
    2222{
    23     var files = buildDirEntList(pathname, "*.xml", true);
     23    var files = Engine.BuildDirEntList(pathname, "*.xml", true);
    2424
    2525    var result = [];
    2626
     
    4545// Get list of JSON files in pathname
    4646function getJSONFileList(pathname)
    4747{
    48     var files = buildDirEntList(pathname, "*.json", false);
     48    var files = Engine.BuildDirEntList(pathname, "*.json", false);
    4949
    5050    // Remove the path and extension from each name, since we just want the filename
    5151    files = [ n.substring(pathname.length, n.length-5) for each (n in files) ];
     
    6161{
    6262    var data = {};
    6363
    64     var rawData = readFile(pathname);
     64    var rawData = Engine.ReadFile(pathname);
    6565    if (!rawData)
    6666    {
    6767        error("Failed to read file: "+pathname);
     
    139139function parseJSONFromDataFile(filename)
    140140{
    141141    var path = "simulation/data/"+filename;
    142     var rawData = readFile(path);
     142    var rawData = Engine.ReadFile(path);
    143143    if (!rawData)
    144144        error("Failed to read file: "+path);
    145145
  • binaries/data/mods/public/gui/common/functions_global_object.js

     
    2929
    3030function updateFPS()
    3131{   
    32     getGUIObjectByName("fpsCounter").caption = "FPS: " + getFPS();
     32    Engine.GetGUIObjectByName("fpsCounter").caption = "FPS: " + Engine.GetFPS();
    3333}
  • binaries/data/mods/public/gui/common/functions_civinfo.js

     
    99function loadCivData()
    1010{   // Load all JSON files containing civ data
    1111    var civData = {};
    12     var civFiles = buildDirEntList("civs/", "*.json", false);
     12    var civFiles = Engine.BuildDirEntList("civs/", "*.json", false);
    1313   
    1414    for each (var filename in civFiles)
    1515    {   // Parse data if valid file
  • binaries/data/mods/public/gui/civinfo/civinfo.js

     
    4444    var civListCodes = [ civ.code for each (civ in civList) ];
    4545
    4646    // Set civ control
    47     var civSelection = getGUIObjectByName("civSelection");
     47    var civSelection = Engine.GetGUIObjectByName("civSelection");
    4848    civSelection.list = civListNames;
    4949    civSelection.list_data = civListCodes;
    5050    civSelection.selected = 0;
     
    8585        error("Error loading civ data for \""+code+"\"");
    8686
    8787    // Update civ gameplay display
    88     getGUIObjectByName("civGameplayHeading").caption = heading(civInfo.Name+" Gameplay", 16);
     88    Engine.GetGUIObjectByName("civGameplayHeading").caption = heading(civInfo.Name+" Gameplay", 16);
    8989
    9090
    9191    // Bonuses
     
    105105                    + civInfo.TeamBonuses[i].History + '" tooltip_style="civInfoTooltip"]\n     ' + civInfo.TeamBonuses[i].Description + '\n[/color]';
    106106    }
    107107   
    108     getGUIObjectByName("civBonuses").caption = bonusCaption;
     108    Engine.GetGUIObjectByName("civBonuses").caption = bonusCaption;
    109109
    110110
    111111    // Special techs / buildings
     
    129129                    + civInfo.Structures[i].History + '" tooltip_style="civInfoTooltip"]\n';
    130130    }
    131131   
    132     getGUIObjectByName("civTechs").caption = techCaption;
     132    Engine.GetGUIObjectByName("civTechs").caption = techCaption;
    133133
    134134
    135135    // Heroes
     
    146146        heroCaption += '\n';
    147147    }
    148148   
    149     getGUIObjectByName("civHeroes").caption = heroCaption;
     149    Engine.GetGUIObjectByName("civHeroes").caption = heroCaption;
    150150
    151151
    152152    // Update civ history display
    153     getGUIObjectByName("civHistoryHeading").caption = heading("History of the " + civInfo.Name, 16);
    154     getGUIObjectByName("civHistoryText").caption = civInfo.History;
     153    Engine.GetGUIObjectByName("civHistoryHeading").caption = heading("History of the " + civInfo.Name, 16);
     154    Engine.GetGUIObjectByName("civHistoryText").caption = civInfo.History;
    155155}
  • binaries/data/mods/public/gui/lobby/prelobby.js

     
    88
    99function lobbyStop()
    1010{
    11     getGUIObjectByName("connectFeedback").caption = "";
    12     getGUIObjectByName("registerFeedback").caption = "";
     11    Engine.GetGUIObjectByName("connectFeedback").caption = "";
     12    Engine.GetGUIObjectByName("registerFeedback").caption = "";
    1313
    1414    if (g_LobbyIsConnecting == false)
    1515        return;
     
    2626    if (Engine.HasXmppClient())
    2727        Engine.StopXmppClient();
    2828
    29     var username = getGUIObjectByName("connectUsername").caption;
    30     var password = getGUIObjectByName("connectPassword").caption;
    31     var feedback = getGUIObjectByName("connectFeedback");
     29    var username = Engine.GetGUIObjectByName("connectUsername").caption;
     30    var password = Engine.GetGUIObjectByName("connectPassword").caption;
     31    var feedback = Engine.GetGUIObjectByName("connectFeedback");
    3232    // Use username as nick unless overridden.
    33     if (getGUIObjectByName("nickPanel").hidden == true)
     33    if (Engine.GetGUIObjectByName("nickPanel").hidden == true)
    3434        var nick = sanitizePlayerName(username, true, true);
    3535    else
    36         var nick = sanitizePlayerName(getGUIObjectByName("joinPlayerName").caption, true, true);
     36        var nick = sanitizePlayerName(Engine.GetGUIObjectByName("joinPlayerName").caption, true, true);
    3737    if (!username || !password)
    3838    {
    3939        feedback.caption = "Username or password empty";
     
    5757    if (Engine.HasXmppClient())
    5858        Engine.StopXmppClient();
    5959
    60     var account = getGUIObjectByName("connectUsername").caption;
    61     var password = getGUIObjectByName("connectPassword").caption;
    62     var passwordAgain = getGUIObjectByName("registerPasswordAgain").caption;
    63     var feedback = getGUIObjectByName("registerFeedback");
     60    var account = Engine.GetGUIObjectByName("connectUsername").caption;
     61    var password = Engine.GetGUIObjectByName("connectPassword").caption;
     62    var passwordAgain = Engine.GetGUIObjectByName("registerPasswordAgain").caption;
     63    var feedback = Engine.GetGUIObjectByName("registerFeedback");
    6464
    6565    if (!account || !password || !passwordAgain)
    6666    {
     
    7070    if (password != passwordAgain)
    7171    {
    7272        feedback.caption = "Password mismatch";
    73         getGUIObjectByName("connectPassword").caption = "";
    74         getGUIObjectByName("registerPasswordAgain").caption = "";
     73        Engine.GetGUIObjectByName("connectPassword").caption = "";
     74        Engine.GetGUIObjectByName("registerPasswordAgain").caption = "";
    7575        return;
    7676    }
    7777    // Check they are using a valid account name.
     
    113113        {
    114114            // We are connected, switch to the lobby page
    115115            Engine.PopGuiPage();
    116             var username = getGUIObjectByName("connectUsername").caption;
    117             var password = getGUIObjectByName("connectPassword").caption;
     116            var username = Engine.GetGUIObjectByName("connectUsername").caption;
     117            var password = Engine.GetGUIObjectByName("connectPassword").caption;
    118118            // Use username as nick unless overridden.
    119             if (getGUIObjectByName("nickPanel").hidden == true)
     119            if (Engine.GetGUIObjectByName("nickPanel").hidden == true)
    120120                var nick = sanitizePlayerName(username, true, true);
    121121            else
    122                 var nick = sanitizePlayerName(getGUIObjectByName("joinPlayerName").caption, true, true);
     122                var nick = sanitizePlayerName(Engine.GetGUIObjectByName("joinPlayerName").caption, true, true);
    123123
    124124            // Switch to lobby
    125125            Engine.SwitchGuiPage("page_lobby.xml");
     
    137137        else if (message.type == "system" && message.text == "registered")
    138138        {
    139139            // Great, we are registered. Switch to the connection window.
    140             getGUIObjectByName("registerFeedback").caption = toTitleCase(message.text);
    141             getGUIObjectByName("connectFeedback").caption = toTitleCase(message.text);
     140            Engine.GetGUIObjectByName("registerFeedback").caption = toTitleCase(message.text);
     141            Engine.GetGUIObjectByName("connectFeedback").caption = toTitleCase(message.text);
    142142            Engine.StopXmppClient();
    143143            g_LobbyIsConnecting = false;
    144             getGUIObjectByName("pageRegister").hidden = true;
    145             getGUIObjectByName("pageConnect").hidden = false;
     144            Engine.GetGUIObjectByName("pageRegister").hidden = true;
     145            Engine.GetGUIObjectByName("pageConnect").hidden = false;
    146146        }
    147147        else if(message.type == "system" && (message.level == "error" || message.text == "disconnected"))
    148148        {
    149             getGUIObjectByName("connectFeedback").caption = toTitleCase(message.text);
    150             getGUIObjectByName("registerFeedback").caption = toTitleCase(message.text);
     149            Engine.GetGUIObjectByName("connectFeedback").caption = toTitleCase(message.text);
     150            Engine.GetGUIObjectByName("registerFeedback").caption = toTitleCase(message.text);
    151151            Engine.StopXmppClient();
    152152            g_LobbyIsConnecting = false;
    153153        }
  • binaries/data/mods/public/gui/lobby/prelobby.xml

     
    5959                <![CDATA[<<]]>
    6060                <action on="Press"><![CDATA[
    6161                    this.hidden = true;
    62                     getGUIObjectByName("nickPanel").hidden = false;
     62                    Engine.GetGUIObjectByName("nickPanel").hidden = false;
    6363                ]]></action>
    6464            </object>
    6565            <object name="connectFeedback" type="text" style="CenteredLabelText" size="32 150 100%-32 180" textcolor="red"/>
     
    7474                Register
    7575                <action on="Press">
    7676                    lobbyStop();
    77                     getGUIObjectByName("pageConnect").hidden = true;
    78                     getGUIObjectByName("pageRegister").hidden = false;
     77                    Engine.GetGUIObjectByName("pageConnect").hidden = true;
     78                    Engine.GetGUIObjectByName("pageRegister").hidden = false;
    7979                </action>
    8080            </object>
    8181            <object type="button" size="258 100%-60 100%-32 100%-32" style="StoneButton">
     
    103103                Back
    104104                <action on="Press">
    105105                    lobbyStop();
    106                     getGUIObjectByName("pageRegister").hidden = true;
    107                     getGUIObjectByName("pageConnect").hidden = false;
     106                    Engine.GetGUIObjectByName("pageRegister").hidden = true;
     107                    Engine.GetGUIObjectByName("pageConnect").hidden = false;
    108108                </action>
    109109            </object>
    110110            <object type="button" size="258 100%-60 100%-32 100%-32" style="StoneButton">
  • binaries/data/mods/public/gui/lobby/lobby.js

     
    2121    g_mapSizes.shortNames.push("Any");
    2222    g_mapSizes.tiles.push("");
    2323
    24     var mapSizeFilter = getGUIObjectByName("mapSizeFilter");
     24    var mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
    2525    mapSizeFilter.list = g_mapSizes.shortNames;
    2626    mapSizeFilter.list_data = g_mapSizes.tiles;
    2727
    28     var playersNumberFilter = getGUIObjectByName("playersNumberFilter");
     28    var playersNumberFilter = Engine.GetGUIObjectByName("playersNumberFilter");
    2929    playersNumberFilter.list = [2,3,4,5,6,7,8,"Any"];
    3030    playersNumberFilter.list_data = [2,3,4,5,6,7,8,""];
    3131
    32     var mapTypeFilter = getGUIObjectByName("mapTypeFilter");
     32    var mapTypeFilter = Engine.GetGUIObjectByName("mapTypeFilter");
    3333    mapTypeFilter.list = ["Skirmish", "Random", "Scenario", "Any"];
    3434    mapTypeFilter.list_data = ["skirmish", "random", "scenario", ""];
    3535
     
    7979function resetFilters()
    8080{
    8181    // Reset states of gui objects
    82     getGUIObjectByName("mapSizeFilter").selected = getGUIObjectByName("mapSizeFilter").list.length - 1;
    83     getGUIObjectByName("playersNumberFilter").selected = getGUIObjectByName("playersNumberFilter").list.length - 1;
    84     getGUIObjectByName("mapTypeFilter").selected = getGUIObjectByName("mapTypeFilter").list.length - 1;
    85     getGUIObjectByName("showFullFilter").checked = false;
     82    Engine.GetGUIObjectByName("mapSizeFilter").selected = Engine.GetGUIObjectByName("mapSizeFilter").list.length - 1;
     83    Engine.GetGUIObjectByName("playersNumberFilter").selected = Engine.GetGUIObjectByName("playersNumberFilter").list.length - 1;
     84    Engine.GetGUIObjectByName("mapTypeFilter").selected = Engine.GetGUIObjectByName("mapTypeFilter").list.length - 1;
     85    Engine.GetGUIObjectByName("showFullFilter").checked = false;
    8686
    8787    // Update the list of games
    8888    updateGameList();
    8989
    9090    // Update info box about the game currently selected
    91     selectGame(getGUIObjectByName("gamesBox").selected);
     91    selectGame(Engine.GetGUIObjectByName("gamesBox").selected);
    9292}
    9393
    9494function applyFilters()
     
    9797    updateGameList();
    9898
    9999    // Update info box about the game currently selected
    100     selectGame(getGUIObjectByName("gamesBox").selected);
     100    selectGame(Engine.GetGUIObjectByName("gamesBox").selected);
    101101}
    102102
    103103function displayGame(g, mapSizeFilter, playersNumberFilter, mapTypeFilter, showFullFilter)
     
    113113// Do a full update of the player listing **Only call on init**
    114114function updatePlayerList()
    115115{
    116     var playersBox = getGUIObjectByName("playersBox");
     116    var playersBox = Engine.GetGUIObjectByName("playersBox");
    117117    [playerList, presenceList, nickList] = [[],[],[]];
    118118    for each (var p in Engine.GetPlayerList())
    119119    {
     
    136136    // Get list from C++
    137137    var boardList = Engine.GetBoardList();
    138138    // Get GUI leaderboard object
    139     var leaderboard = getGUIObjectByName("leaderboardBox");
     139    var leaderboard = Engine.GetGUIObjectByName("leaderboardBox");
    140140    // Sort list in acending order by rating
    141141    boardList.sort(function(a, b) b.rating - a.rating);
    142142
     
    166166// Update game listing
    167167function updateGameList()
    168168{
    169     var gamesBox = getGUIObjectByName("gamesBox");
     169    var gamesBox = Engine.GetGUIObjectByName("gamesBox");
    170170    var gameList = Engine.GetGameList();
    171171    // Store the game whole game list data so that we can access it later
    172172    // to update the game info panel.
     
    186186    var list = [];
    187187    var list_data = [];
    188188
    189     var mapSizeFilterDD = getGUIObjectByName("mapSizeFilter");
    190     var playersNumberFilterDD = getGUIObjectByName("playersNumberFilter");
    191     var mapTypeFilterDD = getGUIObjectByName("mapTypeFilter");
    192     var showFullFilterCB = getGUIObjectByName("showFullFilter");
     189    var mapSizeFilterDD = Engine.GetGUIObjectByName("mapSizeFilter");
     190    var playersNumberFilterDD = Engine.GetGUIObjectByName("playersNumberFilter");
     191    var mapTypeFilterDD = Engine.GetGUIObjectByName("mapTypeFilter");
     192    var showFullFilterCB = Engine.GetGUIObjectByName("showFullFilter");
    193193
    194194    // Get filter values
    195195    var mapSizeFilter = mapSizeFilterDD.selected >= 0 ? mapSizeFilterDD.list_data[mapSizeFilterDD.selected] : "";
     
    229229        gamesBox.selected = -1;
    230230
    231231    // If game selected, update info box about the game.
    232     if(getGUIObjectByName("gamesBox").selected != -1)
    233         selectGame(getGUIObjectByName("gamesBox").selected)
     232    if(Engine.GetGUIObjectByName("gamesBox").selected != -1)
     233        selectGame(Engine.GetGUIObjectByName("gamesBox").selected)
    234234}
    235235
    236236// The following function colorizes and formats the entries in the player list.
     
    272272    if (selected == -1)
    273273    {
    274274        // Hide the game info panel if a game is not selected
    275         getGUIObjectByName("gameInfo").hidden = true;
    276         getGUIObjectByName("gameInfoEmpty").hidden = false;
    277         getGUIObjectByName("joinGameButton").hidden = true;
     275        Engine.GetGUIObjectByName("gameInfo").hidden = true;
     276        Engine.GetGUIObjectByName("gameInfoEmpty").hidden = false;
     277        Engine.GetGUIObjectByName("joinGameButton").hidden = true;
    278278        return;
    279279    }
    280280
    281281    var mapData;
    282     var g = getGUIObjectByName("gamesBox").list_data[selected];
     282    var g = Engine.GetGUIObjectByName("gamesBox").list_data[selected];
    283283
    284284    // Load map data
    285285    if (g_GameList[g].mapType == "random" && g_GameList[g].mapName == "random")
    286286        mapData = {"settings": {"Description": "A randomly selected map."}};
    287     else if (g_GameList[g].mapType == "random" && fileExists(g_GameList[g].mapName + ".json"))
     287    else if (g_GameList[g].mapType == "random" && Engine.FileExists(g_GameList[g].mapName + ".json"))
    288288        mapData = parseJSONData(g_GameList[g].mapName + ".json");
    289     else if (fileExists(g_GameList[g].mapName + ".xml"))
     289    else if (Engine.FileExists(g_GameList[g].mapName + ".xml"))
    290290        mapData = Engine.LoadMapSettings(g_GameList[g].mapName + ".xml");
    291291    else
    292292        // Warn the player if we can't find the map.
    293293        warn("Map '"+ g_GameList[g].mapName +"'  not found");
    294294
    295295    // Show the game info paneland join button.
    296     getGUIObjectByName("gameInfo").hidden = false;
    297     getGUIObjectByName("gameInfoEmpty").hidden = true;
    298     getGUIObjectByName("joinGameButton").hidden = false;
     296    Engine.GetGUIObjectByName("gameInfo").hidden = false;
     297    Engine.GetGUIObjectByName("gameInfoEmpty").hidden = true;
     298    Engine.GetGUIObjectByName("joinGameButton").hidden = false;
    299299
    300300    // Display the map name, number of players, the names of the players, the map size and the map type.
    301     getGUIObjectByName("sgMapName").caption = g_GameList[g].niceMapName;
    302     getGUIObjectByName("sgNbPlayers").caption = g_GameList[g].nbp + "/" + g_GameList[g].tnbp;
    303     getGUIObjectByName("sgPlayersNames").caption = g_GameList[g].players;
    304     getGUIObjectByName("sgMapSize").caption = g_GameList[g].mapSize.split("(")[0];
    305     getGUIObjectByName("sgMapType").caption = toTitleCase(g_GameList[g].mapType);
     301    Engine.GetGUIObjectByName("sgMapName").caption = g_GameList[g].niceMapName;
     302    Engine.GetGUIObjectByName("sgNbPlayers").caption = g_GameList[g].nbp + "/" + g_GameList[g].tnbp;
     303    Engine.GetGUIObjectByName("sgPlayersNames").caption = g_GameList[g].players;
     304    Engine.GetGUIObjectByName("sgMapSize").caption = g_GameList[g].mapSize.split("(")[0];
     305    Engine.GetGUIObjectByName("sgMapType").caption = toTitleCase(g_GameList[g].mapType);
    306306
    307307    // Display map description if it exists, otherwise display a placeholder.
    308308    if (mapData && mapData.settings.Description)
     
    316316    else
    317317        var mapPreview = "nopreview.png";
    318318   
    319     getGUIObjectByName("sgMapDescription").caption = mapDescription;
    320     getGUIObjectByName("sgMapPreview").sprite = "cropped:(0.7812,0.5859)session/icons/mappreview/" + mapPreview;
     319    Engine.GetGUIObjectByName("sgMapDescription").caption = mapDescription;
     320    Engine.GetGUIObjectByName("sgMapPreview").sprite = "cropped:(0.7812,0.5859)session/icons/mappreview/" + mapPreview;
    321321}
    322322
    323323function joinSelectedGame()
    324324{
    325     var gamesBox = getGUIObjectByName("gamesBox");
     325    var gamesBox = Engine.GetGUIObjectByName("gamesBox");
    326326    if (gamesBox.selected >= 0)
    327327    {
    328328        var g = gamesBox.list_data[gamesBox.selected];
     
    382382        case "muc":
    383383            var nick = message.text;
    384384            var presence = Engine.LobbyGetPlayerPresence(nick);
    385             var playersBox = getGUIObjectByName("playersBox");
     385            var playersBox = Engine.GetGUIObjectByName("playersBox");
    386386            var playerList = playersBox.list_name;
    387387            var presenceList = playersBox.list_status;
    388388            var nickList = playersBox.list;
     
    454454                    updateBoardList();
    455455                    updatePlayerList();
    456456                    // Disable the 'host' button
    457                     getGUIObjectByName("hostButton").enabled = false;
     457                    Engine.GetGUIObjectByName("hostButton").enabled = false;
    458458                }
    459459                else if (message.text == "connected")
    460460                {
    461                     getGUIObjectByName("hostButton").enabled = true;
     461                    Engine.GetGUIObjectByName("hostButton").enabled = true;
    462462                }
    463463                break;
    464464            case "error":
     
    486486/* Messages */
    487487function submitChatInput()
    488488{
    489     var input = getGUIObjectByName("chatInput");
     489    var input = Engine.GetGUIObjectByName("chatInput");
    490490    var text = escapeText(input.caption);
    491491    if (text.length)
    492492    {
     
    498498
    499499function completeNick()
    500500{
    501     var input = getGUIObjectByName("chatInput");
     501    var input = Engine.GetGUIObjectByName("chatInput");
    502502    var text = escapeText(input.caption);
    503503    if (text.length)
    504504    {
     
    586586    if (formatted)
    587587    {
    588588        g_ChatMessages.push(formatted);
    589         getGUIObjectByName("chatText").caption = g_ChatMessages.join("\n");
     589        Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n");
    590590    }
    591591}
    592592
  • binaries/data/mods/public/gui/lobby/lobby.xml

     
    3535        <object name="leftButtonPanel" size="20 100%-45 15% 100%-20">
    3636            <object type="button" style="StoneButton" size="0 0 100% 100%">
    3737                Leaderboard
    38                 <action on="Press">getGUIObjectByName("leaderboard").hidden = false;getGUIObjectByName("leaderboardFade").hidden = false;</action>
     38                <action on="Press">Engine.GetGUIObjectByName("leaderboard").hidden = false;Engine.GetGUIObjectByName("leaderboardFade").hidden = false;</action>
    3939            </object>
    4040        </object>
    4141
     
    178178            </object>
    179179            <object type="button" style="StoneButton" size="50%+5 100%-45 50%+133 100%-17">
    180180                Back
    181                 <action on="Press">getGUIObjectByName("leaderboard").hidden = true;getGUIObjectByName("leaderboardFade").hidden = true;</action>
     181                <action on="Press">Engine.GetGUIObjectByName("leaderboard").hidden = true;Engine.GetGUIObjectByName("leaderboardFade").hidden = true;</action>
    182182            </object>
    183183            <object type="button" style="StoneButton" size="50%-133 100%-45 50%-5 100%-17">
    184184                Update
  • binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml

     
    4848            <object hotkey="confirm" type="button" size="50%-144 100%-60 50%-16 100%-32" style="StoneButton">
    4949                Continue
    5050                <action on="Press">
    51                     var joinPlayerName = getGUIObjectByName("joinPlayerName").caption;
    52                     var joinServer = getGUIObjectByName("joinServer").caption;
     51                    var joinPlayerName = Engine.GetGUIObjectByName("joinPlayerName").caption;
     52                    var joinServer = Engine.GetGUIObjectByName("joinServer").caption;
    5353                    Engine.ConfigDB_CreateValue("user", "playername", joinPlayerName);
    5454                    Engine.ConfigDB_CreateValue("user", "multiplayerserver", joinServer);
    5555                    Engine.ConfigDB_WriteFile("user", "config/user.cfg");
     
    9494            <object type="button" size="50%-144 100%-60 50%-16 100%-32" style="StoneButton">
    9595                Continue
    9696                <action on="Press">
    97                     var hostPlayerName = getGUIObjectByName("hostPlayerName").caption;
     97                    var hostPlayerName = Engine.GetGUIObjectByName("hostPlayerName").caption;
    9898                    Engine.ConfigDB_CreateValue("user", "playername", hostPlayerName);
    9999                    Engine.ConfigDB_WriteFile("user", "config/user.cfg");
    100                     if (startHost(hostPlayerName, getGUIObjectByName("hostServerName").caption))
     100                    if (startHost(hostPlayerName, Engine.GetGUIObjectByName("hostServerName").caption))
    101101                        switchSetupPage("pageHost", "pageConnecting");
    102102                </action>
    103103            </object>
  • binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js

     
    1818        }
    1919        else
    2020        {
    21             getGUIObjectByName("pageJoin").hidden = false;
    22             getGUIObjectByName("pageHost").hidden = true;
     21            Engine.GetGUIObjectByName("pageJoin").hidden = false;
     22            Engine.GetGUIObjectByName("pageHost").hidden = true;
    2323        }
    2424        break;
    2525    case "host":
    26         getGUIObjectByName("pageJoin").hidden = true;
    27         getGUIObjectByName("pageHost").hidden = false;
     26        Engine.GetGUIObjectByName("pageJoin").hidden = true;
     27        Engine.GetGUIObjectByName("pageHost").hidden = false;
    2828        if(Engine.HasXmppClient())
    2929        {
    30             getGUIObjectByName("hostServerNameWrapper").hidden = false;
    31             getGUIObjectByName("hostPlayerName").caption = attribs.name;
    32             getGUIObjectByName("hostServerName").caption = attribs.name + "'s game";
     30            Engine.GetGUIObjectByName("hostServerNameWrapper").hidden = false;
     31            Engine.GetGUIObjectByName("hostPlayerName").caption = attribs.name;
     32            Engine.GetGUIObjectByName("hostServerName").caption = attribs.name + "'s game";
    3333        }
    3434        else
    35             getGUIObjectByName("hostPlayerNameWrapper").hidden = false;
     35            Engine.GetGUIObjectByName("hostPlayerNameWrapper").hidden = false;
    3636        break;
    3737    default:
    3838        error("Unrecognised multiplayer game type : " + attribs.multiplayerGameType);
     
    5555    g_GameType = type;
    5656    g_IsConnecting = true;
    5757    g_IsRejoining = false;
    58     getGUIObjectByName("connectionStatus").caption = "Connecting to server...";
     58    Engine.GetGUIObjectByName("connectionStatus").caption = "Connecting to server...";
    5959}
    6060
    6161function onTick()
     
    131131                switch (message.status)
    132132                {
    133133                case "connected":
    134                     getGUIObjectByName("connectionStatus").caption = "Registering with server...";
     134                    Engine.GetGUIObjectByName("connectionStatus").caption = "Registering with server...";
    135135                    break;
    136136
    137137                case "authenticated":
    138138                    if (message.rejoining)
    139139                    {
    140                         getGUIObjectByName("connectionStatus").caption = "Game has already started - rejoining...";
     140                        Engine.GetGUIObjectByName("connectionStatus").caption = "Game has already started - rejoining...";
    141141                        g_IsRejoining = true;
    142142                        return; // we'll process the game setup messages in the next tick
    143143                    }
     
    167167
    168168function switchSetupPage(oldpage, newpage)
    169169{
    170     getGUIObjectByName(oldpage).hidden = true;
    171     getGUIObjectByName(newpage).hidden = false;
     170    Engine.GetGUIObjectByName(oldpage).hidden = true;
     171    Engine.GetGUIObjectByName(newpage).hidden = false;
    172172}
    173173
    174174function startHost(playername, servername)
     
    180180        {
    181181            if (g.name === servername)
    182182            {
    183                 getGUIObjectByName("hostFeedback").caption = "Game name already in use.";
     183                Engine.GetGUIObjectByName("hostFeedback").caption = "Game name already in use.";
    184184                return false;
    185185            }
    186186        }
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    8888        g_ServerName = attribs.serverName;
    8989
    9090    // Init the Cancel Button caption and tooltip
    91     var cancelButton = getGUIObjectByName("cancelGame");
     91    var cancelButton = Engine.GetGUIObjectByName("cancelGame");
    9292    if(!Engine.HasXmppClient())
    9393    {
    9494        cancelButton.caption = "Main menu";
     
    126126    initCivNameList();
    127127
    128128    // Init map types
    129     var mapTypes = getGUIObjectByName("mapTypeSelection");
     129    var mapTypes = Engine.GetGUIObjectByName("mapTypeSelection");
    130130    mapTypes.list = ["Skirmish","Random","Scenario"];
    131131    mapTypes.list_data = ["skirmish","random","scenario"];
    132132
     
    137137    addFilter("All Maps", function(settings) { return true; });
    138138
    139139    // Populate map filters dropdown
    140     var mapFilters = getGUIObjectByName("mapFilterSelection");
     140    var mapFilters = Engine.GetGUIObjectByName("mapFilterSelection");
    141141    mapFilters.list = getFilters();
    142142    g_GameAttributes.mapFilter = "Default";
    143143
     
    153153
    154154        initMapNameList();
    155155
    156         var numPlayersSelection = getGUIObjectByName("numPlayersSelection");
     156        var numPlayersSelection = Engine.GetGUIObjectByName("numPlayersSelection");
    157157        var players = [];
    158158        for (var i = 1; i <= MAX_PLAYERS; ++i)
    159159            players.push(i);
     
    161161        numPlayersSelection.list_data = players;
    162162        numPlayersSelection.selected = MAX_PLAYERS - 1;
    163163
    164         var gameSpeed = getGUIObjectByName("gameSpeed");
     164        var gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
    165165        gameSpeed.hidden = false;
    166         getGUIObjectByName("gameSpeedText").hidden = true;
     166        Engine.GetGUIObjectByName("gameSpeedText").hidden = true;
    167167        gameSpeed.list = g_GameSpeeds.names;
    168168        gameSpeed.list_data = g_GameSpeeds.speeds;
    169169        gameSpeed.onSelectionChange = function()
     
    177177        }
    178178        gameSpeed.selected = g_GameSpeeds["default"];
    179179
    180         var populationCaps = getGUIObjectByName("populationCap");
     180        var populationCaps = Engine.GetGUIObjectByName("populationCap");
    181181        populationCaps.list = POPULATION_CAP;
    182182        populationCaps.list_data = POPULATION_CAP_DATA;
    183183        populationCaps.selected = POPULATION_CAP_DEFAULTIDX;
     
    190190                updateGameAttributes();
    191191        }
    192192
    193         var startingResourcesL = getGUIObjectByName("startingResources");
     193        var startingResourcesL = Engine.GetGUIObjectByName("startingResources");
    194194        startingResourcesL.list = STARTING_RESOURCES;
    195195        startingResourcesL.list_data = STARTING_RESOURCES_DATA;
    196196        startingResourcesL.selected = STARTING_RESOURCES_DEFAULTIDX;
     
    203203                updateGameAttributes();
    204204        }
    205205
    206         var victoryConditions = getGUIObjectByName("victoryCondition");
     206        var victoryConditions = Engine.GetGUIObjectByName("victoryCondition");
    207207        victoryConditions.list = VICTORY_TEXT;
    208208        victoryConditions.list_data = VICTORY_DATA;
    209209        victoryConditions.onSelectionChange = function()
     
    216216        };
    217217        victoryConditions.selected = VICTORY_DEFAULTIDX;
    218218
    219         var mapSize = getGUIObjectByName("mapSize");
     219        var mapSize = Engine.GetGUIObjectByName("mapSize");
    220220        mapSize.list = g_MapSizes.names;
    221221        mapSize.list_data = g_MapSizes.tiles;
    222222        mapSize.onSelectionChange = function()
     
    229229        };
    230230        mapSize.selected = 0;
    231231
    232         getGUIObjectByName("revealMap").onPress = function()
     232        Engine.GetGUIObjectByName("revealMap").onPress = function()
    233233        {   // Update attributes so other players can see change
    234234            g_GameAttributes.settings.RevealMap = this.checked;
    235235
     
    237237                updateGameAttributes();
    238238        };
    239239
    240         getGUIObjectByName("lockTeams").onPress = function()
     240        Engine.GetGUIObjectByName("lockTeams").onPress = function()
    241241        {   // Update attributes so other players can see change
    242242            g_GameAttributes.settings.LockTeams = this.checked;
    243243
     
    245245                updateGameAttributes();
    246246        };
    247247
    248         getGUIObjectByName("enableCheats").onPress = function()
     248        Engine.GetGUIObjectByName("enableCheats").onPress = function()
    249249        {   // Update attributes so other players can see change
    250250            g_GameAttributes.settings.CheatsEnabled = this.checked;
    251251
     
    257257    {
    258258        // If we're a network client, disable all the map controls
    259259        // TODO: make them look visually disabled so it's obvious why they don't work
    260         getGUIObjectByName("mapTypeSelection").hidden = true;
    261         getGUIObjectByName("mapTypeText").hidden = false;
    262         getGUIObjectByName("mapFilterSelection").hidden = true;
    263         getGUIObjectByName("mapFilterText").hidden = false;
    264         getGUIObjectByName("mapSelectionText").hidden = false;
    265         getGUIObjectByName("mapSelection").hidden = true;
    266         getGUIObjectByName("victoryConditionText").hidden = false;
    267         getGUIObjectByName("victoryCondition").hidden = true;
    268         getGUIObjectByName("gameSpeedText").hidden = false;
    269         getGUIObjectByName("gameSpeed").hidden = true;
     260        Engine.GetGUIObjectByName("mapTypeSelection").hidden = true;
     261        Engine.GetGUIObjectByName("mapTypeText").hidden = false;
     262        Engine.GetGUIObjectByName("mapFilterSelection").hidden = true;
     263        Engine.GetGUIObjectByName("mapFilterText").hidden = false;
     264        Engine.GetGUIObjectByName("mapSelectionText").hidden = false;
     265        Engine.GetGUIObjectByName("mapSelection").hidden = true;
     266        Engine.GetGUIObjectByName("victoryConditionText").hidden = false;
     267        Engine.GetGUIObjectByName("victoryCondition").hidden = true;
     268        Engine.GetGUIObjectByName("gameSpeedText").hidden = false;
     269        Engine.GetGUIObjectByName("gameSpeed").hidden = true;
    270270
    271271        // Disable player and game options controls
    272272        // TODO: Shouldn't players be able to choose their own assignment?
    273273        for (var i = 0; i < MAX_PLAYERS; ++i)
    274274        {
    275             getGUIObjectByName("playerAssignment["+i+"]").enabled = false;
    276             getGUIObjectByName("playerCiv["+i+"]").hidden = true;
    277             getGUIObjectByName("playerTeam["+i+"]").hidden = true;
     275            Engine.GetGUIObjectByName("playerAssignment["+i+"]").enabled = false;
     276            Engine.GetGUIObjectByName("playerCiv["+i+"]").hidden = true;
     277            Engine.GetGUIObjectByName("playerTeam["+i+"]").hidden = true;
    278278        }
    279279
    280         getGUIObjectByName("numPlayersSelection").hidden = true;
     280        Engine.GetGUIObjectByName("numPlayersSelection").hidden = true;
    281281    }
    282282
    283283    // Set up multiplayer/singleplayer bits:
    284284    if (!g_IsNetworked)
    285285    {
    286         getGUIObjectByName("chatPanel").hidden = true;
    287         getGUIObjectByName("enableCheats").checked = true;
     286        Engine.GetGUIObjectByName("chatPanel").hidden = true;
     287        Engine.GetGUIObjectByName("enableCheats").checked = true;
    288288        g_GameAttributes.settings.CheatsEnabled = true;
    289289    }
    290290    else
    291291    {
    292         getGUIObjectByName("enableCheatsDesc").hidden = false;
    293         getGUIObjectByName("enableCheats").checked = false;
     292        Engine.GetGUIObjectByName("enableCheatsDesc").hidden = false;
     293        Engine.GetGUIObjectByName("enableCheats").checked = false;
    294294        g_GameAttributes.settings.CheatsEnabled = false;
    295295        if (g_IsController)
    296             getGUIObjectByName("enableCheats").hidden = false;
     296            Engine.GetGUIObjectByName("enableCheats").hidden = false;
    297297        else
    298             getGUIObjectByName("enableCheatsText").hidden = false;
     298            Engine.GetGUIObjectByName("enableCheatsText").hidden = false;
    299299    }
    300300
    301301    // Settings for all possible player slots
     
    303303    for (var i = 0; i < MAX_PLAYERS; ++i)
    304304    {
    305305        // Space player boxes
    306         var box = getGUIObjectByName("playerBox["+i+"]");
     306        var box = Engine.GetGUIObjectByName("playerBox["+i+"]");
    307307        var boxSize = box.size;
    308308        var h = boxSize.bottom - boxSize.top;
    309309        boxSize.top = i * boxSpacing;
     
    311311        box.size = boxSize;
    312312
    313313        // Populate team dropdowns
    314         var team = getGUIObjectByName("playerTeam["+i+"]");
     314        var team = Engine.GetGUIObjectByName("playerTeam["+i+"]");
    315315        team.list = ["None", "1", "2", "3", "4"];
    316316        team.list_data = [-1, 0, 1, 2, 3];
    317317        team.selected = 0;
     
    327327        };
    328328
    329329        // Set events
    330         var civ = getGUIObjectByName("playerCiv["+i+"]");
     330        var civ = Engine.GetGUIObjectByName("playerCiv["+i+"]");
    331331        civ.onSelectionChange = function()
    332332        {   // Update civ
    333333            if ((this.selected != -1)&&(g_GameAttributes.mapType !== "scenario"))
     
    341341    if (g_IsNetworked)
    342342    {
    343343        // For multiplayer, focus the chat input box by default
    344         getGUIObjectByName("chatInput").focus();
     344        Engine.GetGUIObjectByName("chatInput").focus();
    345345    }
    346346    else
    347347    {
    348348        // For single-player, focus the map list by default,
    349349        // to allow easy keyboard selection of maps
    350         getGUIObjectByName("mapSelection").focus();
     350        Engine.GetGUIObjectByName("mapSelection").focus();
    351351    }
    352352}
    353353
     
    490490    // Update the dropdowns
    491491    for (var i = 0; i < MAX_PLAYERS; ++i)
    492492    {
    493         var civ = getGUIObjectByName("playerCiv["+i+"]");
     493        var civ = Engine.GetGUIObjectByName("playerCiv["+i+"]");
    494494        civ.list = civListNames;
    495495        civ.list_data = civListCodes;
    496496        civ.selected = 0;
     
    502502{
    503503    // Get a list of map filenames
    504504    // TODO: Should verify these are valid maps before adding to list
    505     var mapSelectionBox = getGUIObjectByName("mapSelection")
     505    var mapSelectionBox = Engine.GetGUIObjectByName("mapSelection")
    506506    var mapFiles;
    507507
    508508    switch (g_GameAttributes.mapType)
     
    611611    }
    612612    else if (g_LoadingState == 1)
    613613    {
    614         getGUIObjectByName("loadingWindow").hidden = true;
    615         getGUIObjectByName("setupWindow").hidden = false;
     614        Engine.GetGUIObjectByName("loadingWindow").hidden = true;
     615        Engine.GetGUIObjectByName("setupWindow").hidden = false;
    616616        initMain();
    617617        g_LoadingState++;
    618618    }
     
    815815        return;
    816816
    817817    if (g_GameAttributes.map == "random")
    818         selectMap(getGUIObjectByName("mapSelection").list_data[Math.floor(Math.random() *
    819             (getGUIObjectByName("mapSelection").list.length - 1)) + 1]);
     818        selectMap(Engine.GetGUIObjectByName("mapSelection").list_data[Math.floor(Math.random() *
     819            (Engine.GetGUIObjectByName("mapSelection").list.length - 1)) + 1]);
    820820
    821821    g_GameAttributes.settings.mapType = g_GameAttributes.mapType;
    822822    var numPlayers = g_GameAttributes.settings.PlayerData.length;
     
    878878        var playerID = -1;
    879879        for (var i = 0; i < numPlayers; ++i)
    880880        {
    881             var assignBox = getGUIObjectByName("playerAssignment["+i+"]");
     881            var assignBox = Engine.GetGUIObjectByName("playerAssignment["+i+"]");
    882882            if (assignBox.list_data[assignBox.selected] == "local")
    883883                playerID = i+1;
    884884        }
     
    909909    // Update some controls for clients
    910910    if (!g_IsController)
    911911    {
    912         getGUIObjectByName("mapFilterText").caption = g_GameAttributes.mapFilter;
    913         var mapTypeSelection = getGUIObjectByName("mapTypeSelection");
     912        Engine.GetGUIObjectByName("mapFilterText").caption = g_GameAttributes.mapFilter;
     913        var mapTypeSelection = Engine.GetGUIObjectByName("mapTypeSelection");
    914914        var idx = mapTypeSelection.list_data.indexOf(g_GameAttributes.mapType);
    915         getGUIObjectByName("mapTypeText").caption = mapTypeSelection.list[idx];
    916         var mapSelectionBox = getGUIObjectByName("mapSelection");
     915        Engine.GetGUIObjectByName("mapTypeText").caption = mapTypeSelection.list[idx];
     916        var mapSelectionBox = Engine.GetGUIObjectByName("mapSelection");
    917917        mapSelectionBox.selected = mapSelectionBox.list_data.indexOf(mapName);
    918         getGUIObjectByName("mapSelectionText").caption = getMapDisplayName(mapName);
    919         var populationCapBox = getGUIObjectByName("populationCap");
     918        Engine.GetGUIObjectByName("mapSelectionText").caption = getMapDisplayName(mapName);
     919        var populationCapBox = Engine.GetGUIObjectByName("populationCap");
    920920        populationCapBox.selected = populationCapBox.list_data.indexOf(mapSettings.PopulationCap);
    921         var startingResourcesBox = getGUIObjectByName("startingResources");
     921        var startingResourcesBox = Engine.GetGUIObjectByName("startingResources");
    922922        startingResourcesBox.selected = startingResourcesBox.list_data.indexOf(mapSettings.StartingResources);
    923923        initMapNameList();
    924924    }
    925925
    926926    // Controls common to all map types
    927     var numPlayersSelection = getGUIObjectByName("numPlayersSelection");
    928     var revealMap = getGUIObjectByName("revealMap");
    929     var victoryCondition = getGUIObjectByName("victoryCondition");
    930     var lockTeams = getGUIObjectByName("lockTeams");
    931     var mapSize = getGUIObjectByName("mapSize");
    932     var enableCheats = getGUIObjectByName("enableCheats");
    933     var populationCap = getGUIObjectByName("populationCap");
    934     var startingResources = getGUIObjectByName("startingResources");
     927    var numPlayersSelection = Engine.GetGUIObjectByName("numPlayersSelection");
     928    var revealMap = Engine.GetGUIObjectByName("revealMap");
     929    var victoryCondition = Engine.GetGUIObjectByName("victoryCondition");
     930    var lockTeams = Engine.GetGUIObjectByName("lockTeams");
     931    var mapSize = Engine.GetGUIObjectByName("mapSize");
     932    var enableCheats = Engine.GetGUIObjectByName("enableCheats");
     933    var populationCap = Engine.GetGUIObjectByName("populationCap");
     934    var startingResources = Engine.GetGUIObjectByName("startingResources");
    935935
    936     var numPlayersText= getGUIObjectByName("numPlayersText");
    937     var mapSizeText = getGUIObjectByName("mapSizeText");
    938     var revealMapText = getGUIObjectByName("revealMapText");
    939     var victoryConditionText = getGUIObjectByName("victoryConditionText");
    940     var lockTeamsText = getGUIObjectByName("lockTeamsText");
    941     var enableCheatsText = getGUIObjectByName("enableCheatsText");
    942     var populationCapText = getGUIObjectByName("populationCapText");
    943     var startingResourcesText = getGUIObjectByName("startingResourcesText");
    944     var gameSpeedText = getGUIObjectByName("gameSpeedText");
     936    var numPlayersText= Engine.GetGUIObjectByName("numPlayersText");
     937    var mapSizeText = Engine.GetGUIObjectByName("mapSizeText");
     938    var revealMapText = Engine.GetGUIObjectByName("revealMapText");
     939    var victoryConditionText = Engine.GetGUIObjectByName("victoryConditionText");
     940    var lockTeamsText = Engine.GetGUIObjectByName("lockTeamsText");
     941    var enableCheatsText = Engine.GetGUIObjectByName("enableCheatsText");
     942    var populationCapText = Engine.GetGUIObjectByName("populationCapText");
     943    var startingResourcesText = Engine.GetGUIObjectByName("startingResourcesText");
     944    var gameSpeedText = Engine.GetGUIObjectByName("gameSpeedText");
    945945
    946946    var sizeIdx = (g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes["default"]);
    947947    var speedIdx = (g_GameAttributes.gameSpeed !== undefined && g_GameSpeeds.speeds.indexOf(g_GameAttributes.gameSpeed) != -1) ? g_GameSpeeds.speeds.indexOf(g_GameAttributes.gameSpeed) : g_GameSpeeds["default"];
     
    955955    startingResourcesText.caption = STARTING_RESOURCES[startingResources.selected];
    956956
    957957    // Update map preview
    958     getGUIObjectByName("mapPreview").sprite = "cropped:(0.78125,0.5859375)session/icons/mappreview/" + getMapPreview(mapName);
     958    Engine.GetGUIObjectByName("mapPreview").sprite = "cropped:(0.78125,0.5859375)session/icons/mappreview/" + getMapPreview(mapName);
    959959
    960960    // Handle map type specific logic
    961961    switch (g_GameAttributes.mapType)
     
    10861086        revealMapText.caption = (mapSettings.RevealMap ? "Yes" : "No");
    10871087        victoryConditionText.caption = VICTORY_TEXT[victoryIdx];
    10881088        lockTeamsText.caption = (mapSettings.LockTeams ? "Yes" : "No");
    1089         getGUIObjectByName("populationCap").selected = POPULATION_CAP_DEFAULTIDX;
     1089        Engine.GetGUIObjectByName("populationCap").selected = POPULATION_CAP_DEFAULTIDX;
    10901090
    10911091        break;
    10921092
     
    10961096    }
    10971097
    10981098    // Display map name
    1099     getGUIObjectByName("mapInfoName").caption = getMapDisplayName(mapName);
     1099    Engine.GetGUIObjectByName("mapInfoName").caption = getMapDisplayName(mapName);
    11001100
    11011101    // Load the description from the map file, if there is one
    11021102    var description = mapSettings.Description || "Sorry, no description available.";
     
    11101110    for (var i = 0; i < MAX_PLAYERS; ++i)
    11111111    {
    11121112        // Show only needed player slots
    1113         getGUIObjectByName("playerBox["+i+"]").hidden = (i >= numPlayers);
     1113        Engine.GetGUIObjectByName("playerBox["+i+"]").hidden = (i >= numPlayers);
    11141114
    11151115        // Show player data or defaults as necessary
    11161116        if (i >= numPlayers)
    11171117            continue;
    11181118
    1119         var pName = getGUIObjectByName("playerName["+i+"]");
    1120         var pCiv = getGUIObjectByName("playerCiv["+i+"]");
    1121         var pCivText = getGUIObjectByName("playerCivText["+i+"]");
    1122         var pTeam = getGUIObjectByName("playerTeam["+i+"]");
    1123         var pTeamText = getGUIObjectByName("playerTeamText["+i+"]");
    1124         var pColor = getGUIObjectByName("playerColour["+i+"]");
     1119        var pName = Engine.GetGUIObjectByName("playerName["+i+"]");
     1120        var pCiv = Engine.GetGUIObjectByName("playerCiv["+i+"]");
     1121        var pCivText = Engine.GetGUIObjectByName("playerCivText["+i+"]");
     1122        var pTeam = Engine.GetGUIObjectByName("playerTeam["+i+"]");
     1123        var pTeamText = Engine.GetGUIObjectByName("playerTeamText["+i+"]");
     1124        var pColor = Engine.GetGUIObjectByName("playerColour["+i+"]");
    11251125
    11261126        // Player data / defaults
    11271127        var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {};
     
    11611161        }
    11621162    }
    11631163
    1164     getGUIObjectByName("mapInfoDescription").caption = playerString + description;
     1164    Engine.GetGUIObjectByName("mapInfoDescription").caption = playerString + description;
    11651165
    11661166    g_IsInGuiUpdate = false;
    11671167
     
    12101210
    12111211    // Only enable start button if we have enough assigned players
    12121212    if (g_IsController)
    1213         getGUIObjectByName("startGame").enabled = (assignedCount > 0);
     1213        Engine.GetGUIObjectByName("startGame").enabled = (assignedCount > 0);
    12141214
    12151215    for each (var ai in g_AIs)
    12161216    {
     
    12461246
    12471247        var selection = assignments[playerID];
    12481248
    1249         var configButton = getGUIObjectByName("playerConfig["+i+"]");
     1249        var configButton = Engine.GetGUIObjectByName("playerConfig["+i+"]");
    12501250        configButton.hidden = true;
    12511251
    12521252        // Look for valid player slots
     
    13011301                Engine.SetNetworkGameAttributes(g_GameAttributes);
    13021302        }
    13031303
    1304         var assignBox = getGUIObjectByName("playerAssignment["+i+"]");
     1304        var assignBox = Engine.GetGUIObjectByName("playerAssignment["+i+"]");
    13051305        assignBox.list = hostNameList;
    13061306        assignBox.list_data = hostGuidList;
    13071307        if (assignBox.selected != selection)
     
    14021402
    14031403function submitChatInput()
    14041404{
    1405     var input = getGUIObjectByName("chatInput");
     1405    var input = Engine.GetGUIObjectByName("chatInput");
    14061406    var text = input.caption;
    14071407    if (text.length)
    14081408    {
     
    14531453
    14541454    g_ChatMessages.push(formatted);
    14551455
    1456     getGUIObjectByName("chatText").caption = g_ChatMessages.join("\n");
     1456    Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n");
    14571457}
    14581458
    14591459function toggleMoreOptions()
    14601460{
    1461     getGUIObjectByName("moreOptions").hidden = !getGUIObjectByName("moreOptions").hidden;
     1461    Engine.GetGUIObjectByName("moreOptions").hidden = !Engine.GetGUIObjectByName("moreOptions").hidden;
    14621462}
    14631463
    14641464////////////////////////////////////////////////////////////////////////////////////////////////
     
    15331533    if (!Engine.HasXmppClient())
    15341534        return;
    15351535
    1536     var selectedMapSize = getGUIObjectByName("mapSize").selected;
    1537     var selectedVictoryCondition = getGUIObjectByName("victoryCondition").selected;
     1536    var selectedMapSize = Engine.GetGUIObjectByName("mapSize").selected;
     1537    var selectedVictoryCondition = Engine.GetGUIObjectByName("victoryCondition").selected;
    15381538
    15391539    // Map sizes only apply to random maps.
    15401540    if (g_GameAttributes.mapType == "random")
    1541         var mapSize = getGUIObjectByName("mapSize").list[selectedMapSize];
     1541        var mapSize = Engine.GetGUIObjectByName("mapSize").list[selectedMapSize];
    15421542    else
    15431543        var mapSize = "Default";
    15441544
    1545     var victoryCondition = getGUIObjectByName("victoryCondition").list[selectedVictoryCondition];
     1545    var victoryCondition = Engine.GetGUIObjectByName("victoryCondition").list[selectedVictoryCondition];
    15461546    var numberOfPlayers = Object.keys(g_PlayerAssignments).length;
    15471547    var players = [ assignment.name for each (assignment in g_PlayerAssignments) ].join(", ");
    15481548
  • binaries/data/mods/public/gui/aiconfig/aiconfig.js

     
    99        {id: "", data: {name: "None", description: "AI will be disabled for this player."}}
    1010    ].concat(settings.ais);
    1111
    12     var aiSelection = getGUIObjectByName("aiSelection");
     12    var aiSelection = Engine.GetGUIObjectByName("aiSelection");
    1313    aiSelection.list = [ ai.data.name for each (ai in g_AIs) ];
    1414
    1515    var selected = 0;
     
    2323    }
    2424    aiSelection.selected = selected;
    2525   
    26     var aiDiff = getGUIObjectByName("aiDifficulty");
     26    var aiDiff = Engine.GetGUIObjectByName("aiDifficulty");
    2727    aiDiff.list = [ "Sandbox", "Easy", "Medium", "Hard", "Very Hard" ];
    2828    aiDiff.selected = settings.difficulty;
    2929}
     
    3434    var name = g_AIs[idx].data.name;
    3535    var description = g_AIs[idx].data.description;
    3636
    37     getGUIObjectByName("aiDescription").caption = description;
     37    Engine.GetGUIObjectByName("aiDescription").caption = description;
    3838}
    3939
    4040function returnAI()
    4141{
    42     var aiSelection = getGUIObjectByName("aiSelection");
     42    var aiSelection = Engine.GetGUIObjectByName("aiSelection");
    4343    var idx = aiSelection.selected;
    4444    var id = g_AIs[idx].id;
    4545    var name = g_AIs[idx].data.name;
    4646
    47     var difficulty = getGUIObjectByName("aiDifficulty").selected;
     47    var difficulty = Engine.GetGUIObjectByName("aiDifficulty").selected;
    4848   
    4949    // Pop the page before calling the callback, so the callback runs
    5050    // in the parent GUI page's context
  • binaries/data/mods/public/gui/pregame/mainmenu.js

     
    1111    // Play main menu music
    1212    global.music.setState(global.music.states.MENU);
    1313
    14     userReportEnabledText = getGUIObjectByName("userReportEnabledText").caption;
     14    userReportEnabledText = Engine.GetGUIObjectByName("userReportEnabledText").caption;
    1515
    1616    // initialize currentSubmenuType with placeholder to avoid null when switching
    1717    currentSubmenuType = "submenuSinglePlayer";
     
    3232{
    3333    if (background == "hellenes1")
    3434    {
    35         var layer1 = getGUIObjectByName("backgroundHele1-1");
    36         var layer2 = getGUIObjectByName("backgroundHele1-2");
    37         var layer3 = getGUIObjectByName("backgroundHele1-3");
     35        var layer1 = Engine.GetGUIObjectByName("backgroundHele1-1");
     36        var layer2 = Engine.GetGUIObjectByName("backgroundHele1-2");
     37        var layer3 = Engine.GetGUIObjectByName("backgroundHele1-3");
    3838       
    3939        layer1.hidden = false;
    4040        layer2.hidden = false;
     
    5959   
    6060    if (background == "persians1")
    6161    {
    62         var layer1 = getGUIObjectByName("backgroundPers1-1");
    63         var layer2 = getGUIObjectByName("backgroundPers1-2");
    64         var layer3 = getGUIObjectByName("backgroundPers1-3");
    65         var layer4 = getGUIObjectByName("backgroundPers1-4");
     62        var layer1 = Engine.GetGUIObjectByName("backgroundPers1-1");
     63        var layer2 = Engine.GetGUIObjectByName("backgroundPers1-2");
     64        var layer3 = Engine.GetGUIObjectByName("backgroundPers1-3");
     65        var layer4 = Engine.GetGUIObjectByName("backgroundPers1-4");
    6666       
    6767        layer1.hidden = false;
    6868        layer2.hidden = false;
     
    9191
    9292function submitUserReportMessage()
    9393{
    94     var input = getGUIObjectByName("userReportMessageInput");
     94    var input = Engine.GetGUIObjectByName("userReportMessageInput");
    9595    var msg = input.caption;
    9696    if (msg.length)
    9797        Engine.SubmitUserReport("message", 1, msg);
     
    148148
    149149    if (Engine.IsUserReportEnabled())
    150150    {
    151         getGUIObjectByName("userReportEnabledText").caption =
     151        Engine.GetGUIObjectByName("userReportEnabledText").caption =
    152152            userReportEnabledText.replace(/\$status/,
    153153                formatUserReportStatus(Engine.GetUserReportStatus()));
    154154    }
     
    175175    }
    176176}
    177177
     178function exit()
     179{
     180    Engine.Exit();
     181}
     182
    178183function EnableUserReport(Enabled)
    179184{
    180     getGUIObjectByName("userReportDisabled").hidden = Enabled;
    181     getGUIObjectByName("userReportEnabled").hidden = !Enabled;
     185    Engine.GetGUIObjectByName("userReportDisabled").hidden = Enabled;
     186    Engine.GetGUIObjectByName("userReportEnabled").hidden = !Enabled;
    182187    Engine.SetUserReportEnabled(Enabled);
    183188}
    184189
     
    198203// Slide menu
    199204function updateMenuPosition(dt)
    200205{
    201     var submenu = getGUIObjectByName("submenu");
     206    var submenu = Engine.GetGUIObjectByName("submenu");
    202207
    203208    if (submenu.hidden == false)
    204209    {
    205210        // Number of pixels per millisecond to move
    206211        const SPEED = 1.2;
    207212
    208         var maxOffset = getGUIObjectByName("mainMenu").size.right - submenu.size.left;
     213        var maxOffset = Engine.GetGUIObjectByName("mainMenu").size.right - submenu.size.left;
    209214        if (maxOffset > 0)
    210215        {
    211216            var offset = Math.min(SPEED * dt, maxOffset);
     
    222227{
    223228    // switch to new submenu type
    224229    currentSubmenuType = newSubmenu;
    225     getGUIObjectByName(currentSubmenuType).hidden = false;
     230    Engine.GetGUIObjectByName(currentSubmenuType).hidden = false;
    226231
    227232    // set position of new submenu
    228     var submenu = getGUIObjectByName("submenu");
     233    var submenu = Engine.GetGUIObjectByName("submenu");
    229234    var top = position - MARGIN;
    230235    var bottom = position + ((buttonHeight + MARGIN) * numButtons);
    231236    submenu.size = submenu.size.left + " " + top + " " + submenu.size.right + " " + bottom;
     
    234239    blendSubmenuIntoMain(top, bottom);
    235240
    236241    // Reveal submenu
    237     getGUIObjectByName("submenu").hidden = false;
     242    Engine.GetGUIObjectByName("submenu").hidden = false;
    238243}
    239244
    240245// Closes the menu and resets position
     
    243248//  playButtonSound();
    244249
    245250    // remove old submenu type
    246     getGUIObjectByName(currentSubmenuType).hidden = true;
     251    Engine.GetGUIObjectByName(currentSubmenuType).hidden = true;
    247252
    248253    // hide submenu and reset position
    249     var submenu = getGUIObjectByName("submenu");
     254    var submenu = Engine.GetGUIObjectByName("submenu");
    250255    submenu.hidden = true;
    251     submenu.size = getGUIObjectByName("mainMenu").size;
     256    submenu.size = Engine.GetGUIObjectByName("mainMenu").size;
    252257
    253258    // reset main menu panel right border
    254     getGUIObjectByName("MainMenuPanelRightBorderTop").size = "100%-2 0 100% 100%";
     259    Engine.GetGUIObjectByName("MainMenuPanelRightBorderTop").size = "100%-2 0 100% 100%";
    255260}
    256261
    257262// Sizes right border on main menu panel to match the submenu
    258263function blendSubmenuIntoMain(topPosition, bottomPosition)
    259264{
    260     var topSprite = getGUIObjectByName("MainMenuPanelRightBorderTop");
     265    var topSprite = Engine.GetGUIObjectByName("MainMenuPanelRightBorderTop");
    261266    topSprite.size = "100%-2 0 100% " + (topPosition + MARGIN);
    262267
    263     var bottomSprite = getGUIObjectByName("MainMenuPanelRightBorderBottom");
     268    var bottomSprite = Engine.GetGUIObjectByName("MainMenuPanelRightBorderBottom");
    264269    bottomSprite.size = "100%-2 " + (bottomPosition) + " 100% 100%";
    265270}
    266271
     
    291296//
    292297//      if (tmpName != tabName)
    293298//      {
    294 //          getGUIObjectByName (tmpName + "Window").hidden = true;
    295 //          getGUIObjectByName (tmpName + "Button").enabled = true;
     299//          Engine.GetGUIObjectByName (tmpName + "Window").hidden = true;
     300//          Engine.GetGUIObjectByName (tmpName + "Button").enabled = true;
    296301//      }
    297302//  }
    298303//
    299304//  // Make given tab visible.
    300 //  getGUIObjectByName (tabName + "Window").hidden = false;
    301 //  getGUIObjectByName (tabName + "Button").enabled = false;
     305//  Engine.GetGUIObjectByName (tabName + "Window").hidden = false;
     306//  Engine.GetGUIObjectByName (tabName + "Button").enabled = false;
    302307//}
    303308//
    304309//// Move the credits up the screen.
  • binaries/data/mods/public/gui/pregame/mainmenu.xml

     
    446446                        closeMenu();
    447447                        <![CDATA[
    448448                            var btCaptions = ["Yes", "No"];
    449                             var btCode = [exit, null];
     449                            var btCode = [ function() { Engine.Exit(); }, null];
    450450                            messageBox(400, 200, "Are you sure you want to quit 0 A.D.?", "Confirmation", 0, btCaptions, btCode);
    451451                        ]]>
    452452                    </action>
     
    563563                size="50%-128 100%-36 50%+128 100%"
    564564            >
    565565                <action on="Load"><![CDATA[
    566                     this.caption = "Build: " + buildTime(0) + " - " + buildTime(2);
     566                    this.caption = "Build: " + Engine.BuildTime(0) + " - " + Engine.BuildTime(2);
    567567                ]]></action>
    568568            </object>
    569569        </object>
  • binaries/data/mods/public/gui/session/unit_commands.js

     
    4141// Lay out a row of centered buttons (does not work inside a loop like the other function)
    4242function layoutButtonRowCentered(rowNumber, guiName, startIndex, endIndex, width)
    4343{
    44     var buttonSideLength = getGUIObjectByName("unit"+guiName+"Button[0]").size.bottom;
     44    var buttonSideLength = Engine.GetGUIObjectByName("unit"+guiName+"Button[0]").size.bottom;
    4545    var buttonSpacer = buttonSideLength+1;
    4646    var colNumber = 0;
    4747
     
    5151
    5252    for (var i = startIndex; i < endIndex; i++)
    5353    {
    54         var button = getGUIObjectByName("unit"+guiName+"Button["+i+"]");
    55         var icon = getGUIObjectByName("unit"+guiName+"Icon["+i+"]");
     54        var button = Engine.GetGUIObjectByName("unit"+guiName+"Button["+i+"]");
     55        var icon = Engine.GetGUIObjectByName("unit"+guiName+"Icon["+i+"]");
    5656
    5757        if (button)
    5858        {
     
    116116
    117117    for (var i = startIndex; i < endIndex; i++)
    118118    {
    119         var button = getGUIObjectByName("unit"+guiName+objectName+"["+i+"]");
     119        var button = Engine.GetGUIObjectByName("unit"+guiName+objectName+"["+i+"]");
    120120
    121121        if (button)
    122122        {
     
    309309        // If a tech has been researched it leaves an empty slot
    310310        if (guiName == RESEARCH && !item)
    311311        {
    312             getGUIObjectByName("unit"+guiName+"Button["+i+"]").hidden = true;
     312            Engine.GetGUIObjectByName("unit"+guiName+"Button["+i+"]").hidden = true;
    313313            // We also remove the paired tech and the pair symbol
    314             getGUIObjectByName("unit"+guiName+"Button["+(i+rowLength)+"]").hidden = true;
    315             getGUIObjectByName("unit"+guiName+"Pair["+i+"]").hidden = true;
     314            Engine.GetGUIObjectByName("unit"+guiName+"Button["+(i+rowLength)+"]").hidden = true;
     315            Engine.GetGUIObjectByName("unit"+guiName+"Pair["+i+"]").hidden = true;
    316316            continue;
    317317        }
    318318
     
    380380                var name = getEntityNames(template);
    381381                var tooltip = name;
    382382                var count = g_Selection.groups.getCount(item);
    383                 getGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (count > 1 ? count : "");
     383                Engine.GetGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (count > 1 ? count : "");
    384384                break;
    385385
    386386            case QUEUE:
     
    389389                    tooltip += "\n[color=\"red\"]Insufficient population capacity:\n[/color]"+getCostComponentDisplayName("population")+" "+item.neededSlots;
    390390
    391391                var progress = Math.round(item.progress*100) + "%";
    392                 getGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (item.count > 1 ? item.count : "");
     392                Engine.GetGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (item.count > 1 ? item.count : "");
    393393
    394394                if (i == 0)
    395395                {
    396                     getGUIObjectByName("queueProgress").caption = (item.progress ? progress : "");
    397                     var size = getGUIObjectByName("unit"+guiName+"ProgressSlider["+i+"]").size;
     396                    Engine.GetGUIObjectByName("queueProgress").caption = (item.progress ? progress : "");
     397                    var size = Engine.GetGUIObjectByName("unit"+guiName+"ProgressSlider["+i+"]").size;
    398398
    399399                    // Buttons are assumed to be square, so left/right offsets can be used for top/bottom.
    400400                    size.top = size.left + Math.round(item.progress * (size.right - size.left));
    401                     getGUIObjectByName("unit"+guiName+"ProgressSlider["+i+"]").size = size;
     401                    Engine.GetGUIObjectByName("unit"+guiName+"ProgressSlider["+i+"]").size = size;
    402402                }
    403403                break;
    404404
     
    406406                var name = getEntityNames(template);
    407407                var tooltip = "Unload " + name + "\nSingle-click to unload 1. Shift-click to unload all of this type.";
    408408                var count = garrisonGroups.getCount(item);
    409                 getGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (count > 1 ? count : "");
     409                Engine.GetGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (count > 1 ? count : "");
    410410                break;
    411411
    412412            case GATE:
     
    423423
    424424                    tooltip += "\n" + getEntityCostTooltip(template, wallCount);
    425425
    426                     var affordableMask = getGUIObjectByName("unitGateUnaffordable["+i+"]");
     426                    var affordableMask = Engine.GetGUIObjectByName("unitGateUnaffordable["+i+"]");
    427427                    affordableMask.hidden = true;
    428428
    429429                    var neededResources = Engine.GuiInterfaceCall("GetNeededResources", multiplyEntityCosts(template, wallCount));
     
    503503                if (item.name == "unload-all")
    504504                {
    505505                    var count = garrisonGroups.getTotalCount();
    506                     getGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (count > 0 ? count : "");
     506                    Engine.GetGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (count > 0 ? count : "");
    507507                }
    508508                else
    509509                {
    510                     getGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = "";
     510                    Engine.GetGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = "";
    511511                }
    512512
    513513                tooltip = (item.tooltip ? item.tooltip : toTitleCase(item.name));
     
    518518        }
    519519
    520520        // Button
    521         var button = getGUIObjectByName("unit"+guiName+"Button["+i+"]");
    522         var button1 = getGUIObjectByName("unit"+guiName+"Button["+(i+rowLength)+"]");
    523         var affordableMask = getGUIObjectByName("unit"+guiName+"Unaffordable["+i+"]");
    524         var affordableMask1 = getGUIObjectByName("unit"+guiName+"Unaffordable["+(i+rowLength)+"]");
    525         var icon = getGUIObjectByName("unit"+guiName+"Icon["+i+"]");
    526         var guiSelection = getGUIObjectByName("unit"+guiName+"Selection["+i+"]");
    527         var pair = getGUIObjectByName("unit"+guiName+"Pair["+i+"]");
     521        var button = Engine.GetGUIObjectByName("unit"+guiName+"Button["+i+"]");
     522        var button1 = Engine.GetGUIObjectByName("unit"+guiName+"Button["+(i+rowLength)+"]");
     523        var affordableMask = Engine.GetGUIObjectByName("unit"+guiName+"Unaffordable["+i+"]");
     524        var affordableMask1 = Engine.GetGUIObjectByName("unit"+guiName+"Unaffordable["+(i+rowLength)+"]");
     525        var icon = Engine.GetGUIObjectByName("unit"+guiName+"Icon["+i+"]");
     526        var guiSelection = Engine.GetGUIObjectByName("unit"+guiName+"Selection["+i+"]");
     527        var pair = Engine.GetGUIObjectByName("unit"+guiName+"Pair["+i+"]");
    528528        button.hidden = false;
    529529        button.tooltip = tooltip;
    530530
     
    544544            {
    545545                button.onpress = (function(e){ return function() { callback(e) } })(item.bottom);
    546546
    547                 var icon1 = getGUIObjectByName("unit"+guiName+"Icon["+(i+rowLength)+"]");
     547                var icon1 = Engine.GetGUIObjectByName("unit"+guiName+"Icon["+(i+rowLength)+"]");
    548548                button1.hidden = false;
    549549                button1.tooltip = tooltip1;
    550550                button1.onpress = (function(e){ return function() { callback(e) } })(item.top);
    551551
    552552                // when we hover over a pair, the other one gets a red cross over it to show it won't be available any more.
    553                 var unchosenIcon = getGUIObjectByName("unit"+guiName+"UnchosenIcon["+i+"]");
    554                 var unchosenIcon1 = getGUIObjectByName("unit"+guiName+"UnchosenIcon["+(i+rowLength)+"]");
     553                var unchosenIcon = Engine.GetGUIObjectByName("unit"+guiName+"UnchosenIcon["+i+"]");
     554                var unchosenIcon1 = Engine.GetGUIObjectByName("unit"+guiName+"UnchosenIcon["+(i+rowLength)+"]");
    555555
    556556                button1.onmouseenter = (function(e){ return function() { setOverlay(e, true) } })(unchosenIcon);
    557557                button1.onmouseleave = (function(e){ return function() { setOverlay(e, false) } })(unchosenIcon);
     
    564564            else
    565565            {
    566566                // Hide the overlay.
    567                 var unchosenIcon = getGUIObjectByName("unit"+guiName+"UnchosenIcon["+i+"]");
     567                var unchosenIcon = Engine.GetGUIObjectByName("unit"+guiName+"UnchosenIcon["+i+"]");
    568568                unchosenIcon.hidden = true;
    569569            }
    570570        }
     
    789789                        trainNum = buildingsCountToTrainFullBatch * fullBatchSize + remainderBatch;
    790790                        button_disableable = !Engine.HotkeyIsPressed("selection.remove");
    791791                    }
    792                     getGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (batchTrainingCount > 0) ? batchTrainingCount : "";
     792                    Engine.GetGUIObjectByName("unit"+guiName+"Count["+i+"]").caption = (batchTrainingCount > 0) ? batchTrainingCount : "";
    793793                }
    794794
    795795                // Walls have no cost defined.
     
    831831
    832832    var numRows = Math.ceil(numButtons / rowLength);
    833833
    834     var buttonSideLength = getGUIObjectByName("unit"+guiName+"Button[0]").size.bottom;
     834    var buttonSideLength = Engine.GetGUIObjectByName("unit"+guiName+"Button[0]").size.bottom;
    835835
    836836    // We sort pairs upside down, so get the size from the topmost button.
    837837    if (guiName == RESEARCH)
    838         buttonSideLength = getGUIObjectByName("unit"+guiName+"Button["+(rowLength*numRows)+"]").size.bottom;
     838        buttonSideLength = Engine.GetGUIObjectByName("unit"+guiName+"Button["+(rowLength*numRows)+"]").size.bottom;
    839839
    840840    var buttonSpacer = buttonSideLength+1;
    841841
     
    863863    // Layout pair icons
    864864    if (guiName == RESEARCH)
    865865    {
    866         var pairSize = getGUIObjectByName("unit"+guiName+"Pair[0]").size;
     866        var pairSize = Engine.GetGUIObjectByName("unit"+guiName+"Pair[0]").size;
    867867        var pairSideWidth = pairSize.right;
    868868        var pairSideHeight = pairSize.bottom;
    869869        var pairSpacerHeight = pairSideHeight + 1;
     
    875875    // Resize Queue panel if needed
    876876    if (guiName == QUEUE) // or garrison
    877877    {
    878         var panel = getGUIObjectByName("unitQueuePanel");
     878        var panel = Engine.GetGUIObjectByName("unitQueuePanel");
    879879        var size = panel.size;
    880880        size.top = (UNIT_PANEL_BASE - ((numRows-1)*UNIT_PANEL_HEIGHT));
    881881        panel.size = size;
     
    883883
    884884    // Hide any buttons we're no longer using
    885885    for (var i = numButtons; i < g_unitPanelButtons[guiName]; ++i)
    886         getGUIObjectByName("unit"+guiName+"Button["+i+"]").hidden = true;
     886        Engine.GetGUIObjectByName("unit"+guiName+"Button["+i+"]").hidden = true;
    887887
    888888    // Hide unused pair buttons and symbols
    889889    if (guiName == RESEARCH)
    890890    {
    891891        for (var i = numButtons; i < g_unitPanelButtons[guiName]; ++i)
    892892        {
    893             getGUIObjectByName("unit"+guiName+"Button["+(i+rowLength)+"]").hidden = true;
    894             getGUIObjectByName("unit"+guiName+"Pair["+i+"]").hidden = true;
     893            Engine.GetGUIObjectByName("unit"+guiName+"Button["+(i+rowLength)+"]").hidden = true;
     894            Engine.GetGUIObjectByName("unit"+guiName+"Pair["+i+"]").hidden = true;
    895895        }
    896896    }
    897897
     
    906906    for (var i = 0; i < TRADING_RESOURCES.length; i++)
    907907    {
    908908        var resource = TRADING_RESOURCES[i];
    909         var button = getGUIObjectByName("unitTradingButton["+i+"]");
     909        var button = Engine.GetGUIObjectByName("unitTradingButton["+i+"]");
    910910        button.size = (i * 46) + " 0 " + ((i + 1) * 46) + " 46";
    911911        var selectTradingPreferredGoodsData = { "entities": selection, "preferredGoods": resource };
    912912        button.onpress = (function(e){ return function() { selectTradingPreferredGoods(e); } })(selectTradingPreferredGoodsData);
    913913        button.enabled = true;
    914914        button.tooltip = "Set " + resource + " as trading goods";
    915         var icon = getGUIObjectByName("unitTradingIcon["+i+"]");
     915        var icon = Engine.GetGUIObjectByName("unitTradingIcon["+i+"]");
    916916        var preferredGoods = unitEntState.trader.preferredGoods;
    917         var selected = getGUIObjectByName("unitTradingSelection["+i+"]");
     917        var selected = Engine.GetGUIObjectByName("unitTradingSelection["+i+"]");
    918918        selected.hidden = !(resource == preferredGoods);
    919919        var grayscale = (resource != preferredGoods) ? "grayscale:" : "";
    920920        icon.sprite = "stretched:"+grayscale+"session/icons/resources/" + resource + ".png";
     
    940940            if (j == 0)
    941941            {
    942942                // Display the selection overlay
    943                 var selection = getGUIObjectByName("unitBarter" + action + "Selection["+i+"]");
     943                var selection = Engine.GetGUIObjectByName("unitBarter" + action + "Selection["+i+"]");
    944944                selection.hidden = !(i == g_barterSell);
    945945            }
    946946
    947947            // We gray out the not selected icons in 'sell' row
    948948            var grayscale = (j == 0 && i != g_barterSell) ? "grayscale:" : "";
    949             var icon = getGUIObjectByName("unitBarter" + action + "Icon["+i+"]");
     949            var icon = Engine.GetGUIObjectByName("unitBarter" + action + "Icon["+i+"]");
    950950
    951             var button = getGUIObjectByName("unitBarter" + action + "Button["+i+"]");
     951            var button = Engine.GetGUIObjectByName("unitBarter" + action + "Button["+i+"]");
    952952            button.size = (i * 46) + " 0 " + ((i + 1) * 46) + " 46";
    953953            var amountToBuy;
    954954            // We don't display a button in 'buy' row if the same resource is selected in 'sell' row
     
    980980                    var hidden = neededResources ? false : true;
    981981                    for (var ii = 0; ii < BARTER_RESOURCES.length; ii++)
    982982                    {
    983                         var affordableMask = getGUIObjectByName("unitBarterBuyUnaffordable["+ii+"]");
     983                        var affordableMask = Engine.GetGUIObjectByName("unitBarterBuyUnaffordable["+ii+"]");
    984984                        affordableMask.hidden = hidden;
    985985                    }
    986986                }
     
    993993                button.onpress = (function(exchangeResourcesParameters){ return function() { exchangeResources(exchangeResourcesParameters); } })(exchangeResourcesParameters);
    994994                amount = amountToBuy;
    995995            }
    996             getGUIObjectByName("unitBarter" + action + "Amount["+i+"]").caption = amount;
     996            Engine.GetGUIObjectByName("unitBarter" + action + "Amount["+i+"]").caption = amount;
    997997        }
    998998    }
    999999}
     
    10621062                function (item) { performStance(entState.id, item); } );
    10631063        }
    10641064
    1065         getGUIObjectByName("unitBarterPanel").hidden = !entState.barterMarket;
     1065        Engine.GetGUIObjectByName("unitBarterPanel").hidden = !entState.barterMarket;
    10661066        if (entState.barterMarket)
    10671067        {
    10681068            usedPanels["Barter"] = 1;
     
    12401240    var offset = 0;
    12411241    for each (var panelName in g_unitPanels)
    12421242    {
    1243         var panel = getGUIObjectByName("unit" + panelName + "Panel");
     1243        var panel = Engine.GetGUIObjectByName("unit" + panelName + "Panel");
    12441244        if (usedPanels[panelName])
    12451245            panel.hidden = false;
    12461246        else
     
    12521252function hideUnitCommands()
    12531253{
    12541254    for each (var panelName in g_unitPanels)
    1255         getGUIObjectByName("unit" + panelName + "Panel").hidden = true;
     1255        Engine.GetGUIObjectByName("unit" + panelName + "Panel").hidden = true;
    12561256}
    12571257
    12581258// Get all of the available entities which can be trained by the selected entities
  • binaries/data/mods/public/gui/session/menu.js

     
    4040// Ignore size defined in XML and set the actual menu size here
    4141function initMenuPosition()
    4242{
    43     menu = getGUIObjectByName("menu");
     43    menu = Engine.GetGUIObjectByName("menu");
    4444    menu.size = INITIAL_MENU_POSITION;
    4545}
    4646
     
    177177
    178178function openSettings(pause)
    179179{
    180     getGUIObjectByName("settingsDialogPanel").hidden = false;
     180    Engine.GetGUIObjectByName("settingsDialogPanel").hidden = false;
    181181    if (pause)
    182182        pauseGame();
    183183}
    184184
    185185function closeSettings(resume)
    186186{
    187     getGUIObjectByName("settingsDialogPanel").hidden = true;
     187    Engine.GetGUIObjectByName("settingsDialogPanel").hidden = true;
    188188    if (resume)
    189189        resumeGame();
    190190}
    191191
    192192function openChat()
    193193{
    194     getGUIObjectByName("chatInput").focus(); // Grant focus to the input area
    195     getGUIObjectByName("chatDialogPanel").hidden = false;
     194    Engine.GetGUIObjectByName("chatInput").focus(); // Grant focus to the input area
     195    Engine.GetGUIObjectByName("chatDialogPanel").hidden = false;
    196196
    197197}
    198198
    199199function closeChat()
    200200{
    201     getGUIObjectByName("chatInput").caption = ""; // Clear chat input
    202     getGUIObjectByName("chatInput").blur(); // Remove focus
    203     getGUIObjectByName("chatDialogPanel").hidden = true;
     201    Engine.GetGUIObjectByName("chatInput").caption = ""; // Clear chat input
     202    Engine.GetGUIObjectByName("chatInput").blur(); // Remove focus
     203    Engine.GetGUIObjectByName("chatDialogPanel").hidden = true;
    204204}
    205205
    206206function toggleChatWindow(teamChat)
    207207{
    208208    closeSettings();
    209209
    210     var chatWindow = getGUIObjectByName("chatDialogPanel");
    211     var chatInput = getGUIObjectByName("chatInput");
     210    var chatWindow = Engine.GetGUIObjectByName("chatDialogPanel");
     211    var chatInput = Engine.GetGUIObjectByName("chatInput");
    212212
    213213    if (chatWindow.hidden)
    214214        chatInput.focus(); // Grant focus to the input area
     
    222222        chatInput.caption = ""; // Clear chat input
    223223    }
    224224
    225     getGUIObjectByName("toggleTeamChat").checked = teamChat;
     225    Engine.GetGUIObjectByName("toggleTeamChat").checked = teamChat;
    226226    chatWindow.hidden = !chatWindow.hidden;
    227227}
    228228
     
    244244    var players = getPlayerData(g_PlayerAssignments);
    245245
    246246    // Get offset for one line
    247     var onesize = getGUIObjectByName("diplomacyPlayer[0]").size;
     247    var onesize = Engine.GetGUIObjectByName("diplomacyPlayer[0]").size;
    248248    var rowsize = onesize.bottom - onesize.top;
    249249
    250250    // We don't include gaia
    251251    for (var i = 1; i < players.length; i++)
    252252    {
    253253        // Apply offset
    254         var row = getGUIObjectByName("diplomacyPlayer["+(i-1)+"]");
     254        var row = Engine.GetGUIObjectByName("diplomacyPlayer["+(i-1)+"]");
    255255        var size = row.size;
    256256        size.top = rowsize*(i-1);
    257257        size.bottom = rowsize*i;
     
    261261        var playerColor = players[i].color.r+" "+players[i].color.g+" "+players[i].color.b;
    262262        row.sprite = "colour: "+playerColor + " 32";
    263263
    264         getGUIObjectByName("diplomacyPlayerName["+(i-1)+"]").caption = "[color=\"" + playerColor + "\"]" + players[i].name + "[/color]";
    265         getGUIObjectByName("diplomacyPlayerCiv["+(i-1)+"]").caption = g_CivData[players[i].civ].Name;
     264        Engine.GetGUIObjectByName("diplomacyPlayerName["+(i-1)+"]").caption = "[color=\"" + playerColor + "\"]" + players[i].name + "[/color]";
     265        Engine.GetGUIObjectByName("diplomacyPlayerCiv["+(i-1)+"]").caption = g_CivData[players[i].civ].Name;
    266266
    267         getGUIObjectByName("diplomacyPlayerTeam["+(i-1)+"]").caption = (players[i].team < 0) ? "None" : players[i].team+1;
     267        Engine.GetGUIObjectByName("diplomacyPlayerTeam["+(i-1)+"]").caption = (players[i].team < 0) ? "None" : players[i].team+1;
    268268
    269269        if (i != we)
    270             getGUIObjectByName("diplomacyPlayerTheirs["+(i-1)+"]").caption = (players[i].isAlly[we] ? "Ally" : (players[i].isNeutral[we] ? "Neutral" : "Enemy"));
     270            Engine.GetGUIObjectByName("diplomacyPlayerTheirs["+(i-1)+"]").caption = (players[i].isAlly[we] ? "Ally" : (players[i].isNeutral[we] ? "Neutral" : "Enemy"));
    271271
    272272        // Don't display the options for ourself, or if we or the other player aren't active anymore
    273273        if (i == we || players[we].state != "active" || players[i].state != "active")
    274274        {
    275275            // Hide the unused/unselectable options
    276276            for each (var a in ["TributeFood", "TributeWood", "TributeStone", "TributeMetal", "Ally", "Neutral", "Enemy"])
    277                 getGUIObjectByName("diplomacyPlayer"+a+"["+(i-1)+"]").hidden = true;
     277                Engine.GetGUIObjectByName("diplomacyPlayer"+a+"["+(i-1)+"]").hidden = true;
    278278            continue;
    279279        }
    280280
    281281        // Tribute
    282282        for each (var resource in ["food", "wood", "stone", "metal"])
    283283        {
    284             var button = getGUIObjectByName("diplomacyPlayerTribute"+toTitleCase(resource)+"["+(i-1)+"]");
     284            var button = Engine.GetGUIObjectByName("diplomacyPlayerTribute"+toTitleCase(resource)+"["+(i-1)+"]");
    285285            button.onpress = (function(player, resource, button){
    286286                // Implement something like how unit batch training works. Shift+click to send 500, shift+click+click to send 1000, etc.
    287287                // Also see input.js (searching for "INPUT_MASSTRIBUTING" should get all the relevant parts).
     
    323323        // Set up the buttons
    324324        for each (var setting in ["ally", "neutral", "enemy"])
    325325        {
    326             var button = getGUIObjectByName("diplomacyPlayer"+toTitleCase(setting)+"["+(i-1)+"]");
     326            var button = Engine.GetGUIObjectByName("diplomacyPlayer"+toTitleCase(setting)+"["+(i-1)+"]");
    327327
    328328            if (setting == "ally")
    329329            {
     
    352352        }
    353353    }
    354354
    355     getGUIObjectByName("diplomacyDialogPanel").hidden = false;
     355    Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = false;
    356356}
    357357
    358358function closeDiplomacy()
    359359{
    360360    isDiplomacyOpen = false;
    361     getGUIObjectByName("diplomacyDialogPanel").hidden = true;
     361    Engine.GetGUIObjectByName("diplomacyDialogPanel").hidden = true;
    362362}
    363363
    364364function toggleDiplomacy()
     
    371371
    372372function toggleGameSpeed()
    373373{
    374     var gameSpeed = getGUIObjectByName("gameSpeed");
     374    var gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
    375375    gameSpeed.hidden = !gameSpeed.hidden;
    376376}
    377377
    378378function pauseGame()
    379379{
    380     getGUIObjectByName("pauseButtonText").caption = RESUME;
    381     getGUIObjectByName("pauseOverlay").hidden = false;
    382     setPaused(true);
     380    Engine.GetGUIObjectByName("pauseButtonText").caption = RESUME;
     381    Engine.GetGUIObjectByName("pauseOverlay").hidden = false;
     382    Engine.SetPaused(true);
    383383}
    384384
    385385function resumeGame()
    386386{
    387     getGUIObjectByName("pauseButtonText").caption = PAUSE;
    388     getGUIObjectByName("pauseOverlay").hidden = true;
    389     setPaused(false);
     387    Engine.GetGUIObjectByName("pauseButtonText").caption = PAUSE;
     388    Engine.GetGUIObjectByName("pauseOverlay").hidden = true;
     389    Engine.SetPaused(false);
    390390}
    391391
    392392function togglePause()
     
    394394    closeMenu();
    395395    closeOpenDialogs();
    396396
    397     var pauseOverlay = getGUIObjectByName("pauseOverlay");
     397    var pauseOverlay = Engine.GetGUIObjectByName("pauseOverlay");
    398398
    399399    if (pauseOverlay.hidden)
    400400    {
    401         getGUIObjectByName("pauseButtonText").caption = RESUME;
    402         setPaused(true);
     401        Engine.GetGUIObjectByName("pauseButtonText").caption = RESUME;
     402        Engine.SetPaused(true);
    403403    }
    404404    else
    405405    {
    406         setPaused(false);
    407         getGUIObjectByName("pauseButtonText").caption = PAUSE;
     406        Engine.SetPaused(false);
     407        Engine.GetGUIObjectByName("pauseButtonText").caption = PAUSE;
    408408    }
    409409
    410410    pauseOverlay.hidden = !pauseOverlay.hidden;
     
    423423    if (Engine.HasXmppClient() && Engine.IsRankedGame())
    424424        return;
    425425
    426     var devCommands = getGUIObjectByName("devCommands");
     426    var devCommands = Engine.GetGUIObjectByName("devCommands");
    427427    var text = devCommands.hidden ? "opened." : "closed.";
    428428    submitChatDirectly("The Developer Overlay was " + text);
    429429    // Update the options dialog
    430     getGUIObjectByName("developerOverlayCheckbox").checked = devCommands.hidden;
     430    Engine.GetGUIObjectByName("developerOverlayCheckbox").checked = devCommands.hidden;
    431431    devCommands.hidden = !devCommands.hidden;
    432432}
    433433
  • binaries/data/mods/public/gui/session/session.xml

     
    6666        <action on="Press">
    6767        var newSetting = !Engine.Renderer_GetSilhouettesEnabled();
    6868        Engine.Renderer_SetSilhouettesEnabled(newSetting);
    69         getGUIObjectByName("silhouettesCheckbox").checked = newSetting;
     69        Engine.GetGUIObjectByName("silhouettesCheckbox").checked = newSetting;
    7070        </action>
    7171    </object>
    7272
     
    259259
    260260        <object size="0 16 100%-18 32" type="text" style="devCommandsText">Change perspective</object>
    261261        <object size="100%-16 16 100% 32" type="checkbox" style="StoneCrossBox">
    262         <action on="Press">getGUIObjectByName("viewPlayer").hidden = !this.checked;</action>
     262        <action on="Press">Engine.GetGUIObjectByName("viewPlayer").hidden = !this.checked;</action>
    263263        </object>
    264264
    265265        <object size="0 32 100%-18 48" type="text" style="devCommandsText">Display selection state</object>
     
    624624        ALPHA XIV : Naukratis<!-- IMPORTANT: remember to update pregame/mainmenu.xml in sync with this -->
    625625
    626626        <!-- Displays build date and revision number-->
    627         <object size="50%-128 0 50%+128 100%-2" name="buildTimeLabel" type="text" style="BuildNameText" ghost="true">
    628             <action on="Load">this.caption = buildTime(0) + " (" + buildTime(2) + ")"</action>
     627        <object size="50%-128 0 50%+128 100%-2" name="Engine.BuildTimeLabel" type="text" style="BuildNameText" ghost="true">
     628            <action on="Load">this.caption = Engine.BuildTime(0) + " (" + Engine.BuildTime(2) + ")"</action>
    629629        </object>
    630630        </object>
    631631
  • binaries/data/mods/public/gui/session/messages.js

     
    136136    var messages = [];
    137137    for each (var n in notifications)
    138138        messages.push(n.message);
    139     getGUIObjectByName("notificationText").caption = messages.join("\n");
     139    Engine.GetGUIObjectByName("notificationText").caption = messages.join("\n");
    140140}
    141141
    142142// Returns [username, playercolor] for the given player
     
    162162        if (g_Disconnected)
    163163            return;
    164164
    165         var obj = getGUIObjectByName("netStatus");
     165        var obj = Engine.GetGUIObjectByName("netStatus");
    166166        switch (message.status)
    167167        {
    168168        case "waiting_for_players":
     
    230230            var players = [ assignment.name for each (assignment in g_PlayerAssignments) ]
    231231            Engine.SendChangeStateGame(Object.keys(g_PlayerAssignments).length, players.join(", "));
    232232        }
    233 
     233
    234234        break;
    235235
    236236    case "chat":
     
    260260
    261261function submitChatInput()
    262262{
    263     var input = getGUIObjectByName("chatInput");
     263    var input = Engine.GetGUIObjectByName("chatInput");
    264264    var text = input.caption;
    265265    var isCheat = false;
    266266    if (text.length)
     
    300300
    301301        if (!isCheat)
    302302        {
    303             if (getGUIObjectByName("toggleTeamChat").checked)
     303            if (Engine.GetGUIObjectByName("toggleTeamChat").checked)
    304304                text = "/team " + text;
    305305
    306306            if (g_IsNetworked)
     
    438438    if (chatMessages.length > MAX_NUM_CHAT_LINES)
    439439        removeOldChatMessages();
    440440    else
    441         getGUIObjectByName("chatText").caption = chatMessages.join("\n");
     441        Engine.GetGUIObjectByName("chatText").caption = chatMessages.join("\n");
    442442}
    443443
    444444function removeOldChatMessages()
     
    446446    clearTimeout(chatTimers[0]); // The timer only needs to be cleared when new messages bump old messages off
    447447    chatTimers.shift();
    448448    chatMessages.shift();
    449     getGUIObjectByName("chatText").caption = chatMessages.join("\n");
     449    Engine.GetGUIObjectByName("chatText").caption = chatMessages.join("\n");
    450450}
    451451
    452452// Parses chat messages for commands.
  • binaries/data/mods/public/gui/session/session.js

     
    113113        if (initData.savedGUIData)
    114114            restoreSavedGameData(initData.savedGUIData);
    115115
    116         getGUIObjectByName("gameSpeedButton").hidden = g_IsNetworked;
     116        Engine.GetGUIObjectByName("gameSpeedButton").hidden = g_IsNetworked;
    117117    }
    118118    else // Needed for autostart loading option
    119119    {
     
    126126
    127127    g_GameSpeeds = initGameSpeeds();
    128128    g_CurrentSpeed = Engine.GetSimRate();
    129     var gameSpeed = getGUIObjectByName("gameSpeed");
     129    var gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
    130130    gameSpeed.list = g_GameSpeeds.names;
    131131    gameSpeed.list_data = g_GameSpeeds.speeds;
    132132    var idx = g_GameSpeeds.speeds.indexOf(g_CurrentSpeed);
    133133    gameSpeed.selected = idx != -1 ? idx : g_GameSpeeds["default"];
    134134    gameSpeed.onSelectionChange = function() { changeGameSpeed(+this.list_data[this.selected]); }
    135135
    136     getGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[Engine.GetPlayerID()].civ].Emblem;
    137     getGUIObjectByName("civIcon").tooltip = g_CivData[g_Players[Engine.GetPlayerID()].civ].Name;
     136    Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[Engine.GetPlayerID()].civ].Emblem;
     137    Engine.GetGUIObjectByName("civIcon").tooltip = g_CivData[g_Players[Engine.GetPlayerID()].civ].Name;
    138138    initMenuPosition(); // set initial position
    139139
    140140    // Populate player selection dropdown
     
    146146        playerIDs.push(player);
    147147    }
    148148
    149     var viewPlayerDropdown = getGUIObjectByName("viewPlayer");
     149    var viewPlayerDropdown = Engine.GetGUIObjectByName("viewPlayer");
    150150    viewPlayerDropdown.list = playerNames;
    151151    viewPlayerDropdown.list_data = playerIDs;
    152152    viewPlayerDropdown.selected = Engine.GetPlayerID();
    153153
    154154    // If in Atlas editor, disable the exit button
    155155    if (Engine.IsAtlasRunning())
    156         getGUIObjectByName("menuExitButton").enabled = false;
     156        Engine.GetGUIObjectByName("menuExitButton").enabled = false;
    157157
    158158    if (hotloadData)
    159159    {
     
    170170    }
    171171
    172172    if (Engine.ConfigDB_GetValue("user", "gui.session.timeelapsedcounter") === "true")
    173         getGUIObjectByName("timeElapsedCounter").hidden = false;
     173        Engine.GetGUIObjectByName("timeElapsedCounter").hidden = false;
    174174
    175175    onSimulationUpdate();
    176176
     
    186186{
    187187    Engine.SetPlayerID(playerID);
    188188    if (playerID != 0) {
    189         getGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[playerID].civ].Emblem;
    190         getGUIObjectByName("civIcon").tooltip = g_CivData[g_Players[playerID].civ].Name;
     189        Engine.GetGUIObjectByName("civIcon").sprite = "stretched:" + g_CivData[g_Players[playerID].civ].Emblem;
     190        Engine.GetGUIObjectByName("civIcon").tooltip = g_CivData[g_Players[playerID].civ].Name;
    191191    }
    192192}
    193193
     
    256256    }
    257257
    258258    stopAmbient();
    259     endGame();
     259    Engine.EndGame();
    260260
    261261    if (g_IsController && Engine.HasXmppClient())
    262262        Engine.SendUnregisterGame();
     
    341341
    342342    // When training is blocked, flash population (alternates colour every 500msec)
    343343    if (g_IsTrainingBlocked && (Date.now() % 1000) < 500)
    344         getGUIObjectByName("resourcePop").textcolor = POPULATION_ALERT_COLOR;
     344        Engine.GetGUIObjectByName("resourcePop").textcolor = POPULATION_ALERT_COLOR;
    345345    else
    346         getGUIObjectByName("resourcePop").textcolor = DEFAULT_POPULATION_COLOR;
     346        Engine.GetGUIObjectByName("resourcePop").textcolor = DEFAULT_POPULATION_COLOR;
    347347
    348348    // Clear renamed entities list
    349349    Engine.GuiInterfaceCall("ClearRenamedEntities");
     
    372372        return;
    373373
    374374    // We can't resign once the game is over.
    375     getGUIObjectByName("menuResignButton").enabled = false;
     375    Engine.GetGUIObjectByName("menuResignButton").enabled = false;
    376376
    377377    // Make sure nothing is open to avoid stacking.
    378378    closeMenu();
     
    404404    {
    405405        global.music.setState(global.music.states.VICTORY);
    406406        // TODO: Reveal map directly instead of this silly proxy.
    407         if (!getGUIObjectByName("devCommandsRevealMap").checked)
    408             getGUIObjectByName("devCommandsRevealMap").checked = true;
     407        if (!Engine.GetGUIObjectByName("devCommandsRevealMap").checked)
     408            Engine.GetGUIObjectByName("devCommandsRevealMap").checked = true;
    409409        messageBox(400, 200, message, "VICTORIOUS!", 0, btCaptions, btCode);
    410410    }
    411411
     
    462462{
    463463    var simState = GetSimState();
    464464    var playerState = simState.players[Engine.GetPlayerID()];
    465     var heroButton = getGUIObjectByName("unitHeroButton");
     465    var heroButton = Engine.GetGUIObjectByName("unitHeroButton");
    466466
    467467    if (!playerState || playerState.heroes.length <= 0)
    468468    {
     
    470470        return;
    471471    }
    472472
    473     var heroImage = getGUIObjectByName("unitHeroImage");
     473    var heroImage = Engine.GetGUIObjectByName("unitHeroImage");
    474474    var heroState = GetEntityState(playerState.heroes[0]);
    475475    var template = GetTemplateData(heroState.template);
    476476    heroImage.sprite = "stretched:session/portraits/" + template.icon;
     
    506506    g_Groups.update();
    507507    for (var i = 0; i < 10; i++)
    508508    {
    509         var button = getGUIObjectByName("unit"+guiName+"Button["+i+"]");
    510         var label = getGUIObjectByName("unit"+guiName+"Label["+i+"]").caption = i;
     509        var button = Engine.GetGUIObjectByName("unit"+guiName+"Button["+i+"]");
     510        var label = Engine.GetGUIObjectByName("unit"+guiName+"Label["+i+"]").caption = i;
    511511        if (g_Groups.groups[i].getTotalCount() == 0)
    512512            button.hidden = true;
    513513        else
     
    518518    var numButtons = i;
    519519    var rowLength = 1;
    520520    var numRows = Math.ceil(numButtons / rowLength);
    521     var buttonSideLength = getGUIObjectByName("unit"+guiName+"Button[0]").size.bottom;
     521    var buttonSideLength = Engine.GetGUIObjectByName("unit"+guiName+"Button[0]").size.bottom;
    522522    var buttonSpacer = buttonSideLength+1;
    523523    for (var i = 0; i < numRows; i++)
    524524        layoutButtonRow(i, guiName, buttonSideLength, buttonSpacer, rowLength*i, rowLength*(i+1) );
     
    527527function updateDebug()
    528528{
    529529    var simState = GetSimState();
    530     var debug = getGUIObjectByName("debug");
     530    var debug = Engine.GetGUIObjectByName("debug");
    531531
    532     if (getGUIObjectByName("devDisplayState").checked)
     532    if (Engine.GetGUIObjectByName("devDisplayState").checked)
    533533    {
    534534        debug.hidden = false;
    535535    }
     
    567567    if (!playerState)
    568568        return;
    569569
    570     getGUIObjectByName("resourceFood").caption = playerState.resourceCounts.food;
    571     getGUIObjectByName("resourceWood").caption = playerState.resourceCounts.wood;
    572     getGUIObjectByName("resourceStone").caption = playerState.resourceCounts.stone;
    573     getGUIObjectByName("resourceMetal").caption = playerState.resourceCounts.metal;
    574     getGUIObjectByName("resourcePop").caption = playerState.popCount + "/" + playerState.popLimit;
     570    Engine.GetGUIObjectByName("resourceFood").caption = playerState.resourceCounts.food;
     571    Engine.GetGUIObjectByName("resourceWood").caption = playerState.resourceCounts.wood;
     572    Engine.GetGUIObjectByName("resourceStone").caption = playerState.resourceCounts.stone;
     573    Engine.GetGUIObjectByName("resourceMetal").caption = playerState.resourceCounts.metal;
     574    Engine.GetGUIObjectByName("resourcePop").caption = playerState.popCount + "/" + playerState.popLimit;
    575575
    576576    g_IsTrainingBlocked = playerState.trainingBlocked;
    577577}
     
    596596        return;
    597597
    598598    // Set up initial positioning.
    599     var buttonSideLength = getGUIObjectByName("researchStartedButton[0]").size.right;
     599    var buttonSideLength = Engine.GetGUIObjectByName("researchStartedButton[0]").size.right;
    600600    for (var i = 0; i < 10; ++i)
    601601    {
    602         var button = getGUIObjectByName("researchStartedButton[" + i + "]");
     602        var button = Engine.GetGUIObjectByName("researchStartedButton[" + i + "]");
    603603        var size = button.size;
    604604        size.top = (4 + buttonSideLength) * i;
    605605        size.bottom = size.top + buttonSideLength;
     
    614614            break;
    615615
    616616        var template = GetTechnologyData(tech);
    617         var button = getGUIObjectByName("researchStartedButton[" + numButtons + "]");
     617        var button = Engine.GetGUIObjectByName("researchStartedButton[" + numButtons + "]");
    618618        button.hidden = false;
    619619        button.tooltip = getEntityNames(template);
    620620        button.onpress = (function(e) { return function() { selectAndMoveTo(e) } })(researchStarted[tech].researcher);
    621621
    622622        var icon = "stretched:session/portraits/" + template.icon;
    623         getGUIObjectByName("researchStartedIcon[" + numButtons + "]").sprite = icon;
     623        Engine.GetGUIObjectByName("researchStartedIcon[" + numButtons + "]").sprite = icon;
    624624
    625625        // Scale the progress indicator.
    626         var size = getGUIObjectByName("researchStartedProgressSlider[" + numButtons + "]").size;
     626        var size = Engine.GetGUIObjectByName("researchStartedProgressSlider[" + numButtons + "]").size;
    627627
    628628        // Buttons are assumed to be square, so left/right offsets can be used for top/bottom.
    629629        size.top = size.left + Math.round(researchStarted[tech].progress * (size.right - size.left));
    630         getGUIObjectByName("researchStartedProgressSlider[" + numButtons + "]").size = size;
     630        Engine.GetGUIObjectByName("researchStartedProgressSlider[" + numButtons + "]").size = size;
    631631
    632632        ++numButtons;
    633633    }
    634634
    635635    // Hide unused buttons.
    636636    for (var i = numButtons; i < 10; ++i)
    637         getGUIObjectByName("researchStartedButton[" + i + "]").hidden = true;
     637        Engine.GetGUIObjectByName("researchStartedButton[" + i + "]").hidden = true;
    638638}
    639639
    640640function updateTimeElapsedCounter()
    641641{
    642642    var simState = GetSimState();
    643643    var speed = g_CurrentSpeed != 1.0 ? " (" + g_CurrentSpeed + "x)" : "";
    644     var timeElapsedCounter = getGUIObjectByName("timeElapsedCounter");
     644    var timeElapsedCounter = Engine.GetGUIObjectByName("timeElapsedCounter");
    645645    timeElapsedCounter.caption = timeToString(simState.timeElapsed) + speed;
    646646}
    647647
  • binaries/data/mods/public/gui/session/selection_details.js

     
    11function layoutSelectionSingle()
    22{
    3     getGUIObjectByName("detailsAreaSingle").hidden = false;
    4     getGUIObjectByName("detailsAreaMultiple").hidden = true;
     3    Engine.GetGUIObjectByName("detailsAreaSingle").hidden = false;
     4    Engine.GetGUIObjectByName("detailsAreaMultiple").hidden = true;
    55}
    66
    77function layoutSelectionMultiple()
    88{
    9     getGUIObjectByName("detailsAreaMultiple").hidden = false;
    10     getGUIObjectByName("detailsAreaSingle").hidden = true;
     9    Engine.GetGUIObjectByName("detailsAreaMultiple").hidden = false;
     10    Engine.GetGUIObjectByName("detailsAreaSingle").hidden = true;
    1111}
    1212
    1313// Fills out information that most entities have
     
    3636    // Rank
    3737    if (entState.identity && entState.identity.rank && entState.identity.classes)
    3838    {
    39         getGUIObjectByName("rankIcon").tooltip = entState.identity.rank + " Rank";
    40         getGUIObjectByName("rankIcon").sprite = getRankIconSprite(entState);                   
    41         getGUIObjectByName("rankIcon").hidden = false;
     39        Engine.GetGUIObjectByName("rankIcon").tooltip = entState.identity.rank + " Rank";
     40        Engine.GetGUIObjectByName("rankIcon").sprite = getRankIconSprite(entState);                 
     41        Engine.GetGUIObjectByName("rankIcon").hidden = false;
    4242    }
    4343    else
    4444    {
    45         getGUIObjectByName("rankIcon").hidden = true;
    46         getGUIObjectByName("rankIcon").tooltip = "";
     45        Engine.GetGUIObjectByName("rankIcon").hidden = true;
     46        Engine.GetGUIObjectByName("rankIcon").tooltip = "";
    4747    }
    4848                               
    4949    // Hitpoints
    5050    if (entState.hitpoints)
    5151    {
    52         var unitHealthBar = getGUIObjectByName("healthBar");
     52        var unitHealthBar = Engine.GetGUIObjectByName("healthBar");
    5353        var healthSize = unitHealthBar.size;
    5454        healthSize.rright = 100*Math.max(0, Math.min(1, entState.hitpoints / entState.maxHitpoints));
    5555        unitHealthBar.size = healthSize;
    5656
    5757        var hitpoints = Math.ceil(entState.hitpoints) + " / " + entState.maxHitpoints;
    58         getGUIObjectByName("healthStats").caption = hitpoints;
    59         getGUIObjectByName("healthSection").hidden = false;
     58        Engine.GetGUIObjectByName("healthStats").caption = hitpoints;
     59        Engine.GetGUIObjectByName("healthSection").hidden = false;
    6060    }
    6161    else
    6262    {
    63         getGUIObjectByName("healthSection").hidden = true;
     63        Engine.GetGUIObjectByName("healthSection").hidden = true;
    6464    }
    6565   
    6666    // TODO: Stamina
    6767    var player = Engine.GetPlayerID();
    6868    if (entState.stamina && (entState.player == player || g_DevSettings.controlAll))
    6969    {
    70         getGUIObjectByName("staminaSection").hidden = false;
     70        Engine.GetGUIObjectByName("staminaSection").hidden = false;
    7171    }
    7272    else
    7373    {
    74         getGUIObjectByName("staminaSection").hidden = true;
     74        Engine.GetGUIObjectByName("staminaSection").hidden = true;
    7575    }
    7676
    7777    // Experience
    7878    if (entState.promotion)
    7979    {
    80         var experienceBar = getGUIObjectByName("experienceBar");
     80        var experienceBar = Engine.GetGUIObjectByName("experienceBar");
    8181        var experienceSize = experienceBar.size;
    8282        experienceSize.rtop = 100 - (100 * Math.max(0, Math.min(1, 1.0 * +entState.promotion.curr / +entState.promotion.req)));
    8383        experienceBar.size = experienceSize;
     
    8585        var experience = "[font=\"serif-bold-13\"]Experience: [/font]" + Math.floor(entState.promotion.curr);
    8686        if (entState.promotion.curr < entState.promotion.req)
    8787            experience += " / " + entState.promotion.req;
    88         getGUIObjectByName("experience").tooltip = experience;
    89         getGUIObjectByName("experience").hidden = false;
     88        Engine.GetGUIObjectByName("experience").tooltip = experience;
     89        Engine.GetGUIObjectByName("experience").hidden = false;
    9090    }
    9191    else
    9292    {
    93         getGUIObjectByName("experience").hidden = true;
     93        Engine.GetGUIObjectByName("experience").hidden = true;
    9494    }
    9595
    9696    // Resource stats
     
    102102        if (resourceType == "treasure")
    103103            resourceType = entState.resourceSupply.type["specific"];
    104104
    105         var unitResourceBar = getGUIObjectByName("resourceBar");
     105        var unitResourceBar = Engine.GetGUIObjectByName("resourceBar");
    106106        var resourceSize = unitResourceBar.size;
    107107
    108108        resourceSize.rright = entState.resourceSupply.isInfinite ? 100 :
    109109                        100 * Math.max(0, Math.min(1, +entState.resourceSupply.amount / +entState.resourceSupply.max));
    110110        unitResourceBar.size = resourceSize;
    111         getGUIObjectByName("resourceLabel").caption = toTitleCase(resourceType) + ":";
    112         getGUIObjectByName("resourceStats").caption = resources;
     111        Engine.GetGUIObjectByName("resourceLabel").caption = toTitleCase(resourceType) + ":";
     112        Engine.GetGUIObjectByName("resourceStats").caption = resources;
    113113
    114114        if (entState.hitpoints)
    115             getGUIObjectByName("resourceSection").size = getGUIObjectByName("staminaSection").size;
     115            Engine.GetGUIObjectByName("resourceSection").size = Engine.GetGUIObjectByName("staminaSection").size;
    116116        else
    117             getGUIObjectByName("resourceSection").size = getGUIObjectByName("healthSection").size;
     117            Engine.GetGUIObjectByName("resourceSection").size = Engine.GetGUIObjectByName("healthSection").size;
    118118
    119         getGUIObjectByName("resourceSection").hidden = false;
     119        Engine.GetGUIObjectByName("resourceSection").hidden = false;
    120120    }
    121121    else
    122122    {
    123         getGUIObjectByName("resourceSection").hidden = true;
     123        Engine.GetGUIObjectByName("resourceSection").hidden = true;
    124124    }
    125125
    126126    // Resource carrying
     
    129129        // We should only be carrying one resource type at once, so just display the first
    130130        var carried = entState.resourceCarrying[0];
    131131
    132         getGUIObjectByName("resourceCarryingIcon").hidden = false;
    133         getGUIObjectByName("resourceCarryingText").hidden = false;
    134         getGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/resources/"+carried.type+".png";
    135         getGUIObjectByName("resourceCarryingText").caption = carried.amount + " / " + carried.max;
    136         getGUIObjectByName("resourceCarryingIcon").tooltip = "";
     132        Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = false;
     133        Engine.GetGUIObjectByName("resourceCarryingText").hidden = false;
     134        Engine.GetGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/resources/"+carried.type+".png";
     135        Engine.GetGUIObjectByName("resourceCarryingText").caption = carried.amount + " / " + carried.max;
     136        Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = "";
    137137    }
    138138    // Use the same indicators for traders
    139139    else if (entState.trader && entState.trader.goods.amount)
    140140    {
    141         getGUIObjectByName("resourceCarryingIcon").hidden = false;
    142         getGUIObjectByName("resourceCarryingText").hidden = false;
    143         getGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/resources/"+entState.trader.goods.type+".png";
     141        Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = false;
     142        Engine.GetGUIObjectByName("resourceCarryingText").hidden = false;
     143        Engine.GetGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/resources/"+entState.trader.goods.type+".png";
    144144        var totalGain = entState.trader.goods.amount.traderGain;
    145145        if (entState.trader.goods.amount.market1Gain)
    146146            totalGain += entState.trader.goods.amount.market1Gain;
    147147        if (entState.trader.goods.amount.market2Gain)
    148148            totalGain += entState.trader.goods.amount.market2Gain;
    149         getGUIObjectByName("resourceCarryingText").caption = totalGain;
    150         getGUIObjectByName("resourceCarryingIcon").tooltip = "Gain: " + getTradingTooltip(entState.trader.goods.amount);
     149        Engine.GetGUIObjectByName("resourceCarryingText").caption = totalGain;
     150        Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = "Gain: " + getTradingTooltip(entState.trader.goods.amount);
    151151    }
    152152    // And for number of workers
    153153    else if (entState.foundation)
    154154    {
    155         getGUIObjectByName("resourceCarryingIcon").hidden = false;
    156         getGUIObjectByName("resourceCarryingText").hidden = false;
    157         getGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/repair.png";
    158         getGUIObjectByName("resourceCarryingText").caption = entState.foundation.numBuilders + "    ";
    159         getGUIObjectByName("resourceCarryingIcon").tooltip = "Number of builders";
     155        Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = false;
     156        Engine.GetGUIObjectByName("resourceCarryingText").hidden = false;
     157        Engine.GetGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/repair.png";
     158        Engine.GetGUIObjectByName("resourceCarryingText").caption = entState.foundation.numBuilders + "    ";
     159        Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = "Number of builders";
    160160    }
    161161    else if (entState.resourceSupply && (!entState.resourceSupply.killBeforeGather || !entState.hitpoints))
    162162    {
    163         getGUIObjectByName("resourceCarryingIcon").hidden = false;
    164         getGUIObjectByName("resourceCarryingText").hidden = false;
    165         getGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/repair.png";
    166         getGUIObjectByName("resourceCarryingText").caption = entState.resourceSupply.gatherers.length + " / " + entState.resourceSupply.maxGatherers + "    ";
    167         getGUIObjectByName("resourceCarryingIcon").tooltip = "Current/max gatherers";
     163        Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = false;
     164        Engine.GetGUIObjectByName("resourceCarryingText").hidden = false;
     165        Engine.GetGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/repair.png";
     166        Engine.GetGUIObjectByName("resourceCarryingText").caption = entState.resourceSupply.gatherers.length + " / " + entState.resourceSupply.maxGatherers + "    ";
     167        Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = "Current/max gatherers";
    168168    }
    169169    else
    170170    {
    171         getGUIObjectByName("resourceCarryingIcon").hidden = true;
    172         getGUIObjectByName("resourceCarryingText").hidden = true;
     171        Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = true;
     172        Engine.GetGUIObjectByName("resourceCarryingText").hidden = true;
    173173    }
    174174
    175175    // Set Player details
    176     getGUIObjectByName("specific").caption = specificName;
    177     getGUIObjectByName("player").caption = playerName;
    178     getGUIObjectByName("playerColorBackground").sprite = "colour: " + playerColor;
     176    Engine.GetGUIObjectByName("specific").caption = specificName;
     177    Engine.GetGUIObjectByName("player").caption = playerName;
     178    Engine.GetGUIObjectByName("playerColorBackground").sprite = "colour: " + playerColor;
    179179   
    180180    if (genericName)
    181181    {
    182         getGUIObjectByName("generic").caption = "(" + genericName + ")";
     182        Engine.GetGUIObjectByName("generic").caption = "(" + genericName + ")";
    183183    }
    184184    else
    185185    {
    186         getGUIObjectByName("generic").caption = "";
     186        Engine.GetGUIObjectByName("generic").caption = "";
    187187
    188188    }
    189189
    190190    if ("Gaia" != civName)
    191191    {
    192         getGUIObjectByName("playerCivIcon").sprite = "stretched:grayscale:" + civEmblem;
    193         getGUIObjectByName("player").tooltip = civName;
     192        Engine.GetGUIObjectByName("playerCivIcon").sprite = "stretched:grayscale:" + civEmblem;
     193        Engine.GetGUIObjectByName("player").tooltip = civName;
    194194    }
    195195    else
    196196    {
    197         getGUIObjectByName("playerCivIcon").sprite = "";
    198         getGUIObjectByName("player").tooltip = "";
     197        Engine.GetGUIObjectByName("playerCivIcon").sprite = "";
     198        Engine.GetGUIObjectByName("player").tooltip = "";
    199199    }
    200200
    201201    // Icon image
    202202    if (template.icon)
    203203    {
    204         getGUIObjectByName("icon").sprite = "stretched:session/portraits/" + template.icon;
     204        Engine.GetGUIObjectByName("icon").sprite = "stretched:session/portraits/" + template.icon;
    205205    }
    206206    else
    207207    {
    208208        // TODO: we should require all entities to have icons, so this case never occurs
    209         getGUIObjectByName("icon").sprite = "bkFillBlack";
     209        Engine.GetGUIObjectByName("icon").sprite = "bkFillBlack";
    210210    }
    211211
    212212    // Attack and Armor
     
    236236        }
    237237    }
    238238   
    239     getGUIObjectByName("attackAndArmorStats").tooltip = attack + "\n[font=\"serif-bold-13\"]Armor:[/font] " + armorTypeDetails(entState.armour);
     239    Engine.GetGUIObjectByName("attackAndArmorStats").tooltip = attack + "\n[font=\"serif-bold-13\"]Armor:[/font] " + armorTypeDetails(entState.armour);
    240240
    241241    // Icon Tooltip
    242242    var iconTooltip = "";
     
    247247    if (template.tooltip)
    248248        iconTooltip += "\n[font=\"serif-13\"]" + template.tooltip + "[/font]";
    249249
    250     getGUIObjectByName("iconBorder").tooltip = iconTooltip;
     250    Engine.GetGUIObjectByName("iconBorder").tooltip = iconTooltip;
    251251
    252252    // Unhide Details Area
    253     getGUIObjectByName("detailsAreaSingle").hidden = false;
    254     getGUIObjectByName("detailsAreaMultiple").hidden = true;
     253    Engine.GetGUIObjectByName("detailsAreaSingle").hidden = false;
     254    Engine.GetGUIObjectByName("detailsAreaMultiple").hidden = true;
    255255}
    256256
    257257// Fills out information for multiple entities
     
    275275
    276276    if (averageHealth > 0)
    277277    {
    278         var unitHealthBar = getGUIObjectByName("healthBarMultiple");
     278        var unitHealthBar = Engine.GetGUIObjectByName("healthBarMultiple");
    279279        var healthSize = unitHealthBar.size;   
    280280        healthSize.rtop = 100-100*Math.max(0, Math.min(1, averageHealth / maxHealth));
    281281        unitHealthBar.size = healthSize;
    282282
    283283        var hitpoints = "[font=\"serif-bold-13\"]Hitpoints [/font]" + averageHealth + " / " + maxHealth;
    284         var healthMultiple = getGUIObjectByName("healthMultiple");
     284        var healthMultiple = Engine.GetGUIObjectByName("healthMultiple");
    285285        healthMultiple.tooltip = hitpoints;
    286286        healthMultiple.hidden = false;
    287287    }
    288288    else
    289289    {
    290         getGUIObjectByName("healthMultiple").hidden = true;
     290        Engine.GetGUIObjectByName("healthMultiple").hidden = true;
    291291    }
    292292   
    293293    // TODO: Stamina
    294     // getGUIObjectByName("staminaBarMultiple");
     294    // Engine.GetGUIObjectByName("staminaBarMultiple");
    295295
    296     getGUIObjectByName("numberOfUnits").caption = selection.length;
     296    Engine.GetGUIObjectByName("numberOfUnits").caption = selection.length;
    297297
    298298    // Unhide Details Area
    299     getGUIObjectByName("detailsAreaMultiple").hidden = false;
    300     getGUIObjectByName("detailsAreaSingle").hidden = true;
     299    Engine.GetGUIObjectByName("detailsAreaMultiple").hidden = false;
     300    Engine.GetGUIObjectByName("detailsAreaSingle").hidden = true;
    301301}
    302302
    303303// Updates middle entity Selection Details Panel
    304304function updateSelectionDetails()
    305305{
    306     var supplementalDetailsPanel = getGUIObjectByName("supplementalSelectionDetails");
    307     var detailsPanel = getGUIObjectByName("selectionDetails");
    308     var commandsPanel = getGUIObjectByName("unitCommands");
     306    var supplementalDetailsPanel = Engine.GetGUIObjectByName("supplementalSelectionDetails");
     307    var detailsPanel = Engine.GetGUIObjectByName("selectionDetails");
     308    var commandsPanel = Engine.GetGUIObjectByName("unitCommands");
    309309
    310310    g_Selection.update();
    311311    var selection = g_Selection.toList();
    312312   
    313313    if (selection.length == 0)
    314314    {
    315         getGUIObjectByName("detailsAreaMultiple").hidden = true;
    316         getGUIObjectByName("detailsAreaSingle").hidden = true;
     315        Engine.GetGUIObjectByName("detailsAreaMultiple").hidden = true;
     316        Engine.GetGUIObjectByName("detailsAreaSingle").hidden = true;
    317317        hideUnitCommands();
    318318   
    319319        supplementalDetailsPanel.hidden = true;
  • binaries/data/mods/public/gui/session/input.js

     
    5555{
    5656    var cursorSet = false;
    5757    var tooltipSet = false;
    58     var informationTooltip = getGUIObjectByName("informationTooltip");
     58    var informationTooltip = Engine.GetGUIObjectByName("informationTooltip");
    5959    if (!mouseIsOverObject)
    6060    {
    6161        var action = determineAction(mouseX, mouseY);
     
    8383    if (!tooltipSet)
    8484        informationTooltip.hidden = true;
    8585   
    86     var placementTooltip = getGUIObjectByName("placementTooltip");
     86    var placementTooltip = Engine.GetGUIObjectByName("placementTooltip");
    8787    if (placementSupport.tooltipMessage)
    8888    {
    8989        if (placementSupport.tooltipError)
     
    723723            if (x0 > x1) { var t = x0; x0 = x1; x1 = t; }
    724724            if (y0 > y1) { var t = y0; y0 = y1; y1 = t; }
    725725
    726             var bandbox = getGUIObjectByName("bandbox");
     726            var bandbox = Engine.GetGUIObjectByName("bandbox");
    727727            bandbox.size = [x0, y0, x1, y1].join(" ");
    728728            bandbox.hidden = false;
    729729
     
    743743                if (x0 > x1) { var t = x0; x0 = x1; x1 = t; }
    744744                if (y0 > y1) { var t = y0; y0 = y1; y1 = t; }
    745745
    746                 var bandbox = getGUIObjectByName("bandbox");
     746                var bandbox = Engine.GetGUIObjectByName("bandbox");
    747747                bandbox.hidden = true;
    748748
    749749                // Get list of entities limited to preferred entities
     
    787787            else if (ev.button == SDL_BUTTON_RIGHT)
    788788            {
    789789                // Cancel selection
    790                 var bandbox = getGUIObjectByName("bandbox");
     790                var bandbox = Engine.GetGUIObjectByName("bandbox");
    791791                bandbox.hidden = true;
    792792
    793793                g_Selection.setHighlightList([]);
     
    10371037function handleInputAfterGui(ev)
    10381038{
    10391039    // Handle the time-warp testing features, restricted to single-player
    1040     if (!g_IsNetworked && getGUIObjectByName("devTimeWarp").checked)
     1040    if (!g_IsNetworked && Engine.GetGUIObjectByName("devTimeWarp").checked)
    10411041    {
    10421042        if (ev.type == "hotkeydown" && ev.hotkey == "timewarp.fastforward")
    10431043            Engine.SetSimRate(20.0);
  • binaries/data/mods/public/gui/options/options.xml

     
    5050                <action on="Load">this.caption = Engine.ConfigDB_GetValue("user", "sound.mastergain");</action>
    5151            </object>
    5252            <object size="70%+35 25 70%+75 50" type="button" style="StoneButton">Save
    53                 <action on="Press">Engine.ConfigDB_CreateValue("user", "sound.mastergain", String(getGUIObjectByName("SMasterCFG").caption));</action>
     53                <action on="Press">Engine.ConfigDB_CreateValue("user", "sound.mastergain", String(Engine.GetGUIObjectByName("SMasterCFG").caption));</action>
    5454            </object>
    5555            <object size="0 50 65% 75" type="text" style="RightLabelText" ghost="true">Music Gain</object>
    5656            <object name="SMusicCFG" size="70% 50 70%+35 75" type="input" style="StoneInput">
    5757                <action on="Load">this.caption = Engine.ConfigDB_GetValue("user", "sound.musicgain");</action>
    5858            </object>
    5959            <object size="70%+35 50 70%+75 75" type="button" style="StoneButton">Save
    60                 <action on="Press">Engine.ConfigDB_CreateValue("user", "sound.musicgain", String(getGUIObjectByName("SMusicCFG").caption));</action>
     60                <action on="Press">Engine.ConfigDB_CreateValue("user", "sound.musicgain", String(Engine.GetGUIObjectByName("SMusicCFG").caption));</action>
    6161            </object>
    6262        </object>
    6363<!--
  • binaries/data/mods/public/gui/msgbox/msgbox.xml

     
    44    <script><![CDATA[
    55    function init(data)
    66    {
    7         var mbMainObj = getGUIObjectByName("mbMain");
    8         var mbTitleObj = getGUIObjectByName("mbTitleBar");
    9         var mbTextObj = getGUIObjectByName("mbText");
     7        var mbMainObj = Engine.GetGUIObjectByName("mbMain");
     8        var mbTitleObj = Engine.GetGUIObjectByName("mbTitleBar");
     9        var mbTextObj = Engine.GetGUIObjectByName("mbText");
    1010
    11         var mbButton1Obj = getGUIObjectByName("mbButton1");
    12         var mbButton2Obj = getGUIObjectByName("mbButton2");
    13         var mbButton3Obj = getGUIObjectByName("mbButton3");
     11        var mbButton1Obj = Engine.GetGUIObjectByName("mbButton1");
     12        var mbButton2Obj = Engine.GetGUIObjectByName("mbButton2");
     13        var mbButton3Obj = Engine.GetGUIObjectByName("mbButton3");
    1414
    1515        // Calculate size
    1616        var mbLRDiff = data.width / 2;     // Message box left/right difference from 50% of screen
     
    8787    ]]></script>
    8888
    8989    <object hotkey="leave">
    90         <action on="Press">Engine.PopGuiPage();</action>
     90        <action on="Press">Engine.PopGuiPageCB();</action>
    9191    </object>
    9292
    9393    <object>
  • binaries/data/mods/public/gui/manual/manual.js

     
    22
    33function init(data)
    44{
    5     getGUIObjectByName("mainText").caption = readFile("gui/manual/" + data.page + ".txt");
     5    Engine.GetGUIObjectByName("mainText").caption = Engine.ReadFile("gui/manual/" + data.page + ".txt");
    66    closeCallback = data.closeCallback;
    77}
    88
  • binaries/data/mods/public/gui/loading/loading.js

     
    66    g_Data = data;
    77
    88    // Set to "hourglass" cursor.
    9     setCursor("cursor-wait");
     9    Engine.SetCursor("cursor-wait");
    1010
    1111    // Get tip image and corresponding tip text
    12     var tipTextLoadingArray = buildDirEntList("gui/text/tips/", "*.txt", false);
     12    var tipTextLoadingArray = Engine.BuildDirEntList("gui/text/tips/", "*.txt", false);
    1313
    1414    if (tipTextLoadingArray.length > 0)
    1515    {
    1616        // Set tip text
    1717        var tipTextFilePath = tipTextLoadingArray[getRandom (0, tipTextLoadingArray.length-1)];
    18         var tipText = readFile(tipTextFilePath);
     18        var tipText = Engine.ReadFile(tipTextFilePath);
    1919
    2020        if (tipText)
    2121        {
    2222            var index = tipText.indexOf("\n");
    2323            var tipTextTitle = tipText.substring(0, index);
    2424            var tipTextMessage = tipText.substring(index);
    25             getGUIObjectByName("tipTitle").caption = tipTextTitle? tipTextTitle : "";
    26             getGUIObjectByName("tipText").caption = tipTextMessage? tipTextMessage : "";
     25            Engine.GetGUIObjectByName("tipTitle").caption = tipTextTitle? tipTextTitle : "";
     26            Engine.GetGUIObjectByName("tipText").caption = tipTextMessage? tipTextMessage : "";
    2727        }
    2828
    2929        // Set tip image
    3030        var fileName = tipTextFilePath.substring(tipTextFilePath.lastIndexOf("/")+1).replace(".txt", ".png");
    3131        var tipImageFilePath = "loading/tips/" + fileName;
    3232        var sprite = "stretched:" + tipImageFilePath;
    33         getGUIObjectByName("tipImage").sprite = sprite? sprite : "";
     33        Engine.GetGUIObjectByName("tipImage").sprite = sprite? sprite : "";
    3434    }
    3535    else
    3636    {
     
    3939
    4040    // janwas: main loop now sets progress / description, but that won't
    4141    // happen until the first timeslice completes, so set initial values.
    42     var loadingMapName = getGUIObjectByName ("loadingMapName");
     42    var loadingMapName = Engine.GetGUIObjectByName ("loadingMapName");
    4343
    4444    if (data)
    4545    {
     
    6060        }
    6161    }
    6262
    63     getGUIObjectByName("progressText").caption = "";
    64     getGUIObjectByName("progressbar").caption = 0;
     63    Engine.GetGUIObjectByName("progressText").caption = "";
     64    Engine.GetGUIObjectByName("progressbar").caption = 0;
    6565
    6666    // Pick a random quote of the day (each line is a separate tip).
    67     var quoteArray = readFileLines("gui/text/quotes.txt");
    68     getGUIObjectByName("quoteText").caption = quoteArray[getRandom(0, quoteArray.length-1)];
     67    var quoteArray = Engine.ReadFileLines("gui/text/quotes.txt");
     68    Engine.GetGUIObjectByName("quoteText").caption = quoteArray[getRandom(0, quoteArray.length-1)];
    6969}
    7070
    7171// ====================================================================
     
    7777        // Show 100 when it is really 99
    7878        var progress = g_Progress + 1;
    7979
    80         getGUIObjectByName("progressbar").caption = progress; // display current progress
    81         getGUIObjectByName("progressText").caption = progress + "%";
     80        Engine.GetGUIObjectByName("progressbar").caption = progress; // display current progress
     81        Engine.GetGUIObjectByName("progressText").caption = progress + "%";
    8282
    8383        // Displays detailed loading info rather than a percent
    84         // getGUIObjectByName("progressText").caption = g_LoadDescription; // display current progess details
     84        // Engine.GetGUIObjectByName("progressText").caption = g_LoadDescription; // display current progess details
    8585
    8686        // Keep curved right edge of progress bar in sync with the rest of the progress bar
    87         var middle = getGUIObjectByName("progressbar");
    88         var rightSide = getGUIObjectByName("progressbar_right");
     87        var middle = Engine.GetGUIObjectByName("progressbar");
     88        var rightSide = Engine.GetGUIObjectByName("progressbar_right");
    8989
    9090        var middleLength = (middle.size.right - middle.size.left) - (END_PIECE_WIDTH / 2);
    9191        var increment = Math.round(progress * middleLength / 100);
     
    112112    Engine.SwitchGuiPage("page_session.xml", g_Data);
    113113
    114114    // Restore default cursor.
    115     setCursor("arrow-default");
     115    Engine.SetCursor("arrow-default");
    116116}
  • binaries/data/mods/public/gui/savedgames/save.js

     
    55
    66function selectDescription()
    77{
    8     var gameSelection = getGUIObjectByName("gameSelection");
     8    var gameSelection = Engine.GetGUIObjectByName("gameSelection");
    99    if (gameSelection.selected != -1)
    1010    {
    11         getGUIObjectByName("deleteGameButton").enabled = true;
     11        Engine.GetGUIObjectByName("deleteGameButton").enabled = true;
    1212        var gameID = gameSelection.list_data[gameSelection.selected];
    13         getGUIObjectByName("saveGameDesc").caption = g_Descriptions[gameID];
     13        Engine.GetGUIObjectByName("saveGameDesc").caption = g_Descriptions[gameID];
    1414    }
    1515}
    1616
     
    2424            gameDataCallback = data.gameDataCallback;
    2525    }
    2626
    27     var gameSelection = getGUIObjectByName("gameSelection");
    28     getGUIObjectByName("deleteGameButton").enabled = false;
     27    var gameSelection = Engine.GetGUIObjectByName("gameSelection");
     28    Engine.GetGUIObjectByName("deleteGameButton").enabled = false;
    2929
    3030    var savedGames = Engine.GetSavedGames();
    3131    if (savedGames.length == 0)
     
    5050
    5151function saveGame()
    5252{
    53     var gameSelection = getGUIObjectByName("gameSelection");
     53    var gameSelection = Engine.GetGUIObjectByName("gameSelection");
    5454    var gameLabel = gameSelection.list[gameSelection.selected];
    5555    var gameID = gameSelection.list_data[gameSelection.selected];
    56     var desc = getGUIObjectByName("saveGameDesc").caption;
     56    var desc = Engine.GetGUIObjectByName("saveGameDesc").caption;
    5757    var name = gameID ? gameID : "savegame";
    5858
    5959    if (gameSelection.selected != -1)
     
    8686
    8787function deleteGame()
    8888{
    89     var gameSelection = getGUIObjectByName("gameSelection");
     89    var gameSelection = Engine.GetGUIObjectByName("gameSelection");
    9090    var gameLabel = gameSelection.list[gameSelection.selected];
    9191    var gameID = gameSelection.list_data[gameSelection.selected];
    9292
  • binaries/data/mods/public/gui/savedgames/load.js

     
    11function init()
    22{
    3     var gameSelection = getGUIObjectByName("gameSelection");
     3    var gameSelection = Engine.GetGUIObjectByName("gameSelection");
    44
    55    var savedGames = Engine.GetSavedGames();
    66    if (savedGames.length == 0)
    77    {
    88        gameSelection.list = [ "No saved games found" ];
    99        gameSelection.selected = 0;
    10         getGUIObjectByName("loadGameButton").enabled = false;
    11         getGUIObjectByName("deleteGameButton").enabled = false;
     10        Engine.GetGUIObjectByName("loadGameButton").enabled = false;
     11        Engine.GetGUIObjectByName("deleteGameButton").enabled = false;
    1212        return;
    1313    }
    1414
     
    2424
    2525function loadGame()
    2626{
    27     var gameSelection = getGUIObjectByName("gameSelection");
     27    var gameSelection = Engine.GetGUIObjectByName("gameSelection");
    2828    var gameID = gameSelection.list_data[gameSelection.selected];
    2929
    3030    var metadata = Engine.StartSavedGame(gameID);
     
    4848
    4949function deleteGame()
    5050{
    51     var gameSelection = getGUIObjectByName("gameSelection");
     51    var gameSelection = Engine.GetGUIObjectByName("gameSelection");
    5252    var gameLabel = gameSelection.list[gameSelection.selected];
    5353    var gameID = gameSelection.list_data[gameSelection.selected];
    5454
  • binaries/data/mods/public/gui/splashscreen/splashscreen.js

     
    11function init(data)
    22{
    3     getGUIObjectByName("mainText").caption = readFile("gui/splashscreen/" + data.page + ".txt");
     3    Engine.GetGUIObjectByName("mainText").caption = Engine.ReadFile("gui/splashscreen/" + data.page + ".txt");
    44}
  • binaries/data/mods/public/gui/splashscreen/splashscreen.xml

     
    2323        <object name="btnOK" type="button" style="StoneButton" tooltip_style="snToolTip" size="24 100%-52 188 100%-24">
    2424            OK
    2525            <action on="Press"><![CDATA[
    26             Engine.SetSplashScreenEnabled(!getGUIObjectByName("displaySplashScreen").checked);
     26            Engine.SetSplashScreenEnabled(!Engine.GetGUIObjectByName("displaySplashScreen").checked);
    2727            Engine.PopGuiPage();
    2828            ]]></action>
    2929        </object>
  • source/test_setup.cpp

     
    116116
    117117namespace
    118118{
    119     void script_TS_FAIL(void*, std::wstring msg)
     119    void script_TS_FAIL(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring msg)
    120120    {
    121121        TS_FAIL(msg);
    122122    }
  • source/scriptinterface/ThreadDebugger.cpp

     
    289289    ReturnActiveBreakPoints(NULL);
    290290
    291291    // Remove all the hooks because they store a pointer to this object
    292     JS_SetExecuteHook(m->m_pScriptInterface->GetRuntime(), NULL, NULL);
    293     JS_SetCallHook(m->m_pScriptInterface->GetRuntime(), NULL, NULL);
    294     JS_SetNewScriptHook(m->m_pScriptInterface->GetRuntime(), NULL, NULL);
    295     JS_SetDestroyScriptHook(m->m_pScriptInterface->GetRuntime(), NULL, NULL);
     292    JS_SetExecuteHook(m->m_pScriptInterface->GetJSRuntime(), NULL, NULL);
     293    JS_SetCallHook(m->m_pScriptInterface->GetJSRuntime(), NULL, NULL);
     294    JS_SetNewScriptHook(m->m_pScriptInterface->GetJSRuntime(), NULL, NULL);
     295    JS_SetDestroyScriptHook(m->m_pScriptInterface->GetJSRuntime(), NULL, NULL);
    296296}
    297297
    298298void CThreadDebugger::ReturnActiveBreakPoints(jsbytecode* pBytecode)
     
    329329    m->m_Name = name;
    330330    m->m_pScriptInterface = pScriptInterface;
    331331    m->m_pDebuggingServer = pDebuggingServer;
    332     JS_SetExecuteHook(m->m_pScriptInterface->GetRuntime(), CallHook_, (void*)this);
    333     JS_SetCallHook(m->m_pScriptInterface->GetRuntime(), CallHook_, (void*)this);
    334     JS_SetNewScriptHook(m->m_pScriptInterface->GetRuntime(), NewScriptHook_, (void*)this);
    335     JS_SetDestroyScriptHook(m->m_pScriptInterface->GetRuntime(), DestroyScriptHook_, (void*)this);
    336     JS_SetThrowHook(m->m_pScriptInterface->GetRuntime(), ThrowHandler_, (void*)this);
     332    JS_SetExecuteHook(m->m_pScriptInterface->GetJSRuntime(), CallHook_, (void*)this);
     333    JS_SetCallHook(m->m_pScriptInterface->GetJSRuntime(), CallHook_, (void*)this);
     334    JS_SetNewScriptHook(m->m_pScriptInterface->GetJSRuntime(), NewScriptHook_, (void*)this);
     335    JS_SetDestroyScriptHook(m->m_pScriptInterface->GetJSRuntime(), DestroyScriptHook_, (void*)this);
     336    JS_SetThrowHook(m->m_pScriptInterface->GetJSRuntime(), ThrowHandler_, (void*)this);
    337337   
    338338    if (m->m_pDebuggingServer->GetSettingSimultaneousThreadBreak())
    339339    {
    340340        // Setup a handler to check for break-requests from the DebuggingServer regularly
    341         JS_SetInterrupt(m->m_pScriptInterface->GetRuntime(), CheckForBreakRequestHandler_, (void*)this);
     341        JS_SetInterrupt(m->m_pScriptInterface->GetJSRuntime(), CheckForBreakRequestHandler_, (void*)this);
    342342    }
    343343}
    344344
     
    456456   
    457457    if (breakSrc == BREAK_SRC_INTERRUP)
    458458    {
    459         JS_ClearInterrupt(m->m_pScriptInterface->GetRuntime(), NULL, NULL);
     459        JS_ClearInterrupt(m->m_pScriptInterface->GetJSRuntime(), NULL, NULL);
    460460        JS_SetSingleStepMode(cx, script, false);
    461461    }
    462462   
     
    496496            {
    497497                if (nextDbgCmd == DBG_CMD_SINGLESTEP)
    498498                {
    499                     JS_SetInterrupt(m->m_pScriptInterface->GetRuntime(), StepHandler_, this);
     499                    JS_SetInterrupt(m->m_pScriptInterface->GetJSRuntime(), StepHandler_, this);
    500500                    break;
    501501                }
    502502                else if (nextDbgCmd == DBG_CMD_STEPINTO)
    503503                {
    504                     JS_SetInterrupt(m->m_pScriptInterface->GetRuntime(), StepIntoHandler_, this);
     504                    JS_SetInterrupt(m->m_pScriptInterface->GetJSRuntime(), StepIntoHandler_, this);
    505505                    break;
    506506                }
    507507                else if (nextDbgCmd == DBG_CMD_STEPOUT)
    508508                {
    509                     JS_SetInterrupt(m->m_pScriptInterface->GetRuntime(), StepOutHandler_, this);
     509                    JS_SetInterrupt(m->m_pScriptInterface->GetJSRuntime(), StepOutHandler_, this);
    510510                    break;
    511511                }
    512512            }
     
    518518            else
    519519            {
    520520                // Setup a handler to check for break-requests from the DebuggingServer regularly
    521                 JS_SetInterrupt(m->m_pScriptInterface->GetRuntime(), CheckForBreakRequestHandler_, this);
     521                JS_SetInterrupt(m->m_pScriptInterface->GetJSRuntime(), CheckForBreakRequestHandler_, this);
    522522            }
    523523            break;
    524524        }
  • source/scriptinterface/ScriptStats.cpp

     
    8686    {
    8787        if (col == 0)
    8888            return "max nominal heap bytes";
    89         uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetRuntime(), JSGC_MAX_BYTES);
     89        uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetJSRuntime(), JSGC_MAX_BYTES);
    9090        return CStr::FromUInt(n);
    9191    }
    9292    case Row_MaxMallocBytes:
    9393    {
    9494        if (col == 0)
    9595            return "max JS_malloc bytes";
    96         uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetRuntime(), JSGC_MAX_MALLOC_BYTES);
     96        uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetJSRuntime(), JSGC_MAX_MALLOC_BYTES);
    9797        return CStr::FromUInt(n);
    9898    }
    9999    case Row_Bytes:
    100100    {
    101101        if (col == 0)
    102102            return "allocated bytes";
    103         uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetRuntime(), JSGC_BYTES);
     103        uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetJSRuntime(), JSGC_BYTES);
    104104        return CStr::FromUInt(n);
    105105    }
    106106    case Row_NumberGC:
    107107    {
    108108        if (col == 0)
    109109            return "number of GCs";
    110         uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetRuntime(), JSGC_NUMBER);
     110        uint32_t n = JS_GetGCParameter(m_ScriptInterfaces.at(col-1).first->GetJSRuntime(), JSGC_NUMBER);
    111111        return CStr::FromUInt(n);
    112112    }
    113113    default:
  • source/scriptinterface/ScriptInterface.cpp

     
    6969{
    7070public:
    7171    ScriptRuntime(int runtimeSize) :
    72         m_rooter(NULL), m_compartmentGlobal(NULL)
     72        m_rooter(NULL)
    7373    {
    7474        m_rt = JS_NewRuntime(runtimeSize);
    7575        ENSURE(m_rt); // TODO: error handling
     
    9898    JSRuntime* m_rt;
    9999    AutoGCRooter* m_rooter;
    100100
    101     JSObject* m_compartmentGlobal;
    102 
    103101private:
    104102
    105103
     
    241239    JSContext* m_cx;
    242240    JSObject* m_glob; // global scope object
    243241    JSObject* m_nativeScope; // native function scope object
    244     JSCrossCompartmentCall* m_call;
    245242};
    246243
    247244namespace
     
    507504    }
    508505
    509506    JS_SetOptions(m_cx, options);
    510 
    511507    JS_SetVersion(m_cx, JSVERSION_LATEST);
    512508
    513     // Threadsafe SpiderMonkey requires that we have a request before doing anything much
    514     JS_BeginRequest(m_cx);
     509    m_glob = JS_NewCompartmentAndGlobalObject(m_cx, &global_class, NULL);
    515510
    516     // We only want a single compartment per runtime
    517     if (m_runtime->m_compartmentGlobal)
    518     {
    519         m_call = JS_EnterCrossCompartmentCall(m_cx, m_runtime->m_compartmentGlobal);
    520         m_glob = JS_NewGlobalObject(m_cx, &global_class);
    521     }
    522     else
    523     {
    524         m_call = NULL;
    525         m_glob = JS_NewCompartmentAndGlobalObject(m_cx, &global_class, NULL);
    526         m_runtime->m_compartmentGlobal = m_glob;
    527     }
    528 
    529511    ok = JS_InitStandardClasses(m_cx, m_glob);
    530512    ENSURE(ok);
    531513
     
    547529
    548530ScriptInterface_impl::~ScriptInterface_impl()
    549531{
    550     if (m_call)
    551         JS_LeaveCrossCompartmentCall(m_call);
    552     JS_EndRequest(m_cx);
    553532    JS_DestroyContext(m_cx);
    554533}
    555534
     
    594573        else
    595574            g_DebuggingServer->RegisterScriptinterface(debugName, this);
    596575    }
     576
     577    m_CxPrivate.pScriptInterface = this;
     578    JS_SetContextPrivate(m->m_cx, (void*)&m_CxPrivate);
    597579}
    598580
    599581ScriptInterface::~ScriptInterface()
     
    614596    JS_ShutDown();
    615597}
    616598
    617 void ScriptInterface::SetCallbackData(void* cbdata)
     599void ScriptInterface::SetCallbackData(void* pCBData)
    618600{
    619     JS_SetContextPrivate(m->m_cx, cbdata);
     601    m_CxPrivate.pCBData = pCBData;
    620602}
    621603
    622 void* ScriptInterface::GetCallbackData(JSContext* cx)
     604ScriptInterface::CxPrivate* ScriptInterface::GetScriptInterfaceAndCBData(JSContext* cx)
    623605{
    624     return JS_GetContextPrivate(cx);
     606    CxPrivate* pCxPrivate = (CxPrivate*)JS_GetContextPrivate(cx);
     607    return pCxPrivate;
    625608}
    626609
    627610bool ScriptInterface::LoadGlobalScripts()
     
    674657    return m->m_cx;
    675658}
    676659
    677 JSRuntime* ScriptInterface::GetRuntime() const
     660JSRuntime* ScriptInterface::GetJSRuntime() const
    678661{
    679662    return m->m_runtime->m_rt;
    680663}
    681664
     665shared_ptr<ScriptRuntime> ScriptInterface::GetRuntime() const
     666{
     667    return m->m_runtime;
     668}
     669
    682670AutoGCRooter* ScriptInterface::ReplaceAutoGCRooter(AutoGCRooter* rooter)
    683671{
    684672    AutoGCRooter* ret = m->m_runtime->m_rooter;
     
    734722    return OBJECT_TO_JSVAL(obj);
    735723}
    736724
     725void ScriptInterface::DefineCustomObjectType(JSClass *clasp, JSNative constructor, uint minArgs, JSPropertySpec *ps, JSFunctionSpec *fs, JSPropertySpec *static_ps, JSFunctionSpec *static_fs)
     726{
     727    std::string typeName = clasp->name;
     728
     729    if (m_CustomObjectTypes.find(typeName) != m_CustomObjectTypes.end())
     730    {
     731        // This type already exists
     732        throw PSERROR_Scripting_DefineType_AlreadyExists();
     733    }
     734
     735    JSObject * obj = JS_InitClass(  m->m_cx, JSVAL_TO_OBJECT(GetGlobalObject()), 0,
     736                                    clasp,
     737                                    constructor, minArgs,               // Constructor, min args
     738                                    ps, fs,                             // Properties, methods
     739                                    static_ps, static_fs);              // Constructor properties, methods
     740
     741    if (obj == NULL)
     742        throw PSERROR_Scripting_DefineType_CreationFailed();
     743
     744    CustomType type;
     745
     746    type.m_Object = obj;
     747    type.m_Class = clasp;
     748    type.m_Constructor = constructor;
     749
     750    m_CustomObjectTypes[typeName] = type;
     751}
     752
     753JSObject* ScriptInterface::CreateCustomObject(const std::string & typeName)
     754{
     755    std::map < std::string, CustomType > ::iterator it = m_CustomObjectTypes.find(typeName);
     756
     757    if (it == m_CustomObjectTypes.end())
     758        throw PSERROR_Scripting_TypeDoesNotExist();
     759
     760    JSFunction* ctor = JS_NewFunction(m->m_cx, (*it).second.m_Constructor, 0, 0,
     761               NULL, "ctor_fun");
     762    return JS_New(m->m_cx, JS_GetFunctionObject(ctor), 0, NULL);
     763}
     764
     765
    737766bool ScriptInterface::CallFunctionVoid(jsval val, const char* name)
    738767{
    739768    jsval jsRet;
     
    951980    return ok ? true : false;
    952981}
    953982
    954 bool ScriptInterface::LoadGlobalScript(const VfsPath& filename, const std::string& code)
     983bool ScriptInterface::LoadGlobalScript(const VfsPath& filename, const std::wstring& code)
    955984{
    956985    // Compile the code in strict mode, to encourage better coding practices and
    957986    // to possibly help SpiderMonkey with optimisations
    958     std::wstring codeStrict = L"\"use strict\";\n" + wstring_from_utf8(code);
     987    std::wstring codeStrict = L"\"use strict\";\n" + code;
    959988    utf16string codeUtf16(codeStrict.begin(), codeStrict.end());
    960989    uintN lineNo = 0; // put the automatic 'use strict' on line 0, so the real code starts at line 1
    961990
     
    11871216#if MOZJS_DEBUG_ABI
    11881217    JS_DumpHeap(m->m_cx, stderr, NULL, 0, NULL, (size_t)-1, NULL);
    11891218#endif
    1190     fprintf(stderr, "# Bytes allocated: %u\n", JS_GetGCParameter(GetRuntime(), JSGC_BYTES));
     1219    fprintf(stderr, "# Bytes allocated: %u\n", JS_GetGCParameter(GetJSRuntime(), JSGC_BYTES));
    11911220    JS_GC(m->m_cx);
    1192     fprintf(stderr, "# Bytes allocated after GC: %u\n", JS_GetGCParameter(GetRuntime(), JSGC_BYTES));
     1221    fprintf(stderr, "# Bytes allocated after GC: %u\n", JS_GetGCParameter(GetJSRuntime(), JSGC_BYTES));
    11931222}
    11941223
    11951224void ScriptInterface::MaybeGC()
     
    13371366    uint64* data = NULL;
    13381367    size_t nbytes = 0;
    13391368    if (!JS_WriteStructuredClone(m->m_cx, v, &data, &nbytes, NULL, NULL))
     1369    {
     1370        debug_warn(L"Writing a structured clone with JS_WriteStructuredClone failed!");
    13401371        return shared_ptr<StructuredClone>();
    1341     // TODO: should we have better error handling?
    1342     // Currently we'll probably continue and then crash in ReadStructuredClone
     1372    }
    13431373
    13441374    shared_ptr<StructuredClone> ret (new StructuredClone);
    13451375    ret->m_Context = m->m_cx;
  • source/scriptinterface/NativeWrapperDecls.h

     
    4040
    4141// Define RegisterFunction<TR, T0..., f>
    4242#define OVERLOADS(z, i, data) \
    43     template <typename R, TYPENAME_T0_HEAD(z,i)  R (*fptr) ( void* T0_TAIL(z,i) )> \
     43    template <typename R, TYPENAME_T0_HEAD(z,i)  R (*fptr) ( ScriptInterface::CxPrivate* T0_TAIL(z,i) )> \
    4444    void RegisterFunction(const char* name) { \
    4545        Register(name, call<R, T0_HEAD(z,i)  fptr>, nargs<0 T0_TAIL(z,i)>()); \
    4646    }
     
    5050// JSFastNative-compatible function that wraps the function identified in the template argument list
    5151// (Definition comes later, since it depends on some things we haven't defined yet)
    5252#define OVERLOADS(z, i, data) \
    53     template <typename R, TYPENAME_T0_HEAD(z,i)  R (*fptr) ( void* T0_TAIL(z,i) )> \
     53    template <typename R, TYPENAME_T0_HEAD(z,i)  R (*fptr) ( ScriptInterface::CxPrivate* T0_TAIL(z,i) )> \
    5454    static JSBool call(JSContext* cx, uintN argc, jsval* vp);
    5555BOOST_PP_REPEAT(SCRIPT_INTERFACE_MAX_ARGS, OVERLOADS, ~)
    5656#undef OVERLOADS
  • source/scriptinterface/NativeWrapperDefns.h

     
    2727    #define OVERLOADS(z, i, data) \
    2828        template<TYPENAME_T0_HEAD(z,i)  typename F> \
    2929        static void call(JSContext* cx, jsval& rval, F fptr  T0_A0(z,i)) { \
    30             rval = ScriptInterface::ToJSVal<R>(cx, fptr(ScriptInterface::GetCallbackData(cx) A0_TAIL(z,i))); \
     30            rval = ScriptInterface::ToJSVal<R>(cx, fptr(ScriptInterface::GetScriptInterfaceAndCBData(cx) A0_TAIL(z,i))); \
    3131        }
    3232
    3333    BOOST_PP_REPEAT(SCRIPT_INTERFACE_MAX_ARGS, OVERLOADS, ~)
     
    4040    #define OVERLOADS(z, i, data) \
    4141        template<TYPENAME_T0_HEAD(z,i)  typename F> \
    4242        static void call(JSContext* cx, jsval& /*rval*/, F fptr  T0_A0(z,i)) { \
    43             fptr(ScriptInterface::GetCallbackData(cx) A0_TAIL(z,i)); \
     43            fptr(ScriptInterface::GetScriptInterfaceAndCBData(cx) A0_TAIL(z,i)); \
    4444        }
    4545    BOOST_PP_REPEAT(SCRIPT_INTERFACE_MAX_ARGS, OVERLOADS, ~)
    4646    #undef OVERLOADS
     
    9090
    9191// JSFastNative-compatible function that wraps the function identified in the template argument list
    9292#define OVERLOADS(z, i, data) \
    93     template <typename R, TYPENAME_T0_HEAD(z,i)  R (*fptr) ( void* T0_TAIL(z,i) )> \
     93    template <typename R, TYPENAME_T0_HEAD(z,i)  R (*fptr) ( ScriptInterface::CxPrivate* T0_TAIL(z,i) )> \
    9494    JSBool ScriptInterface::call(JSContext* cx, uintN argc, jsval* vp) { \
    9595        UNUSED2(argc); \
    9696        SCRIPT_PROFILE \
  • source/scriptinterface/ScriptInterface.h

     
    2727
    2828#include "js/jsapi.h"
    2929
     30#include "ps/Errors.h"
     31ERROR_GROUP(Scripting);
     32ERROR_TYPE(Scripting, SetupFailed);
     33
     34ERROR_SUBGROUP(Scripting, LoadFile);
     35ERROR_TYPE(Scripting_LoadFile, OpenFailed);
     36ERROR_TYPE(Scripting_LoadFile, EvalErrors);
     37
     38ERROR_TYPE(Scripting, ConversionFailed);
     39ERROR_TYPE(Scripting, CallFunctionFailed);
     40ERROR_TYPE(Scripting, RegisterFunctionFailed);
     41ERROR_TYPE(Scripting, DefineConstantFailed);
     42ERROR_TYPE(Scripting, CreateObjectFailed);
     43ERROR_TYPE(Scripting, TypeDoesNotExist);
     44
     45ERROR_SUBGROUP(Scripting, DefineType);
     46ERROR_TYPE(Scripting_DefineType, AlreadyExists);
     47ERROR_TYPE(Scripting_DefineType, CreationFailed);
     48
    3049#include "lib/file/vfs/vfs_path.h"
    3150#include "ps/Profile.h"
    3251#include "ps/utf16string.h"
     
    4766
    4867class ScriptRuntime;
    4968
     69extern shared_ptr<ScriptRuntime> g_ScriptRuntime;
     70
    5071class CDebuggingServer;
    5172
    5273/**
     
    87108     */
    88109    static void ShutDown();
    89110
    90     void SetCallbackData(void* cbdata);
    91     static void* GetCallbackData(JSContext* cx);
     111    struct CxPrivate
     112    {
     113        ScriptInterface* pScriptInterface; // the ScriptInterface object the current context belongs to
     114        void* pCBData; // meant to be used as the "this" object for callback functions
     115    } m_CxPrivate;
    92116
     117    void SetCallbackData(void* pCBData);
     118    static CxPrivate* GetScriptInterfaceAndCBData(JSContext* cx);
     119
    93120    JSContext* GetContext() const;
    94     JSRuntime* GetRuntime() const;
     121    JSRuntime* GetJSRuntime() const;
     122    shared_ptr<ScriptRuntime> GetRuntime() const;
    95123
    96124    /**
    97125     * Load global scripts that most script contexts need,
     
    170198    template<typename T0, typename T1, typename T2, typename T3, typename R>
    171199    bool CallFunction(jsval val, const char* name, const T0& a0, const T1& a1, const T2& a2, const T3& a3, R& ret);
    172200
     201    JSObject* CreateCustomObject(const std::string & typeName);
     202    void DefineCustomObjectType(JSClass *clasp, JSNative constructor, uint minArgs, JSPropertySpec *ps, JSFunctionSpec *fs, JSPropertySpec *static_ps, JSFunctionSpec *static_fs);
     203
    173204    jsval GetGlobalObject();
    174205
    175206    JSClass* GetGlobalClass();
     
    268299     * @param code JS code to execute
    269300     * @return true on successful compilation and execution; false otherwise
    270301     */
    271     bool LoadGlobalScript(const VfsPath& filename, const std::string& code);
     302    bool LoadGlobalScript(const VfsPath& filename, const std::wstring& code);
    272303
    273304    /**
    274305     * Load and execute the given script in the global scope.
     
    342373    static JSClass* GetClass(JSContext* cx, JSObject* obj);
    343374    static void* GetPrivate(JSContext* cx, JSObject* obj);
    344375
     376    class CustomType
     377    {
     378    public:
     379        JSObject *  m_Object;
     380        JSClass *   m_Class;
     381        JSNative    m_Constructor;
     382    };
    345383    void Register(const char* name, JSNative fptr, size_t nargs);
    346384    std::auto_ptr<ScriptInterface_impl> m;
     385   
     386    std::map<std::string, CustomType> m_CustomObjectTypes;
    347387
    348388// The nasty macro/template bits are split into a separate file so you don't have to look at them
    349389public:
  • source/network/NetTurnManager.cpp

     
    333333
    334334    m_QuickSaveState = stream.str();
    335335    if (g_GUI)
    336         m_QuickSaveMetadata = g_GUI->GetScriptInterface().StringifyJSON(g_GUI->GetSavedGameData().get(), false);
     336        m_QuickSaveMetadata = g_GUI->GetSavedGameData();
    337337    else
    338338        m_QuickSaveMetadata = std::string();
    339339
     
    360360    }
    361361
    362362    if (g_GUI && !m_QuickSaveMetadata.empty())
    363         g_GUI->GetScriptInterface().CallFunctionVoid(OBJECT_TO_JSVAL(g_GUI->GetScriptObject()),
    364         "restoreSavedGameData", g_GUI->GetScriptInterface().ParseJSON(m_QuickSaveMetadata));
     363        g_GUI->RestoreSavedGameData(m_QuickSaveMetadata);
    365364
    366365    LOGMESSAGERENDER(L"Quickloaded game");
    367366
  • source/tools/atlas/GameInterface/ActorViewer.cpp

     
    6767        MeshManager(ColladaManager),
    6868        SkeletonAnimManager(ColladaManager),
    6969        UnitManager(),
    70         Simulation2(&UnitManager, &Terrain),
     70        Simulation2(&UnitManager, g_ScriptRuntime, &Terrain),
    7171        ObjectManager(MeshManager, SkeletonAnimManager, Simulation2),
    7272        LOSTexture(Simulation2),
    7373        TerritoryTexture(Simulation2)
  • source/tools/atlas/GameInterface/GameLoop.cpp

     
    3939#include "ps/Profile.h"
    4040#include "ps/GameSetup/Paths.h"
    4141#include "renderer/Renderer.h"
    42 #include "scripting/ScriptingHost.h"
    4342
    4443using namespace AtlasMessage;
    4544
     
    329328
    330329    // Clean up
    331330    AtlasView::DestroyViews();
    332     ScriptingHost::FinalShutdown();
    333331    AtlasMessage::g_MessagePasser = NULL;
    334332
    335333    return true;
  • source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp

     
    2525#include "graphics/CinemaTrack.h"
    2626#include "graphics/GameView.h"
    2727#include "gui/GUIManager.h"
     28#include "gui/GUI.h"
    2829#include "lib/external_libraries/libsdl.h"
    2930#include "lib/sysdep/cpu.h"
    3031#include "maths/MathUtil.h"
     
    3334#include "ps/GameSetup/Config.h"
    3435#include "ps/GameSetup/GameSetup.h"
    3536#include "renderer/Renderer.h"
    36 #include "scripting/ScriptingHost.h"
    3737
    3838extern void (*Atlas_GLSwapBuffers)(void* context);
    3939
     
    149149
    150150MESSAGEHANDLER(JavaScript)
    151151{
    152     g_ScriptingHost.ExecuteScript(*msg->command, L"Atlas");
     152    // TODO YGW: not sure if that works
     153    g_GUI->GetActiveGUI()->GetScriptInterface()->LoadGlobalScript(L"Atlas", *msg->command);
    153154}
    154155
    155156MESSAGEHANDLER(GuiSwitchPage)
    156157{
    157     g_GUI->SwitchPage(*msg->page, CScriptVal());
     158    g_GUI->SwitchPage(*msg->page, NULL, JSVAL_VOID);
    158159}
    159160
    160161MESSAGEHANDLER(GuiMouseButtonEvent)
  • source/scripting/ScriptingHost.cpp

     
    1 /* Copyright (C) 2010 Wildfire Games.
    2  * This file is part of 0 A.D.
    3  *
    4  * 0 A.D. is free software: you can redistribute it and/or modify
    5  * it under the terms of the GNU General Public License as published by
    6  * the Free Software Foundation, either version 2 of the License, or
    7  * (at your option) any later version.
    8  *
    9  * 0 A.D. is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 
    18 #include "precompiled.h"
    19 
    20 #include <sstream>
    21 
    22 #include "ScriptingHost.h"
    23 #include "ScriptGlue.h"
    24 #include "lib/utf8.h"
    25 #include "ps/Profile.h"
    26 #include "ps/CLogger.h"
    27 #include "ps/Filesystem.h"
    28 #include "scriptinterface/ScriptInterface.h"
    29 
    30 ScriptingHost::ScriptingHost()
    31 {
    32     m_ScriptInterface = new ScriptInterface("Engine", "GUI", ScriptInterface::CreateRuntime());
    33 
    34     m_Context = m_ScriptInterface->GetContext();
    35 
    36     m_GlobalObject = JS_GetGlobalObject(m_Context);
    37 
    38     if (!JS_DefineFunctions(m_Context, m_GlobalObject, ScriptFunctionTable))
    39         throw PSERROR_Scripting_SetupFailed();
    40 }
    41 
    42 ScriptingHost::~ScriptingHost()
    43 {
    44     delete m_ScriptInterface;
    45 }
    46 
    47 ScriptInterface& ScriptingHost::GetScriptInterface()
    48 {
    49     return *m_ScriptInterface;
    50 }
    51 
    52 void ScriptingHost::FinalShutdown()
    53 {
    54     // This should only be called once per process, just to clean up before
    55     // we report memory leaks. (Otherwise, if it's called while there are
    56     // other contexts active in other threads, things will break.)
    57     JS_ShutDown();
    58 }
    59 
    60 // filename, line and globalObject default to 0 (in which case we execute
    61 // the whole script / use our m_GlobalObject)
    62 void ScriptingHost::RunMemScript(const char* script, size_t size, const char* filename, int line, JSObject* globalObject)
    63 {
    64     if(!filename)
    65         filename = "unspecified file";
    66     if(!globalObject)
    67         globalObject = m_GlobalObject;
    68 
    69     // Maybe TODO: support Unicode input formats?
    70 
    71     jsval rval;
    72     JSBool ok = JS_EvaluateScript(m_Context, globalObject, script, (uintN)size, filename, line, &rval);
    73 
    74     if (ok == JS_FALSE)
    75         throw PSERROR_Scripting_LoadFile_EvalErrors();
    76 }
    77 
    78 // globalObject defaults to 0 (in which case we use our m_GlobalObject).
    79 void ScriptingHost::RunScript(const VfsPath& pathname, JSObject* globalObject)
    80 {
    81     if(!globalObject)
    82         globalObject = m_GlobalObject;
    83 
    84     shared_ptr<u8> buf; size_t size;
    85     if(g_VFS->LoadFile(pathname, buf, size) != INFO::OK)    // ERRTODO: translate/pass it on
    86         throw PSERROR_Scripting_LoadFile_OpenFailed();
    87 
    88     std::wstring scriptw = wstring_from_utf8(std::string(buf.get(), buf.get() + size));
    89     utf16string script(scriptw.begin(), scriptw.end());
    90 
    91     jsval rval;
    92     JSBool ok = JS_EvaluateUCScript(m_Context, globalObject,
    93         reinterpret_cast<const jschar*>(script.c_str()), (uintN)script.size(),
    94         utf8_from_wstring(pathname.string()).c_str(), 1, &rval);
    95 
    96     if (ok == JS_FALSE)
    97         throw PSERROR_Scripting_LoadFile_EvalErrors();
    98 }
    99 
    100 jsval ScriptingHost::ExecuteScript(const CStrW& script, const CStrW& calledFrom, JSObject* contextObject )
    101 {
    102     jsval rval;
    103 
    104     JSBool ok = JS_EvaluateUCScript(m_Context, contextObject ? contextObject : m_GlobalObject,
    105         reinterpret_cast<const jschar*>(script.utf16().c_str()), (int)script.length(),
    106         calledFrom.ToUTF8().c_str(), 1, &rval);
    107 
    108     if (!ok) return JSVAL_NULL;
    109 
    110     return rval;
    111 }
    112 
    113 void ScriptingHost::DefineCustomObjectType(JSClass *clasp, JSNative constructor, uintN minArgs, JSPropertySpec *ps, JSFunctionSpec *fs, JSPropertySpec *static_ps, JSFunctionSpec *static_fs)
    114 {
    115     std::string typeName = clasp->name;
    116 
    117     if (m_CustomObjectTypes.find(typeName) != m_CustomObjectTypes.end())
    118     {
    119         // This type already exists
    120         throw PSERROR_Scripting_DefineType_AlreadyExists();
    121     }
    122 
    123     JSObject * obj = JS_InitClass(  m_Context, m_GlobalObject, 0,
    124                                     clasp,
    125                                     constructor, minArgs,               // Constructor, min args
    126                                     ps, fs,                             // Properties, methods
    127                                     static_ps, static_fs);              // Constructor properties, methods
    128 
    129     if (obj == NULL)
    130         throw PSERROR_Scripting_DefineType_CreationFailed();
    131 
    132     CustomType type;
    133    
    134     type.m_Object = obj;
    135     type.m_Class = clasp;
    136 
    137     m_CustomObjectTypes[typeName] = type;
    138 }
    139 
    140 JSObject * ScriptingHost::CreateCustomObject(const std::string & typeName)
    141 {
    142     std::map < std::string, CustomType > ::iterator it = m_CustomObjectTypes.find(typeName);
    143 
    144     if (it == m_CustomObjectTypes.end())
    145         throw PSERROR_Scripting_TypeDoesNotExist();
    146 
    147     return JS_ConstructObject(m_Context, (*it).second.m_Class, (*it).second.m_Object, NULL);
    148 
    149 }
    150 
    151 
    152 
    153 void ScriptingHost::SetObjectProperty(JSObject * object, const std::string & propertyName, jsval value)
    154 {
    155     JS_SetProperty(m_Context, object, propertyName.c_str(), &value);
    156 }
    157 
    158 jsval ScriptingHost::GetObjectProperty( JSObject* object, const std::string& propertyName )
    159 {
    160     jsval vp;
    161     JS_GetProperty( m_Context, object, propertyName.c_str(), &vp );
    162     return( vp );
    163 }
    164 
    165 
    166 
    167 void ScriptingHost::SetObjectProperty_Double(JSObject* object, const char* propertyName, double value)
    168 {
    169     jsval v;
    170     if (! JS_NewNumberValue(m_Context, value, &v))
    171         throw PSERROR_Scripting_ConversionFailed();
    172 
    173     if (! JS_SetProperty(m_Context, object, propertyName, &v))
    174         throw PSERROR_Scripting_ConversionFailed();
    175 }
    176 
    177 double ScriptingHost::GetObjectProperty_Double(JSObject* object, const char* propertyName)
    178 {
    179     jsval v;
    180     double d;
    181 
    182     if (! JS_GetProperty(m_Context, object, propertyName, &v))
    183         throw PSERROR_Scripting_ConversionFailed();
    184     if (! JS_ValueToNumber(m_Context, v, &d))
    185         throw PSERROR_Scripting_ConversionFailed();
    186     return d;
    187 }
    188 
    189 
    190 
    191 void ScriptingHost::SetGlobal(const std::string &globalName, jsval value)
    192 {
    193     JS_SetProperty(m_Context, m_GlobalObject, globalName.c_str(), &value);
    194 }
    195 
    196 
    197 
    198 //----------------------------------------------------------------------------
    199 // conversions
    200 //----------------------------------------------------------------------------
    201 
    202 CStrW ScriptingHost::ValueToUCString( const jsval value )
    203 {
    204     JSString* string = JS_ValueToString(m_Context, value);
    205     if (string == NULL)
    206         throw PSERROR_Scripting_ConversionFailed();
    207 
    208     size_t length;
    209     const jschar *strptr = JS_GetStringCharsAndLength(m_Context, string, &length);
    210     if (!strptr)
    211         throw PSERROR_Scripting_ConversionFailed();
    212 
    213     return std::wstring(strptr, strptr+length);
    214 }
  • source/scripting/ScriptGlue.cpp

     
    1 /* Copyright (C) 2013 Wildfire Games.
    2  * This file is part of 0 A.D.
    3  *
    4  * 0 A.D. is free software: you can redistribute it and/or modify
    5  * it under the terms of the GNU General Public License as published by
    6  * the Free Software Foundation, either version 2 of the License, or
    7  * (at your option) any later version.
    8  *
    9  * 0 A.D. is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 
    18 // This module defines the table of all functions callable from JS.
    19 // it's required by the interpreter; we make use of the opportunity to
    20 // document them all in one spot. we thus obviate having to dig through
    21 // all the other headers. most of the functions are implemented here;
    22 // as for the rest, we only link to their docs (duplication is bad).
    23 
    24 #include "precompiled.h"
    25 
    26 #include "ScriptGlue.h"
    27 
    28 #include "graphics/GameView.h"
    29 #include "graphics/LightEnv.h"
    30 #include "graphics/MapWriter.h"
    31 #include "graphics/Unit.h"
    32 #include "graphics/UnitManager.h"
    33 #include "gui/GUIManager.h"
    34 #include "gui/IGUIObject.h"
    35 #include "lib/frequency_filter.h"
    36 #include "lib/svn_revision.h"
    37 #include "lib/timer.h"
    38 #include "lib/sysdep/sysdep.h"  // sys_OpenFile
    39 #include "network/NetServer.h"
    40 #include "ps/CConsole.h"
    41 #include "ps/CLogger.h"
    42 #include "ps/CStr.h"
    43 #include "ps/Game.h"
    44 #include "ps/Globals.h" // g_frequencyFilter
    45 #include "ps/GameSetup/GameSetup.h"
    46 #include "ps/Hotkey.h"
    47 #include "ps/ProfileViewer.h"
    48 #include "ps/World.h"
    49 #include "ps/scripting/JSInterface_Console.h"
    50 #include "ps/scripting/JSInterface_VFS.h"
    51 #include "renderer/Renderer.h"
    52 #include "scriptinterface/ScriptInterface.h"
    53 #include "simulation2/Simulation2.h"
    54 #include "soundmanager/ISoundManager.h"
    55 
    56 // rationale: the function table is now at the end of the source file to
    57 // avoid the need for forward declarations for every function.
    58 
    59 // all normal function wrappers have the following signature:
    60 //   JSBool func(JSContext* cx, JSObject* globalObject, uintN argc, jsval* argv, jsval* rval);
    61 // all property accessors have the following signature:
    62 //   JSBool accessor(JSContext* cx, JSObject* globalObject, jsval id, jsval* vp);
    63 
    64 
    65 //-----------------------------------------------------------------------------
    66 // Timer
    67 //-----------------------------------------------------------------------------
    68 
    69 
    70 // Script profiling functions: Begin timing a piece of code with StartJsTimer(num)
    71 // and stop timing with StopJsTimer(num). The results will be printed to stdout
    72 // when the game exits.
    73 
    74 static const size_t MAX_JS_TIMERS = 20;
    75 static TimerUnit js_start_times[MAX_JS_TIMERS];
    76 static TimerUnit js_timer_overhead;
    77 static TimerClient js_timer_clients[MAX_JS_TIMERS];
    78 static wchar_t js_timer_descriptions_buf[MAX_JS_TIMERS * 12];   // depends on MAX_JS_TIMERS and format string below
    79 
    80 static void InitJsTimers()
    81 {
    82     wchar_t* pos = js_timer_descriptions_buf;
    83     for(size_t i = 0; i < MAX_JS_TIMERS; i++)
    84     {
    85         const wchar_t* description = pos;
    86         pos += swprintf_s(pos, 12, L"js_timer %d", (int)i)+1;
    87         timer_AddClient(&js_timer_clients[i], description);
    88     }
    89 
    90     // call several times to get a good approximation of 'hot' performance.
    91     // note: don't use a separate timer slot to warm up and then judge
    92     // overhead from another: that causes worse results (probably some
    93     // caching effects inside JS, but I don't entirely understand why).
    94     static const char* calibration_script =
    95         "startXTimer(0);\n"
    96         "stopXTimer (0);\n"
    97         "\n";
    98     g_ScriptingHost.RunMemScript(calibration_script, strlen(calibration_script));
    99     // slight hack: call RunMemScript twice because we can't average several
    100     // TimerUnit values because there's no operator/. this way is better anyway
    101     // because it hopefully avoids the one-time JS init overhead.
    102     g_ScriptingHost.RunMemScript(calibration_script, strlen(calibration_script));
    103     js_timer_overhead = js_timer_clients[0].sum;
    104     js_timer_clients[0].sum.SetToZero();
    105 }
    106 
    107 JSBool StartJsTimer(JSContext* cx, uintN argc, jsval* vp)
    108 {
    109     ONCE(InitJsTimers());
    110 
    111     JSU_REQUIRE_PARAMS(1);
    112     size_t slot;
    113     ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], slot);
    114     if (slot >= MAX_JS_TIMERS)
    115         return JS_FALSE;
    116 
    117     js_start_times[slot].SetFromTimer();
    118 
    119     JS_SET_RVAL(cx, vp, JSVAL_VOID);
    120     return JS_TRUE;
    121 }
    122 
    123 
    124 JSBool StopJsTimer(JSContext* cx, uintN argc, jsval* vp)
    125 {
    126     JSU_REQUIRE_PARAMS(1);
    127     size_t slot;
    128     ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], slot);
    129     if (slot >= MAX_JS_TIMERS)
    130         return JS_FALSE;
    131 
    132     TimerUnit now;
    133     now.SetFromTimer();
    134     now.Subtract(js_timer_overhead);
    135     BillingPolicy_Default()(&js_timer_clients[slot], js_start_times[slot], now);
    136     js_start_times[slot].SetToZero();
    137 
    138     JS_SET_RVAL(cx, vp, JSVAL_VOID);
    139     return JS_TRUE;
    140 }
    141 
    142 
    143 //-----------------------------------------------------------------------------
    144 // Game Setup
    145 //-----------------------------------------------------------------------------
    146 
    147 // Immediately ends the current game (if any).
    148 // params:
    149 // returns:
    150 JSBool EndGame(JSContext* cx, uintN argc, jsval* vp)
    151 {
    152     JSU_REQUIRE_NO_PARAMS();
    153 
    154     EndGame();
    155 
    156     JS_SET_RVAL(cx, vp, JSVAL_VOID);
    157     return JS_TRUE;
    158 }
    159 
    160 //-----------------------------------------------------------------------------
    161 // Misc. Engine Interface
    162 //-----------------------------------------------------------------------------
    163 
    164 // Return the global frames-per-second value.
    165 // params:
    166 // returns: FPS [int]
    167 // notes:
    168 // - This value is recalculated once a frame. We take special care to
    169 //   filter it, so it is both accurate and free of jitter.
    170 JSBool GetFps(JSContext* cx, uintN argc, jsval* vp)
    171 {
    172     JSU_REQUIRE_NO_PARAMS();
    173     int freq = 0;
    174     if (g_frequencyFilter)
    175         freq = g_frequencyFilter->StableFrequency();
    176     JS_SET_RVAL(cx, vp, INT_TO_JSVAL(freq));
    177     return JS_TRUE;
    178 }
    179 
    180 
    181 // Cause the game to exit gracefully.
    182 // params:
    183 // returns:
    184 // notes:
    185 // - Exit happens after the current main loop iteration ends
    186 //   (since this only sets a flag telling it to end)
    187 JSBool ExitProgram(JSContext* cx, uintN argc, jsval* vp)
    188 {
    189     JSU_REQUIRE_NO_PARAMS();
    190 
    191     kill_mainloop();
    192 
    193     JS_SET_RVAL(cx, vp, JSVAL_VOID);
    194     return JS_TRUE;
    195 }
    196 
    197 
    198 // Change the mouse cursor.
    199 // params: cursor name [string] (i.e. basename of definition file and texture)
    200 // returns:
    201 // notes:
    202 // - Cursors are stored in "art\textures\cursors"
    203 JSBool SetCursor(JSContext* cx, uintN argc, jsval* vp)
    204 {
    205     JSU_REQUIRE_PARAMS(1);
    206     g_CursorName = g_ScriptingHost.ValueToUCString(JS_ARGV(cx, vp)[0]);
    207 
    208     JS_SET_RVAL(cx, vp, JSVAL_VOID);
    209     return JS_TRUE;
    210 }
    211 
    212 JSBool GetGUIObjectByName(JSContext* cx, uintN argc, jsval* vp)
    213 {
    214     JSU_REQUIRE_PARAMS(1);
    215 
    216     try
    217     {
    218         CStr name;
    219         ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], name);
    220         IGUIObject* guiObj = g_GUI->FindObjectByName(name);
    221         if (guiObj)
    222             JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(guiObj->GetJSObject()));
    223         else
    224             JS_SET_RVAL(cx, vp, JSVAL_NULL);
    225         return JS_TRUE;
    226     }
    227     catch (PSERROR_Scripting&)
    228     {
    229         return JS_FALSE;
    230     }
    231 }
    232 
    233 //-----------------------------------------------------------------------------
    234 // Miscellany
    235 //-----------------------------------------------------------------------------
    236 
    237 // Return the date/time at which the current executable was compiled.
    238 // params: none (-> "date time (svn revision)") OR an integer specifying
    239 //   what to display: 0 for date, 1 for time, 2 for svn revision
    240 // returns: string with the requested timestamp info
    241 // notes:
    242 // - Displayed on main menu screen; tells non-programmers which auto-build
    243 //   they are running. Could also be determined via .EXE file properties,
    244 //   but that's a bit more trouble.
    245 // - To be exact, the date/time returned is when scriptglue.cpp was
    246 //   last compiled, but the auto-build does full rebuilds.
    247 // - svn revision is generated by calling svnversion and cached in
    248 //   lib/svn_revision.cpp. it is useful to know when attempting to
    249 //   reproduce bugs (the main EXE and PDB should be temporarily reverted to
    250 //   that revision so that they match user-submitted crashdumps).
    251 JSBool GetBuildTimestamp(JSContext* cx, uintN argc, jsval* vp)
    252 {
    253     JSU_REQUIRE_MAX_PARAMS(1);
    254 
    255     char buf[200];
    256 
    257     // see function documentation
    258     const int mode = argc? JSVAL_TO_INT(JS_ARGV(cx, vp)[0]) : -1;
    259     switch(mode)
    260     {
    261     case -1:
    262         sprintf_s(buf, ARRAY_SIZE(buf), "%s %s (%ls)", __DATE__, __TIME__, svn_revision);
    263         break;
    264     case 0:
    265         sprintf_s(buf, ARRAY_SIZE(buf), "%s", __DATE__);
    266         break;
    267     case 1:
    268         sprintf_s(buf, ARRAY_SIZE(buf), "%s", __TIME__);
    269         break;
    270     case 2:
    271         sprintf_s(buf, ARRAY_SIZE(buf), "%ls", svn_revision);
    272         break;
    273     }
    274 
    275     JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buf)));
    276     return JS_TRUE;
    277 }
    278 
    279 #if MOZJS_DEBUG_ABI
    280 void DumpHeap(const char* basename, int idx, JSContext* cx)
    281 {
    282     char filename[64];
    283     sprintf_s(filename, ARRAY_SIZE(filename), "%s.%03d.txt", basename, idx);
    284     OsPath pathname = psLogDir() / filename;
    285     FILE* f = sys_OpenFile(pathname, "w");
    286     ENSURE(f);
    287     JS_DumpHeap(cx, f, NULL, 0, NULL, (size_t)-1, NULL);
    288     fclose(f);
    289 }
    290 #endif
    291 
    292 JSBool DumpHeaps(JSContext* cx, uintN argc, jsval* vp)
    293 {
    294     UNUSED2(cx);
    295     UNUSED2(argc);
    296 
    297 #if MOZJS_DEBUG_ABI
    298     static int i = 0;
    299 
    300     if (ScriptingHost::IsInitialised())
    301         DumpHeap("gui", i, g_ScriptingHost.GetContext());
    302     if (g_Game)
    303         DumpHeap("sim", i, g_Game->GetSimulation2()->GetScriptInterface().GetContext());
    304 
    305     ++i;
    306 #else
    307     debug_warn(L"DumpHeaps only available in DEBUG mode");
    308 #endif
    309 
    310     JS_SET_RVAL(cx, vp, JSVAL_VOID);
    311     return JS_TRUE;
    312 }
    313 
    314 //-----------------------------------------------------------------------------
    315 
    316 // Is the game paused?
    317 JSBool IsPaused(JSContext* cx, uintN argc, jsval* vp)
    318 {
    319     JSU_REQUIRE_NO_PARAMS();
    320 
    321     if (!g_Game)
    322     {
    323         JS_ReportError(cx, "Game is not started");
    324         return JS_FALSE;
    325     }
    326 
    327     JS_SET_RVAL(cx, vp, g_Game->m_Paused ? JSVAL_TRUE : JSVAL_FALSE);
    328     return JS_TRUE;
    329 }
    330 
    331 // Pause/unpause the game
    332 JSBool SetPaused(JSContext* cx, uintN argc, jsval* vp)
    333 {
    334     JSU_REQUIRE_PARAMS( 1 );
    335 
    336     if (!g_Game)
    337     {
    338         JS_ReportError(cx, "Game is not started");
    339         return JS_FALSE;
    340     }
    341 
    342     try
    343     {
    344         ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], g_Game->m_Paused);
    345 
    346         if ( g_SoundManager )
    347             g_SoundManager->Pause(g_Game->m_Paused);
    348     }
    349     catch (PSERROR_Scripting_ConversionFailed&)
    350     {
    351         JS_ReportError(cx, "Invalid parameter to SetPaused");
    352     }
    353 
    354     JS_SET_RVAL(cx, vp, JSVAL_VOID);
    355     return JS_TRUE;
    356 }
    357 
    358 
    359 //-----------------------------------------------------------------------------
    360 // function table
    361 //-----------------------------------------------------------------------------
    362 
    363 // the JS interpreter expects the table to contain 5-tuples as follows:
    364 // - name the function will be called as from script;
    365 // - function which will be called;
    366 // - number of arguments this function expects
    367 // - Flags (deprecated, always zero)
    368 // - Extra (reserved for future use, always zero)
    369 //
    370 // we simplify this a bit with a macro:
    371 #define JS_FUNC(script_name, cpp_function, min_params) { script_name, cpp_function, min_params, 0 },
    372 
    373 JSFunctionSpec ScriptFunctionTable[] =
    374 {
    375     // Profiling
    376     JS_FUNC("startXTimer", StartJsTimer, 1)
    377     JS_FUNC("stopXTimer", StopJsTimer, 1)
    378 
    379     // Game Setup
    380     JS_FUNC("endGame", EndGame, 0)
    381 
    382     // VFS (external)
    383     JS_FUNC("buildDirEntList", JSI_VFS::BuildDirEntList, 1)
    384     JS_FUNC("fileExists", JSI_VFS::FileExists, 1)
    385     JS_FUNC("getFileMTime", JSI_VFS::GetFileMTime, 1)
    386     JS_FUNC("getFileSize", JSI_VFS::GetFileSize, 1)
    387     JS_FUNC("readFile", JSI_VFS::ReadFile, 1)
    388     JS_FUNC("readFileLines", JSI_VFS::ReadFileLines, 1)
    389 
    390     // Misc. Engine Interface
    391     JS_FUNC("exit", ExitProgram, 0)
    392     JS_FUNC("isPaused", IsPaused, 0)
    393     JS_FUNC("setPaused", SetPaused, 1)
    394     JS_FUNC("setCursor", SetCursor, 1)
    395     JS_FUNC("getFPS", GetFps, 0)
    396     JS_FUNC("getGUIObjectByName", GetGUIObjectByName, 1)
    397 
    398     // Miscellany
    399     JS_FUNC("buildTime", GetBuildTimestamp, 0)
    400     JS_FUNC("dumpHeaps", DumpHeaps, 0)
    401 
    402     // end of table marker
    403     {0}
    404 };
    405 #undef JS_FUNC
  • source/scripting/ScriptingHost.h

     
    1 /* Copyright (C) 2009 Wildfire Games.
    2  * This file is part of 0 A.D.
    3  *
    4  * 0 A.D. is free software: you can redistribute it and/or modify
    5  * it under the terms of the GNU General Public License as published by
    6  * the Free Software Foundation, either version 2 of the License, or
    7  * (at your option) any later version.
    8  *
    9  * 0 A.D. is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 
    18 
    19 #ifndef INCLUDED_SCRIPTINGHOST
    20 #define INCLUDED_SCRIPTINGHOST
    21 
    22 #include "ps/Errors.h"
    23 
    24 ERROR_GROUP(Scripting);
    25 ERROR_TYPE(Scripting, SetupFailed);
    26 
    27 ERROR_SUBGROUP(Scripting, LoadFile);
    28 ERROR_TYPE(Scripting_LoadFile, OpenFailed);
    29 ERROR_TYPE(Scripting_LoadFile, EvalErrors);
    30 
    31 ERROR_TYPE(Scripting, ConversionFailed);
    32 ERROR_TYPE(Scripting, CallFunctionFailed);
    33 ERROR_TYPE(Scripting, RegisterFunctionFailed);
    34 ERROR_TYPE(Scripting, DefineConstantFailed);
    35 ERROR_TYPE(Scripting, CreateObjectFailed);
    36 ERROR_TYPE(Scripting, TypeDoesNotExist);
    37 
    38 ERROR_SUBGROUP(Scripting, DefineType);
    39 ERROR_TYPE(Scripting_DefineType, AlreadyExists);
    40 ERROR_TYPE(Scripting_DefineType, CreationFailed);
    41 
    42 #include "scripting/SpiderMonkey.h"
    43 #include "lib/file/vfs/vfs_path.h"
    44 
    45 #include <string>
    46 #include <vector>
    47 #include <map>
    48 
    49 #include "ps/Singleton.h"
    50 #include "ps/CStr.h"
    51 
    52 class ScriptInterface;
    53 
    54 class IPropertyOwner
    55 {
    56 };
    57 
    58 class ScriptingHost : public Singleton < ScriptingHost >
    59 {
    60 private:
    61     class CustomType
    62     {
    63     public:
    64         JSObject *  m_Object;
    65         JSClass *   m_Class;
    66     };
    67 
    68     JSContext *     m_Context;
    69     JSObject *      m_GlobalObject;
    70 
    71     std::map < std::string, CustomType >        m_CustomObjectTypes;
    72 
    73     // The long-term plan is to migrate from ScriptingHost to the newer shinier ScriptInterface.
    74     // For now, just have a ScriptInterface that hooks onto the ScriptingHost's context so they
    75     // can both be used.
    76     ScriptInterface* m_ScriptInterface;
    77 public:
    78 
    79     ScriptingHost();
    80     ~ScriptingHost();
    81 
    82     ScriptInterface& GetScriptInterface();
    83 
    84     static void FinalShutdown();
    85    
    86     // Helpers:
    87 
    88     // TODO: Remove one of these
    89     inline JSContext *getContext() { return m_Context; }
    90     inline JSContext *GetContext() { return m_Context; }
    91 
    92     inline JSObject* GetGlobalObject() { return m_GlobalObject; }
    93 
    94     void RunMemScript(const char* script, size_t size, const char* filename = 0, int line = 0, JSObject* globalObject = 0);
    95     void RunScript(const VfsPath& filename, JSObject* globalObject = 0);
    96 
    97 
    98     jsval ExecuteScript(const CStrW& script, const CStrW& calledFrom = L"Console", JSObject* contextObject = NULL );
    99 
    100     void DefineCustomObjectType(JSClass *clasp, JSNative constructor, uintN nargs, JSPropertySpec *ps, JSFunctionSpec *fs, JSPropertySpec *static_ps, JSFunctionSpec *static_fs);
    101 
    102     JSObject * CreateCustomObject(const std::string & typeName);
    103 
    104     void  SetObjectProperty(JSObject * object, const std::string & propertyName, jsval value);
    105     jsval GetObjectProperty(JSObject * object, const std::string & propertyName);
    106 
    107     void   SetObjectProperty_Double(JSObject* object, const char* propertyName, double value);
    108     double GetObjectProperty_Double(JSObject* object, const char* propertyName);
    109 
    110     void SetGlobal(const std::string& globalName, jsval value);
    111 
    112     CStrW ValueToUCString(const jsval value);
    113 };
    114 
    115 #define g_ScriptingHost ScriptingHost::GetSingleton()
    116 
    117 #endif
  • source/scripting/ScriptGlue.h

     
    1 /* Copyright (C) 2009 Wildfire Games.
    2  * This file is part of 0 A.D.
    3  *
    4  * 0 A.D. is free software: you can redistribute it and/or modify
    5  * it under the terms of the GNU General Public License as published by
    6  * the Free Software Foundation, either version 2 of the License, or
    7  * (at your option) any later version.
    8  *
    9  * 0 A.D. is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 
    18 
    19 #ifndef INCLUDED_SCRIPTGLUE
    20 #define INCLUDED_SCRIPTGLUE
    21 
    22 #include "ScriptingHost.h"
    23 
    24 // referenced by ScriptingHost.cpp
    25 extern JSFunctionSpec ScriptFunctionTable[];
    26 
    27 // dependencies (moved to header to avoid L4 warnings)
    28 // .. from main.cpp:
    29 extern int fps;
    30 extern void kill_mainloop();
    31 extern CStrW g_CursorName;
    32 extern void StartGame();
    33 extern void EndGame();
    34 // .. other
    35 #if OS_WIN
    36 extern int GetVRAMInfo(int&, int&);
    37 #endif
    38 
    39 #endif  // #ifndef INCLUDED_SCRIPTGLUE
  • source/main.cpp

     
    7171#include "graphics/TextureManager.h"
    7272#include "gui/GUIManager.h"
    7373#include "renderer/Renderer.h"
    74 #include "scripting/ScriptingHost.h"
    7574#include "simulation2/Simulation2.h"
    7675
    7776#if OS_UNIX
     
    185184        PROFILE2("event");
    186185        if (g_GUI)
    187186        {
    188             std::string data = g_GUI->GetScriptInterface().StringifyJSON(
    189                 ScriptInterface::ToJSVal(g_GUI->GetScriptInterface().GetContext(), ev));
     187            std::string data = g_GUI->GetScriptInterface()->StringifyJSON(
     188                ScriptInterface::ToJSVal(g_GUI->GetScriptInterface()->GetContext(), ev));
    190189            PROFILE2_ATTR("%s", data.c_str());
    191190        }
    192191        in_dispatch_event(&ev);
     
    472471    while(!quit)
    473472        Frame();
    474473    Shutdown(0);
    475     ScriptingHost::FinalShutdown(); // this can't go in Shutdown() because that could be called multiple times per process, so stick it here instead
    476474    MainControllerShutdown();
    477475
    478476    if (restart_in_atlas)
  • source/renderer/scripting/JSInterface_Renderer.cpp

     
    2121#include "renderer/Renderer.h"
    2222
    2323#define IMPLEMENT_BOOLEAN_SCRIPT_SETTING(NAME, SCRIPTNAME) \
    24 bool JSI_Renderer::Get##SCRIPTNAME##Enabled(void* UNUSED(cbdata)) \
     24bool JSI_Renderer::Get##SCRIPTNAME##Enabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) \
    2525{ \
    2626    return g_Renderer.GetOptionBool(CRenderer::OPT_##NAME); \
    2727} \
    2828\
    29 void JSI_Renderer::Set##SCRIPTNAME##Enabled(void* UNUSED(cbdata), bool Enabled) \
     29void JSI_Renderer::Set##SCRIPTNAME##Enabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool Enabled) \
    3030{ \
    3131    g_Renderer.SetOptionBool(CRenderer::OPT_##NAME, Enabled); \
    3232}
     
    4747
    4848#undef IMPLEMENT_BOOLEAN_SCRIPT_SETTING
    4949
    50 std::string JSI_Renderer::GetRenderPath(void* UNUSED(cbdata))
     50std::string JSI_Renderer::GetRenderPath(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    5151{
    5252    return CRenderer::GetRenderPathName(g_Renderer.GetRenderPath());
    5353}
    5454
    55 void JSI_Renderer::SetRenderPath(void* UNUSED(cbdata), std::string name)
     55void JSI_Renderer::SetRenderPath(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::string name)
    5656{
    5757    g_Renderer.SetRenderPath(CRenderer::GetRenderPathByName(name));
    5858}
  • source/renderer/scripting/JSInterface_Renderer.h

     
    1919#ifndef INCLUDED_JSINTERFACE_RENDERER
    2020#define INCLUDED_JSINTERFACE_RENDERER
    2121
    22 class ScriptInterface;
     22#include "scriptinterface/ScriptInterface.h"
    2323
    2424#define DECLARE_BOOLEAN_SCRIPT_SETTING(NAME) \
    25     bool Get##NAME##Enabled(void* cbdata); \
    26     void Set##NAME##Enabled(void* cbdata, bool Enabled);
     25    bool Get##NAME##Enabled(ScriptInterface::CxPrivate* pCxPrivate); \
     26    void Set##NAME##Enabled(ScriptInterface::CxPrivate* pCxPrivate, bool Enabled);
    2727
    2828namespace JSI_Renderer
    2929{
    30     std::string GetRenderPath(void* cbdata);
    31     void SetRenderPath(void* cbdata, std::string name);
     30    std::string GetRenderPath(ScriptInterface::CxPrivate* pCxPrivate);
     31    void SetRenderPath(ScriptInterface::CxPrivate* pCxPrivate, std::string name);
    3232
    3333    DECLARE_BOOLEAN_SCRIPT_SETTING(Shadows);
    3434    DECLARE_BOOLEAN_SCRIPT_SETTING(ShadowPCF);
  • source/ps/Game.cpp

     
    2424#include "graphics/ParticleManager.h"
    2525#include "graphics/UnitManager.h"
    2626#include "gui/GUIManager.h"
     27#include "gui/CGUI.h"
    2728#include "lib/config2.h"
    2829#include "lib/timer.h"
    2930#include "network/NetClient.h"
     
    4142#include "ps/GameSetup/GameSetup.h"
    4243#include "renderer/Renderer.h"
    4344#include "renderer/TimeManager.h"
    44 #include "scripting/ScriptingHost.h"
    4545#include "scriptinterface/ScriptInterface.h"
    4646#include "simulation2/Simulation2.h"
    4747#include "simulation2/components/ICmpPlayer.h"
     
    6161 **/
    6262CGame::CGame(bool disableGraphics):
    6363    m_World(new CWorld(this)),
    64     m_Simulation2(new CSimulation2(&m_World->GetUnitManager(), m_World->GetTerrain())),
     64    m_Simulation2(new CSimulation2(&m_World->GetUnitManager(), g_ScriptRuntime, m_World->GetTerrain())),
    6565    m_GameView(disableGraphics ? NULL : new CGameView(this)),
    6666    m_GameStarted(false),
    6767    m_Paused(false),
     
    220220    // Call the reallyStartGame GUI function, but only if it exists
    221221    if (g_GUI && g_GUI->HasPages())
    222222    {
    223         jsval fval, rval;
    224         JSBool ok = JS_GetProperty(g_ScriptingHost.getContext(), g_GUI->GetScriptObject(), "reallyStartGame", &fval);
    225         ENSURE(ok);
    226         if (ok && !JSVAL_IS_VOID(fval))
    227             JS_CallFunctionValue(g_ScriptingHost.getContext(), g_GUI->GetScriptObject(), fval, 0, NULL, &rval);
     223        if (g_GUI->GetActiveGUI()->GetScriptInterface()->HasProperty(g_GUI->GetActiveGUI()->GetGlobalObject(), "reallyStartGame"))
     224            g_GUI->GetActiveGUI()->GetScriptInterface()->CallFunctionVoid(g_GUI->GetActiveGUI()->GetGlobalObject(), "reallyStartGame");
    228225    }
    229226
    230227    if (g_NetClient)
  • source/ps/scripting/JSInterface_ConfigDB.h

     
    1818#ifndef INCLUDED_JSI_CONFIGDB
    1919#define INCLUDED_JSI_CONFIGDB
    2020
     21#include "scriptinterface/ScriptInterface.h"
    2122#include "ps/ConfigDB.h"
    2223
    23 class ScriptInterface;
    24 
    2524namespace JSI_ConfigDB
    2625{
    2726    bool GetConfigNamespace(std::wstring cfgNsString, EConfigNamespace& cfgNs);
    28     std::string GetValue(void* cbdata, std::wstring cfgNsString, std::string name);
    29     bool CreateValue(void* cbdata, std::wstring cfgNsString, std::string name, std::string value);
    30     bool WriteFile(void* cbdata, std::wstring cfgNsString, Path path);
    31     bool Reload(void* cbdata, std::wstring cfgNsString);
    32     bool SetFile(void* cbdata, std::wstring cfgNsString, Path path);
     27    std::string GetValue(ScriptInterface::CxPrivate* pCxPrivate, std::wstring cfgNsString, std::string name);
     28    bool CreateValue(ScriptInterface::CxPrivate* pCxPrivate, std::wstring cfgNsString, std::string name, std::string value);
     29    bool WriteFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring cfgNsString, Path path);
     30    bool Reload(ScriptInterface::CxPrivate* pCxPrivate, std::wstring cfgNsString);
     31    bool SetFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring cfgNsString, Path path);
    3332    void RegisterScriptFunctions(ScriptInterface& scriptInterface);
    3433}
    3534
  • source/ps/scripting/JSInterface_Console.cpp

     
    3232    return true;
    3333}
    3434
    35 bool JSI_Console::GetVisibleEnabled(void* UNUSED(cbdata))
     35bool JSI_Console::GetVisibleEnabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    3636{
    3737    if (!CheckGlobalInitialized())
    3838        return false;
    3939    return g_Console->IsActive();
    4040}
    4141
    42 void JSI_Console::SetVisibleEnabled(void* UNUSED(cbdata), bool Enabled)
     42void JSI_Console::SetVisibleEnabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool Enabled)
    4343{
    4444    if (!CheckGlobalInitialized())
    4545        return;
    4646    g_Console->SetVisible(Enabled);
    4747}
    4848
    49 void JSI_Console::Write(void* UNUSED(cbdata), std::wstring output)
     49void JSI_Console::Write(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring output)
    5050{
    5151    if (!CheckGlobalInitialized())
    5252        return;
  • source/ps/scripting/JSInterface_VFS.h

     
    2222#ifndef INCLUDED_JSI_VFS
    2323#define INCLUDED_JSI_VFS
    2424
    25 #include "scripting/ScriptingHost.h"
     25#include "scriptinterface/ScriptInterface.h"
    2626
    27 // these are registered in ScriptGlue.cpp, hence the need for a header.
     27// these are registered in ScriptFunctions.cpp, hence the need for a header.
    2828
    2929namespace JSI_VFS
    3030{
     
    3838    //
    3939    // note: full pathnames of each file/subdirectory are returned,
    4040    // ready for use as a "filename" for the other functions.
    41     JSBool BuildDirEntList(JSContext* cx, uintN argc, jsval* vp);
     41    CScriptVal BuildDirEntList(ScriptInterface::CxPrivate* pCxPrivate, std::wstring path, std::wstring filterStr, bool recurse);
    4242
    4343    // Return true iff the file exists
    4444    //
    4545    // if (fileExists(filename) { ... }
    4646    //   filename: VFS filename (may include path)
    47     JSBool FileExists(JSContext* cx, uintN argc, jsval* vp);
     47    bool FileExists(ScriptInterface::CxPrivate* pCxPrivate, CStrW filename);
    4848
    4949    // Return time [seconds since 1970] of the last modification to the specified file.
    5050    //
    5151    // mtime = getFileMTime(filename);
    5252    //   filename: VFS filename (may include path)
    53     JSBool GetFileMTime(JSContext* cx, uintN argc, jsval* vp);
     53    double GetFileMTime(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename);
    5454
    5555    // Return current size of file.
    5656    //
    5757    // size = getFileSize(filename);
    5858    //   filename: VFS filename (may include path)
    59     JSBool GetFileSize(JSContext* cx, uintN argc, jsval* vp);
     59    unsigned int GetFileSize(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename);
    6060
    6161    // Return file contents in a string.
    6262    //
    6363    // contents = readFile(filename);
    6464    //   filename: VFS filename (may include path)
    65     JSBool ReadFile(JSContext* cx, uintN argc, jsval* vp);
     65    CScriptVal ReadFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename);
    6666
    6767    // Return file contents as an array of lines.
    6868    //
    6969    // lines = readFileLines(filename);
    7070    //   filename: VFS filename (may include path)
    71     JSBool ReadFileLines(JSContext* cx, uintN argc, jsval* vp);
     71    CScriptVal ReadFileLines(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename);
    7272}
    7373
    7474#endif
  • source/ps/scripting/JSInterface_Console.h

     
    2323namespace JSI_Console
    2424{
    2525    bool CheckGlobalInitialized();
    26     bool GetVisibleEnabled(void* cbdata);
    27     void SetVisibleEnabled(void* cbdata, bool Enabled);
    28     void Write(void* cbdata, std::wstring output);
     26    bool GetVisibleEnabled(ScriptInterface::CxPrivate* pCxPrivate);
     27    void SetVisibleEnabled(ScriptInterface::CxPrivate* pCxPrivate, bool Enabled);
     28    void Write(ScriptInterface::CxPrivate* pCxPrivate, std::wstring output);
    2929   
    3030    void RegisterScriptFunctions(ScriptInterface& scriptInterface);
    3131}
  • source/ps/scripting/JSInterface_ConfigDB.cpp

     
    4242    return true;
    4343}
    4444
    45 std::string JSI_ConfigDB::GetValue(void* UNUSED(cbdata), std::wstring cfgNsString, std::string name)
     45std::string JSI_ConfigDB::GetValue(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring cfgNsString, std::string name)
    4646{
    4747    EConfigNamespace cfgNs;
    4848    if (!GetConfigNamespace(cfgNsString, cfgNs))
     
    6060    }
    6161}
    6262
    63 bool JSI_ConfigDB::CreateValue(void* UNUSED(cbdata), std::wstring cfgNsString, std::string name, std::string value)
     63bool JSI_ConfigDB::CreateValue(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring cfgNsString, std::string name, std::string value)
    6464{
    6565    EConfigNamespace cfgNs;
    6666    if (!GetConfigNamespace(cfgNsString, cfgNs))
     
    7171    return true;
    7272}
    7373
    74 bool JSI_ConfigDB::WriteFile(void* UNUSED(cbdata), std::wstring cfgNsString, Path path)
     74bool JSI_ConfigDB::WriteFile(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring cfgNsString, Path path)
    7575{
    7676    EConfigNamespace cfgNs;
    7777    if (!GetConfigNamespace(cfgNsString, cfgNs))
     
    8181    return ret;
    8282}
    8383
    84 bool JSI_ConfigDB::Reload(void* UNUSED(cbdata), std::wstring cfgNsString)
     84bool JSI_ConfigDB::Reload(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring cfgNsString)
    8585{
    8686    EConfigNamespace cfgNs;
    8787    if (!GetConfigNamespace(cfgNsString, cfgNs))
     
    9191    return ret;
    9292}
    9393
    94 bool JSI_ConfigDB::SetFile(void* UNUSED(cbdata), std::wstring cfgNsString, Path path)
     94bool JSI_ConfigDB::SetFile(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring cfgNsString, Path path)
    9595{
    9696    EConfigNamespace cfgNs;
    9797    if (!GetConfigNamespace(cfgNsString, cfgNs))
  • source/ps/scripting/JSInterface_VFS.cpp

     
    1919
    2020#include <sstream>
    2121
     22#include "ps/CLogger.h"
    2223#include "ps/CStr.h"
    2324#include "ps/Filesystem.h"
    24 #include "scripting/ScriptingHost.h"
     25#include "scriptinterface/ScriptVal.h"
    2526#include "scriptinterface/ScriptInterface.h"
    2627#include "ps/scripting/JSInterface_VFS.h"
    2728#include "lib/file/vfs/vfs_util.h"
     
    3132    /* this is liable to happen often, so don't complain */\
    3233    if (err == ERR::VFS_FILE_NOT_FOUND)\
    3334    {\
    34         JS_SET_RVAL(cx, vp, JSVAL_NULL);\
    35         return JS_TRUE;\
     35        return 0; \
    3636    }\
    37     /* unknown failure. we return an error (akin to an exception in JS) that
    38        stops the script to make sure this error is noticed. */\
     37    /* unknown failure. We output an error message. */\
    3938    else if (err < 0)\
    40         return JS_FALSE;\
     39        LOGERROR(L"Unknown failure in VFS %i", err );
    4140    /* else: success */
    4241
    4342
     
    8584//
    8685// note: full pathnames of each file/subdirectory are returned,
    8786// ready for use as a "filename" for the other functions.
    88 JSBool JSI_VFS::BuildDirEntList(JSContext* cx, uintN argc, jsval* vp)
     87CScriptVal JSI_VFS::BuildDirEntList(ScriptInterface::CxPrivate* pCxPrivate, std::wstring path, std::wstring filterStr, bool recurse)
    8988{
    90     //
    91     // get arguments
    92     //
    93 
    94     JSU_REQUIRE_PARAM_RANGE(1, 3);
    95 
    96     CStrW path;
    97     if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], path))
    98         return JS_FALSE;
    99 
    100     CStrW filter_str = L"";
    101     if (argc >= 2)
    102     {
    103         if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[1], filter_str))
    104             return JS_FALSE;
    105     }
    10689    // convert to const wchar_t*; if there's no filter, pass 0 for speed
    10790    // (interpreted as: "accept all files without comparing").
    10891    const wchar_t* filter = 0;
    109     if (!filter_str.empty())
    110         filter = filter_str.c_str();
     92    if (!filterStr.empty())
     93        filter = filterStr.c_str();
     94 
     95    int flags = recurse ? vfs::DIR_RECURSIVE : 0;
    11196
    112     bool recursive = false;
    113     if (argc >= 3)
    114     {
    115         if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[2], recursive))
    116             return JS_FALSE;
    117     }
    118     int flags = recursive ? vfs::DIR_RECURSIVE : 0;
    119 
    120 
    12197    // build array in the callback function
    122     BuildDirEntListState state(cx);
     98    BuildDirEntListState state(pCxPrivate->pScriptInterface->GetContext());
    12399    vfs::ForEachFile(g_VFS, path, BuildDirEntListCB, (uintptr_t)&state, filter, flags);
    124100
    125     JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(state.filename_array));
    126     return JS_TRUE;
     101    return OBJECT_TO_JSVAL(state.filename_array);
    127102}
    128103
    129104// Return true iff the file exits
    130105//
    131106// if (fileExists(filename)) { ... }
    132107//   filename: VFS filename (may include path)
    133 JSBool JSI_VFS::FileExists(JSContext* cx, uintN argc, jsval* vp)
     108bool JSI_VFS::FileExists(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW filename)
    134109{
    135     JSU_REQUIRE_PARAMS(1);
    136 
    137     CStrW filename;
    138     if (!ScriptInterface::FromJSVal<CStrW> (cx, JS_ARGV(cx, vp)[0], filename))
    139         return JS_FALSE;
    140 
    141     JS_SET_RVAL(cx, vp, g_VFS->GetFileInfo(filename, 0) == INFO::OK ? JSVAL_TRUE : JSVAL_FALSE);
    142     return JS_TRUE;
     110    return (g_VFS->GetFileInfo(filename, 0) == INFO::OK);
    143111}
    144112
    145113
     
    147115//
    148116// mtime = getFileMTime(filename);
    149117//   filename: VFS filename (may include path)
    150 JSBool JSI_VFS::GetFileMTime(JSContext* cx, uintN argc, jsval* vp)
     118double JSI_VFS::GetFileMTime(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring filename)
    151119{
    152     JSU_REQUIRE_PARAMS(1);
    153 
    154     CStrW filename;
    155     if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename))
    156         return JS_FALSE;
    157 
    158120    CFileInfo fileInfo;
    159121    Status err = g_VFS->GetFileInfo(filename, &fileInfo);
    160122    JS_CHECK_FILE_ERR(err);
    161123
    162     JS_SET_RVAL(cx, vp, ScriptInterface::ToJSVal(cx, (double)fileInfo.MTime()));
    163     return JS_TRUE;
     124    return (double)fileInfo.MTime();
    164125}
    165126
    166127
     
    168129//
    169130// size = getFileSize(filename);
    170131//   filename: VFS filename (may include path)
    171 JSBool JSI_VFS::GetFileSize(JSContext* cx, uintN argc, jsval* vp)
     132unsigned int JSI_VFS::GetFileSize(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring filename)
    172133{
    173     JSU_REQUIRE_PARAMS(1);
    174 
    175     CStrW filename;
    176     if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename))
    177         return JS_FALSE;
    178 
    179134    CFileInfo fileInfo;
    180135    Status err = g_VFS->GetFileInfo(filename, &fileInfo);
    181136    JS_CHECK_FILE_ERR(err);
    182137
    183     JS_SET_RVAL(cx, vp, ScriptInterface::ToJSVal(cx, (unsigned)fileInfo.Size()));
    184     return JS_TRUE;
     138    return (unsigned int)fileInfo.Size();
    185139}
    186140
    187141
     
    189143//
    190144// contents = readFile(filename);
    191145//   filename: VFS filename (may include path)
    192 JSBool JSI_VFS::ReadFile(JSContext* cx, uintN argc, jsval* vp)
     146CScriptVal JSI_VFS::ReadFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename)
    193147{
    194     JSU_REQUIRE_PARAMS(1);
    195 
    196     CStrW filename;
    197     if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename))
    198         return JS_FALSE;
    199 
    200     //
    201     // read file
    202     //
    203148    CVFSFile file;
    204149    if (file.Load(g_VFS, filename) != PSRETURN_OK)
    205     {
    206         JS_SET_RVAL(cx, vp, JSVAL_NULL);
    207         return JS_TRUE;
    208     }
     150        return JSVAL_NULL;
    209151
    210152    CStr contents = file.DecodeUTF8(); // assume it's UTF-8
    211153
     
    213155    contents.Replace("\r\n", "\n");
    214156
    215157    // Decode as UTF-8
    216     JS_SET_RVAL(cx, vp, ScriptInterface::ToJSVal(cx, contents.FromUTF8()));
    217     return JS_TRUE;
     158    return ScriptInterface::ToJSVal( pCxPrivate->pScriptInterface->GetContext(), contents.FromUTF8() );
    218159}
    219160
    220161
     
    222163//
    223164// lines = readFileLines(filename);
    224165//   filename: VFS filename (may include path)
    225 JSBool JSI_VFS::ReadFileLines(JSContext* cx, uintN argc, jsval* vp)
     166CScriptVal JSI_VFS::ReadFileLines(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename)
    226167{
    227     JSU_REQUIRE_PARAMS(1);
    228 
    229     CStrW filename;
    230     if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename))
    231         return (JS_FALSE);
    232 
    233168    //
    234169    // read file
    235170    //
    236171    CVFSFile file;
    237172    if (file.Load(g_VFS, filename) != PSRETURN_OK)
    238     {
    239         JS_SET_RVAL(cx, vp, JSVAL_NULL);
    240         return JS_TRUE;
    241     }
     173        return JSVAL_NULL;
    242174
    243175    CStr contents = file.DecodeUTF8(); // assume it's UTF-8
    244176
     
    251183
    252184    std::stringstream ss(contents);
    253185
     186    JSContext* cx = pCxPrivate->pScriptInterface->GetContext();
    254187    JSObject* line_array = JS_NewArrayObject(cx, 0, NULL);
    255188
    256189    std::string line;
     
    262195        JS_SetElement(cx, line_array, cur_line++, &val);
    263196    }
    264197
    265     JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL( line_array ));
    266     return JS_TRUE ;
     198    return OBJECT_TO_JSVAL( line_array );
    267199}
  • source/ps/CConsole.cpp

     
    2828#include "graphics/ShaderManager.h"
    2929#include "graphics/TextRenderer.h"
    3030#include "gui/GUIutil.h"
     31#include "gui/GUIManager.h"
    3132#include "lib/ogl.h"
    3233#include "lib/sysdep/clipboard.h"
    3334#include "lib/timer.h"
     
    4041#include "ps/Hotkey.h"
    4142#include "ps/Pyrogenesis.h"
    4243#include "renderer/Renderer.h"
    43 #include "scripting/ScriptingHost.h"
    4444#include "scriptinterface/ScriptInterface.h"
    4545
    4646CConsole* g_Console = 0;
     
    603603                   // a crash it's a useful record.
    604604
    605605    // Process it as JavaScript
    606 
    607     jsval rval = g_ScriptingHost.ExecuteScript(szLine, L"Console");
    608     if (!JSVAL_IS_VOID(rval))
    609         InsertMessage(L"%ls", g_ScriptingHost.GetScriptInterface().ToString(rval).c_str());
     606   
     607    CScriptVal rval;
     608    g_GUI->GetActiveGUI()->GetScriptInterface()->Eval(szLine, rval);
     609    if (!rval.undefined())
     610        InsertMessage(L"%ls", g_GUI->GetActiveGUI()->GetScriptInterface()->ToString(rval.get()).c_str());
    610611}
    611612
    612613void CConsole::LoadHistory()
  • source/ps/GameSetup/GameSetup.cpp

     
    4444#include "graphics/TerrainTextureManager.h"
    4545#include "gui/GUI.h"
    4646#include "gui/GUIManager.h"
    47 #include "gui/scripting/JSInterface_IGUIObject.h"
    48 #include "gui/scripting/JSInterface_GUITypes.h"
    4947#include "gui/scripting/ScriptFunctions.h"
    5048#include "maths/MathUtil.h"
    5149#include "network/NetServer.h"
     
    8179#include "renderer/Renderer.h"
    8280#include "renderer/VertexBufferManager.h"
    8381#include "renderer/ModelRenderer.h"
    84 #include "scripting/ScriptingHost.h"
    85 #include "scripting/ScriptGlue.h"
    8682#include "scriptinterface/DebuggingServer.h"
    8783#include "scriptinterface/ScriptInterface.h"
    8884#include "scriptinterface/ScriptStats.h"
     
    115111bool g_DoRenderLogger = true;
    116112bool g_DoRenderCursor = true;
    117113
     114shared_ptr<ScriptRuntime> g_ScriptRuntime;
     115
    118116static const int SANE_TEX_QUALITY_DEFAULT = 5;  // keep in sync with code
    119117
    120118static void SetTextureQuality(int quality)
     
    182180// display progress / description in loading screen
    183181void GUI_DisplayLoadProgress(int percent, const wchar_t* pending_task)
    184182{
    185     g_ScriptingHost.GetScriptInterface().SetGlobal("g_Progress", percent, true);
    186     g_ScriptingHost.GetScriptInterface().SetGlobal("g_LoadDescription", pending_task, true);
    187     g_GUI->SendEventToAll("progress");
     183    g_GUI->GetActiveGUI()->GetScriptInterface()->SetGlobal("g_Progress", percent, true);
     184    g_GUI->GetActiveGUI()->GetScriptInterface()->SetGlobal("g_LoadDescription", pending_task, true);
     185    g_GUI->GetActiveGUI()->SendEventToAll("progress");
    188186}
    189187
    190188
     
    320318}
    321319
    322320
    323 static void RegisterJavascriptInterfaces()
    324 {
    325     // GUI
    326     CGUI::ScriptingInit();
    327 
    328     GuiScriptingInit(g_ScriptingHost.GetScriptInterface());
    329     JSI_Sound::RegisterScriptFunctions(g_ScriptingHost.GetScriptInterface());
    330 }
    331 
    332 
    333 static void InitScripting()
    334 {
    335     TIMER(L"InitScripting");
    336 
    337     // Create the scripting host.  This needs to be done before the GUI is created.
    338     // [7ms]
    339     new ScriptingHost;
    340    
    341     RegisterJavascriptInterfaces();
    342 }
    343 
    344 
    345321static size_t OperatingSystemFootprint()
    346322{
    347323#if OS_WIN
     
    499475}
    500476
    501477
    502 static void InitPs(bool setup_gui, const CStrW& gui_page, CScriptVal initData)
     478static void InitPs(bool setup_gui, const CStrW& gui_page, ScriptInterface* srcScriptInterface, CScriptVal initData)
    503479{
    504480    {
    505481        // console
     
    530506    {
    531507        // We do actually need *some* kind of GUI loaded, so use the
    532508        // (currently empty) Atlas one
    533         g_GUI->SwitchPage(L"page_atlas.xml", initData);
     509        g_GUI->SwitchPage(L"page_atlas.xml", srcScriptInterface, initData);
    534510        return;
    535511    }
    536512
    537513    // GUI uses VFS, so this must come after VFS init.
    538     g_GUI->SwitchPage(gui_page, initData);
     514    g_GUI->SwitchPage(gui_page, srcScriptInterface, initData);
    539515}
    540516
    541517
     
    718694    g_UserReporter.Deinitialize();
    719695    TIMER_END(L"shutdown UserReporter");
    720696
    721     TIMER_BEGIN(L"shutdown ScriptingHost");
    722     delete &g_ScriptingHost;
     697    TIMER_BEGIN(L"shutdown DebuggingServer (if active)");
    723698    delete g_DebuggingServer;
    724     TIMER_END(L"shutdown ScriptingHost");
     699    TIMER_END(L"shutdown DebuggingServer (if active)");
    725700
    726701    TIMER_BEGIN(L"shutdown ConfigDB");
    727702    delete &g_ConfigDB;
     
    875850    // This must come after VFS init, which sets the current directory
    876851    // (required for finding our output log files).
    877852    g_Logger = new CLogger;
     853   
     854    // Workaround until Simulation and AI use their own threads and also their own runtimes
     855    g_ScriptRuntime = ScriptInterface::CreateRuntime(128 * 1024 * 1024);
    878856
    879857    // Special command-line mode to dump the entity schemas instead of running the game.
    880858    // (This must be done after loading VFS etc, but should be done before wasting time
    881859    // on anything else.)
    882860    if (args.Has("dumpSchema"))
    883861    {
    884         CSimulation2 sim(NULL, NULL);
     862        CSimulation2 sim(NULL, g_ScriptRuntime, NULL);
    885863        sim.LoadDefaultScripts();
    886864        std::ofstream f("entity.rng", std::ios_base::out | std::ios_base::trunc);
    887865        f << sim.GenerateSchema();
     
    920898    if (g_JSDebuggerEnabled)
    921899        g_DebuggingServer = new CDebuggingServer();
    922900
    923     InitScripting();    // before GUI
    924 
    925901    // Optionally start profiler HTTP output automatically
    926902    // (By default it's only enabled by a hotkey, for security/performance)
    927903    bool profilerHTTPEnable = false;
     
    977953    if(g_DisableAudio)
    978954        ISoundManager::SetEnabled(false);
    979955
    980     g_GUI = new CGUIManager(g_ScriptingHost.GetScriptInterface());
     956    g_GUI = new CGUIManager();
    981957
    982958    // (must come after SetVideoMode, since it calls ogl_Init)
    983959    if (ogl_HaveExtensions(0, "GL_ARB_vertex_program", "GL_ARB_fragment_program", NULL) != 0 // ARB
     
    10361012            CScriptValRooted data;
    10371013            if (g_GUI)
    10381014            {
    1039                 ScriptInterface& scriptInterface = g_GUI->GetScriptInterface();
    1040                 scriptInterface.Eval("({})", data);
    1041                 scriptInterface.SetProperty(data.get(), "isStartup", true);
     1015                shared_ptr<ScriptInterface> scriptInterface = g_GUI->GetScriptInterface();
     1016                scriptInterface->Eval("({})", data);
     1017                scriptInterface->SetProperty(data.get(), "isStartup", true);
    10421018            }
    1043             InitPs(setup_gui, L"page_pregame.xml", data.get());
     1019            InitPs(setup_gui, L"page_pregame.xml", g_GUI->GetScriptInterface().get(), data.get());
    10441020        }
    10451021    }
    10461022    catch (PSERROR_Game_World_MapLoadFailed& e)
     
    10481024        // Map Loading failed
    10491025
    10501026        // Start the engine so we have a GUI
    1051         InitPs(true, L"page_pregame.xml", JSVAL_VOID);
     1027        InitPs(true, L"page_pregame.xml", NULL, JSVAL_VOID);
    10521028
    10531029        // Call script function to do the actual work
    10541030        //  (delete game data, switch GUI page, show error, etc.)
     
    12621238    scriptInterface.SetProperty(attrs.get(), "settings", settings);
    12631239
    12641240    CScriptVal mpInitData;
    1265     g_GUI->GetScriptInterface().Eval("({isNetworked:true, playerAssignments:{}})", mpInitData);
    1266     g_GUI->GetScriptInterface().SetProperty(mpInitData.get(), "attribs",
    1267             CScriptVal(g_GUI->GetScriptInterface().CloneValueFromOtherContext(scriptInterface, attrs.get())));
     1241    scriptInterface.Eval("({isNetworked:true, playerAssignments:{}})", mpInitData);
     1242    scriptInterface.SetProperty(mpInitData.get(), "attribs", attrs);
    12681243
    12691244    // Get optional playername
    12701245    CStrW userName = L"anonymous";
     
    12751250
    12761251    if (args.Has("autostart-host"))
    12771252    {
    1278         InitPs(true, L"page_loading.xml", mpInitData.get());
     1253        InitPs(true, L"page_loading.xml", &scriptInterface, mpInitData.get());
    12791254
    12801255        size_t maxPlayers = 2;
    12811256        if (args.Has("autostart-players"))
     
    12961271    }
    12971272    else if (args.Has("autostart-client"))
    12981273    {
    1299         InitPs(true, L"page_loading.xml", mpInitData.get());
     1274        InitPs(true, L"page_loading.xml", &scriptInterface, mpInitData.get());
    13001275
    13011276        g_NetClient = new CNetClient(g_Game);
    13021277        g_NetClient->SetUserName(userName);
     
    13201295        PSRETURN ret = g_Game->ReallyStartGame();
    13211296        ENSURE(ret == PSRETURN_OK);
    13221297
    1323         InitPs(true, L"page_session.xml", JSVAL_VOID);
     1298        InitPs(true, L"page_session.xml", NULL, JSVAL_VOID);
    13241299    }
    13251300
    13261301    return true;
     
    13351310    // So all GUI pages that load games should include this script
    13361311    if (g_GUI && g_GUI->HasPages())
    13371312    {
    1338         JSContext* cx = g_ScriptingHost.getContext();
    1339         jsval fval, rval;
    1340         JSBool ok = JS_GetProperty(cx, g_GUI->GetScriptObject(), "cancelOnError", &fval);
    1341         ENSURE(ok);
    1342 
    1343         jsval msgval = ScriptInterface::ToJSVal(cx, message);
    1344 
    1345         if (ok && !JSVAL_IS_VOID(fval))
    1346             JS_CallFunctionValue(cx, g_GUI->GetScriptObject(), fval, 1, &msgval, &rval);
     1313        if (g_GUI->GetActiveGUI()->GetScriptInterface()->HasProperty(g_GUI->GetActiveGUI()->GetGlobalObject(), "cancelOnError" ))
     1314            g_GUI->GetActiveGUI()->GetScriptInterface()->CallFunctionVoid(g_GUI->GetActiveGUI()->GetGlobalObject(), "cancelOnError", message);
    13471315    }
    13481316}
  • source/ps/GameSetup/HWDetect.cpp

     
    1717
    1818#include "precompiled.h"
    1919
    20 #include "scripting/ScriptingHost.h"
    2120#include "scriptinterface/ScriptInterface.h"
    2221
    2322#include "lib/ogl.h"
     
    123122    return !(ns == CFG_LAST || ns == CFG_DEFAULT);
    124123}
    125124
    126 void SetDisableAudio(void* UNUSED(cbdata), bool disabled)
     125void SetDisableAudio(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool disabled)
    127126{
    128127    g_DisableAudio = disabled;
    129128}
    130129
    131 void SetDisableS3TC(void* UNUSED(cbdata), bool disabled)
     130void SetDisableS3TC(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool disabled)
    132131{
    133132    if (!IsOverridden("nos3tc"))
    134133        ogl_tex_override(OGL_TEX_S3TC, disabled ? OGL_TEX_DISABLE : OGL_TEX_ENABLE);
    135134}
    136135
    137 void SetDisableShadows(void* UNUSED(cbdata), bool disabled)
     136void SetDisableShadows(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool disabled)
    138137{
    139138    if (!IsOverridden("shadows"))
    140139        g_Shadows = !disabled;
    141140}
    142141
    143 void SetDisableShadowPCF(void* UNUSED(cbdata), bool disabled)
     142void SetDisableShadowPCF(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool disabled)
    144143{
    145144    if (!IsOverridden("shadowpcf"))
    146145        g_ShadowPCF = !disabled;
    147146}
    148147
    149 void SetDisableAllWater(void* UNUSED(cbdata), bool disabled)
     148void SetDisableAllWater(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool disabled)
    150149{
    151150    if (!IsOverridden("waternormals"))
    152151        g_WaterNormal = !disabled;
     
    163162    if (!IsOverridden("watershadows"))
    164163        g_WaterShadows = !disabled;
    165164}
    166 void SetDisableFancyWater(void* UNUSED(cbdata), bool disabled)
     165void SetDisableFancyWater(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool disabled)
    167166{
    168167    if (!IsOverridden("waterrealdepth"))
    169168        g_WaterRealDepth = !disabled;
     
    174173    if (!IsOverridden("watershadows"))
    175174        g_WaterShadows = !disabled;
    176175}
    177 void SetDisableFBOWater(void* UNUSED(cbdata), bool disabled)
     176void SetDisableFBOWater(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool disabled)
    178177{
    179178    if (!IsOverridden("waterfoam"))
    180179        g_WaterFoam = !disabled;
     
    182181        g_WaterCoastalWaves = !disabled;
    183182}
    184183
    185 void SetRenderPath(void* UNUSED(cbdata), std::string renderpath)
     184void SetRenderPath(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::string renderpath)
    186185{
    187186    g_RenderPath = renderpath;
    188187}
     
    191190{
    192191    TIMER(L"RunHardwareDetection");
    193192
    194     ScriptInterface& scriptInterface = g_ScriptingHost.GetScriptInterface();
     193    ScriptInterface scriptInterface("Engine", "HWDetect", g_ScriptRuntime);
    195194
    196195    scriptInterface.RegisterFunction<void, bool, &SetDisableAudio>("SetDisableAudio");
    197196    scriptInterface.RegisterFunction<void, bool, &SetDisableS3TC>("SetDisableS3TC");
  • source/ps/SavedGame.cpp

     
    8181    simulation.GetScriptInterface().SetProperty(metadata.get(), "initAttributes", simulation.GetInitAttributes());
    8282    if (gui)
    8383    {
    84         CScriptVal guiMetadata = simulation.GetScriptInterface().CloneValueFromOtherContext(gui->GetScriptInterface(), gui->GetSavedGameData().get());
     84        ScriptInterface* pPageScriptInterface = NULL;
     85        CScriptVal guiMetadataPageCx = gui->GetSavedGameData(pPageScriptInterface);
     86
     87        CScriptVal guiMetadata = simulation.GetScriptInterface().CloneValueFromOtherContext(*pPageScriptInterface, guiMetadataPageCx.get());
    8588        simulation.GetScriptInterface().SetProperty(metadata.get(), "gui", guiMetadata);
    8689    }
    8790    simulation.GetScriptInterface().SetProperty(metadata.get(), "description", description);
  • source/soundmanager/scripting/JSInterface_Sound.cpp

     
    3131{
    3232  #if CONFIG2_AUDIO
    3333
    34   void StartMusic(void* UNUSED(cbdata))
     34  void StartMusic(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    3535  {
    3636    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    3737      sndManager->SetMusicEnabled(true);
    3838  }
    3939
    40   void StopMusic(void* UNUSED(cbdata))
     40  void StopMusic(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    4141  {
    4242    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    4343      sndManager->SetMusicEnabled(false);
    4444  }
    4545
    46   void ClearPlaylist(void* UNUSED(cbdata))
     46  void ClearPlaylist(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    4747  {
    4848    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    4949      sndManager->ClearPlayListItems();
    5050  }
    5151
    52   void AddPlaylistItem(void* UNUSED(cbdata), std::wstring filename)
     52  void AddPlaylistItem(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring filename)
    5353  { 
    5454    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    5555      sndManager->AddPlayListItem(VfsPath(filename));
    5656  }
    5757
    58   void StartPlaylist(void* UNUSED(cbdata), bool looping)
     58  void StartPlaylist(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool looping)
    5959  {
    6060    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    6161      sndManager->StartPlayList( looping );
    6262  }
    6363
    64   void PlayMusic(void* UNUSED(cbdata), std::wstring filename, bool looping)
     64  void PlayMusic(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring filename, bool looping)
    6565  {
    6666    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    6767      sndManager->PlayAsMusic( filename, looping);
    6868  }
    6969
    70   void PlayUISound(void* UNUSED(cbdata), std::wstring filename, bool looping)
     70  void PlayUISound(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring filename, bool looping)
    7171  {
    7272    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    7373      sndManager->PlayAsUI( filename, looping);
    7474  }
    7575
    76   void PlayAmbientSound(void* UNUSED(cbdata), std::wstring filename, bool looping)
     76  void PlayAmbientSound(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring filename, bool looping)
    7777  {
    7878    if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
    7979      sndManager->PlayAsAmbient( filename, looping);
    8080  }
    8181
    82   bool MusicPlaying(void* UNUSED(cbdata))
     82  bool MusicPlaying(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    8383  {
    8484    return true;
    8585  }
     
    8787
    8888
    8989  #else
    90     bool MusicPlaying(void* UNUSED(cbdata) ){ return false; }
    91     void PlayAmbientSound(void* UNUSED(cbdata), std::wstring UNUSED(filename), bool UNUSED(looping) ){}
    92     void PlayUISound(void* UNUSED(cbdata), std::wstring UNUSED(filename), bool UNUSED(looping) ) {}
    93     void PlayMusic(void* UNUSED(cbdata), std::wstring UNUSED(filename), bool UNUSED(looping) ) {}
    94     void StartPlaylist(void* UNUSED(cbdata), bool UNUSED(looping) ){}
    95     void AddPlaylistItem(void* UNUSED(cbdata), std::wstring UNUSED(filename) ){}
    96     void ClearPlaylist(void* UNUSED(cbdata) ){}
    97     void StopMusic(void* UNUSED(cbdata) ){}
    98     void StartMusic(void* UNUSED(cbdata) ){}
     90    bool MusicPlaying(ScriptInterface::CxPrivate* UNUSED(pCxPrivate) ){ return false; }
     91    void PlayAmbientSound(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring UNUSED(filename), bool UNUSED(looping) ){}
     92    void PlayUISound(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring UNUSED(filename), bool UNUSED(looping) ) {}
     93    void PlayMusic(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring UNUSED(filename), bool UNUSED(looping) ) {}
     94    void StartPlaylist(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool UNUSED(looping) ){}
     95    void AddPlaylistItem(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring UNUSED(filename) ){}
     96    void ClearPlaylist(ScriptInterface::CxPrivate* UNUSED(pCxPrivate) ){}
     97    void StopMusic(ScriptInterface::CxPrivate* UNUSED(pCxPrivate) ){}
     98    void StartMusic(ScriptInterface::CxPrivate* UNUSED(pCxPrivate) ){}
    9999
    100100  #endif
    101101
  • source/soundmanager/SoundManager.h

     
    108108    void StartPlayList( bool doLoop );
    109109    void AddPlayListItem(const VfsPath& itemPath);
    110110
    111     static void ScriptingInit();
    112111    static void CreateSoundManager();
    113112    static void SetEnabled(bool doEnable);
    114113    static Status ReloadChangedFileCB(void* param, const VfsPath& path);
  • source/gui/CGUI.cpp

     
    4141#include "CTooltip.h"
    4242#include "MiniMap.h"
    4343#include "scripting/JSInterface_GUITypes.h"
     44#include "scripting/ScriptFunctions.h"
    4445
    4546#include "graphics/FontMetrics.h"
    4647#include "graphics/ShaderManager.h"
     
    5859#include "ps/Pyrogenesis.h"
    5960#include "ps/XML/Xeromyces.h"
    6061#include "renderer/Renderer.h"
    61 #include "scripting/ScriptingHost.h"
    6262#include "scriptinterface/ScriptInterface.h"
    6363
    6464extern int g_yres;
    6565
    6666const double SELECT_DBLCLICK_RATE = 0.5;
    6767
    68 void CGUI::ScriptingInit()
    69 {
    70     JSI_IGUIObject::init();
    71     JSI_GUITypes::init();
    72 }
    73 
    7468InReaction CGUI::HandleEvent(const SDL_Event_* ev)
    7569{
    7670    InReaction ret = IN_PASS;
     
    321315//  Constructor / Destructor
    322316//-------------------------------------------------------------------
    323317
    324 // To isolate the vars declared by each GUI page, we need to create
    325 // a pseudo-global object to declare them in. In particular, it must
    326 // have no parent object, so it must be declared with JS_NewGlobalObject.
    327 // But GUI scripts should have access to the real global's properties
    328 // (Array, undefined, getGUIObjectByName, etc), so we add a custom resolver
    329 // that defers to the real global object when necessary.
    330 
    331 static JSBool GetGlobalProperty(JSContext* cx, JSObject* UNUSED(obj), jsid id, jsval* vp)
     318CGUI::CGUI(const shared_ptr<ScriptRuntime>& runtime) : m_MouseButtons(0), m_FocusedObject(NULL), m_InternalNameNumber(0)
    332319{
    333     return JS_GetPropertyById(cx, g_ScriptingHost.GetGlobalObject(), id, vp);
     320    m_ScriptInterface.reset(new ScriptInterface("Engine", "GUIPage", runtime));
     321    GuiScriptingInit(*m_ScriptInterface);
     322    m_BaseObject = new CGUIDummyObject;
     323    m_BaseObject->SetGUI(this);
    334324}
    335325
    336 static JSBool SetGlobalProperty(JSContext* cx, JSObject* UNUSED(obj), jsid id, JSBool UNUSED(strict), jsval* vp)
     326CGUI::CGUI(const shared_ptr<ScriptInterface>& scriptInterface) : m_MouseButtons(0), m_FocusedObject(NULL), m_InternalNameNumber(0)
    337327{
    338     return JS_SetPropertyById(cx, g_ScriptingHost.GetGlobalObject(), id, vp);
    339 }
    340 
    341 static JSBool ResolveGlobalProperty(JSContext* cx, JSObject* obj, jsid id, uintN flags, JSObject** objp)
    342 {
    343     // This gets called when the property can't be resolved in the page_global object.
    344 
    345     // Warning: The interaction between this resolution stuff and the JITs appears
    346     // to be quite fragile, and I don't quite understand what the constraints are.
    347     // If changing it, be careful to test with each JIT to make sure it works.
    348     // (This code is somewhat based on GPSEE's module system.)
    349 
    350     // Declarations and assignments shouldn't affect the real global
    351     if (flags & (JSRESOLVE_DECLARING | JSRESOLVE_ASSIGNING))
    352     {
    353         // Can't be resolved - return NULL
    354         *objp = NULL;
    355         return JS_TRUE;
    356     }
    357 
    358     // Check whether the real global object defined this property
    359     uintN attrs;
    360     JSBool found;
    361     if (!JS_GetPropertyAttrsGetterAndSetterById(cx, g_ScriptingHost.GetGlobalObject(), id, &attrs, &found, NULL, NULL))
    362         return JS_FALSE;
    363 
    364     if (!found)
    365     {
    366         // Not found on real global, so can't be resolved - return NULL
    367         *objp = NULL;
    368         return JS_TRUE;
    369     }
    370 
    371     // Retrieve the property value from the global
    372     jsval v;
    373     if (!JS_GetPropertyById(cx, g_ScriptingHost.GetGlobalObject(), id, &v))
    374         return JS_FALSE;
    375 
    376     // Add the global's property value onto this object, with getter/setter that will
    377     // update the global's copy instead of this copy, and then return this object
    378     if (!JS_DefinePropertyById(cx, obj, id, v, GetGlobalProperty, SetGlobalProperty, attrs))
    379         return JS_FALSE;
    380 
    381     *objp = obj;
    382     return JS_TRUE;
    383 }
    384 
    385 static JSClass page_global_class = {
    386     "page_global", JSCLASS_GLOBAL_FLAGS | JSCLASS_NEW_RESOLVE,
    387     JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
    388     JS_EnumerateStub, (JSResolveOp)ResolveGlobalProperty, JS_ConvertStub, JS_FinalizeStub,
    389     NULL, NULL, NULL, NULL,
    390     NULL, NULL, NULL, NULL
    391 };
    392 
    393 CGUI::CGUI() : m_MouseButtons(0), m_FocusedObject(NULL), m_InternalNameNumber(0)
    394 {
    395328    m_BaseObject = new CGUIDummyObject;
    396329    m_BaseObject->SetGUI(this);
    397330
    398     // Construct the root object for all GUI JavaScript things
    399     m_ScriptObject = JS_NewGlobalObject(g_ScriptingHost.getContext(), &page_global_class);
    400     JS_AddObjectRoot(g_ScriptingHost.getContext(), &m_ScriptObject);
     331    m_ScriptInterface = scriptInterface;
    401332}
    402333
    403334CGUI::~CGUI()
     
    406337
    407338    if (m_BaseObject)
    408339        delete m_BaseObject;
    409 
    410     if (m_ScriptObject)
    411     {
    412         // Let it be garbage-collected
    413         JS_RemoveObjectRoot(g_ScriptingHost.getContext(), &m_ScriptObject);
    414     }
    415340}
    416341
    417342//-------------------------------------------------------------------
     
    430355
    431356void CGUI::Initialize()
    432357{
     358    JSI_IGUIObject::init(*m_ScriptInterface);
     359    JSI_GUITypes::init(*m_ScriptInterface);
    433360    // Add base types!
    434361    //  You can also add types outside the GUI to extend the flexibility of the GUI.
    435362    //  Pyrogenesis though will have all the object types inserted from here.
     
    13371264            code += CStr(child.GetText());
    13381265
    13391266            CStr action = CStr(child.GetAttributes().GetNamedItem(attr_on));
     1267           
     1268            // We need to set the GUI this object belongs to because RegisterScriptHandler requires an associated GUI.
     1269            object->SetGUI(this);
    13401270            object->RegisterScriptHandler(action.LowerCase(), code, this);
    13411271        }
    13421272        else if (element_name == elmt_repeat)
     
    14301360        Paths.insert(file);
    14311361        try
    14321362        {
    1433             g_ScriptingHost.RunScript(file, m_ScriptObject);
     1363            m_ScriptInterface->LoadGlobalScriptFile(file);
    14341364        }
    14351365        catch (PSERROR_Scripting& e)
    14361366        {
     
    14431373    {
    14441374        CStr code (Element.GetText());
    14451375        if (! code.empty())
    1446             g_ScriptingHost.RunMemScript(code.c_str(), code.length(), "Some XML file", Element.GetLineNumber(), m_ScriptObject);
     1376            m_ScriptInterface->LoadGlobalScript(L"Some XML file", code.FromUTF8());
    14471377    }
    14481378    catch (PSERROR_Scripting& e)
    14491379    {
  • source/gui/IGUIObject.h

     
    554554    CGUI                                    *m_pGUI;
    555555
    556556    // Internal storage for registered script handlers.
    557     std::map<CStr, JSObject**> m_ScriptHandlers;
     557    std::map<CStr, CScriptValRooted> m_ScriptHandlers;
    558558   
    559559    // Cached JSObject representing this GUI object
    560     JSObject                                *m_JSObject;
     560    CScriptValRooted                        m_JSObject;
    561561};
    562562
    563563
  • source/gui/scripting/ScriptFunctions.cpp

     
    2323#include "graphics/GameView.h"
    2424#include "graphics/MapReader.h"
    2525#include "gui/GUIManager.h"
     26#include "gui/GUI.h"
     27#include "gui/IGUIObject.h"
    2628#include "graphics/scripting/JSInterface_GameView.h"
    2729#include "lib/timer.h"
    2830#include "lib/utf8.h"
     31#include "lib/svn_revision.h"
    2932#include "lib/sysdep/sysdep.h"
    3033#include "lobby/scripting/JSInterface_Lobby.h"
    3134#include "maths/FixedVector3D.h"
     
    3639#include "ps/CConsole.h"
    3740#include "ps/Errors.h"
    3841#include "ps/Game.h"
     42#include "ps/Globals.h" // g_frequencyFilter
    3943#include "ps/GUID.h"
    4044#include "ps/World.h"
    4145#include "ps/Hotkey.h"
     
    4549#include "ps/SavedGame.h"
    4650#include "ps/scripting/JSInterface_ConfigDB.h"
    4751#include "ps/scripting/JSInterface_Console.h"
     52#include "ps/scripting/JSInterface_VFS.h"
    4853#include "ps/UserReport.h"
    4954#include "ps/GameSetup/Atlas.h"
    5055#include "ps/GameSetup/Config.h"
     
    6065#include "simulation2/components/ICmpTemplateManager.h"
    6166#include "simulation2/components/ICmpSelectable.h"
    6267#include "simulation2/helpers/Selection.h"
     68#include "soundmanager/SoundManager.h"
     69#include "soundmanager/scripting/JSInterface_Sound.h"
    6370
    6471#include "js/jsapi.h"
    6572/*
     
    7077 */
    7178
    7279extern void restart_mainloop_in_atlas(); // from main.cpp
     80extern void EndGame();
     81extern void kill_mainloop();
    7382
    7483namespace {
    7584
    76 CScriptVal GetActiveGui(void* UNUSED(cbdata))
     85void PushGuiPage(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name, CScriptVal initData)
    7786{
    78     return OBJECT_TO_JSVAL(g_GUI->GetScriptObject());
     87    g_GUI->PushPage(name, pCxPrivate->pScriptInterface, initData);
    7988}
    8089
    81 void PushGuiPage(void* UNUSED(cbdata), std::wstring name, CScriptVal initData)
     90void SwitchGuiPage(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name, CScriptVal initData)
    8291{
    83     g_GUI->PushPage(name, initData);
     92    g_GUI->SwitchPage(name, pCxPrivate->pScriptInterface, initData);
    8493}
    8594
    86 void SwitchGuiPage(void* UNUSED(cbdata), std::wstring name, CScriptVal initData)
     95void PopGuiPage(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    8796{
    88     g_GUI->SwitchPage(name, initData);
    89 }
    90 
    91 void PopGuiPage(void* UNUSED(cbdata))
    92 {
    9397    g_GUI->PopPage();
    9498}
    9599
    96 CScriptVal GuiInterfaceCall(void* cbdata, std::wstring name, CScriptVal data)
     100CScriptVal GuiInterfaceCall(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name, CScriptVal data)
    97101{
    98     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    99 
    100102    if (!g_Game)
    101103        return JSVAL_VOID;
    102104    CSimulation2* sim = g_Game->GetSimulation2();
     
    110112    if (g_Game)
    111113        player = g_Game->GetPlayerID();
    112114
    113     CScriptValRooted arg (sim->GetScriptInterface().GetContext(), sim->GetScriptInterface().CloneValueFromOtherContext(guiManager->GetScriptInterface(), data.get()));
     115    CScriptValRooted arg (sim->GetScriptInterface().GetContext(), sim->GetScriptInterface().CloneValueFromOtherContext(*(pCxPrivate->pScriptInterface), data.get()));
    114116    CScriptVal ret (cmpGuiInterface->ScriptCall(player, name, arg.get()));
    115     return guiManager->GetScriptInterface().CloneValueFromOtherContext(sim->GetScriptInterface(), ret.get());
     117    return pCxPrivate->pScriptInterface->CloneValueFromOtherContext(sim->GetScriptInterface(), ret.get());
    116118}
    117119
    118 void PostNetworkCommand(void* cbdata, CScriptVal cmd)
     120void PostNetworkCommand(ScriptInterface::CxPrivate* pCxPrivate, CScriptVal cmd)
    119121{
    120     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    121 
    122122    if (!g_Game)
    123123        return;
    124124    CSimulation2* sim = g_Game->GetSimulation2();
     
    128128    if (!cmpCommandQueue)
    129129        return;
    130130
    131     jsval cmd2 = sim->GetScriptInterface().CloneValueFromOtherContext(guiManager->GetScriptInterface(), cmd.get());
     131    jsval cmd2 = sim->GetScriptInterface().CloneValueFromOtherContext(*(pCxPrivate->pScriptInterface), cmd.get());
    132132
    133133    cmpCommandQueue->PostNetworkCommand(cmd2);
    134134}
    135135
    136 std::vector<entity_id_t> PickEntitiesAtPoint(void* UNUSED(cbdata), int x, int y)
     136std::vector<entity_id_t> PickEntitiesAtPoint(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int x, int y)
    137137{
    138138    return EntitySelection::PickEntitiesAtPoint(*g_Game->GetSimulation2(), *g_Game->GetView()->GetCamera(), x, y, g_Game->GetPlayerID(), false);
    139139}
    140140
    141 std::vector<entity_id_t> PickFriendlyEntitiesInRect(void* UNUSED(cbdata), int x0, int y0, int x1, int y1, int player)
     141std::vector<entity_id_t> PickFriendlyEntitiesInRect(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int x0, int y0, int x1, int y1, int player)
    142142{
    143143    return EntitySelection::PickEntitiesInRect(*g_Game->GetSimulation2(), *g_Game->GetView()->GetCamera(), x0, y0, x1, y1, player, false);
    144144}
    145145
    146 std::vector<entity_id_t> PickFriendlyEntitiesOnScreen(void* cbdata, int player)
     146std::vector<entity_id_t> PickFriendlyEntitiesOnScreen(ScriptInterface::CxPrivate* pCxPrivate, int player)
    147147{
    148     return PickFriendlyEntitiesInRect(cbdata, 0, 0, g_xres, g_yres, player);
     148    return PickFriendlyEntitiesInRect(pCxPrivate, 0, 0, g_xres, g_yres, player);
    149149}
    150150
    151 std::vector<entity_id_t> PickSimilarFriendlyEntities(void* UNUSED(cbdata), std::string templateName, bool includeOffScreen, bool matchRank, bool allowFoundations)
     151std::vector<entity_id_t> PickSimilarFriendlyEntities(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::string templateName, bool includeOffScreen, bool matchRank, bool allowFoundations)
    152152{
    153153    return EntitySelection::PickSimilarEntities(*g_Game->GetSimulation2(), *g_Game->GetView()->GetCamera(), templateName, g_Game->GetPlayerID(), includeOffScreen, matchRank, false, allowFoundations);
    154154}
    155155
    156 CFixedVector3D GetTerrainAtScreenPoint(void* UNUSED(cbdata), int x, int y)
     156CFixedVector3D GetTerrainAtScreenPoint(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int x, int y)
    157157{
    158158    CVector3D pos = g_Game->GetView()->GetCamera()->GetWorldCoordinates(x, y, true);
    159159    return CFixedVector3D(fixed::FromFloat(pos.X), fixed::FromFloat(pos.Y), fixed::FromFloat(pos.Z));
    160160}
    161161
    162 std::wstring SetCursor(void* UNUSED(cbdata), std::wstring name)
     162std::wstring SetCursor(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring name)
    163163{
    164164    std::wstring old = g_CursorName;
    165165    g_CursorName = name;
    166166    return old;
    167167}
    168168
    169 int GetPlayerID(void* UNUSED(cbdata))
     169int GetPlayerID(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    170170{
    171171    if (g_Game)
    172172        return g_Game->GetPlayerID();
    173173    return -1;
    174174}
    175175
    176 void SetPlayerID(void* UNUSED(cbdata), int id)
     176void SetPlayerID(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int id)
    177177{
    178178    if (g_Game)
    179179        g_Game->SetPlayerID(id);
    180180}
    181181
    182 void StartNetworkGame(void* UNUSED(cbdata))
     182void StartNetworkGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    183183{
    184184    ENSURE(g_NetServer);
    185185    g_NetServer->StartGame();
    186186}
    187187
    188 void StartGame(void* cbdata, CScriptVal attribs, int playerID)
     188void StartGame(ScriptInterface::CxPrivate* pCxPrivate, CScriptVal attribs, int playerID)
    189189{
    190     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    191 
    192190    ENSURE(!g_NetServer);
    193191    ENSURE(!g_NetClient);
    194192
     
    198196    // Convert from GUI script context to sim script context
    199197    CSimulation2* sim = g_Game->GetSimulation2();
    200198    CScriptValRooted gameAttribs (sim->GetScriptInterface().GetContext(),
    201             sim->GetScriptInterface().CloneValueFromOtherContext(guiManager->GetScriptInterface(), attribs.get()));
     199            sim->GetScriptInterface().CloneValueFromOtherContext(*(pCxPrivate->pScriptInterface), attribs.get()));
    202200
    203201    g_Game->SetPlayerID(playerID);
    204202    g_Game->StartGame(gameAttribs, "");
    205203}
    206204
    207 CScriptVal StartSavedGame(void* cbdata, std::wstring name)
     205CScriptVal StartSavedGame(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name)
    208206{
    209     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    210 
    211207    ENSURE(!g_NetServer);
    212208    ENSURE(!g_NetClient);
    213209
     
    216212    // Load the saved game data from disk
    217213    CScriptValRooted metadata;
    218214    std::string savedState;
    219     Status err = SavedGames::Load(name, guiManager->GetScriptInterface(), metadata, savedState);
     215    Status err = SavedGames::Load(name, *(pCxPrivate->pScriptInterface), metadata, savedState);
    220216    if (err < 0)
    221217        return CScriptVal();
    222218
     
    225221    // Convert from GUI script context to sim script context
    226222    CSimulation2* sim = g_Game->GetSimulation2();
    227223    CScriptValRooted gameMetadata (sim->GetScriptInterface().GetContext(),
    228         sim->GetScriptInterface().CloneValueFromOtherContext(guiManager->GetScriptInterface(), metadata.get()));
     224        sim->GetScriptInterface().CloneValueFromOtherContext(*(pCxPrivate->pScriptInterface), metadata.get()));
    229225
    230226    CScriptValRooted gameInitAttributes;
    231227    sim->GetScriptInterface().GetProperty(gameMetadata.get(), "initAttributes", gameInitAttributes);
     
    240236    return metadata.get();
    241237}
    242238
    243 void SaveGame(void* cbdata, std::wstring filename, std::wstring description)
     239void SaveGame(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename, std::wstring description)
    244240{
    245     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
     241    CGUIManager* guiManager = static_cast<CGUIManager*> (pCxPrivate->pCBData);
    246242
    247243    if (SavedGames::Save(filename, description, *g_Game->GetSimulation2(), guiManager, g_Game->GetPlayerID()) < 0)
    248244        LOGERROR(L"Failed to save game");
    249245}
    250246
    251 void SaveGamePrefix(void* cbdata, std::wstring prefix, std::wstring description)
     247void SaveGamePrefix(ScriptInterface::CxPrivate* pCxPrivate, std::wstring prefix, std::wstring description)
    252248{
    253     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
     249    CGUIManager* guiManager = static_cast<CGUIManager*> (pCxPrivate->pCBData);
    254250
    255251    if (SavedGames::SavePrefix(prefix, description, *g_Game->GetSimulation2(), guiManager, g_Game->GetPlayerID()) < 0)
    256252        LOGERROR(L"Failed to save game");
    257253}
    258254
    259 void SetNetworkGameAttributes(void* cbdata, CScriptVal attribs)
     255void SetNetworkGameAttributes(ScriptInterface::CxPrivate* pCxPrivate, CScriptVal attribs)
    260256{
    261     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    262 
    263257    ENSURE(g_NetServer);
    264258
    265     g_NetServer->UpdateGameAttributes(attribs, guiManager->GetScriptInterface());
     259    g_NetServer->UpdateGameAttributes(attribs, *(pCxPrivate->pScriptInterface));
    266260}
    267261
    268 void StartNetworkHost(void* cbdata, std::wstring playerName)
     262void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, std::wstring playerName)
    269263{
    270     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    271 
    272264    ENSURE(!g_NetClient);
    273265    ENSURE(!g_NetServer);
    274266    ENSURE(!g_Game);
     
    276268    g_NetServer = new CNetServer();
    277269    if (!g_NetServer->SetupConnection())
    278270    {
    279         guiManager->GetScriptInterface().ReportError("Failed to start server");
     271        pCxPrivate->pScriptInterface->ReportError("Failed to start server");
    280272        SAFE_DELETE(g_NetServer);
    281273        return;
    282274    }
     
    287279
    288280    if (!g_NetClient->SetupConnection("127.0.0.1"))
    289281    {
    290         guiManager->GetScriptInterface().ReportError("Failed to connect to server");
     282        pCxPrivate->pScriptInterface->ReportError("Failed to connect to server");
    291283        SAFE_DELETE(g_NetClient);
    292284        SAFE_DELETE(g_Game);
    293285    }
    294286}
    295287
    296 void StartNetworkJoin(void* cbdata, std::wstring playerName, std::string serverAddress)
     288void StartNetworkJoin(ScriptInterface::CxPrivate* pCxPrivate, std::wstring playerName, std::string serverAddress)
    297289{
    298     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    299 
    300290    ENSURE(!g_NetClient);
    301291    ENSURE(!g_NetServer);
    302292    ENSURE(!g_Game);
     
    306296    g_NetClient->SetUserName(playerName);
    307297    if (!g_NetClient->SetupConnection(serverAddress))
    308298    {
    309         guiManager->GetScriptInterface().ReportError("Failed to connect to server");
     299        pCxPrivate->pScriptInterface->ReportError("Failed to connect to server");
    310300        SAFE_DELETE(g_NetClient);
    311301        SAFE_DELETE(g_Game);
    312302    }
    313303}
    314304
    315 void DisconnectNetworkGame(void* UNUSED(cbdata))
     305void DisconnectNetworkGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    316306{
    317307    // TODO: we ought to do async reliable disconnections
    318308
     
    321311    SAFE_DELETE(g_Game);
    322312}
    323313
    324 CScriptVal PollNetworkClient(void* cbdata)
     314CScriptVal PollNetworkClient(ScriptInterface::CxPrivate* pCxPrivate)
    325315{
    326     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    327 
    328316    if (!g_NetClient)
    329317        return CScriptVal();
    330318
    331319    CScriptValRooted poll = g_NetClient->GuiPoll();
    332320
    333321    // Convert from net client context to GUI script context
    334     return guiManager->GetScriptInterface().CloneValueFromOtherContext(g_NetClient->GetScriptInterface(), poll.get());
     322    return pCxPrivate->pScriptInterface->CloneValueFromOtherContext(g_NetClient->GetScriptInterface(), poll.get());
    335323}
    336324
    337 void AssignNetworkPlayer(void* UNUSED(cbdata), int playerID, std::string guid)
     325void AssignNetworkPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int playerID, std::string guid)
    338326{
    339327    ENSURE(g_NetServer);
    340328
    341329    g_NetServer->AssignPlayer(playerID, guid);
    342330}
    343331
    344 void SendNetworkChat(void* UNUSED(cbdata), std::wstring message)
     332void SendNetworkChat(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring message)
    345333{
    346334    ENSURE(g_NetClient);
    347335
    348336    g_NetClient->SendChatMessage(message);
    349337}
    350338
    351 std::vector<CScriptValRooted> GetAIs(void* cbdata)
     339std::vector<CScriptValRooted> GetAIs(ScriptInterface::CxPrivate* pCxPrivate)
    352340{
    353     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    354 
    355     return ICmpAIManager::GetAIs(guiManager->GetScriptInterface());
     341    return ICmpAIManager::GetAIs(*(pCxPrivate->pScriptInterface));
    356342}
    357343
    358 std::vector<CScriptValRooted> GetSavedGames(void* cbdata)
     344std::vector<CScriptValRooted> GetSavedGames(ScriptInterface::CxPrivate* pCxPrivate)
    359345{
    360     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    361 
    362     return SavedGames::GetSavedGames(guiManager->GetScriptInterface());
     346    return SavedGames::GetSavedGames(*(pCxPrivate->pScriptInterface));
    363347}
    364348
    365 bool DeleteSavedGame(void* UNUSED(cbdata), std::wstring name)
     349bool DeleteSavedGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring name)
    366350{
    367351    return SavedGames::DeleteSavedGame(name);
    368352}
    369353
    370 void OpenURL(void* UNUSED(cbdata), std::string url)
     354void OpenURL(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::string url)
    371355{
    372356    sys_open_url(url);
    373357}
    374358
    375 std::wstring GetMatchID(void* UNUSED(cbdata))
     359std::wstring GetMatchID(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    376360{
    377361    return ps_generate_guid().FromUTF8();
    378362}
    379363
    380 void RestartInAtlas(void* UNUSED(cbdata))
     364void RestartInAtlas(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    381365{
    382366    restart_mainloop_in_atlas();
    383367}
    384368
    385 bool AtlasIsAvailable(void* UNUSED(cbdata))
     369bool AtlasIsAvailable(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    386370{
    387371    return ATLAS_IsAvailable();
    388372}
    389373
    390 bool IsAtlasRunning(void* UNUSED(cbdata))
     374bool IsAtlasRunning(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    391375{
    392376    return (g_AtlasGameLoop && g_AtlasGameLoop->running);
    393377}
    394378
    395 CScriptVal LoadMapSettings(void* cbdata, VfsPath pathname)
     379CScriptVal LoadMapSettings(ScriptInterface::CxPrivate* pCxPrivate, VfsPath pathname)
    396380{
    397     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    398 
    399381    CMapSummaryReader reader;
    400382
    401383    if (reader.LoadMap(pathname) != PSRETURN_OK)
    402384        return CScriptVal();
    403385
    404     return reader.GetMapSettings(guiManager->GetScriptInterface()).get();
     386    return reader.GetMapSettings(*(pCxPrivate->pScriptInterface)).get();
    405387}
    406388
    407 CScriptVal GetMapSettings(void* cbdata)
     389CScriptVal GetMapSettings(ScriptInterface::CxPrivate* pCxPrivate)
    408390{
    409     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    410 
    411391    if (!g_Game)
    412392        return CScriptVal();
    413393
    414     return guiManager->GetScriptInterface().CloneValueFromOtherContext(
     394    return pCxPrivate->pScriptInterface->CloneValueFromOtherContext(
    415395        g_Game->GetSimulation2()->GetScriptInterface(),
    416396        g_Game->GetSimulation2()->GetMapSettings().get());
    417397}
     
    419399/**
    420400 * Get the current X coordinate of the camera.
    421401 */
    422 float CameraGetX(void* UNUSED(cbdata))
     402float CameraGetX(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    423403{
    424404    if (g_Game && g_Game->GetView())
    425405        return g_Game->GetView()->GetCameraX();
     
    429409/**
    430410 * Get the current Z coordinate of the camera.
    431411 */
    432 float CameraGetZ(void* UNUSED(cbdata))
     412float CameraGetZ(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    433413{
    434414    if (g_Game && g_Game->GetView())
    435415        return g_Game->GetView()->GetCameraZ();
     
    440420 * Start / stop camera following mode
    441421 * @param entityid unit id to follow. If zero, stop following mode
    442422 */
    443 void CameraFollow(void* UNUSED(cbdata), entity_id_t entityid)
     423void CameraFollow(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), entity_id_t entityid)
    444424{
    445425    if (g_Game && g_Game->GetView())
    446426        g_Game->GetView()->CameraFollow(entityid, false);
     
    450430 * Start / stop first-person camera following mode
    451431 * @param entityid unit id to follow. If zero, stop following mode
    452432 */
    453 void CameraFollowFPS(void* UNUSED(cbdata), entity_id_t entityid)
     433void CameraFollowFPS(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), entity_id_t entityid)
    454434{
    455435    if (g_Game && g_Game->GetView())
    456436        g_Game->GetView()->CameraFollow(entityid, true);
    457437}
    458438
    459439/// Move camera to a 2D location
    460 void CameraMoveTo(void* UNUSED(cbdata), entity_pos_t x, entity_pos_t z)
     440void CameraMoveTo(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), entity_pos_t x, entity_pos_t z)
    461441{
    462442    // called from JS; must not fail
    463443    if(!(g_Game && g_Game->GetWorld() && g_Game->GetView() && g_Game->GetWorld()->GetTerrain()))
     
    473453    g_Game->GetView()->MoveCameraTarget(target);
    474454}
    475455
    476 entity_id_t GetFollowedEntity(void* UNUSED(cbdata))
     456entity_id_t GetFollowedEntity(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    477457{
    478458    if (g_Game && g_Game->GetView())
    479459        return g_Game->GetView()->GetFollowedEntity();
     
    481461    return INVALID_ENTITY;
    482462}
    483463
    484 bool HotkeyIsPressed_(void* UNUSED(cbdata), std::string hotkeyName)
     464bool HotkeyIsPressed_(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::string hotkeyName)
    485465{
    486466    return HotkeyIsPressed(hotkeyName);
    487467}
    488468
    489 void DisplayErrorDialog(void* UNUSED(cbdata), std::wstring msg)
     469void DisplayErrorDialog(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring msg)
    490470{
    491471    debug_DisplayError(msg.c_str(), DE_NO_DEBUG_INFO, NULL, NULL, NULL, 0, NULL, NULL);
    492472}
    493473
    494 CScriptVal GetProfilerState(void* cbdata)
     474CScriptVal GetProfilerState(ScriptInterface::CxPrivate* pCxPrivate)
    495475{
    496     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    497 
    498     return g_ProfileViewer.SaveToJS(guiManager->GetScriptInterface());
     476    return g_ProfileViewer.SaveToJS(*(pCxPrivate->pScriptInterface));
    499477}
    500478
    501 
    502 bool IsUserReportEnabled(void* UNUSED(cbdata))
     479bool IsUserReportEnabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    503480{
    504481    return g_UserReporter.IsReportingEnabled();
    505482}
    506483
    507 bool IsSplashScreenEnabled(void* UNUSED(cbdata))
     484bool IsSplashScreenEnabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    508485{
    509486    bool splashScreenEnable = true;
    510487    CFG_GET_VAL("splashscreenenable", Bool, splashScreenEnable);
    511488    return splashScreenEnable;
    512489}
    513490
    514 void SetSplashScreenEnabled(void* UNUSED(cbdata), bool enabled)
     491void SetSplashScreenEnabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool enabled)
    515492{
    516493    CStr val = (enabled ? "true" : "false");
    517494    g_ConfigDB.CreateValue(CFG_USER, "splashscreenenable")->m_String = val;
     
    519496}
    520497
    521498
    522 void SetUserReportEnabled(void* UNUSED(cbdata), bool enabled)
     499void SetUserReportEnabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool enabled)
    523500{
    524501    g_UserReporter.SetReportingEnabled(enabled);
    525502}
    526503
    527 std::string GetUserReportStatus(void* UNUSED(cbdata))
     504std::string GetUserReportStatus(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    528505{
    529506    return g_UserReporter.GetStatus();
    530507}
    531508
    532 void SubmitUserReport(void* UNUSED(cbdata), std::string type, int version, std::wstring data)
     509void SubmitUserReport(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::string type, int version, std::wstring data)
    533510{
    534511    g_UserReporter.SubmitReport(type.c_str(), version, utf8_from_wstring(data));
    535512}
    536513
    537 
    538 
    539 void SetSimRate(void* UNUSED(cbdata), float rate)
     514void SetSimRate(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), float rate)
    540515{
    541516    g_Game->SetSimRate(rate);
    542517}
    543518
    544 float GetSimRate(void* UNUSED(cbdata))
     519float GetSimRate(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    545520{
    546521    return g_Game->GetSimRate();
    547522}
    548523
    549 void SetTurnLength(void* UNUSED(cbdata), int length)
     524void SetTurnLength(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int length)
    550525{
    551526    if (g_NetServer)
    552527        g_NetServer->SetTurnLength(length);
     
    555530}
    556531
    557532// Focus the game camera on a given position.
    558 void SetCameraTarget(void* UNUSED(cbdata), float x, float y, float z)
     533void SetCameraTarget(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), float x, float y, float z)
    559534{
    560535    g_Game->GetView()->ResetCameraTarget(CVector3D(x, y, z));
    561536}
     
    563538// Deliberately cause the game to crash.
    564539// Currently implemented via access violation (read of address 0).
    565540// Useful for testing the crashlog/stack trace code.
    566 int Crash(void* UNUSED(cbdata))
     541int Crash(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    567542{
    568543    debug_printf(L"Crashing at user's request.\n");
    569544    return *(volatile int*)0;
    570545}
    571546
    572 void DebugWarn(void* UNUSED(cbdata))
     547void DebugWarn(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    573548{
    574549    debug_warn(L"Warning at user's request.");
    575550}
    576551
    577552// Force a JS garbage collection cycle to take place immediately.
    578553// Writes an indication of how long this took to the console.
    579 void ForceGC(void* cbdata)
     554void ForceGC(ScriptInterface::CxPrivate* pCxPrivate)
    580555{
    581     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    582 
    583556    double time = timer_Time();
    584     JS_GC(guiManager->GetScriptInterface().GetContext());
     557    JS_GC(pCxPrivate->pScriptInterface->GetContext());
    585558    time = timer_Time() - time;
    586559    g_Console->InsertMessage(L"Garbage collection completed in: %f", time);
    587560}
    588561
    589 void DumpSimState(void* UNUSED(cbdata))
     562void DumpSimState(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    590563{
    591564    OsPath path = psLogDir()/"sim_dump.txt";
    592565    std::ofstream file (OsString(path).c_str(), std::ofstream::out | std::ofstream::trunc);
    593566    g_Game->GetSimulation2()->DumpDebugState(file);
    594567}
    595568
    596 void DumpTerrainMipmap(void* UNUSED(cbdata))
     569void DumpTerrainMipmap(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    597570{
    598571    VfsPath filename(L"screenshots/terrainmipmap.png");
    599572    g_Game->GetWorld()->GetTerrain()->GetHeightMipmap().DumpToDisk(filename);
     
    602575    LOGMESSAGERENDER(L"Terrain mipmap written to '%ls'", realPath.string().c_str());
    603576}
    604577
    605 void EnableTimeWarpRecording(void* UNUSED(cbdata), unsigned int numTurns)
     578void EnableTimeWarpRecording(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), unsigned int numTurns)
    606579{
    607580    g_Game->GetTurnManager()->EnableTimeWarpRecording(numTurns);
    608581}
    609582
    610 void RewindTimeWarp(void* UNUSED(cbdata))
     583void RewindTimeWarp(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    611584{
    612585    g_Game->GetTurnManager()->RewindTimeWarp();
    613586}
    614587
    615 void QuickSave(void* UNUSED(cbdata))
     588void QuickSave(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    616589{
    617590    g_Game->GetTurnManager()->QuickSave();
    618591}
    619592
    620 void QuickLoad(void* UNUSED(cbdata))
     593void QuickLoad(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    621594{
    622595    g_Game->GetTurnManager()->QuickLoad();
    623596}
    624597
    625 void SetBoundingBoxDebugOverlay(void* UNUSED(cbdata), bool enabled)
     598void SetBoundingBoxDebugOverlay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool enabled)
    626599{
    627600    ICmpSelectable::ms_EnableDebugOverlays = enabled;
    628601}
    629602
     603void Script_EndGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
     604{
     605    EndGame();
     606}
     607
     608// Cause the game to exit gracefully.
     609// params:
     610// returns:
     611// notes:
     612// - Exit happens after the current main loop iteration ends
     613//   (since this only sets a flag telling it to end)
     614void ExitProgram(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
     615{
     616    kill_mainloop();
     617}
     618
     619// Is the game paused?
     620bool IsPaused(ScriptInterface::CxPrivate* pCxPrivate)
     621{
     622    if (!g_Game)
     623    {
     624        JS_ReportError(pCxPrivate->pScriptInterface->GetContext(), "Game is not started");
     625        return false;
     626    }
     627
     628    return g_Game->m_Paused;
     629}
     630
     631// Pause/unpause the game
     632void SetPaused(ScriptInterface::CxPrivate* pCxPrivate, bool pause)
     633{
     634    if (!g_Game)
     635    {
     636        JS_ReportError(pCxPrivate->pScriptInterface->GetContext(), "Game is not started");
     637        return;
     638    }
     639    g_Game->m_Paused = pause;
     640#if CONFIG2_AUDIO
     641    if ( g_SoundManager )
     642        g_SoundManager->Pause(pause);
     643#endif
     644}
     645
     646// Return the global frames-per-second value.
     647// params:
     648// returns: FPS [int]
     649// notes:
     650// - This value is recalculated once a frame. We take special care to
     651//   filter it, so it is both accurate and free of jitter.
     652int GetFps(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
     653{
     654    int freq = 0;
     655    if (g_frequencyFilter)
     656        freq = g_frequencyFilter->StableFrequency();
     657    return freq;
     658}
     659
     660CScriptVal GetGUIObjectByName(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStr name)
     661{
     662        IGUIObject* guiObj = g_GUI->FindObjectByName(name);
     663        if (guiObj)
     664            return OBJECT_TO_JSVAL(guiObj->GetJSObject());
     665        else
     666            return JSVAL_VOID;
     667}
     668
     669// Return the date/time at which the current executable was compiled.
     670// params: mode OR an integer specifying
     671//   what to display: -1 for "date time (svn revision)", 0 for date, 1 for time, 2 for svn revision
     672// returns: string with the requested timestamp info
     673// notes:
     674// - Displayed on main menu screen; tells non-programmers which auto-build
     675//   they are running. Could also be determined via .EXE file properties,
     676//   but that's a bit more trouble.
     677// - To be exact, the date/time returned is when scriptglue.cpp was
     678//   last compiled, but the auto-build does full rebuilds.
     679// - svn revision is generated by calling svnversion and cached in
     680//   lib/svn_revision.cpp. it is useful to know when attempting to
     681//   reproduce bugs (the main EXE and PDB should be temporarily reverted to
     682//   that revision so that they match user-submitted crashdumps).
     683CStr GetBuildTimestamp(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int mode)
     684{
     685    char buf[200];
     686
     687    // see function documentation
     688    switch(mode)
     689    {
     690    case -1:
     691        sprintf_s(buf, ARRAY_SIZE(buf), "%s %s (%ls)", __DATE__, __TIME__, svn_revision);
     692        break;
     693    case 0:
     694        sprintf_s(buf, ARRAY_SIZE(buf), "%s", __DATE__);
     695        break;
     696    case 1:
     697        sprintf_s(buf, ARRAY_SIZE(buf), "%s", __TIME__);
     698        break;
     699    case 2:
     700        sprintf_s(buf, ARRAY_SIZE(buf), "%ls", svn_revision);
     701        break;
     702    }
     703
     704    return CStr(buf);
     705}
     706
     707//-----------------------------------------------------------------------------
     708// Timer
     709//-----------------------------------------------------------------------------
     710
     711
     712// Script profiling functions: Begin timing a piece of code with StartJsTimer(num)
     713// and stop timing with StopJsTimer(num). The results will be printed to stdout
     714// when the game exits.
     715
     716static const size_t MAX_JS_TIMERS = 20;
     717static TimerUnit js_start_times[MAX_JS_TIMERS];
     718static TimerUnit js_timer_overhead;
     719static TimerClient js_timer_clients[MAX_JS_TIMERS];
     720static wchar_t js_timer_descriptions_buf[MAX_JS_TIMERS * 12];   // depends on MAX_JS_TIMERS and format string below
     721
     722static void InitJsTimers(ScriptInterface& scriptInterface)
     723{
     724    wchar_t* pos = js_timer_descriptions_buf;
     725    for(size_t i = 0; i < MAX_JS_TIMERS; i++)
     726    {
     727        const wchar_t* description = pos;
     728        pos += swprintf_s(pos, 12, L"js_timer %d", (int)i)+1;
     729        timer_AddClient(&js_timer_clients[i], description);
     730    }
     731
     732    // call several times to get a good approximation of 'hot' performance.
     733    // note: don't use a separate timer slot to warm up and then judge
     734    // overhead from another: that causes worse results (probably some
     735    // caching effects inside JS, but I don't entirely understand why).
     736    std::wstring calibration_script =
     737        L"Engine.StartXTimer(0);\n" \
     738        "Engine.StopXTimer (0);\n" \
     739        "\n";
     740    scriptInterface.LoadGlobalScript("timer_calibration_script", calibration_script);
     741    // slight hack: call LoadGlobalScript twice because we can't average several
     742    // TimerUnit values because there's no operator/. this way is better anyway
     743    // because it hopefully avoids the one-time JS init overhead.
     744    js_timer_clients[0].sum.SetToZero();
     745    scriptInterface.LoadGlobalScript("timer_calibration_script", calibration_script);
     746    js_timer_clients[0].sum.SetToZero();
     747    js_timer_clients[0].num_calls = 0;
     748}
     749
     750void StartJsTimer(ScriptInterface::CxPrivate* pCxPrivate, unsigned int slot)
     751{
     752    ONCE(InitJsTimers(*(pCxPrivate->pScriptInterface)));
     753   
     754    if (slot >= MAX_JS_TIMERS)
     755        LOGERROR(L"Exceeded the maximum number of timer slots for scripts!");
     756
     757    js_start_times[slot].SetFromTimer();
     758}
     759
     760
     761void StopJsTimer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), unsigned int slot)
     762{
     763    if (slot >= MAX_JS_TIMERS)
     764        LOGERROR(L"Exceeded the maximum number of timer slots for scripts!");
     765
     766    TimerUnit now;
     767    now.SetFromTimer();
     768    now.Subtract(js_timer_overhead);
     769    BillingPolicy_Default()(&js_timer_clients[slot], js_start_times[slot], now);
     770    js_start_times[slot].SetToZero();
     771}
     772
     773
     774
    630775} // namespace
    631776
     777
     778
    632779void GuiScriptingInit(ScriptInterface& scriptInterface)
    633780{
    634781    JSI_GameView::RegisterScriptFunctions(scriptInterface);
    635782    JSI_Renderer::RegisterScriptFunctions(scriptInterface);
    636783    JSI_Console::RegisterScriptFunctions(scriptInterface);
    637784    JSI_ConfigDB::RegisterScriptFunctions(scriptInterface);
    638 
     785    JSI_Sound::RegisterScriptFunctions(scriptInterface);
     786 
     787    // VFS (external)
     788    scriptInterface.RegisterFunction<CScriptVal, std::wstring, std::wstring, bool, &JSI_VFS::BuildDirEntList>("BuildDirEntList");
     789    scriptInterface.RegisterFunction<double, std::wstring, &JSI_VFS::GetFileMTime>("GetFileMTime");
     790    scriptInterface.RegisterFunction<unsigned int, std::wstring, &JSI_VFS::GetFileSize>("GetFileSize");
     791    scriptInterface.RegisterFunction<CScriptVal, std::wstring, &JSI_VFS::ReadFile>("ReadFile");
     792    scriptInterface.RegisterFunction<CScriptVal, std::wstring, &JSI_VFS::ReadFileLines>("ReadFileLines");
    639793    // GUI manager functions:
    640     scriptInterface.RegisterFunction<CScriptVal, &GetActiveGui>("GetActiveGui");
    641794    scriptInterface.RegisterFunction<void, std::wstring, CScriptVal, &PushGuiPage>("PushGuiPage");
    642795    scriptInterface.RegisterFunction<void, std::wstring, CScriptVal, &SwitchGuiPage>("SwitchGuiPage");
    643796    scriptInterface.RegisterFunction<void, &PopGuiPage>("PopGuiPage");
     797    scriptInterface.RegisterFunction<CScriptVal, CStr, &GetGUIObjectByName>("GetGUIObjectByName");
    644798
    645799    // Simulation<->GUI interface functions:
    646800    scriptInterface.RegisterFunction<CScriptVal, std::wstring, CScriptVal, &GuiInterfaceCall>("GuiInterfaceCall");
     
    656810    // Network / game setup functions
    657811    scriptInterface.RegisterFunction<void, &StartNetworkGame>("StartNetworkGame");
    658812    scriptInterface.RegisterFunction<void, CScriptVal, int, &StartGame>("StartGame");
     813    scriptInterface.RegisterFunction<void, &Script_EndGame>("EndGame");
    659814    scriptInterface.RegisterFunction<void, std::wstring, &StartNetworkHost>("StartNetworkHost");
    660815    scriptInterface.RegisterFunction<void, std::wstring, std::string, &StartNetworkJoin>("StartNetworkJoin");
    661816    scriptInterface.RegisterFunction<void, &DisconnectNetworkGame>("DisconnectNetworkGame");
     
    694849    scriptInterface.RegisterFunction<bool, std::string, &HotkeyIsPressed_>("HotkeyIsPressed");
    695850    scriptInterface.RegisterFunction<void, std::wstring, &DisplayErrorDialog>("DisplayErrorDialog");
    696851    scriptInterface.RegisterFunction<CScriptVal, &GetProfilerState>("GetProfilerState");
     852    scriptInterface.RegisterFunction<void, &ExitProgram>("Exit");
     853    scriptInterface.RegisterFunction<bool, &IsPaused>("IsPaused");
     854    scriptInterface.RegisterFunction<void, bool, &SetPaused>("SetPaused");
     855    scriptInterface.RegisterFunction<int, &GetFps>("GetFPS");
     856    scriptInterface.RegisterFunction<CStr, int, &GetBuildTimestamp>("BuildTime");
    697857
    698858    // User report functions
    699859    scriptInterface.RegisterFunction<bool, &IsUserReportEnabled>("IsUserReportEnabled");
     
    706866    scriptInterface.RegisterFunction<void, bool, &SetSplashScreenEnabled>("SetSplashScreenEnabled");
    707867
    708868    // Development/debugging functions
     869    scriptInterface.RegisterFunction<void, unsigned int, &StartJsTimer>("StartXTimer");
     870    scriptInterface.RegisterFunction<void, unsigned int, &StopJsTimer>("StopXTimer");
    709871    scriptInterface.RegisterFunction<void, float, &SetSimRate>("SetSimRate");
    710872    scriptInterface.RegisterFunction<float, &GetSimRate>("GetSimRate");
    711873    scriptInterface.RegisterFunction<void, int, &SetTurnLength>("SetTurnLength");
  • source/gui/scripting/JSInterface_IGUIObject.cpp

     
    8686    if (propName.substr(0, 2) == "on")
    8787    {
    8888        CStr eventName (CStr(propName.substr(2)).LowerCase());
    89         std::map<CStr, JSObject**>::iterator it = e->m_ScriptHandlers.find(eventName);
     89        std::map<CStr, CScriptValRooted>::iterator it = e->m_ScriptHandlers.find(eventName);
    9090        if (it == e->m_ScriptHandlers.end())
    9191            *vp = JSVAL_NULL;
    9292        else
    93             *vp = OBJECT_TO_JSVAL(*(it->second));
     93            *vp = it->second.get();
    9494        return JS_TRUE;
    9595    }
    9696
     
    182182                *vp = OBJECT_TO_JSVAL(obj); // root it
    183183                try
    184184                {
    185                 #define P(x, y, z) g_ScriptingHost.SetObjectProperty_Double(obj, #z, area.x.y)
     185                    ScriptInterface* pScriptInterface = ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface;
     186                #define P(x, y, z) pScriptInterface->SetProperty(OBJECT_TO_JSVAL(obj), #z, area.x.y, false, true)
    186187                    P(pixel,    left,   left);
    187188                    P(pixel,    top,    top);
    188189                    P(pixel,    right,  right);
     
    481482                GUI<CClientArea>::GetSetting(e, propName, area);
    482483
    483484                JSObject* obj = JSVAL_TO_OBJECT(*vp);
    484                 #define P(x, y, z) area.x.y = (float)g_ScriptingHost.GetObjectProperty_Double(obj, #z)
     485                ScriptInterface* pScriptInterface = ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface;
     486                #define P(x, y, z) pScriptInterface->GetProperty(OBJECT_TO_JSVAL(obj), #z, area.x.y)
    485487                    P(pixel,    left,   left);
    486488                    P(pixel,    top,    top);
    487489                    P(pixel,    right,  right);
     
    603605    return JS_TRUE;
    604606}
    605607
    606 void JSI_IGUIObject::init()
     608void JSI_IGUIObject::init(ScriptInterface& scriptInterface)
    607609{
    608     g_ScriptingHost.DefineCustomObjectType(&JSI_class, construct, 1, JSI_props, JSI_methods, NULL, NULL);
     610    scriptInterface.DefineCustomObjectType(&JSI_class, construct, 1, JSI_props, JSI_methods, NULL, NULL);
    609611}
    610612
    611613JSBool JSI_IGUIObject::toString(JSContext* cx, uintN argc, jsval* vp)
     
    654656JSBool JSI_IGUIObject::getComputedSize(JSContext* cx, uintN argc, jsval* vp)
    655657{
    656658    UNUSED2(argc);
    657 
    658659    IGUIObject* e = (IGUIObject*)JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx, vp), &JSI_IGUIObject::JSI_class, NULL);
    659660    if (!e)
    660661        return JS_FALSE;
     
    665666    JSObject* obj = JS_NewObject(cx, NULL, NULL, NULL);
    666667    try
    667668    {
    668         g_ScriptingHost.SetObjectProperty_Double(obj, "left", size.left);
    669         g_ScriptingHost.SetObjectProperty_Double(obj, "right", size.right);
    670         g_ScriptingHost.SetObjectProperty_Double(obj, "top", size.top);
    671         g_ScriptingHost.SetObjectProperty_Double(obj, "bottom", size.bottom);
     669        ScriptInterface* pScriptInterface = ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface;
     670        pScriptInterface->SetProperty(OBJECT_TO_JSVAL(obj), "left", size.left, false, true);
     671        pScriptInterface->SetProperty(OBJECT_TO_JSVAL(obj), "right", size.right, false, true);
     672        pScriptInterface->SetProperty(OBJECT_TO_JSVAL(obj), "top", size.top, false, true);
     673        pScriptInterface->SetProperty(OBJECT_TO_JSVAL(obj), "bottom", size.bottom, false, true);
    672674    }
    673675    catch (PSERROR_Scripting_ConversionFailed&)
    674676    {
  • source/gui/scripting/JSInterface_GUITypes.cpp

     
    110110
    111111    try
    112112    {
    113 #define SIDE(side) buffer += ToPercentString(g_ScriptingHost.GetObjectProperty_Double(JS_THIS_OBJECT(cx, vp), #side), g_ScriptingHost.GetObjectProperty_Double(JS_THIS_OBJECT(cx, vp), "r"#side));
     113        ScriptInterface* pScriptInterface = ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface;
     114        double val, valr;
     115#define SIDE(side) \
     116        pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), #side, val); \
     117        pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "r"#side, valr); \
     118        buffer += ToPercentString(val, valr);
    114119        SIDE(left);
    115120        buffer += " ";
    116121        SIDE(top);
     
    191196{
    192197    UNUSED2(argc);
    193198
    194     jsdouble r, g, b, a;
    195     if (!JS_ValueToNumber(cx, g_ScriptingHost.GetObjectProperty(JS_THIS_OBJECT(cx, vp), "r"), &r)) return JS_FALSE;
    196     if (!JS_ValueToNumber(cx, g_ScriptingHost.GetObjectProperty(JS_THIS_OBJECT(cx, vp), "g"), &g)) return JS_FALSE;
    197     if (!JS_ValueToNumber(cx, g_ScriptingHost.GetObjectProperty(JS_THIS_OBJECT(cx, vp), "b"), &b)) return JS_FALSE;
    198     if (!JS_ValueToNumber(cx, g_ScriptingHost.GetObjectProperty(JS_THIS_OBJECT(cx, vp), "a"), &a)) return JS_FALSE;
    199 
     199    double r, g, b, a;
     200    ScriptInterface* pScriptInterface = ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface;
     201    pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "r", r);
     202    pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "g", g);
     203    pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "b", b);
     204    pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "a", a);
    200205    char buffer[256];
    201206    // Convert to integers, to be compatible with the GUI's string SetSetting
    202207    snprintf(buffer, 256, "%d %d %d %d",
     
    261266    UNUSED2(argc);
    262267
    263268    int32 x, y, buttons;
    264     if (!JS_ValueToECMAInt32(cx, g_ScriptingHost.GetObjectProperty(JS_THIS_OBJECT(cx, vp), "x"), &x)) return JS_FALSE;
    265     if (!JS_ValueToECMAInt32(cx, g_ScriptingHost.GetObjectProperty(JS_THIS_OBJECT(cx, vp), "y"), &y)) return JS_FALSE;
    266     if (!JS_ValueToECMAInt32(cx, g_ScriptingHost.GetObjectProperty(JS_THIS_OBJECT(cx, vp), "buttons"), &buttons)) return JS_FALSE;
     269    ScriptInterface* pScriptInterface = ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface;
     270    pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "x", x);
     271    pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "y", y);
     272    pScriptInterface->GetProperty(JS_THIS_VALUE(cx, vp), "buttons", buttons);
    267273
    268274    char buffer[256];
    269275    snprintf(buffer, 256, "%d %d %d", x, y, buttons);
     
    273279
    274280
    275281// Initialise all the types at once:
    276 void JSI_GUITypes::init()
     282void JSI_GUITypes::init(ScriptInterface& scriptInterface)
    277283{
    278     g_ScriptingHost.DefineCustomObjectType(&JSI_GUISize::JSI_class,  JSI_GUISize::construct,  1, JSI_GUISize::JSI_props,  JSI_GUISize::JSI_methods,  NULL, NULL);
    279     g_ScriptingHost.DefineCustomObjectType(&JSI_GUIColor::JSI_class, JSI_GUIColor::construct, 1, JSI_GUIColor::JSI_props, JSI_GUIColor::JSI_methods, NULL, NULL);
    280     g_ScriptingHost.DefineCustomObjectType(&JSI_GUIMouse::JSI_class, JSI_GUIMouse::construct, 1, JSI_GUIMouse::JSI_props, JSI_GUIMouse::JSI_methods, NULL, NULL);
     284    scriptInterface.DefineCustomObjectType(&JSI_GUISize::JSI_class,  JSI_GUISize::construct,  1, JSI_GUISize::JSI_props,  JSI_GUISize::JSI_methods,  NULL, NULL);
     285    scriptInterface.DefineCustomObjectType(&JSI_GUIColor::JSI_class, JSI_GUIColor::construct, 1, JSI_GUIColor::JSI_props, JSI_GUIColor::JSI_methods, NULL, NULL);
     286    scriptInterface.DefineCustomObjectType(&JSI_GUIMouse::JSI_class, JSI_GUIMouse::construct, 1, JSI_GUIMouse::JSI_props, JSI_GUIMouse::JSI_methods, NULL, NULL);
    281287}
  • source/gui/scripting/JSInterface_IGUIObject.h

     
    1515 * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
    1616 */
    1717
    18 #include "scripting/ScriptingHost.h"
     18#include "scriptinterface/ScriptInterface.h"
    1919
    2020#ifndef INCLUDED_JSI_IGUIOBJECT
    2121#define INCLUDED_JSI_IGUIOBJECT
     
    3232    JSBool focus(JSContext* cx, uintN argc, jsval* vp);
    3333    JSBool blur(JSContext* cx, uintN argc, jsval* vp);
    3434    JSBool getComputedSize(JSContext* cx, uintN argc, jsval* vp);
    35     void init();
     35    void init(ScriptInterface& scriptInterface);
    3636}
    3737
    3838#endif
  • source/gui/scripting/JSInterface_GUITypes.h

     
    1515 * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
    1616 */
    1717
    18 #include "scripting/ScriptingHost.h"
     18#include "scriptinterface/ScriptInterface.h"
    1919
    2020#ifndef INCLUDED_JSI_GUITYPES
    2121#define INCLUDED_JSI_GUITYPES
     
    3838
    3939namespace JSI_GUITypes
    4040{
    41     void init();
     41    void init(ScriptInterface& scriptInterface);
    4242}
    4343
    4444#endif
  • source/gui/GUIManager.h

     
    2222
    2323#include "lib/input.h"
    2424#include "lib/file/vfs/vfs_path.h"
     25#include "ps/CLogger.h"
    2526#include "ps/CStr.h"
    2627#include "scriptinterface/ScriptVal.h"
     28#include "scriptinterface/ScriptInterface.h"
    2729
    2830#include <set>
    2931
     
    4648{
    4749    NONCOPYABLE(CGUIManager);
    4850public:
    49     CGUIManager(ScriptInterface& scriptInterface);
     51    CGUIManager();
    5052    ~CGUIManager();
    5153
    52     ScriptInterface& GetScriptInterface() { return m_ScriptInterface; }
     54    shared_ptr<ScriptInterface> GetScriptInterface()
     55    {
     56        return m_ScriptInterface;
     57    }
     58    shared_ptr<ScriptRuntime> GetRuntime() { return m_ScriptRuntime; }
     59    shared_ptr<CGUI> GetActiveGUI() { return top(); }
    5360
    5461    /**
    5562     * Returns whether there are any current pages.
     
    5966    /**
    6067     * Load a new GUI page and make it active. All current pages will be destroyed.
    6168     */
    62     void SwitchPage(const CStrW& name, CScriptVal initData);
     69    void SwitchPage(const CStrW& name, ScriptInterface* srcScriptInterface, CScriptVal initData);
    6370
    6471    /**
    6572     * Load a new GUI page and make it active. All current pages will be retained,
    6673     * and will still be drawn and receive tick events, but will not receive
    6774     * user inputs.
    6875     */
    69     void PushPage(const CStrW& name, CScriptVal initData);
     76    void PushPage(const CStrW& pageName, ScriptInterface* srcScriptInterface, CScriptVal initData);
    7077
    7178    /**
    7279     * Unload the currently active GUI page, and make the previous page active.
     
    115122    void SendEventToAll(const CStr& eventName);
    116123
    117124    /**
    118      * See CGUI::GetScriptObject; applies to the currently active page.
    119      */
    120     JSObject* GetScriptObject();
    121 
    122     /**
    123125     * See CGUI::TickObjects; applies to @em all loaded pages.
    124126     */
    125127    void TickObjects();
     
    134136     */
    135137    void UpdateResolution();
    136138
    137     /**
    138      * Calls the current page's script function getSavedGameData() and returns the result.
    139      */
    140     CScriptVal GetSavedGameData();
     139    /**
     140     * Calls the current page's script function getSavedGameData() and returns the result.
     141     * The first overload also returns a pointer to the ScriptInterface the returned CScriptVal belongs to.
     142     */
     143    CScriptVal GetSavedGameData(ScriptInterface*& pPageScriptInterface);
     144    std::string GetSavedGameData();
     145 
     146    void RestoreSavedGameData(std::string jsonData);
    141147
    142148private:
    143149    struct SGUIPage
     
    151157        shared_ptr<CGUI> gui; // the actual GUI page
    152158    };
    153159
    154     void LoadPage(SGUIPage& page);
     160    void LoadPage(SGUIPage& page, ScriptInterface* srcScriptInterface, CScriptVal initData);
    155161
    156162    shared_ptr<CGUI> top() const;
     163   
     164    shared_ptr<CGUI> m_CurrentGUI; // used to latch state during TickObjects/LoadPage (this is kind of ugly)
     165    shared_ptr<ScriptRuntime> m_ScriptRuntime;
     166    shared_ptr<ScriptInterface> m_ScriptInterface;
    157167
    158168    typedef std::vector<SGUIPage> PageStackType;
    159169    PageStackType m_PageStack;
    160 
    161     shared_ptr<CGUI> m_CurrentGUI; // used to latch state during TickObjects/LoadPage (this is kind of ugly)
    162 
    163     ScriptInterface& m_ScriptInterface;
    164170};
    165171
    166172extern CGUIManager* g_GUI;
  • source/gui/GUIManager.cpp

     
    2626#include "ps/CLogger.h"
    2727#include "ps/Profile.h"
    2828#include "ps/XML/Xeromyces.h"
    29 #include "scripting/ScriptingHost.h"
    3029#include "scriptinterface/ScriptInterface.h"
    3130
    3231CGUIManager* g_GUI = NULL;
     
    4847    return g_GUI->HandleEvent(ev);
    4948}
    5049
    51 CGUIManager::CGUIManager(ScriptInterface& scriptInterface) :
    52     m_ScriptInterface(scriptInterface)
     50CGUIManager::CGUIManager()
    5351{
    54     ENSURE(ScriptInterface::GetCallbackData(scriptInterface.GetContext()) == NULL);
    55     scriptInterface.SetCallbackData(this);
    56 
    57     scriptInterface.LoadGlobalScripts();
     52    m_ScriptRuntime = g_ScriptRuntime;
     53    m_ScriptInterface.reset(new ScriptInterface("Engine", "GUIManager", m_ScriptRuntime));
     54    m_ScriptInterface->SetCallbackData(this);
     55    m_ScriptInterface->LoadGlobalScripts();
    5856}
    5957
    6058CGUIManager::~CGUIManager()
     
    6664    return !m_PageStack.empty();
    6765}
    6866
    69 void CGUIManager::SwitchPage(const CStrW& pageName, CScriptVal initData)
     67void CGUIManager::SwitchPage(const CStrW& pageName, ScriptInterface* srcScriptInterface, CScriptVal initData)
    7068{
     69    // The page stack is cleared (including the script context where initData came from),
     70    // therefore we have to clone initData.
     71    CScriptVal initDataCopy = JSVAL_VOID;
     72    if (initData.get() != JSVAL_VOID)
     73    {
     74        ENSURE(srcScriptInterface);
     75        initDataCopy = g_GUI->GetScriptInterface()->CloneValueFromOtherContext(*srcScriptInterface, initData.get());
     76    }
    7177    m_PageStack.clear();
    72     PushPage(pageName, initData);
     78    PushPage(pageName, g_GUI->GetScriptInterface().get(), initDataCopy);
    7379}
    7480
    75 void CGUIManager::PushPage(const CStrW& pageName, CScriptVal initData)
     81void CGUIManager::PushPage(const CStrW& pageName, ScriptInterface* srcScriptInterface, CScriptVal initData)
    7682{
    7783    m_PageStack.push_back(SGUIPage());
    7884    m_PageStack.back().name = pageName;
    79     m_PageStack.back().initData = CScriptValRooted(m_ScriptInterface.GetContext(), initData);
    80     LoadPage(m_PageStack.back());
     85    LoadPage(m_PageStack.back(), srcScriptInterface, initData);
    8186}
    8287
    8388void CGUIManager::PopPage()
     
    95100{
    96101    // Set up scripted init data for the standard message box window
    97102    CScriptValRooted data;
    98     m_ScriptInterface.Eval("({})", data);
    99     m_ScriptInterface.SetProperty(data.get(), "width", width, false);
    100     m_ScriptInterface.SetProperty(data.get(), "height", height, false);
    101     m_ScriptInterface.SetProperty(data.get(), "mode", 2, false);
    102     m_ScriptInterface.SetProperty(data.get(), "title", std::wstring(title), false);
    103     m_ScriptInterface.SetProperty(data.get(), "message", std::wstring(message), false);
     103    m_ScriptInterface->Eval("({})", data);
     104    m_ScriptInterface->SetProperty(data.get(), "width", width, false);
     105    m_ScriptInterface->SetProperty(data.get(), "height", height, false);
     106    m_ScriptInterface->SetProperty(data.get(), "mode", 2, false);
     107    m_ScriptInterface->SetProperty(data.get(), "title", std::wstring(title), false);
     108    m_ScriptInterface->SetProperty(data.get(), "message", std::wstring(message), false);
    104109
    105110    // Display the message box
    106     PushPage(L"page_msgbox.xml", data.get());
     111    PushPage(L"page_msgbox.xml", m_ScriptInterface.get(), data.get());
    107112}
    108113
    109 void CGUIManager::LoadPage(SGUIPage& page)
     114void CGUIManager::LoadPage(SGUIPage& page, ScriptInterface* srcScriptInterface, CScriptVal initData)
    110115{
     116    ENSURE(srcScriptInterface);
    111117    // If we're hotloading then try to grab some data from the previous page
    112118    CScriptValRooted hotloadData;
    113119    if (page.gui)
    114         m_ScriptInterface.CallFunction(OBJECT_TO_JSVAL(page.gui->GetScriptObject()), "getHotloadData", hotloadData);
     120        page.gui->GetScriptInterface()->CallFunction(page.gui->GetScriptInterface()->GetGlobalObject(), "getHotloadData", hotloadData);
     121       
     122    page.inputs.clear();
     123    // if we are hotloading, we keep the existing ScriptInterface
     124    if(!page.gui)
     125        page.gui.reset(new CGUI(m_ScriptRuntime));
     126    else
     127        page.gui.reset(new CGUI(page.gui->GetScriptInterface()));
    115128
    116     page.inputs.clear();
    117     page.gui.reset(new CGUI());
     129    // We need to pass the data as a wrapper because it can also contain callback function that can't be cloned
     130    // and need to be executed in the calling page's context.
     131    jsval wrapInitData = initData.get();
     132    if(!JS_WrapValue(page.gui->GetScriptInterface()->GetContext(), &wrapInitData))
     133        debug_warn(L"Wrapping InitData failed when loading a GUI page!");
     134    page.initData = CScriptValRooted(page.gui->GetScriptInterface()->GetContext(), wrapInitData);
     135
    118136    page.gui->Initialize();
    119137
    120138    VfsPath path = VfsPath("gui") / page.name;
     
    161179    page.gui->SendEventToAll("load");
    162180
    163181    // Call the init() function
    164     if (!m_ScriptInterface.CallFunctionVoid(OBJECT_TO_JSVAL(page.gui->GetScriptObject()), "init", page.initData, hotloadData))
     182    if (!page.gui->GetScriptInterface()->CallFunctionVoid(page.gui->GetScriptInterface()->GetGlobalObject(), "init", page.initData, hotloadData))
    165183    {
    166184        LOGERROR(L"GUI page '%ls': Failed to call init() function", page.name.c_str());
    167185    }
     
    176194        if (it->inputs.count(path))
    177195        {
    178196            LOGMESSAGE(L"GUI file '%ls' changed - reloading page '%ls'", path.string().c_str(), it->name.c_str());
    179             LoadPage(*it);
     197            LoadPage(*it, NULL, JSVAL_VOID);
    180198            // TODO: this can crash if LoadPage runs an init script which modifies the page stack and breaks our iterators
    181199        }
    182200    }
     
    184202    return INFO::OK;
    185203}
    186204
    187 CScriptVal CGUIManager::GetSavedGameData()
     205CScriptVal CGUIManager::GetSavedGameData(ScriptInterface*& pPageScriptInterface)
    188206{
    189207    CScriptVal data;
    190     if (!m_ScriptInterface.CallFunction(OBJECT_TO_JSVAL(top()->GetScriptObject()), "getSavedGameData", data))
     208    if (!top()->GetScriptInterface()->CallFunction(top()->GetGlobalObject(), "getSavedGameData", data))
    191209        LOGERROR(L"Failed to call getSavedGameData() on the current GUI page");
     210    pPageScriptInterface = GetScriptInterface().get();
    192211    return data;
    193212}
    194213
     214std::string CGUIManager::GetSavedGameData()
     215{
     216    CScriptVal data;
     217    top()->GetScriptInterface()->CallFunction(top()->GetGlobalObject(), "getSavedGameData", data);
     218    return top()->GetScriptInterface()->StringifyJSON(data.get(), false);
     219}
     220
     221void CGUIManager::RestoreSavedGameData(std::string jsonData)
     222{
     223    top()->GetScriptInterface()->CallFunctionVoid(top()->GetGlobalObject(), "restoreSavedGameData",
     224                                                        top()->GetScriptInterface()->ParseJSON(jsonData));
     225}
     226
    195227InReaction CGUIManager::HandleEvent(const SDL_Event_* ev)
    196228{
    197229    // We want scripts to have access to the raw input events, so they can do complex
     
    205237
    206238    {
    207239        PROFILE("handleInputBeforeGui");
    208         if (m_ScriptInterface.CallFunction(OBJECT_TO_JSVAL(top()->GetScriptObject()), "handleInputBeforeGui", *ev, top()->FindObjectUnderMouse(), handled))
     240        if (top()->GetScriptInterface()->CallFunction(top()->GetGlobalObject(), "handleInputBeforeGui", *ev, top()->FindObjectUnderMouse(), handled))
    209241            if (handled)
    210242                return IN_HANDLED;
    211243    }
     
    219251
    220252    {
    221253        PROFILE("handleInputAfterGui");
    222         if (m_ScriptInterface.CallFunction(OBJECT_TO_JSVAL(top()->GetScriptObject()), "handleInputAfterGui", *ev, handled))
    223             if (handled)
     254        if (top()->GetScriptInterface()->CallFunction(top()->GetGlobalObject(), "handleInputAfterGui", *ev, handled))           if (handled)
    224255                return IN_HANDLED;
    225256    }
    226257
     
    287318        it->gui->UpdateResolution();
    288319}
    289320
    290 JSObject* CGUIManager::GetScriptObject()
    291 {
    292     return top()->GetScriptObject();
    293 }
    294 
    295321// This returns a shared_ptr to make sure the CGUI doesn't get deallocated
    296322// while we're in the middle of calling a function on it (e.g. if a GUI script
    297323// calls SwitchPage)
  • source/gui/IGUIObject.cpp

     
    4343IGUIObject::IGUIObject() :
    4444    m_pGUI(NULL),
    4545    m_pParent(NULL),
    46     m_MouseHovering(false),
    47     m_JSObject(NULL)
     46    m_MouseHovering(false)
    4847{
    4948    AddSetting(GUIST_bool,          "enabled");
    5049    AddSetting(GUIST_bool,          "hidden");
     
    8483            }
    8584        }
    8685    }
    87 
    88     {
    89         std::map<CStr, JSObject**>::iterator it;
    90         for (it = m_ScriptHandlers.begin(); it != m_ScriptHandlers.end(); ++it)
    91         {
    92             JS_RemoveObjectRoot(g_ScriptingHost.getContext(), it->second);
    93             delete it->second;
    94         }
    95     }
    96    
    97     if (m_JSObject)
    98         JS_RemoveObjectRoot(g_ScriptingHost.getContext(), &m_JSObject);
    9986}
    10087
    10188//-------------------------------------------------------------------
     
    429416
    430417void IGUIObject::RegisterScriptHandler(const CStr& Action, const CStr& Code, CGUI* pGUI)
    431418{
     419    if(!GetGUI())
     420        throw PSERROR_GUI_OperationNeedsGUIObject();
     421       
     422    JSContext* cx = pGUI->GetScriptInterface()->GetContext();
     423   
    432424    const int paramCount = 1;
    433425    const char* paramNames[paramCount] = { "mouse" };
    434426
     
    440432    char buf[64];
    441433    sprintf_s(buf, ARRAY_SIZE(buf), "__eventhandler%d (%s)", x++, Action.c_str());
    442434
    443     JSFunction* func = JS_CompileFunction(g_ScriptingHost.getContext(), pGUI->m_ScriptObject,
     435    JSFunction* func = JS_CompileFunction(cx, JSVAL_TO_OBJECT(pGUI->GetGlobalObject()),
    444436        buf, paramCount, paramNames, Code.c_str(), Code.length(), CodeName.c_str(), 0);
    445437
    446438    if (!func)
     
    451443
    452444void IGUIObject::SetScriptHandler(const CStr& Action, JSObject* Function)
    453445{
    454     JSObject** obj = new JSObject*;
    455     *obj = Function;
    456     JS_AddObjectRoot(g_ScriptingHost.getContext(), obj);
    457 
    458     if (m_ScriptHandlers[Action])
    459     {
    460         JS_RemoveObjectRoot(g_ScriptingHost.getContext(), m_ScriptHandlers[Action]);
    461         delete m_ScriptHandlers[Action];
    462     }
    463     m_ScriptHandlers[Action] = obj;
     446    m_ScriptHandlers[Action] = CScriptValRooted(m_pGUI->GetScriptInterface()->GetContext(), OBJECT_TO_JSVAL(Function));
    464447}
    465448
    466449InReaction IGUIObject::SendEvent(EGUIMessageType type, const CStr& EventName)
     
    479462
    480463void IGUIObject::ScriptEvent(const CStr& Action)
    481464{
    482     std::map<CStr, JSObject**>::iterator it = m_ScriptHandlers.find(Action);
     465    std::map<CStr, CScriptValRooted>::iterator it = m_ScriptHandlers.find(Action);
    483466    if (it == m_ScriptHandlers.end())
    484467        return;
    485468
     469    JSContext* cx = m_pGUI->GetScriptInterface()->GetContext();
     470
    486471    // Set up the 'mouse' parameter
    487472    CScriptVal mouse;
    488     g_ScriptingHost.GetScriptInterface().Eval("({})", mouse);
    489     g_ScriptingHost.GetScriptInterface().SetProperty(mouse.get(), "x", m_pGUI->m_MousePos.x, false);
    490     g_ScriptingHost.GetScriptInterface().SetProperty(mouse.get(), "y", m_pGUI->m_MousePos.y, false);
    491     g_ScriptingHost.GetScriptInterface().SetProperty(mouse.get(), "buttons", m_pGUI->m_MouseButtons, false);
     473    m_pGUI->GetScriptInterface()->Eval("({})", mouse);
     474    m_pGUI->GetScriptInterface()->SetProperty(mouse.get(), "x", m_pGUI->m_MousePos.x, false);
     475    m_pGUI->GetScriptInterface()->SetProperty(mouse.get(), "y", m_pGUI->m_MousePos.y, false);
     476    m_pGUI->GetScriptInterface()->SetProperty(mouse.get(), "buttons", m_pGUI->m_MouseButtons, false);
    492477
    493478    jsval paramData[] = { mouse.get() };
    494479
    495480    jsval result;
    496     JSBool ok = JS_CallFunctionValue(g_ScriptingHost.getContext(), GetJSObject(), OBJECT_TO_JSVAL(*it->second), ARRAY_SIZE(paramData), paramData, &result);
     481    JSBool ok = JS_CallFunctionValue(cx, GetJSObject(), (*it).second.get(), ARRAY_SIZE(paramData), paramData, &result);
    497482    if (!ok)
    498483    {
    499484        // We have no way to propagate the script exception, so just ignore it
     
    503488
    504489void IGUIObject::ScriptEvent(const CStr& Action, const CScriptValRooted& Argument)
    505490{
    506     std::map<CStr, JSObject**>::iterator it = m_ScriptHandlers.find(Action);
     491    JSContext* cx = m_pGUI->GetScriptInterface()->GetContext();
     492    std::map<CStr, CScriptValRooted>::iterator it = m_ScriptHandlers.find(Action);
    507493    if (it == m_ScriptHandlers.end())
    508494        return;
    509495
     
    512498    jsval arg = Argument.get();
    513499
    514500    jsval result;
    515     JSBool ok = JS_CallFunctionValue(g_ScriptingHost.getContext(), object, OBJECT_TO_JSVAL(*it->second), 1, &arg, &result);
     501    JSBool ok = JS_CallFunctionValue(cx, object, (*it).second.get(), 1, &arg, &result);
    516502    if (!ok)
    517503    {
    518         JS_ReportError(g_ScriptingHost.getContext(), "Errors executing script action \"%s\"", Action.c_str());
     504        JS_ReportError(cx, "Errors executing script action \"%s\"", Action.c_str());
    519505    }
    520506}
    521507
    522508JSObject* IGUIObject::GetJSObject()
    523509{
     510    JSContext* cx = m_pGUI->GetScriptInterface()->GetContext();
    524511    // Cache the object when somebody first asks for it, because otherwise
    525512    // we end up doing far too much object allocation. TODO: Would be nice to
    526513    // not have these objects hang around forever using up memory, though.
    527     if (! m_JSObject)
     514    if (m_JSObject.uninitialised())
    528515    {
    529         m_JSObject = JS_NewObject(g_ScriptingHost.getContext(), &JSI_IGUIObject::JSI_class, NULL, NULL);
    530         JS_AddObjectRoot(g_ScriptingHost.getContext(), &m_JSObject);
    531         JS_SetPrivate(g_ScriptingHost.getContext(), m_JSObject, this);
     516        JSObject* obj = JS_NewObject(cx, &JSI_IGUIObject::JSI_class, NULL, NULL);
     517        m_JSObject = CScriptValRooted(cx, OBJECT_TO_JSVAL(obj));
     518        JS_SetPrivate(cx, JSVAL_TO_OBJECT(m_JSObject.get()), this);
    532519    }
    533     return m_JSObject;
     520    return JSVAL_TO_OBJECT(m_JSObject.get());;
    534521}
    535522
    536523CStr IGUIObject::GetPresentableName() const
  • source/gui/MiniMap.cpp

     
    2828#include "graphics/TerrainTextureEntry.h"
    2929#include "graphics/TerrainTextureManager.h"
    3030#include "graphics/TerritoryTexture.h"
     31#include "gui/GUI.h"
     32#include "gui/GUIManager.h"
    3133#include "lib/ogl.h"
    3234#include "lib/external_libraries/libsdl.h"
    3335#include "lib/bits.h"
     
    241243    GetMouseWorldCoordinates(x, z);
    242244
    243245    CScriptValRooted coords;
    244     g_ScriptingHost.GetScriptInterface().Eval("({})", coords);
    245     g_ScriptingHost.GetScriptInterface().SetProperty(coords.get(), "x", x, false);
    246     g_ScriptingHost.GetScriptInterface().SetProperty(coords.get(), "z", z, false);
     246    g_GUI->GetActiveGUI()->GetScriptInterface()->Eval("({})", coords);
     247    g_GUI->GetActiveGUI()->GetScriptInterface()->SetProperty(coords.get(), "x", x, false);
     248    g_GUI->GetActiveGUI()->GetScriptInterface()->SetProperty(coords.get(), "z", z, false);
    247249    ScriptEvent("worldclick", coords);
    248250
    249251    UNUSED2(button);
  • source/gui/CGUI.h

     
    4040
    4141#include "GUITooltip.h"
    4242#include "GUIbase.h"
     43#include "scriptinterface/ScriptInterface.h"
    4344
    4445#include "ps/Overlay.h" // CPos and CRect
    4546
     
    107108    typedef IGUIObject *(*ConstructObjectFunction)();
    108109
    109110public:
    110     CGUI();
     111    CGUI(const shared_ptr<ScriptRuntime>& runtime);
     112    CGUI(const shared_ptr<ScriptInterface>& scriptInterface);
    111113    ~CGUI();
    112114
    113115    /**
    114      * Initializes GUI script classes
    115      */
    116     static void ScriptingInit();
    117 
    118     /**
    119116     * Initializes the GUI, needs to be called before the GUI is used
    120117     */
    121118    void Initialize();
     
    260257                          const float &Width, const float &BufferZone,
    261258                          const IGUIObject *pObject=NULL);
    262259
    263     /**
    264      * Returns the JSObject* associated with the GUI
    265      *
    266      * @return The relevant JS object
    267      */
    268     JSObject* GetScriptObject() { return m_ScriptObject; }
    269260
    270261    /**
    271262     * Check if an icon exists
     
    282273     * Returns false if it fails.
    283274     */
    284275    bool GetPreDefinedColor(const CStr& name, CColor &Output);
     276   
     277    shared_ptr<ScriptInterface> GetScriptInterface() { return m_ScriptInterface; };
     278    jsval GetGlobalObject() { return m_ScriptInterface->GetGlobalObject(); };
    285279
    286280private:
    287281
     
    581575    /** @name Miscellaneous */
    582576    //--------------------------------------------------------
    583577    //@{
     578   
     579    shared_ptr<ScriptInterface> m_ScriptInterface;
    584580
    585581    /**
    586      * An JSObject* under which all GUI JavaScript things will
    587      * be created, so that they can be garbage-collected
    588      * when the GUI shuts down.
    589      */
    590     JSObject* m_ScriptObject;
    591 
    592     /**
    593582     * don't want to pass this around with the
    594583     * ChooseMouseOverAndClosest broadcast -
    595584     * we'd need to pack this and pNearest in a struct
  • source/graphics/MapGenerator.cpp

     
    147147    return m_MapData;
    148148}
    149149
    150 bool CMapGeneratorWorker::LoadLibrary(void* cbdata, std::wstring name)
     150bool CMapGeneratorWorker::LoadLibrary(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name)
    151151{
    152     CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(cbdata);
    153 
     152    CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(pCxPrivate->pCBData);
    154153    return self->LoadScripts(name);
    155154}
    156155
    157 void CMapGeneratorWorker::ExportMap(void* cbdata, CScriptValRooted data)
     156void CMapGeneratorWorker::ExportMap(ScriptInterface::CxPrivate* pCxPrivate, CScriptValRooted data)
    158157{
    159     CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(cbdata);
     158    CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(pCxPrivate->pCBData);
    160159
    161160    // Copy results
    162161    CScopeLock lock(self->m_WorkerMutex);
     
    164163    self->m_Progress = 0;
    165164}
    166165
    167 void CMapGeneratorWorker::SetProgress(void* cbdata, int progress)
     166void CMapGeneratorWorker::SetProgress(ScriptInterface::CxPrivate* pCxPrivate, int progress)
    168167{
    169     CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(cbdata);
     168    CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(pCxPrivate->pCBData);
    170169
    171170    // Copy data
    172171    CScopeLock lock(self->m_WorkerMutex);
    173172    self->m_Progress = progress;
    174173}
    175174
    176 void CMapGeneratorWorker::MaybeGC(void* cbdata)
     175void CMapGeneratorWorker::MaybeGC(ScriptInterface::CxPrivate* pCxPrivate)
    177176{
    178     CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(cbdata);
     177    CMapGeneratorWorker* self = static_cast<CMapGeneratorWorker*>(pCxPrivate->pCBData);
    179178    self->m_ScriptInterface->MaybeGC();
    180179}
    181180
    182 std::vector<std::string> CMapGeneratorWorker::GetCivData(void* UNUSED(cbdata))
     181std::vector<std::string> CMapGeneratorWorker::GetCivData(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    183182{
    184183    VfsPath path(L"civs/");
    185184    VfsPaths pathnames;
  • source/graphics/tests/test_LOSTexture.h

     
    1919
    2020#include "graphics/LOSTexture.h"
    2121#include "lib/timer.h"
     22#include "scriptinterface/ScriptInterface.h"
    2223#include "simulation2/Simulation2.h"
    2324
    2425class TestLOSTexture : public CxxTest::TestSuite
     
    2627public:
    2728    void test_basic()
    2829    {
    29         CSimulation2 sim(NULL, NULL);
     30        CSimulation2 sim(NULL, ScriptInterface::CreateRuntime(), NULL);
    3031        CLOSTexture tex(sim);
    3132
    3233        const ssize_t size = 8;
     
    6061
    6162    void test_perf_DISABLED()
    6263    {
    63         CSimulation2 sim(NULL, NULL);
     64        CSimulation2 sim(NULL, ScriptInterface::CreateRuntime(), NULL);
    6465        CLOSTexture tex(sim);
    6566
    6667        const ssize_t size = 257;
  • source/graphics/MapGenerator.h

     
    120120    bool LoadScripts(const std::wstring& libraryName);
    121121   
    122122    // callbacks for script functions
    123     static bool LoadLibrary(void* cbdata, std::wstring name);
    124     static void ExportMap(void* cbdata, CScriptValRooted data);
    125     static void SetProgress(void* cbdata, int progress);
    126     static void MaybeGC(void* cbdata);
    127     static std::vector<std::string> GetCivData(void* cbdata);
     123    static bool LoadLibrary(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name);
     124    static void ExportMap(ScriptInterface::CxPrivate* pCxPrivate, CScriptValRooted data);
     125    static void SetProgress(ScriptInterface::CxPrivate* pCxPrivate, int progress);
     126    static void MaybeGC(ScriptInterface::CxPrivate* pCxPrivate);
     127    static std::vector<std::string> GetCivData(ScriptInterface::CxPrivate* pCxPrivate);
    128128
    129129    std::set<std::wstring> m_LoadedLibraries;
    130130    shared_ptr<ScriptInterface::StructuredClone> m_MapData;
  • source/graphics/scripting/JSInterface_GameView.cpp

     
    2424#include "scriptinterface/ScriptInterface.h"
    2525
    2626#define IMPLEMENT_BOOLEAN_SCRIPT_SETTING(NAME) \
    27 bool JSI_GameView::Get##NAME##Enabled(void* UNUSED(cbdata)) \
     27bool JSI_GameView::Get##NAME##Enabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) \
    2828{ \
    2929    if (!g_Game || !g_Game->GetView()) \
    3030    { \
     
    3434    return g_Game->GetView()->Get##NAME##Enabled(); \
    3535} \
    3636\
    37 void JSI_GameView::Set##NAME##Enabled(void* UNUSED(cbdata), bool Enabled) \
     37void JSI_GameView::Set##NAME##Enabled(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool Enabled) \
    3838{ \
    3939    if (!g_Game || !g_Game->GetView()) \
    4040    { \
  • source/graphics/scripting/JSInterface_GameView.h

     
    2020#define INCLUDED_JSINTERFACE_GAMEVIEW
    2121
    2222#include "ps/CStr.h"
    23 class ScriptInterface;
     23#include "scriptinterface/ScriptInterface.h"
    2424
    2525#define DECLARE_BOOLEAN_SCRIPT_SETTING(NAME) \
    26     bool Get##NAME##Enabled(void* cbdata); \
    27     void Set##NAME##Enabled(void* cbdata, bool Enabled);
     26    bool Get##NAME##Enabled(ScriptInterface::CxPrivate* pCxPrivate); \
     27    void Set##NAME##Enabled(ScriptInterface::CxPrivate* pCxPrivate, bool Enabled);
    2828
    2929namespace JSI_GameView
    3030{
  • source/simulation2/Simulation2.h

     
    3838class CMessage;
    3939class SceneCollector;
    4040class CFrustum;
     41class ScriptRuntime;
    4142
    4243/**
    4344 * Public API for simulation system.
     
    4849public:
    4950    // TODO: CUnitManager should probably be handled automatically by this
    5051    // module, but for now we'll have it passed in externally instead
    51     CSimulation2(CUnitManager*, CTerrain*);
     52    CSimulation2(CUnitManager* unitManager, shared_ptr<ScriptRuntime> rt, CTerrain* terrain);
    5253    ~CSimulation2();
    5354
    5455    void EnableOOSLog();
  • source/simulation2/tests/test_Serializer.h

     
    644644
    645645        CTerrain terrain;
    646646
    647         CSimulation2 sim2(NULL, &terrain);
     647        CSimulation2 sim2(NULL, ScriptInterface::CreateRuntime(), &terrain);
    648648        sim2.LoadDefaultScripts();
    649649        sim2.ResetState();
    650650
  • source/simulation2/tests/test_ComponentManager.h

     
    5959    void test_Load()
    6060    {
    6161        CSimContext context;
    62         CComponentManager man(context);
     62        CComponentManager man(context, ScriptInterface::CreateRuntime());
    6363        man.LoadComponentTypes();
    6464    }
    6565
    6666    void test_LookupCID()
    6767    {
    6868        CSimContext context;
    69         CComponentManager man(context);
     69        CComponentManager man(context, ScriptInterface::CreateRuntime());
    7070        man.LoadComponentTypes();
    7171
    7272        TS_ASSERT_EQUALS(man.LookupCID("Test1A"), (int)CID_Test1A);
     
    7676    void test_AllocateNewEntity()
    7777    {
    7878        CSimContext context;
    79         CComponentManager man(context);
     79        CComponentManager man(context, ScriptInterface::CreateRuntime());
    8080
    8181        TS_ASSERT_EQUALS(man.AllocateNewEntity(), (u32)2);
    8282        TS_ASSERT_EQUALS(man.AllocateNewEntity(), (u32)3);
     
    9999    void test_AddComponent_errors()
    100100    {
    101101        CSimContext context;
    102         CComponentManager man(context);
     102        CComponentManager man(context, ScriptInterface::CreateRuntime());
    103103        man.LoadComponentTypes();
    104104        CEntityHandle hnd1 = man.AllocateEntityHandle(1);
    105105
     
    122122    void test_QueryInterface()
    123123    {
    124124        CSimContext context;
    125         CComponentManager man(context);
     125        CComponentManager man(context, ScriptInterface::CreateRuntime());
    126126        man.LoadComponentTypes();
    127127
    128128        entity_id_t ent1 = 1, ent2 = 2;
     
    147147    void test_SendMessage()
    148148    {
    149149        CSimContext context;
    150         CComponentManager man(context);
     150        CComponentManager man(context, ScriptInterface::CreateRuntime());
    151151        man.LoadComponentTypes();
    152152
    153153        entity_id_t ent1 = 1, ent2 = 2, ent3 = 3, ent4 = 4;
     
    221221    void test_ParamNode()
    222222    {
    223223        CSimContext context;
    224         CComponentManager man(context);
     224        CComponentManager man(context, ScriptInterface::CreateRuntime());
    225225        man.LoadComponentTypes();
    226226
    227227        entity_id_t ent1 = 1, ent2 = 2;
     
    242242    void test_script_basic()
    243243    {
    244244        CSimContext context;
    245         CComponentManager man(context);
     245        CComponentManager man(context, ScriptInterface::CreateRuntime());
    246246        man.LoadComponentTypes();
    247247        TS_ASSERT(man.LoadScript(L"simulation/components/test.js"));
    248248
     
    286286    void test_script_helper_basic()
    287287    {
    288288        CSimContext context;
    289         CComponentManager man(context);
     289        CComponentManager man(context, ScriptInterface::CreateRuntime());
    290290        man.LoadComponentTypes();
    291291        TS_ASSERT(man.LoadScript(L"simulation/components/test-helper.js"));
    292292        TS_ASSERT(man.LoadScript(L"simulation/helpers/test-helper.js"));
     
    303303    void test_script_global_helper()
    304304    {
    305305        CSimContext context;
    306         CComponentManager man(context);
     306        CComponentManager man(context, ScriptInterface::CreateRuntime());
    307307        man.LoadComponentTypes();
    308308        TS_ASSERT(man.LoadScript(L"simulation/components/test-global-helper.js"));
    309309
     
    319319    void test_script_interface()
    320320    {
    321321        CSimContext context;
    322         CComponentManager man(context);
     322        CComponentManager man(context, ScriptInterface::CreateRuntime());
    323323        man.LoadComponentTypes();
    324324        TS_ASSERT(man.LoadScript(L"simulation/components/interfaces/test-interface.js"));
    325325        TS_ASSERT(man.LoadScript(L"simulation/components/test-interface.js"));
     
    337337    void test_script_errors()
    338338    {
    339339        CSimContext context;
    340         CComponentManager man(context);
     340        CComponentManager man(context, ScriptInterface::CreateRuntime());
    341341        ScriptTestSetup(man.m_ScriptInterface);
    342342        man.LoadComponentTypes();
    343343
     
    354354    void test_script_entityID()
    355355    {
    356356        CSimContext context;
    357         CComponentManager man(context);
     357        CComponentManager man(context, ScriptInterface::CreateRuntime());
    358358        ScriptTestSetup(man.m_ScriptInterface);
    359359        man.LoadComponentTypes();
    360360        TS_ASSERT(man.LoadScript(L"simulation/components/test-entityid.js"));
     
    374374    void test_script_QueryInterface()
    375375    {
    376376        CSimContext context;
    377         CComponentManager man(context);
     377        CComponentManager man(context, ScriptInterface::CreateRuntime());
    378378        man.LoadComponentTypes();
    379379        TS_ASSERT(man.LoadScript(L"simulation/components/test-query.js"));
    380380
     
    395395    void test_script_AddEntity()
    396396    {
    397397        CSimContext context;
    398         CComponentManager man(context);
     398        CComponentManager man(context, ScriptInterface::CreateRuntime());
    399399        man.LoadComponentTypes();
    400400        TS_ASSERT(man.LoadScript(L"simulation/components/test-addentity.js"));
    401401        TS_ASSERT(man.LoadScript(L"simulation/components/addentity/test-addentity.js"));
     
    428428    void test_script_AddLocalEntity()
    429429    {
    430430        CSimContext context;
    431         CComponentManager man(context);
     431        CComponentManager man(context, ScriptInterface::CreateRuntime());
    432432        man.LoadComponentTypes();
    433433        TS_ASSERT(man.LoadScript(L"simulation/components/test-addentity.js"));
    434434        TS_ASSERT(man.LoadScript(L"simulation/components/addentity/test-addentity.js"));
     
    461461    void test_script_DestroyEntity()
    462462    {
    463463        CSimContext context;
    464         CComponentManager man(context);
     464        CComponentManager man(context, ScriptInterface::CreateRuntime());
    465465        man.LoadComponentTypes();
    466466        TS_ASSERT(man.LoadScript(L"simulation/components/test-destroyentity.js"));
    467467
     
    481481    void test_script_messages()
    482482    {
    483483        CSimContext context;
    484         CComponentManager man(context);
     484        CComponentManager man(context, ScriptInterface::CreateRuntime());
    485485        man.LoadComponentTypes();
    486486        TS_ASSERT(man.LoadScript(L"simulation/components/test-msg.js"));
    487487
     
    514514    void test_script_template()
    515515    {
    516516        CSimContext context;
    517         CComponentManager man(context);
     517        CComponentManager man(context, ScriptInterface::CreateRuntime());
    518518        man.LoadComponentTypes();
    519519        TS_ASSERT(man.LoadScript(L"simulation/components/test-param.js"));
    520520
     
    536536    void test_script_template_readonly()
    537537    {
    538538        CSimContext context;
    539         CComponentManager man(context);
     539        CComponentManager man(context, ScriptInterface::CreateRuntime());
    540540        man.LoadComponentTypes();
    541541        TS_ASSERT(man.LoadScript(L"simulation/components/test-param.js"));
    542542
     
    558558    void test_script_hotload()
    559559    {
    560560        CSimContext context;
    561         CComponentManager man(context);
     561        CComponentManager man(context, ScriptInterface::CreateRuntime());
    562562        man.LoadComponentTypes();
    563563
    564564        TS_ASSERT(man.LoadScript(L"simulation/components/test-hotload1.js"));
     
    594594    void test_serialization()
    595595    {
    596596        CSimContext context;
    597         CComponentManager man(context);
     597        CComponentManager man(context, ScriptInterface::CreateRuntime());
    598598        man.LoadComponentTypes();
    599599
    600600        entity_id_t ent1 = 1, ent2 = 2, ent3 = FIRST_LOCAL_ENTITY;
     
    664664        );
    665665
    666666        CSimContext context2;
    667         CComponentManager man2(context2);
     667        CComponentManager man2(context2, ScriptInterface::CreateRuntime());
    668668        man2.LoadComponentTypes();
    669669
    670670        TS_ASSERT(man2.QueryInterface(ent1, IID_Test1) == NULL);
     
    683683    void test_script_serialization()
    684684    {
    685685        CSimContext context;
    686         CComponentManager man(context);
     686        CComponentManager man(context, ScriptInterface::CreateRuntime());
    687687        ScriptTestSetup(man.m_ScriptInterface);
    688688        man.LoadComponentTypes();
    689689        TS_ASSERT(man.LoadScript(L"simulation/components/test-serialize.js"));
     
    754754        TS_ASSERT(man.SerializeState(stateStream));
    755755
    756756        CSimContext context2;
    757         CComponentManager man2(context2);
     757        CComponentManager man2(context2, ScriptInterface::CreateRuntime());
    758758        man2.LoadComponentTypes();
    759759        TS_ASSERT(man2.LoadScript(L"simulation/components/test-serialize.js"));
    760760
     
    771771    void test_script_serialization_errors()
    772772    {
    773773        CSimContext context;
    774         CComponentManager man(context);
     774        CComponentManager man(context, ScriptInterface::CreateRuntime());
    775775        man.LoadComponentTypes();
    776776        TS_ASSERT(man.LoadScript(L"simulation/components/test-serialize.js"));
    777777
     
    789789    void test_script_serialization_template()
    790790    {
    791791        CSimContext context;
    792         CComponentManager man(context);
     792        CComponentManager man(context, ScriptInterface::CreateRuntime());
    793793        man.LoadComponentTypes();
    794794        TS_ASSERT(man.LoadScript(L"simulation/components/test-serialize.js"));
    795795        man.InitSystemEntity();
     
    813813        TS_ASSERT(man.SerializeState(stateStream));
    814814
    815815        CSimContext context2;
    816         CComponentManager man2(context2);
     816        CComponentManager man2(context2, ScriptInterface::CreateRuntime());
    817817        man2.LoadComponentTypes();
    818818        TS_ASSERT(man2.LoadScript(L"simulation/components/test-serialize.js"));
    819819
  • source/simulation2/tests/test_Simulation2.h

     
    1717
    1818#include "lib/self_test.h"
    1919
     20#include "scriptinterface/ScriptInterface.h"
    2021#include "simulation2/Simulation2.h"
    2122#include "simulation2/MessageTypes.h"
    2223#include "simulation2/components/ICmpTest.h"
     
    5657
    5758    void test_AddEntity()
    5859    {
    59         CSimulation2 sim(NULL, &m_Terrain);
     60        CSimulation2 sim(NULL, ScriptInterface::CreateRuntime(), &m_Terrain);
    6061        TS_ASSERT(sim.LoadScripts(L"simulation/components/addentity/"));
    6162
    6263        sim.ResetState(true, true);
     
    7677
    7778    void test_DestroyEntity()
    7879    {
    79         CSimulation2 sim(NULL, &m_Terrain);
     80        CSimulation2 sim(NULL, ScriptInterface::CreateRuntime(), &m_Terrain);
    8081        TS_ASSERT(sim.LoadScripts(L"simulation/components/addentity/"));
    8182
    8283        sim.ResetState(true, true);
     
    128129
    129130    void test_hotload_scripts()
    130131    {
    131         CSimulation2 sim(NULL, &m_Terrain);
     132        CSimulation2 sim(NULL, ScriptInterface::CreateRuntime(), &m_Terrain);
    132133
    133134        TS_ASSERT_OK(CreateDirectories(DataDir()/"mods"/"_test.sim"/"simulation"/"components"/"hotload"/"", 0700));
    134135
  • source/simulation2/tests/test_CmpTemplateManager.h

     
    5252    void test_LoadTemplate()
    5353    {
    5454        CSimContext context;
    55         CComponentManager man(context);
     55        CComponentManager man(context, ScriptInterface::CreateRuntime());
    5656        man.LoadComponentTypes();
    5757
    5858        entity_id_t ent1 = 1, ent2 = 2;
     
    114114    void test_LoadTemplate_scriptcache()
    115115    {
    116116        CSimContext context;
    117         CComponentManager man(context);
     117        CComponentManager man(context, ScriptInterface::CreateRuntime());
    118118        man.LoadComponentTypes();
    119119
    120120        entity_id_t ent1 = 1, ent2 = 2;
     
    152152    void test_LoadTemplate_errors()
    153153    {
    154154        CSimContext context;
    155         CComponentManager man(context);
     155        CComponentManager man(context, ScriptInterface::CreateRuntime());
    156156        man.LoadComponentTypes();
    157157
    158158        entity_id_t ent1 = 1, ent2 = 2;
     
    184184    void test_LoadTemplate_multiple()
    185185    {
    186186        CSimContext context;
    187         CComponentManager man(context);
     187        CComponentManager man(context, ScriptInterface::CreateRuntime());
    188188        man.LoadComponentTypes();
    189189
    190190        entity_id_t ent1 = 1, ent2 = 2;
     
    243243    void test_load_all_DISABLED() // disabled since it's a bit slow and noisy
    244244    {
    245245        CTerrain dummy;
    246         CSimulation2 sim(NULL, &dummy);
     246        CSimulation2 sim(NULL, ScriptInterface::CreateRuntime(), &dummy);
    247247        sim.LoadDefaultScripts();
    248248        sim.ResetState();
    249249
  • source/simulation2/system/ComponentManager.h

     
    7878    };
    7979
    8080public:
    81     CComponentManager(CSimContext&, bool skipScriptFunctions = false);
     81    CComponentManager(CSimContext&, shared_ptr<ScriptRuntime> rt, bool skipScriptFunctions = false);
    8282    ~CComponentManager();
    8383
    8484    void LoadComponentTypes();
     
    242242
    243243private:
    244244    // Implementations of functions exposed to scripts
    245     static void Script_RegisterComponentType(void* cbdata, int iid, std::string cname, CScriptVal ctor);
    246     static void Script_RegisterInterface(void* cbdata, std::string name);
    247     static void Script_RegisterMessageType(void* cbdata, std::string name);
    248     static void Script_RegisterGlobal(void* cbdata, std::string name, CScriptVal value);
    249     static IComponent* Script_QueryInterface(void* cbdata, int ent, int iid);
    250     static std::vector<int> Script_GetEntitiesWithInterface(void* cbdata, int iid);
    251     static std::vector<IComponent*> Script_GetComponentsWithInterface(void* cbdata, int iid);
    252     static void Script_PostMessage(void* cbdata, int ent, int mtid, CScriptVal data);
    253     static void Script_BroadcastMessage(void* cbdata, int mtid, CScriptVal data);
    254     static int Script_AddEntity(void* cbdata, std::string templateName);
    255     static int Script_AddLocalEntity(void* cbdata, std::string templateName);
    256     static void Script_DestroyEntity(void* cbdata, int ent);
    257     static CScriptVal Script_ReadJSONFile(void* cbdata, std::wstring fileName);
    258     static CScriptVal Script_ReadCivJSONFile(void* cbdata, std::wstring fileName);
    259     static std::vector<std::string> Script_FindJSONFiles(void* cbdata, std::wstring subPath, bool recursive);
    260 
    261     static CScriptVal ReadJSONFile(void *cbdata, std::wstring filePath, std::wstring fileName);
     245    static void Script_RegisterComponentType(ScriptInterface::CxPrivate* pCxPrivate, int iid, std::string cname, CScriptVal ctor);
     246    static void Script_RegisterInterface(ScriptInterface::CxPrivate* pCxPrivate, std::string name);
     247    static void Script_RegisterMessageType(ScriptInterface::CxPrivate* pCxPrivate, std::string name);
     248    static void Script_RegisterGlobal(ScriptInterface::CxPrivate* pCxPrivate, std::string name, CScriptVal value);
     249    static IComponent* Script_QueryInterface(ScriptInterface::CxPrivate* pCxPrivate, int ent, int iid);
     250    static std::vector<int> Script_GetEntitiesWithInterface(ScriptInterface::CxPrivate* pCxPrivate, int iid);
     251    static std::vector<IComponent*> Script_GetComponentsWithInterface(ScriptInterface::CxPrivate* pCxPrivate, int iid);
     252    static void Script_PostMessage(ScriptInterface::CxPrivate* pCxPrivate, int ent, int mtid, CScriptVal data);
     253    static void Script_BroadcastMessage(ScriptInterface::CxPrivate* pCxPrivate, int mtid, CScriptVal data);
     254    static int Script_AddEntity(ScriptInterface::CxPrivate* pCxPrivate, std::string templateName);
     255    static int Script_AddLocalEntity(ScriptInterface::CxPrivate* pCxPrivate, std::string templateName);
     256    static void Script_DestroyEntity(ScriptInterface::CxPrivate* pCxPrivate, int ent);
     257    static CScriptVal Script_ReadJSONFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring fileName);
     258    static CScriptVal Script_ReadCivJSONFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring fileName);
     259    static std::vector<std::string> Script_FindJSONFiles(ScriptInterface::CxPrivate* pCxPrivate, std::wstring subPath, bool recursive);
     260    static CScriptVal ReadJSONFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filePath, std::wstring fileName);
    262261   
    263262    // callback function to handle recursively finding files in a directory
    264263    static Status FindJSONFilesCallback(const VfsPath&, const CFileInfo&, const uintptr_t);
  • source/simulation2/system/ComponentTest.h

     
    5353
    5454public:
    5555    ComponentTestHelper() :
    56         m_Context(), m_ComponentManager(m_Context), m_Cmp(NULL)
     56        m_Context(), m_ComponentManager(m_Context, ScriptInterface::CreateRuntime()), m_Cmp(NULL)
    5757    {
    5858        m_ComponentManager.LoadComponentTypes();
    5959    }
  • source/simulation2/system/ComponentManager.cpp

     
    5252    CScriptValRooted msg;
    5353};
    5454
    55 CComponentManager::CComponentManager(CSimContext& context, bool skipScriptFunctions) :
     55CComponentManager::CComponentManager(CSimContext& context, shared_ptr<ScriptRuntime> rt, bool skipScriptFunctions) :
    5656    m_NextScriptComponentTypeId(CID__LastNative),
    57     m_ScriptInterface("Engine", "Simulation", ScriptInterface::CreateRuntime(128*MiB)),
     57    m_ScriptInterface("Engine", "Simulation", rt),
    5858    m_SimContext(context), m_CurrentlyHotloading(false)
    5959{
    6060    context.SetComponentManager(this);
     
    143143    return ok;
    144144}
    145145
    146 void CComponentManager::Script_RegisterComponentType(void* cbdata, int iid, std::string cname, CScriptVal ctor)
     146void CComponentManager::Script_RegisterComponentType(ScriptInterface::CxPrivate* pCxPrivate, int iid, std::string cname, CScriptVal ctor)
    147147{
    148     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     148    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    149149
    150150    // Find the C++ component that wraps the interface
    151151    int cidWrapper = componentManager->GetScriptWrapper(iid);
     
    294294    }
    295295}
    296296
    297 void CComponentManager::Script_RegisterInterface(void* cbdata, std::string name)
     297void CComponentManager::Script_RegisterInterface(ScriptInterface::CxPrivate* pCxPrivate, std::string name)
    298298{
    299     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     299    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    300300
    301301    std::map<std::string, InterfaceId>::iterator it = componentManager->m_InterfaceIdsByName.find(name);
    302302    if (it != componentManager->m_InterfaceIdsByName.end())
     
    315315    componentManager->m_ScriptInterface.SetGlobal(("IID_" + name).c_str(), (int)id);
    316316}
    317317
    318 void CComponentManager::Script_RegisterMessageType(void* cbdata, std::string name)
     318void CComponentManager::Script_RegisterMessageType(ScriptInterface::CxPrivate* pCxPrivate, std::string name)
    319319{
    320     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     320    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    321321
    322322    std::map<std::string, MessageTypeId>::iterator it = componentManager->m_MessageTypeIdsByName.find(name);
    323323    if (it != componentManager->m_MessageTypeIdsByName.end())
     
    335335    componentManager->m_ScriptInterface.SetGlobal(("MT_" + name).c_str(), (int)id);
    336336}
    337337
    338 void CComponentManager::Script_RegisterGlobal(void* cbdata, std::string name, CScriptVal value)
     338void CComponentManager::Script_RegisterGlobal(ScriptInterface::CxPrivate* pCxPrivate, std::string name, CScriptVal value)
    339339{
    340     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     340    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    341341
    342342    // Set the value, and accept duplicates only if hotloading (otherwise it's an error,
    343343    // in order to detect accidental duplicate definitions of globals)
    344344    componentManager->m_ScriptInterface.SetGlobal(name.c_str(), value, componentManager->m_CurrentlyHotloading);
    345345}
    346346
    347 IComponent* CComponentManager::Script_QueryInterface(void* cbdata, int ent, int iid)
     347IComponent* CComponentManager::Script_QueryInterface(ScriptInterface::CxPrivate* pCxPrivate, int ent, int iid)
    348348{
    349     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     349    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    350350    IComponent* component = componentManager->QueryInterface((entity_id_t)ent, iid);
    351351    return component;
    352352}
    353353
    354 std::vector<int> CComponentManager::Script_GetEntitiesWithInterface(void* cbdata, int iid)
     354std::vector<int> CComponentManager::Script_GetEntitiesWithInterface(ScriptInterface::CxPrivate* pCxPrivate, int iid)
    355355{
    356     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     356    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    357357
    358358    std::vector<int> ret;
    359359    const InterfaceListUnordered& ents = componentManager->GetEntitiesWithInterfaceUnordered(iid);
     
    364364    return ret;
    365365}
    366366
    367 std::vector<IComponent*> CComponentManager::Script_GetComponentsWithInterface(void* cbdata, int iid)
     367std::vector<IComponent*> CComponentManager::Script_GetComponentsWithInterface(ScriptInterface::CxPrivate* pCxPrivate, int iid)
    368368{
    369     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     369    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    370370
    371371    std::vector<IComponent*> ret;
    372372    InterfaceList ents = componentManager->GetEntitiesWithInterface(iid);
     
    391391    }
    392392}
    393393
    394 void CComponentManager::Script_PostMessage(void* cbdata, int ent, int mtid, CScriptVal data)
     394void CComponentManager::Script_PostMessage(ScriptInterface::CxPrivate* pCxPrivate, int ent, int mtid, CScriptVal data)
    395395{
    396     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     396    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    397397
    398398    CMessage* msg = componentManager->ConstructMessage(mtid, data);
    399399    if (!msg)
     
    404404    delete msg;
    405405}
    406406
    407 void CComponentManager::Script_BroadcastMessage(void* cbdata, int mtid, CScriptVal data)
     407void CComponentManager::Script_BroadcastMessage(ScriptInterface::CxPrivate* pCxPrivate, int mtid, CScriptVal data)
    408408{
    409     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     409    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    410410
    411411    CMessage* msg = componentManager->ConstructMessage(mtid, data);
    412412    if (!msg)
     
    417417    delete msg;
    418418}
    419419
    420 int CComponentManager::Script_AddEntity(void* cbdata, std::string templateName)
     420int CComponentManager::Script_AddEntity(ScriptInterface::CxPrivate* pCxPrivate, std::string templateName)
    421421{
    422     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     422    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    423423
    424424    std::wstring name(templateName.begin(), templateName.end());
    425425    // TODO: should validate the string to make sure it doesn't contain scary characters
     
    429429    return (int)ent;
    430430}
    431431
    432 int CComponentManager::Script_AddLocalEntity(void* cbdata, std::string templateName)
     432int CComponentManager::Script_AddLocalEntity(ScriptInterface::CxPrivate* pCxPrivate, std::string templateName)
    433433{
    434     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     434    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    435435
    436436    std::wstring name(templateName.begin(), templateName.end());
    437437    // TODO: should validate the string to make sure it doesn't contain scary characters
     
    441441    return (int)ent;
    442442}
    443443
    444 void CComponentManager::Script_DestroyEntity(void* cbdata, int ent)
     444void CComponentManager::Script_DestroyEntity(ScriptInterface::CxPrivate* pCxPrivate, int ent)
    445445{
    446     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     446    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    447447
    448448    componentManager->DestroyComponentsSoon(ent);
    449449}
     
    10011001    return schema;
    10021002}
    10031003
    1004 CScriptVal CComponentManager::Script_ReadJSONFile(void* cbdata, std::wstring fileName)
     1004CScriptVal CComponentManager::Script_ReadJSONFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring fileName)
    10051005{
    1006     return ReadJSONFile(cbdata, L"simulation/data", fileName);
     1006    return ReadJSONFile(pCxPrivate, L"simulation/data", fileName);
    10071007}
    10081008
    1009 CScriptVal CComponentManager::Script_ReadCivJSONFile(void* cbdata, std::wstring fileName)
     1009CScriptVal CComponentManager::Script_ReadCivJSONFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring fileName)
    10101010{
    1011     return ReadJSONFile(cbdata, L"civs", fileName);
     1011    return ReadJSONFile(pCxPrivate, L"civs", fileName);
    10121012}
    10131013
    1014 CScriptVal CComponentManager::ReadJSONFile(void* cbdata, std::wstring filePath, std::wstring fileName)
     1014CScriptVal CComponentManager::ReadJSONFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filePath, std::wstring fileName)
    10151015{
    1016     CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     1016    CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    10171017
    10181018    VfsPath path = VfsPath(filePath) / fileName;
    10191019
     
    10331033    return INFO::OK;
    10341034}
    10351035
    1036 std::vector<std::string> CComponentManager::Script_FindJSONFiles(void* UNUSED(cbdata), std::wstring subPath, bool recursive)
     1036std::vector<std::string> CComponentManager::Script_FindJSONFiles(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring subPath, bool recursive)
    10371037{
    10381038    FindJSONFilesCallbackData cbData;
    10391039    cbData.path = VfsPath(L"simulation/data/" + subPath + L"/");
  • source/simulation2/components/tests/test_Pathfinder.h

     
    6161    {
    6262        CTerrain terrain;
    6363
    64         CSimulation2 sim2(NULL, &terrain);
     64        CSimulation2 sim2(NULL, ScriptInterface::CreateRuntime(), &terrain);
    6565        sim2.LoadDefaultScripts();
    6666        sim2.ResetState();
    6767
     
    114114        CTerrain terrain;
    115115        terrain.Initialize(5, NULL);
    116116
    117         CSimulation2 sim2(NULL, &terrain);
     117        CSimulation2 sim2(NULL, ScriptInterface::CreateRuntime(), &terrain);
    118118        sim2.LoadDefaultScripts();
    119119        sim2.ResetState();
    120120
  • source/simulation2/components/tests/test_scripts.h

     
    4343        TSM_ASSERT(L"Running script "+pathname.string(), scriptInterface.LoadScript(pathname, content));
    4444    }
    4545
    46     static void Script_LoadComponentScript(void* cbdata, VfsPath pathname)
     46    static void Script_LoadComponentScript(ScriptInterface::CxPrivate* pCxPrivate, VfsPath pathname)
    4747    {
    48         CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     48        CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    4949        TS_ASSERT(componentManager->LoadScript(VfsPath(L"simulation/components") / pathname));
    5050    }
    5151
    52     static void Script_LoadHelperScript(void* cbdata, VfsPath pathname)
     52    static void Script_LoadHelperScript(ScriptInterface::CxPrivate* pCxPrivate, VfsPath pathname)
    5353    {
    54         CComponentManager* componentManager = static_cast<CComponentManager*> (cbdata);
     54        CComponentManager* componentManager = static_cast<CComponentManager*> (pCxPrivate->pCBData);
    5555        TS_ASSERT(componentManager->LoadScript(VfsPath(L"simulation/helpers") / pathname));
    5656    }
    5757
     
    6868        for (size_t i = 0; i < paths.size(); ++i)
    6969        {
    7070            CSimContext context;
    71             CComponentManager componentManager(context, true);
     71            CComponentManager componentManager(context, ScriptInterface::CreateRuntime(), true);
    7272
    7373            ScriptTestSetup(componentManager.GetScriptInterface());
    7474
  • source/simulation2/components/CCmpAIManager.cpp

     
    103103            m_Commands.clear();
    104104        }
    105105
    106         static void IncludeModule(void* cbdata, std::wstring name)
     106        static void IncludeModule(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name)
    107107        {
    108             CAIPlayer* self = static_cast<CAIPlayer*> (cbdata);
    109 
     108            CAIPlayer* self = static_cast<CAIPlayer*> (pCxPrivate->pCBData);
    110109            self->LoadScripts(name);
    111110        }
    112         static void DumpHeap(void* cbdata)
     111        static void DumpHeap(ScriptInterface::CxPrivate* pCxPrivate)
    113112        {
    114             CAIPlayer* self = static_cast<CAIPlayer*> (cbdata);
    115            
    116             //std::cout << JS_GetGCParameter(self->m_ScriptInterface.GetRuntime(), JSGC_BYTES) << std::endl;
    117             self->m_ScriptInterface.DumpHeap();
     113            pCxPrivate->pScriptInterface->DumpHeap();
    118114        }
    119         static void ForceGC(void* cbdata)
     115        static void ForceGC(ScriptInterface::CxPrivate* pCxPrivate)
    120116        {
    121             CAIPlayer* self = static_cast<CAIPlayer*> (cbdata);
    122            
    123             JS_GC(self->m_ScriptInterface.GetContext());
     117            JS_GC(pCxPrivate->pScriptInterface->GetContext());
    124118        }       
    125         static void PostCommand(void* cbdata, CScriptValRooted cmd)
     119        static void PostCommand(ScriptInterface::CxPrivate* pCxPrivate, CScriptValRooted cmd)
    126120        {
    127             CAIPlayer* self = static_cast<CAIPlayer*> (cbdata);
    128 
     121            CAIPlayer* self = static_cast<CAIPlayer*> (pCxPrivate->pCBData);
    129122            self->m_Commands.push_back(self->m_ScriptInterface.WriteStructuredClone(cmd.get()));
    130123        }
    131124
     
    133126         * Debug function for AI scripts to dump 2D array data (e.g. terrain tile weights).
    134127         * TODO: check if this needs to be here too.
    135128         */
    136         static void DumpImage(void* UNUSED(cbdata), std::wstring name, std::vector<u32> data, u32 w, u32 h, u32 max)
     129        static void DumpImage(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring name, std::vector<u32> data, u32 w, u32 h, u32 max)
    137130        {
    138131            // TODO: this is totally not threadsafe.
    139132
     
    170163            tex_free(&t);
    171164        }
    172165
    173         static void RegisterSerializablePrototype(void* cbdata, std::wstring name, CScriptVal proto)
     166        static void RegisterSerializablePrototype(ScriptInterface::CxPrivate* pCxPrivate, std::wstring name, CScriptVal proto)
    174167        {
    175             CAIPlayer* self = static_cast<CAIPlayer*> (cbdata);
     168            CAIPlayer* self = static_cast<CAIPlayer*> (pCxPrivate->pCBData);
    176169            // Add our player number to avoid name conflicts with other prototypes
    177170            // TODO: it would be better if serializable prototypes were stored in ScriptInterfaces
    178171            //  and then each serializer would access those matching its own context, but that's
     
    218211                LOGERROR(L"Failed to create AI player: can't find %ls", path.string().c_str());
    219212                return false;
    220213            }
     214            CScriptValRooted clonedMetadata(m_ScriptInterface.GetContext(), m_ScriptInterface.CloneValueFromOtherContext(m_Worker.m_ScriptInterface, metadata.get()));
    221215
    222216            // Get the constructor name from the metadata
    223217            std::string constructor;
    224             if (!m_ScriptInterface.GetProperty(metadata.get(), "constructor", constructor))
     218
     219            if (!m_ScriptInterface.GetProperty(clonedMetadata.get(), "constructor", constructor))
    225220            {
    226221                LOGERROR(L"Failed to create AI player: %ls: missing 'constructor'", path.string().c_str());
    227222                return false;
     
    236231                return false;
    237232            }
    238233
    239             m_ScriptInterface.GetProperty(metadata.get(), "useShared", m_UseSharedComponent);
     234            m_ScriptInterface.GetProperty(clonedMetadata.get(), "useShared", m_UseSharedComponent);
    240235           
    241236            CScriptVal obj;
    242237
    243238            if (callConstructor)
    244239            {
    245240                // Set up the data to pass as the constructor argument
    246                 CScriptVal settings;
     241                CScriptValRooted settings;
    247242                m_ScriptInterface.Eval(L"({})", settings);
    248243                m_ScriptInterface.SetProperty(settings.get(), "player", m_Player, false);
    249244                m_ScriptInterface.SetProperty(settings.get(), "difficulty", m_Difficulty, false);
    250245                ENSURE(m_Worker.m_HasLoadedEntityTemplates);
    251                 m_ScriptInterface.SetProperty(settings.get(), "templates", m_Worker.m_EntityTemplates, false);
     246               
     247                jsval clone = m_ScriptInterface.CloneValueFromOtherContext(m_Worker.m_ScriptInterface, m_Worker.m_EntityTemplates.get());
     248                // TODO: The conversion to CScriptVal is a workaround because TOJSVAL currently can't be specialized for the jsval type.
     249                // Remove the workaround once Spidermonkey is upgraded and the specialization for JS::Value is possible
     250                CScriptVal workaroundClone(clone);
     251                m_ScriptInterface.SetProperty(settings.get(), "templates", workaroundClone, false);
    252252
    253253                obj = m_ScriptInterface.CallConstructor(ctor.get(), settings.get());
    254254            }
     
    273273        void Run(CScriptVal state)
    274274        {
    275275            m_Commands.clear();
    276             m_ScriptInterface.CallFunctionVoid(m_Obj.get(), "HandleMessage", state);
     276            jsval wrapState = state.get();
     277            JS_WrapValue(m_ScriptInterface.GetContext(), &wrapState);
     278            // TODO: The conversion to CScriptVal is a workaround because TOJSVAL currently can't be specialized for the jsval type.
     279            // Remove the workaround once Spidermonkey is upgraded and the specialization for JS::Value is possible
     280            CScriptVal workaroundState(wrapState);
     281            m_ScriptInterface.CallFunctionVoid(m_Obj.get(), "HandleMessage", workaroundState);
    277282        }
    278283        // overloaded with a sharedAI part.
    279284        // javascript can handle both natively on the same function.
    280285        void Run(CScriptVal state, CScriptValRooted SharedAI)
    281286        {
     287            jsval wrapSharedAI = SharedAI.get();
     288            JS_WrapValue(m_ScriptInterface.GetContext(), &wrapSharedAI);
     289            jsval wrapState = state.get();
     290            JS_WrapValue(m_ScriptInterface.GetContext(), &wrapState);
    282291            m_Commands.clear();
    283             m_ScriptInterface.CallFunctionVoid(m_Obj.get(), "HandleMessage", state, SharedAI);
     292            // TODO: The conversion to CScriptVal is a workaround because TOJSVAL currently can't be specialized for the jsval type.
     293            // Remove the workaround once Spidermonkey is upgraded and the specialization for JS::Value is possible
     294            CScriptVal workaroundSharedAI(wrapSharedAI);
     295            CScriptVal workaroundState(wrapState);
     296            m_ScriptInterface.CallFunctionVoid(m_Obj.get(), "HandleMessage", workaroundState, workaroundSharedAI);
    284297        }
    285298        void InitWithSharedScript(CScriptVal state, CScriptValRooted SharedAI)
    286299        {
    287300            m_Commands.clear();
    288             m_ScriptInterface.CallFunctionVoid(m_Obj.get(), "InitWithSharedScript", state, SharedAI);
     301
     302            jsval wrapSharedAI = SharedAI.get();
     303            if (!JS_WrapValue(m_ScriptInterface.GetContext(), &wrapSharedAI))
     304                debug_warn(L"Calling JS_WrapValue on the shared AI object failed!");
     305
     306            jsval wrapState = state.get();
     307            if (!JS_WrapValue(m_ScriptInterface.GetContext(), &wrapState))
     308                debug_warn(L"Calling JS_WrapValue on the shared state failed!");
     309       
     310            // TODO: The conversion to CScriptVal is a workaround because TOJSVAL currently can't be specialized for the jsval type.
     311            // Remove the workaround once Spidermonkey is upgraded and the specialization for JS::Value is possible
     312            CScriptVal workaroundSharedAI(wrapSharedAI);
     313            CScriptVal workaroundState(wrapState);
     314            m_ScriptInterface.CallFunctionVoid(m_Obj.get(), "InitWithSharedScript", workaroundState, workaroundSharedAI);
    289315        }
    290316
    291317        CAIWorker& m_Worker;
     
    312338        // to prevent frequent AI out-of-memory crashes. The argument should be
    313339        // removed as soon whenever the new pathfinder is committed
    314340        // And the AIs can stop relying on their own little hands.
    315         m_ScriptRuntime(ScriptInterface::CreateRuntime(33554432)),
    316         m_ScriptInterface("Engine", "AI", m_ScriptRuntime),
     341        m_ScriptRuntime(g_ScriptRuntime),
     342        m_ScriptInterface("Engine", "AI", g_ScriptRuntime),
    317343        m_TurnNum(0),
    318344        m_CommandsComputed(true),
    319345        m_HasLoadedEntityTemplates(false),
     
    347373    // This is called by AIs if they use the v3 API.
    348374    // If the AIs originate the call, cbdata is not NULL.
    349375    // If the shared component does, it is, so it must not be taken into account.
    350     static void PostCommand(void* cbdata, CScriptValRooted cmd)
     376    static void PostCommand(ScriptInterface::CxPrivate* pCxPrivate, CScriptValRooted cmd)
    351377    {
    352         if (cbdata == NULL) {
     378        if (pCxPrivate->pCBData == NULL) {
    353379            debug_warn(L"Warning: the shared component has tried to push an engine command. Ignoring.");
    354380            return;
    355381        }
    356         CAIPlayer* self = static_cast<CAIPlayer*> (cbdata);
     382        CAIPlayer* self = static_cast<CAIPlayer*> (pCxPrivate->pCBData);
    357383        self->m_Commands.push_back(self->m_ScriptInterface.WriteStructuredClone(cmd.get()));
    358384    }
    359385    // The next two ought to be implmeneted someday but for now as it returns "null" it can't
    360     static void DumpHeap(void* cbdata)
     386    static void DumpHeap(ScriptInterface::CxPrivate* pCxPrivate)
    361387    {
    362         if (cbdata == NULL) {
     388        if (pCxPrivate->pCBData == NULL) {
    363389            debug_warn(L"Warning: the shared component has asked for DumpHeap. Ignoring.");
    364390            return;
    365391        }
    366         CAIWorker* self = static_cast<CAIWorker*> (cbdata);
    367         self->m_ScriptInterface.DumpHeap();
     392        pCxPrivate->pScriptInterface->DumpHeap();
    368393    }
    369     static void ForceGC(void* cbdata)
     394    static void ForceGC(ScriptInterface::CxPrivate* pCxPrivate)
    370395    {
    371         if (cbdata == NULL) {
     396        if (pCxPrivate->pCBData == NULL) {
    372397            debug_warn(L"Warning: the shared component has asked for ForceGC. Ignoring.");
    373398            return;
    374399        }
    375         CAIWorker* self = static_cast<CAIWorker*> (cbdata);
    376400        PROFILE3("AI compute GC");
    377         JS_GC(self->m_ScriptInterface.GetContext());
     401        JS_GC(pCxPrivate->pScriptInterface->GetContext());
    378402    }
    379403   
    380404    /**
    381405     * Debug function for AI scripts to dump 2D array data (e.g. terrain tile weights).
    382406     */
    383     static void DumpImage(void* UNUSED(cbdata), std::wstring name, std::vector<u32> data, u32 w, u32 h, u32 max)
     407    static void DumpImage(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring name, std::vector<u32> data, u32 w, u32 h, u32 max)
    384408    {
    385409        // TODO: this is totally not threadsafe.
    386410        VfsPath filename = L"screenshots/aidump/" + name;
     
    671695                CScriptVal val = m_ScriptInterface.ReadStructuredClone(m_Players[i]->m_Commands[j]);
    672696                serializer.ScriptVal("command", val);
    673697            }
    674 
    675             bool hasCustomSerialize = m_ScriptInterface.HasProperty(m_Players[i]->m_Obj.get(), "Serialize");
     698           
     699            jsval playerObjClone = m_ScriptInterface.CloneValueFromOtherContext(m_Players[i]->m_ScriptInterface, m_Players[i]->m_Obj.get());
     700            bool hasCustomSerialize = m_ScriptInterface.HasProperty(playerObjClone, "Serialize");
    676701            if (hasCustomSerialize)
    677702            {
    678703                CScriptVal scriptData;
    679                 if (!m_ScriptInterface.CallFunction(m_Players[i]->m_Obj.get(), "Serialize", scriptData))
     704                if (!m_ScriptInterface.CallFunction(playerObjClone, "Serialize", scriptData))
    680705                    LOGERROR(L"AI script Serialize call failed");
    681706                serializer.ScriptVal("data", scriptData);
    682707            }
    683708            else
    684709            {
    685                 serializer.ScriptVal("data", m_Players[i]->m_Obj.get());
     710                serializer.ScriptVal("data", playerObjClone);
    686711            }
    687712        }
    688713    }
     
    837862            PROFILE2_ATTR("player: %d", m_Players[i]->m_Player);
    838863            PROFILE2_ATTR("script: %ls", m_Players[i]->m_AIName.c_str());
    839864            if (m_HasSharedComponent && m_Players[i]->m_UseSharedComponent)
     865            {
    840866                m_Players[i]->Run(state,m_SharedAIObj);
     867            }
    841868            else
    842869                m_Players[i]->Run(state);
    843870        }
    844871
    845872        // Run GC if we are about to overflow
    846         if (JS_GetGCParameter(m_ScriptInterface.GetRuntime(), JSGC_BYTES) > 33000000)
     873        if (JS_GetGCParameter(m_ScriptInterface.GetJSRuntime(), JSGC_BYTES) > 33000000)
    847874        {
    848875            PROFILE3("AI compute GC");
    849876
  • source/simulation2/Simulation2.cpp

     
    5959class CSimulation2Impl
    6060{
    6161public:
    62     CSimulation2Impl(CUnitManager* unitManager, CTerrain* terrain) :
    63         m_SimContext(), m_ComponentManager(m_SimContext),
     62    CSimulation2Impl(CUnitManager* unitManager, shared_ptr<ScriptRuntime> rt, CTerrain* terrain) :
     63        m_SimContext(), m_ComponentManager(m_SimContext, rt),
    6464        m_EnableOOSLog(false), m_EnableSerializationTest(false)
    6565    {
    6666        m_SimContext.m_UnitManager = unitManager;
     
    376376        CTerrain secondaryTerrain;
    377377        CSimContext secondaryContext;
    378378        secondaryContext.m_Terrain = &secondaryTerrain;
    379         CComponentManager secondaryComponentManager(secondaryContext);
     379        CComponentManager secondaryComponentManager(secondaryContext, m_ComponentManager.GetScriptInterface().GetRuntime());
    380380        secondaryComponentManager.LoadComponentTypes();
    381381        ENSURE(LoadDefaultScripts(secondaryComponentManager, NULL));
    382382        ResetComponentState(secondaryComponentManager, false, false);
     
    565565
    566566////////////////////////////////////////////////////////////////
    567567
    568 CSimulation2::CSimulation2(CUnitManager* unitManager, CTerrain* terrain) :
    569     m(new CSimulation2Impl(unitManager, terrain))
     568CSimulation2::CSimulation2(CUnitManager* unitManager, shared_ptr<ScriptRuntime> rt, CTerrain* terrain) :
     569    m(new CSimulation2Impl(unitManager, rt, terrain))
    570570{
    571571}
    572572
  • source/lobby/scripting/JSInterface_Lobby.cpp

     
    2626
    2727#include "scriptinterface/ScriptInterface.h"
    2828
    29 bool JSI_Lobby::HasXmppClient(void* UNUSED(cbdata))
     29bool JSI_Lobby::HasXmppClient(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    3030{
    3131    return (g_XmppClient ? true : false);
    3232}
    3333
    3434#if CONFIG2_LOBBY
    3535
    36 void JSI_Lobby::StartXmppClient(void* UNUSED(cbdata), std::wstring username, std::wstring password, std::wstring room, std::wstring nick)
     36void JSI_Lobby::StartXmppClient(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring username, std::wstring password, std::wstring room, std::wstring nick)
    3737{
    3838    ENSURE(!g_XmppClient);
    3939
     
    4242    g_rankedGame = true;
    4343}
    4444
    45 void JSI_Lobby::StartRegisterXmppClient(void* UNUSED(cbdata), std::wstring username, std::wstring password)
     45void JSI_Lobby::StartRegisterXmppClient(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring username, std::wstring password)
    4646{
    4747    ENSURE(!g_XmppClient);
    4848
     
    5050        "", "", true);
    5151}
    5252
    53 void JSI_Lobby::StopXmppClient(void* UNUSED(cbdata))
     53void JSI_Lobby::StopXmppClient(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    5454{
    5555    ENSURE(g_XmppClient);
    5656    SAFE_DELETE(g_XmppClient);
    5757    g_rankedGame = false;
    5858}
    5959
    60 void JSI_Lobby::ConnectXmppClient(void* UNUSED(cbdata))
     60void JSI_Lobby::ConnectXmppClient(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    6161{
    6262    ENSURE(g_XmppClient);
    6363    g_XmppClient->connect();
    6464}
    6565
    66 void JSI_Lobby::DisconnectXmppClient(void* UNUSED(cbdata))
     66void JSI_Lobby::DisconnectXmppClient(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    6767{
    6868    ENSURE(g_XmppClient);
    6969    g_XmppClient->disconnect();
    7070}
    7171
    72 void JSI_Lobby::RecvXmppClient(void* UNUSED(cbdata))
     72void JSI_Lobby::RecvXmppClient(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    7373{
    7474    if (!g_XmppClient)
    7575        return;
    7676    g_XmppClient->recv();
    7777}
    7878
    79 void JSI_Lobby::SendGetGameList(void* UNUSED(cbdata))
     79void JSI_Lobby::SendGetGameList(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    8080{
    8181    if (!g_XmppClient)
    8282        return;
    8383    g_XmppClient->SendIqGetGameList();
    8484}
    8585
    86 void JSI_Lobby::SendGetBoardList(void* UNUSED(cbdata))
     86void JSI_Lobby::SendGetBoardList(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    8787{
    8888    if (!g_XmppClient)
    8989        return;
    9090    g_XmppClient->SendIqGetBoardList();
    9191}
    9292
    93 void JSI_Lobby::SendGameReport(void* cbdata, CScriptVal data)
     93void JSI_Lobby::SendGameReport(ScriptInterface::CxPrivate* pCxPrivate, CScriptVal data)
    9494{
    9595    if (!g_XmppClient)
    9696        return;
    9797
    98     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    99     g_XmppClient->SendIqGameReport(guiManager->GetScriptInterface(), data);
     98    g_XmppClient->SendIqGameReport(*(pCxPrivate->pScriptInterface), data);
    10099}
    101100
    102 void JSI_Lobby::SendRegisterGame(void* cbdata, CScriptVal data)
     101void JSI_Lobby::SendRegisterGame(ScriptInterface::CxPrivate* pCxPrivate, CScriptVal data)
    103102{
    104103    if (!g_XmppClient)
    105104        return;
    106    
    107     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    108     g_XmppClient->SendIqRegisterGame(guiManager->GetScriptInterface(), data);
     105
     106    g_XmppClient->SendIqRegisterGame(*(pCxPrivate->pScriptInterface), data);
    109107}
    110108
    111 void JSI_Lobby::SendUnregisterGame(void* UNUSED(cbdata))
     109void JSI_Lobby::SendUnregisterGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    112110{
    113111    if (!g_XmppClient)
    114112        return;
    115113    g_XmppClient->SendIqUnregisterGame();
    116114}
    117115
    118 void JSI_Lobby::SendChangeStateGame(void* UNUSED(cbdata), std::wstring nbp, std::wstring players)
     116void JSI_Lobby::SendChangeStateGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring nbp, std::wstring players)
    119117{
    120118    if (!g_XmppClient)
    121119        return;
    122120    g_XmppClient->SendIqChangeStateGame(utf8_from_wstring(nbp), utf8_from_wstring(players));
    123121}
    124122
    125 CScriptVal JSI_Lobby::GetPlayerList(void* cbdata)
     123CScriptVal JSI_Lobby::GetPlayerList(ScriptInterface::CxPrivate* pCxPrivate)
    126124{
    127125    if (!g_XmppClient)
    128126        return CScriptVal();
    129127       
    130     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    131     CScriptValRooted playerList = g_XmppClient->GUIGetPlayerList(guiManager->GetScriptInterface());
     128    CScriptValRooted playerList = g_XmppClient->GUIGetPlayerList(*(pCxPrivate->pScriptInterface));
    132129
    133130    return playerList.get();
    134131}
    135132
    136 CScriptVal JSI_Lobby::GetGameList(void* cbdata)
     133CScriptVal JSI_Lobby::GetGameList(ScriptInterface::CxPrivate* pCxPrivate)
    137134{
    138135    if (!g_XmppClient)
    139136        return CScriptVal();
    140137
    141     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    142     CScriptValRooted gameList = g_XmppClient->GUIGetGameList(guiManager->GetScriptInterface());
     138    CScriptValRooted gameList = g_XmppClient->GUIGetGameList(*(pCxPrivate->pScriptInterface));
    143139
    144140    return gameList.get();
    145141}
    146142
    147 CScriptVal JSI_Lobby::GetBoardList(void* cbdata)
     143CScriptVal JSI_Lobby::GetBoardList(ScriptInterface::CxPrivate* pCxPrivate)
    148144{
    149145    if (!g_XmppClient)
    150146        return CScriptVal();
    151147
    152     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    153     CScriptValRooted boardList = g_XmppClient->GUIGetBoardList(guiManager->GetScriptInterface());
     148    CScriptValRooted boardList = g_XmppClient->GUIGetBoardList(*(pCxPrivate->pScriptInterface));
    154149
    155150    return boardList.get();
    156151}
    157152
    158 CScriptVal JSI_Lobby::LobbyGuiPollMessage(void* cbdata)
     153CScriptVal JSI_Lobby::LobbyGuiPollMessage(ScriptInterface::CxPrivate* pCxPrivate)
    159154{
    160155    if (!g_XmppClient)
    161156        return CScriptVal();
    162        
    163     CGUIManager* guiManager = static_cast<CGUIManager*> (cbdata);
    164     CScriptValRooted poll = g_XmppClient->GuiPollMessage(guiManager->GetScriptInterface());
     157   
     158    CScriptValRooted poll = g_XmppClient->GuiPollMessage(*(pCxPrivate->pScriptInterface));
    165159
    166160    return poll.get();
    167161}
    168162
    169 void JSI_Lobby::LobbySendMessage(void* UNUSED(cbdata), std::wstring message)
     163void JSI_Lobby::LobbySendMessage(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring message)
    170164{
    171165    if (!g_XmppClient)
    172166        return;
     
    174168    g_XmppClient->SendMUCMessage(utf8_from_wstring(message));
    175169}
    176170
    177 void JSI_Lobby::LobbySetPlayerPresence(void* UNUSED(cbdata), std::wstring presence)
     171void JSI_Lobby::LobbySetPlayerPresence(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring presence)
    178172{
    179173    if (!g_XmppClient)
    180174        return;
     
    182176    g_XmppClient->SetPresence(utf8_from_wstring(presence));
    183177}
    184178
    185 void JSI_Lobby::LobbySetNick(void* UNUSED(cbdata), std::wstring nick)
     179void JSI_Lobby::LobbySetNick(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring nick)
    186180{
    187181    if (!g_XmppClient)
    188182        return;
     
    190184    g_XmppClient->SetNick(utf8_from_wstring(nick));
    191185}
    192186
    193 std::wstring JSI_Lobby::LobbyGetNick(void* UNUSED(cbdata))
     187std::wstring JSI_Lobby::LobbyGetNick(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    194188{
    195189    if (!g_XmppClient)
    196190        return L"";
     
    200194    return wstring_from_utf8(nick);
    201195}
    202196
    203 void JSI_Lobby::LobbyKick(void* UNUSED(cbdata), std::wstring nick, std::wstring reason)
     197void JSI_Lobby::LobbyKick(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring nick, std::wstring reason)
    204198{
    205199    if (!g_XmppClient)
    206200        return;
     
    208202    g_XmppClient->kick(utf8_from_wstring(nick), utf8_from_wstring(reason));
    209203}
    210204
    211 void JSI_Lobby::LobbyBan(void* UNUSED(cbdata), std::wstring nick, std::wstring reason)
     205void JSI_Lobby::LobbyBan(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring nick, std::wstring reason)
    212206{
    213207    if (!g_XmppClient)
    214208        return;
     
    216210    g_XmppClient->ban(utf8_from_wstring(nick), utf8_from_wstring(reason));
    217211}
    218212
    219 std::wstring JSI_Lobby::LobbyGetPlayerPresence(void* UNUSED(cbdata), std::wstring nickname)
     213std::wstring JSI_Lobby::LobbyGetPlayerPresence(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring nickname)
    220214{
    221215    if (!g_XmppClient)
    222216        return L"";
     
    257251    return std::string(hex, sizeof(hex));
    258252}
    259253
    260 std::wstring JSI_Lobby::EncryptPassword(void* UNUSED(cbdata), std::wstring pass, std::wstring user)
     254std::wstring JSI_Lobby::EncryptPassword(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::wstring pass, std::wstring user)
    261255{
    262256    return wstring_from_utf8(JSI_Lobby::EncryptPassword(utf8_from_wstring(pass), utf8_from_wstring(user)));
    263257}
    264258
    265 bool JSI_Lobby::IsRankedGame(void* UNUSED(cbdata))
     259bool JSI_Lobby::IsRankedGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
    266260{
    267261    return g_rankedGame;
    268262}
    269263
    270 void JSI_Lobby::SetRankedGame(void* UNUSED(cbdata), bool isRanked)
     264void JSI_Lobby::SetRankedGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), bool isRanked)
    271265{
    272266    g_rankedGame = isRanked;
    273267}
  • source/lobby/scripting/JSInterface_Lobby.h

     
    1818#ifndef INCLUDED_JSI_LOBBY
    1919#define INCLUDED_JSI_LOBBY
    2020
     21#include "scriptinterface/ScriptInterface.h"
    2122#include "scriptinterface/ScriptVal.h"
    2223#include "lib/config2.h" // for CONFIG2_LOBBY
    2324
    24 class ScriptInterface;
    25 
    2625namespace JSI_Lobby
    2726{
    28     bool HasXmppClient(void* cbdata);
     27    bool HasXmppClient(ScriptInterface::CxPrivate* pCxPrivate);
    2928   
    3029#if CONFIG2_LOBBY
    31     void StartXmppClient(void* cbdata, std::wstring username, std::wstring password, std::wstring room, std::wstring nick);
    32     void StartRegisterXmppClient(void* cbdata, std::wstring username, std::wstring password);
    33     void StopXmppClient(void* cbdata);
    34     void ConnectXmppClient(void* cbdata);
    35     void DisconnectXmppClient(void* cbdata);
    36     void RecvXmppClient(void* cbdata);
    37     void SendGetGameList(void* cbdata);
    38     void SendGetBoardList(void* cbdata);
    39     void SendGameReport(void* cbdata, CScriptVal data);
    40     void SendRegisterGame(void* cbdata, CScriptVal data);
    41     void SendUnregisterGame(void* cbdata);
    42     void SendChangeStateGame(void* cbdata, std::wstring nbp, std::wstring players);
    43     CScriptVal GetPlayerList(void* cbdata);
    44     CScriptVal GetGameList(void* cbdata);
    45     CScriptVal GetBoardList(void* cbdata);
    46     CScriptVal LobbyGuiPollMessage(void* cbdata);
    47     void LobbySendMessage(void* cbdata, std::wstring message);
    48     void LobbySetPlayerPresence(void* cbdata, std::wstring presence);
    49     void LobbySetNick(void* cbdata, std::wstring nick);
    50     std::wstring LobbyGetNick(void* cbdata);
    51     void LobbyKick(void* cbdata, std::wstring nick, std::wstring reason);
    52     void LobbyBan(void* cbdata, std::wstring nick, std::wstring reason);
    53     std::wstring LobbyGetPlayerPresence(void* cbdata, std::wstring nickname);
     30    void StartXmppClient(ScriptInterface::CxPrivate* pCxPrivate, std::wstring username, std::wstring password, std::wstring room, std::wstring nick);
     31    void StartRegisterXmppClient(ScriptInterface::CxPrivate* pCxPrivate, std::wstring username, std::wstring password);
     32    void StopXmppClient(ScriptInterface::CxPrivate* pCxPrivate);
     33    void ConnectXmppClient(ScriptInterface::CxPrivate* pCxPrivate);
     34    void DisconnectXmppClient(ScriptInterface::CxPrivate* pCxPrivate);
     35    void RecvXmppClient(ScriptInterface::CxPrivate* pCxPrivate);
     36    void SendGetGameList(ScriptInterface::CxPrivate* pCxPrivate);
     37    void SendGetBoardList(ScriptInterface::CxPrivate* pCxPrivate);
     38    void SendGameReport(ScriptInterface::CxPrivate* pCxPrivate, CScriptVal data);
     39    void SendRegisterGame(ScriptInterface::CxPrivate* pCxPrivate, CScriptVal data);
     40    void SendUnregisterGame(ScriptInterface::CxPrivate* pCxPrivate);
     41    void SendChangeStateGame(ScriptInterface::CxPrivate* pCxPrivate, std::wstring nbp, std::wstring players);
     42    CScriptVal GetPlayerList(ScriptInterface::CxPrivate* pCxPrivate);
     43    CScriptVal GetGameList(ScriptInterface::CxPrivate* pCxPrivate);
     44    CScriptVal GetBoardList(ScriptInterface::CxPrivate* pCxPrivate);
     45    CScriptVal LobbyGuiPollMessage(ScriptInterface::CxPrivate* pCxPrivate);
     46    void LobbySendMessage(ScriptInterface::CxPrivate* pCxPrivate, std::wstring message);
     47    void LobbySetPlayerPresence(ScriptInterface::CxPrivate* pCxPrivate, std::wstring presence);
     48    void LobbySetNick(ScriptInterface::CxPrivate* pCxPrivate, std::wstring nick);
     49    std::wstring LobbyGetNick(ScriptInterface::CxPrivate* pCxPrivate);
     50    void LobbyKick(ScriptInterface::CxPrivate* pCxPrivate, std::wstring nick, std::wstring reason);
     51    void LobbyBan(ScriptInterface::CxPrivate* pCxPrivate, std::wstring nick, std::wstring reason);
     52    std::wstring LobbyGetPlayerPresence(ScriptInterface::CxPrivate* pCxPrivate, std::wstring nickname);
    5453
    5554    // Non-public secure PBKDF2 hash function with salting and 1,337 iterations
    5655    std::string EncryptPassword(const std::string& password, const std::string& username);
    5756
    5857    // Public hash interface.
    59     std::wstring EncryptPassword(void* cbdata, std::wstring pass, std::wstring user);
     58    std::wstring EncryptPassword(ScriptInterface::CxPrivate* pCxPrivate, std::wstring pass, std::wstring user);
    6059   
    61     bool IsRankedGame(void* cbdata);
    62     void SetRankedGame(void* cbdata, bool isRanked);
     60    bool IsRankedGame(ScriptInterface::CxPrivate* pCxPrivate);
     61    void SetRankedGame(ScriptInterface::CxPrivate* pCxPrivate, bool isRanked);
    6362#endif // CONFIG2_LOBBY
    6463}
    6564