Skip to content

Commit

Permalink
#1108 - implementing hyperlink disambiguation. Object id is now sent …
Browse files Browse the repository at this point in the history
…to UI and included in new metadata when a hyperlink is clicked.
  • Loading branch information
alexwarren committed Jul 21, 2012
1 parent 2b15cd1 commit 20ee2b4
Show file tree
Hide file tree
Showing 16 changed files with 100 additions and 35 deletions.
Binary file added Dependencies/Newtonsoft.Json.dll
Binary file not shown.
1 change: 1 addition & 0 deletions IASL/IASL.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public interface IASL
bool Initialise(IPlayer player);
void Begin();
void SendCommand(string command);
void SendCommand(string command, IDictionary<string, string> metadata);
void SendEvent(string eventName, string param);
event PrintTextHandler PrintText;
event UpdateListHandler UpdateList;
Expand Down
2 changes: 1 addition & 1 deletion IASL/IASLTimer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ public interface IASLTimer : IASL
{
event Action<int> RequestNextTimerTick;
void Tick(int elapsedTime);
void SendCommand(string command, int elapsedTime);
void SendCommand(string command, int elapsedTime, IDictionary<string, string> metadata);
}
}
9 changes: 7 additions & 2 deletions Legacy/LegacyGame.vb
Original file line number Diff line number Diff line change
Expand Up @@ -13253,10 +13253,14 @@ ErrorHandler:
End Property

Public Sub SendCommand(command As String) Implements IASL.SendCommand
SendCommand(command, 0)
SendCommand(command, 0, Nothing)
End Sub

Public Sub SendCommand(command As String, elapsedTime As Integer) Implements IASLTimer.SendCommand
Public Sub SendCommand(command As String, metadata As IDictionary(Of String, String)) Implements IASL.SendCommand
SendCommand(command, 0, metadata)
End Sub

Public Sub SendCommand(command As String, elapsedTime As Integer, metadata As IDictionary(Of String, String)) Implements IASLTimer.SendCommand
' The processing of commands is done in a separate thread, so things like the "enter" command can
' lock the thread while waiting for further input. After starting to process the command, we wait
' for something to happen before returning from the SendCommand call - either the command will have
Expand Down Expand Up @@ -13571,4 +13575,5 @@ ErrorHandler:
Return GameASLVersion
End Get
End Property

End Class
11 changes: 6 additions & 5 deletions Player/Player.vb
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ Public Class Player
' PanesVisible = Not PanesVisible
'End Sub

Private Sub RunCommand(command As String)
Private Sub RunCommand(command As String, Optional metadata As IDictionary(Of String, String) = Nothing)

If Not m_initialised Then Exit Sub

Expand All @@ -196,7 +196,7 @@ Public Class Player

Try
If m_gameTimer IsNot Nothing Then
m_gameTimer.SendCommand(command, GetTickCountAndStopTimer())
m_gameTimer.SendCommand(command, GetTickCountAndStopTimer(), Nothing)
Else
m_game.SendCommand(command)
End If
Expand Down Expand Up @@ -731,7 +731,8 @@ Public Class Player
End Sub

Private Sub ctlPlayerHtml_CommandRequested(command As String) Handles ctlPlayerHtml.CommandRequested
RunCommand(command)
Dim data = PlayerHelper.GetCommandData(command)
RunCommand(data.Command, data.Metadata)
End Sub

Private Sub ctlPlayerHtml_EndWait() Handles ctlPlayerHtml.EndWait
Expand All @@ -758,8 +759,8 @@ Public Class Player
ClearBuffer()
End Sub

Public Sub BindMenu(linkid As String, verbs As String, text As String) Implements IPlayerHelperUI.BindMenu
BeginInvoke(Sub() ctlPlayerHtml.BindMenu(linkid, verbs, text))
Public Sub BindMenu(linkid As String, verbs As String, text As String, elementId As String) Implements IPlayerHelperUI.BindMenu
BeginInvoke(Sub() ctlPlayerHtml.BindMenu(linkid, verbs, text, elementId))
End Sub

Public Sub OutputText(text As String) Implements IPlayerHelperUI.OutputText
Expand Down
4 changes: 2 additions & 2 deletions Player/PlayerHTML.vb
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ Public Class PlayerHTML
InvokeScript("createNewDiv", align)
End Sub

Public Sub BindMenu(linkid As String, verbs As String, text As String)
InvokeScript("bindMenu", linkid, verbs, text)
Public Sub BindMenu(linkid As String, verbs As String, text As String, elementId As String)
InvokeScript("bindMenu", linkid, verbs, text, elementId)
End Sub

Public Sub WriteLine(text As String)
Expand Down
9 changes: 7 additions & 2 deletions Player/desktopplayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@ function scrollToEnd() {
$("#txtCommand").focus();
}

function sendCommand(text) {
UIEvent("RunCommand", text);
function sendCommand(text, metadata) {
var data = new Object();
data["command"] = text;
if (typeof metadata != "undefined") {
data["metadata"] = metadata;
}
UIEvent("RunCommand", JSON.stringify(data));
}

function ASLEvent(event, parameter) {
Expand Down
2 changes: 1 addition & 1 deletion PlayerController/GameQuery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ public void SetAlignment(string alignment)
{
}

public void BindMenu(string linkid, string verbs, string text)
public void BindMenu(string linkid, string verbs, string text, string elementId)
{
}

Expand Down
3 changes: 3 additions & 0 deletions PlayerController/PlayerController.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@
<Reference Include="Ionic.Zip.Reduced">
<HintPath>..\Dependencies\Ionic.Zip.Reduced.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\Dependencies\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
Expand Down
42 changes: 36 additions & 6 deletions PlayerController/PlayerHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface IPlayerHelperUI : IPlayer
{
void OutputText(string text);
void SetAlignment(string alignment);
void BindMenu(string linkid, string verbs, string text);
void BindMenu(string linkid, string verbs, string text, string elementId);
}

/// <summary>
Expand Down Expand Up @@ -68,6 +68,7 @@ void m_game_PrintText(string text)

public void PrintText(string text)
{
string currentElementId = "";
string currentTagValue = "";
string currentVerbs = "";
string currentCommand = "";
Expand Down Expand Up @@ -98,6 +99,7 @@ public void PrintText(string text)
break;
case "object":
generatingLink = true;
currentElementId = reader.GetAttribute("id");
currentVerbs = reader.GetAttribute("verbs");
currentLinkColour = reader.GetAttribute("color");
break;
Expand Down Expand Up @@ -156,11 +158,11 @@ public void PrintText(string text)
// do nothing
break;
case "object":
AddLink(currentTagValue, null, currentVerbs, currentLinkColour);
AddLink(currentTagValue, null, currentVerbs, currentLinkColour, currentElementId);
generatingLink = false;
break;
case "command":
AddLink(currentTagValue, currentCommand, null, currentLinkColour);
AddLink(currentTagValue, currentCommand, null, currentLinkColour, null);
generatingLink = false;
break;
case "b":
Expand Down Expand Up @@ -291,7 +293,7 @@ private string GetCurrentFormat(string linkForeground)

private int m_linkCount = 0;

private void AddLink(string text, string command, string verbs, string colour)
private void AddLink(string text, string command, string verbs, string colour, string elementId)
{
string onclick = string.Empty;
m_linkCount++;
Expand All @@ -314,7 +316,7 @@ private void AddLink(string text, string command, string verbs, string colour)
if (!string.IsNullOrEmpty(verbs))
{
m_playerUI.OutputText(ClearBuffer());
m_playerUI.BindMenu(linkid, verbs, text);
m_playerUI.BindMenu(linkid, verbs, text, elementId);
}
}

Expand Down Expand Up @@ -352,7 +354,7 @@ public void SendCommand(string command, int tickCount)
{
if (m_gameTimer != null)
{
m_gameTimer.SendCommand(command, tickCount);
m_gameTimer.SendCommand(command, tickCount, null);
}
else
{
Expand Down Expand Up @@ -422,5 +424,33 @@ public static string VerbString(IEnumerable<string> verbs)
{
return string.Join("/", verbs);
}

public class CommandData
{
public string Command { get; set; }
public IDictionary<string, string> Metadata { get; set; }
}

public static CommandData GetCommandData(string data)
{
CommandData result = new CommandData();

Dictionary<string, object> values = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(data);
if (values.ContainsKey("command"))
{
result.Command = values["command"] as string;
}

if (values.ContainsKey("metadata"))
{
string metadataString = values["metadata"] as string;
if (metadataString != null)
{
result.Metadata = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(metadataString);
}
}

return result;
}
}
}
17 changes: 13 additions & 4 deletions PlayerController/playercore.js
Original file line number Diff line number Diff line change
Expand Up @@ -436,20 +436,29 @@ function createNewDiv(alignment) {
_currentDiv = $("#divOutputAlign" + _divCount);
}

function bindMenu(linkid, verbs, text) {
function bindMenu(linkid, verbs, text, elementId) {
var verbsList = verbs.split("/");
var options = [];
var metadata = new Object();
metadata[text] = elementId;
var metadataString = JSON.stringify(metadata);

$.each(verbsList, function (key, value) {
options = options.concat({ title: value, action: { type: "fn", callback: "doMenuClick('" + value.toLowerCase() + " " + text.replace("'", "\\'") + "');"} });
options = options.concat({
title: value,
action: {
type: "fn",
callback: "doMenuClick('" + value.toLowerCase() + " " + text.replace("'", "\\'") + "','" + metadataString + "');"
}
});
});

$("#" + linkid).jjmenu("both", options, {}, { show: "fadeIn", speed: 100, xposition: "left", yposition: "auto", "orientation": "auto" });
}

function doMenuClick(command) {
function doMenuClick(command, metadata) {
$("div[id^=jjmenu]").remove();
sendCommand(command);
sendCommand(command, metadata);
}

function clearScreen() {
Expand Down
2 changes: 1 addition & 1 deletion QuestConsole/ConsolePlayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ public void SetAlignment(string alignment)
{
}

public void BindMenu(string linkid, string verbs, string text)
public void BindMenu(string linkid, string verbs, string text, string elementId)
{
}

Expand Down
4 changes: 2 additions & 2 deletions WebPlayer/PlayerHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ public void Quit()
Finished = true;
}

public void BindMenu(string linkid, string verbs, string text)
public void BindMenu(string linkid, string verbs, string text, string elementId)
{
m_buffer.AddJavaScriptToBuffer("bindMenu", new StringParameter(linkid), new StringParameter(verbs), new StringParameter(text));
m_buffer.AddJavaScriptToBuffer("bindMenu", new StringParameter(linkid), new StringParameter(verbs), new StringParameter(text), new StringParameter(elementId));
}

private void UpdateList(ListType listType, List<ListData> items)
Expand Down
15 changes: 8 additions & 7 deletions WebPlayer/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,6 @@ function keepSessionAlive() {

var _waitingForSoundToFinish = false;

function prepareCommand(command) {
$("#fldUITickCount").val(getTickCountAndStopTimer());
$("#fldUIMsg").val("command " + command);
}

function msgboxSubmit(text) {
$("#msgbox").dialog("close");
window.setTimeout(function () {
Expand Down Expand Up @@ -104,11 +99,17 @@ function dialogSendCancel() {
}, 100);
}

function sendCommand(text) {
function sendCommand(text, metadata) {
if (_pauseMode || _waitingForSoundToFinish || _waitMode) return;
markScrollPosition();
window.setTimeout(function () {
prepareCommand(text);
$("#fldUITickCount").val(getTickCountAndStopTimer());
var data = new Object();
data["command"] = text;
if (typeof metadata != "undefined") {
data["metadata"] = metadata;
}
$("#fldUIMsg").val("command " + JSON.stringify(data));
$("#cmdSubmit").click();
}, 100);
afterSendCommand();
Expand Down
2 changes: 1 addition & 1 deletion WorldModel/WorldModel/Core/CoreDescriptions.aslx
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@
type = ""
}
if (not type = "") {
result = "<object"
result = "<object id='" + obj.name + "'"
if (verbs <> null) {
result = result + " verbs='" + Join(verbs, "/") + "'"
}
Expand Down
12 changes: 11 additions & 1 deletion WorldModel/WorldModel/WorldModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ public List<string> DebuggerObjectTypes
get { return new List<string>(m_debuggerObjectTypes.Keys.Union(m_debuggerElementTypes.Keys)); }
}

public void SendCommand(string command, int elapsedTime)
public void SendCommand(string command, int elapsedTime, IDictionary<string, string> metadata)
{
if (elapsedTime > 0)
{
Expand Down Expand Up @@ -622,6 +622,16 @@ public void SendCommand(string command, int elapsedTime)
}
}

public void SendCommand(string command, int elapsedTime)
{
SendCommand(command, elapsedTime, null);
}

public void SendCommand(string command, IDictionary<string, string> metadata)
{
SendCommand(command, metadata);
}

public void SendCommand(string command)
{
SendCommand(command, 0);
Expand Down

0 comments on commit 20ee2b4

Please sign in to comment.