From 874bdb049623f41a8491ab94e06e472e361219f1 Mon Sep 17 00:00:00 2001 From: Matt Wagner Date: Thu, 3 Jun 2021 23:40:52 -0700 Subject: [PATCH] Convert to GMCP --- src/scripts/galaxy-map/galaxy-map.lua | 10 +-- src/scripts/info-panel/info-panel.lua | 101 ++++++++++++++------------ src/scripts/mapper/mapper.lua | 16 ++-- src/scripts/msdp/msdp.lua | 45 ------------ src/scripts/msdp/scripts.json | 5 -- src/scripts/system-map/system-map.lua | 12 ++- 6 files changed, 69 insertions(+), 120 deletions(-) delete mode 100644 src/scripts/msdp/msdp.lua delete mode 100644 src/scripts/msdp/scripts.json diff --git a/src/scripts/galaxy-map/galaxy-map.lua b/src/scripts/galaxy-map/galaxy-map.lua index e321968..f313845 100644 --- a/src/scripts/galaxy-map/galaxy-map.lua +++ b/src/scripts/galaxy-map/galaxy-map.lua @@ -41,7 +41,7 @@ registerAnonymousEventHandler("lotjUICreated", function() lotj.galaxyMap.drawSystems() end - registerAnonymousEventHandler("msdp.SHIPGALY", lotj.galaxyMap.setShipGalCoords) + registerAnonymousEventHandler("gmcp.Ship.System.y", lotj.galaxyMap.setShipGalCoords) end) @@ -50,11 +50,9 @@ function lotj.galaxyMap.log(text) end function lotj.galaxyMap.setShipGalCoords() - -- Assume "0" in both values means we don't have valid coordinates and leave them what they were. - -- TODO: Find a way to support a system actually located at 0, 0 - if msdp.SHIPGALX ~= "0" or msdp.SHIPGALY ~= "0" then - lotj.galaxyMap.currentX = tonumber(msdp.SHIPGALX) - lotj.galaxyMap.currentY = tonumber(msdp.SHIPGALY) + if gmcp.Ship.System.x ~= nil and gmcp.Ship.System.y ~= nil then + lotj.galaxyMap.currentX = gmcp.Ship.System.x + lotj.galaxyMap.currentY = gmcp.Ship.System.y lotj.galaxyMap.drawSystems() end end diff --git a/src/scripts/info-panel/info-panel.lua b/src/scripts/info-panel/info-panel.lua index 41092cf..fc5b2f9 100644 --- a/src/scripts/info-panel/info-panel.lua +++ b/src/scripts/info-panel/info-panel.lua @@ -52,20 +52,32 @@ local function styleGaugeText(gauge, fontSize) gauge:setFontSize(fontSize) end --- Wires up MSDP subscriptions for a gauge. +local function gmcpVarByPath(varPath) + local temp = gmcp + for varStep in varPath:gmatch("([^\\.]+)") do + if temp and temp[varStep] then + temp = temp[varStep] + else + return nil + end + end + return temp +end + +-- Wires up GMCP subscriptions for a gauge. -- statName is the short version of the stat name to show after the value (mv, hp, etc) local function wireGaugeUpdate(gauge, valueVarName, maxVarName, statName) local function doUpdate() - local current = tonumber(msdp[valueVarName] or "0") - local max = tonumber(msdp[maxVarName] or "0") + local current = gmcpVarByPath(valueVarName) or 0 + local max = gmcpVarByPath(maxVarName) or 0 if max > 0 then gauge:setValue(current, max, current.."/"..max.." "..statName) else gauge:setValue(0, 1, "") end end - registerAnonymousEventHandler("msdp."..valueVarName, doUpdate) - registerAnonymousEventHandler("msdp."..maxVarName, doUpdate) + registerAnonymousEventHandler("gmcp."..valueVarName, doUpdate) + registerAnonymousEventHandler("gmcp."..maxVarName, doUpdate) end @@ -78,7 +90,7 @@ function lotj.infoPanel.createBasicStats(container) healthGauge.front:setStyleSheet(gaugeFrontStyle("#f04141", "#ef2929", "#cc0000", "#a40000", "#cc0000")) healthGauge.back:setStyleSheet(gaugeBackStyle("#3f1111", "#3f0707", "#330000", "#220000", "#330000")) styleGaugeText(healthGauge, 12) - wireGaugeUpdate(healthGauge, "HEALTH", "HEALTHMAX", "hp") + wireGaugeUpdate(healthGauge, "Char.Stats.hp", "Char.Stats.maxHp", "hp") local wimpyBar = Geyser.Label:new({ x=0, y=0, @@ -88,10 +100,10 @@ function lotj.infoPanel.createBasicStats(container) background-color: yellow; ]]) - registerAnonymousEventHandler("msdp.WIMPY", function() - local health = tonumber(msdp.HEALTH or 0) - local healthMax = tonumber(msdp.HEALTHMAX or 0) - local wimpy = tonumber(msdp.WIMPY or 0) + registerAnonymousEventHandler("gmcp.Char.Stats.wimpy", function() + local health = gmcp.Char.Stats.hp + local healthMax = gmcp.Char.Stats.maxHp + local wimpy = gmcp.Char.Stats.wimpy if healthMax > 0 then if wimpy > 0 and health > 0 and wimpy < health then wimpyBar:show() @@ -110,7 +122,7 @@ function lotj.infoPanel.createBasicStats(container) movementGauge.front:setStyleSheet(gaugeFrontStyle("#41f041", "#29ef29", "#00cc00", "#00a400", "#00cc00")) movementGauge.back:setStyleSheet(gaugeBackStyle("#113f11", "#073f07", "#003300", "#002200", "#003300")) styleGaugeText(movementGauge, 12) - wireGaugeUpdate(movementGauge, "MOVEMENT", "MOVEMENTMAX", "mv") + wireGaugeUpdate(movementGauge, "Char.Stats.move", "Char.Stats.maxMove", "mv") -- Mana gauge (will be hidden later if we do not have mana) local manaGauge = Geyser.Gauge:new({ @@ -120,10 +132,10 @@ function lotj.infoPanel.createBasicStats(container) manaGauge.front:setStyleSheet(gaugeFrontStyle("#4141f0", "#2929ef", "#0000cc", "#0000a4", "#0000cc")) manaGauge.back:setStyleSheet(gaugeBackStyle("#11113f", "#07073f", "#000033", "#000022", "#000011")) styleGaugeText(manaGauge, 12) - wireGaugeUpdate(manaGauge, "MANA", "MANAMAX", "mn") + wireGaugeUpdate(manaGauge, "Char.Stats.mana", "Char.stats.maxMana", "mn") - registerAnonymousEventHandler("msdp.MANAMAX", function() - local manaMax = tonumber(msdp.MANAMAX or 0) + registerAnonymousEventHandler("gmcp.Char.Stats.maxMana", function() + local manaMax = gmcp.Char.Stats.maxMana or 0 if manaMax > 0 then healthGauge:move(nil, 4) healthGauge:resize(nil, 16) @@ -165,22 +177,20 @@ function lotj.infoPanel.createOpponentStats(container) opponentGauge:setFontSize("12") local function update() - local opponentName = string.gsub(msdp.OPPONENTNAME or "", "&.", "") + local opponentName = string.gsub(gmcp.Char.Enemy.name or "", "&.", "") -- Opponent name seems to always be empty string even when fighting, so fall back to something reasonable if opponentName == "" then opponentName = "Current target" end - local opponentHealth = tonumber(msdp.OPPONENTHEALTH or "0") - local opponentHealthMax = tonumber(msdp.OPPONENTHEALTHMAX or "0") - if opponentHealth > 0 then + local opponentHealth = gmcp.Char.Enemy.Percent + local opponentHealthMax = 100 + if opponentHealth ~= nil then opponentGauge:setValue(opponentHealth, opponentHealthMax, opponentName.."
"..opponentHealth.."%") else opponentGauge:setValue(0, 1, "Not fighting") end end - registerAnonymousEventHandler("msdp.OPPONENTNAME", update) - registerAnonymousEventHandler("msdp.OPPONENTHEALTH", update) - registerAnonymousEventHandler("msdp.OPPONENTHEALTHMAX", update) + registerAnonymousEventHandler("gmcp.Char.Enemy", update) end @@ -197,16 +207,17 @@ function lotj.infoPanel.createChatInfo(container) }, container) local function updateCommnet() - local commChannel = msdp.COMMCHANNEL or "0" - local commEncrypt = msdp.COMMENCRYPT or "0" - if commEncrypt == "0" then - commnetInfo:echo(commChannel, nil, "l13") - else + local commChannel = gmcp.Char.Chat.commChannel + local commEncrypt = gmcp.Char.Chat.commEncrypt + if not commChannel then + commnetInfo:echo("None", nil, "l13") + elseif commEncrypt then commnetInfo:echo(commChannel.." (E "..commEncrypt..")", nil, "l13") + else + commnetInfo:echo(commChannel, nil, "l13") end end - registerAnonymousEventHandler("msdp.COMMCHANNEL", updateCommnet) - registerAnonymousEventHandler("msdp.COMMENCRYPT", updateCommnet) + registerAnonymousEventHandler("gmcp.Char.Chat", updateCommnet) -- OOC meter local oocLabel = Geyser.Label:new({ @@ -221,8 +232,8 @@ function lotj.infoPanel.createChatInfo(container) oocGauge.front:setStyleSheet(gaugeFrontStyle("#31d0d0", "#22cfcf", "#00b2b2", "#009494", "#00b2b2")) oocGauge.back:setStyleSheet(gaugeBackStyle("#113f3f", "#073f3f", "#003333", "#002222", "#001111")) - registerAnonymousEventHandler("msdp.OOCLIMIT", function() - local oocLeft = tonumber(msdp.OOCLIMIT or 0) + registerAnonymousEventHandler("gmcp.Char.Chat.oocLimit", function() + local oocLeft = gmcp.Char.Chat.oocLimit or 0 local oocMax = 6 oocGauge:setValue(oocLeft, oocMax) end) @@ -237,7 +248,7 @@ function lotj.infoPanel.createSpaceStats(container) energyGauge.front:setStyleSheet(gaugeFrontStyle("#7a7a7a", "#777777", "#656565", "#505050", "#656565")) energyGauge.back:setStyleSheet(gaugeBackStyle("#383838", "#303030", "#222222", "#151515", "#222222")) styleGaugeText(energyGauge, 12) - wireGaugeUpdate(energyGauge, "SHIPENERGY", "SHIPMAXENERGY", "en") + wireGaugeUpdate(energyGauge, "Ship.Info.energy", "Ship.Info.maxEnergy", "en") local hullGauge = Geyser.Gauge:new({ x="3%", y=23, @@ -246,7 +257,7 @@ function lotj.infoPanel.createSpaceStats(container) hullGauge.front:setStyleSheet(gaugeFrontStyle("#bd7833", "#bd6e20", "#994c00", "#703800", "#994c00")) hullGauge.back:setStyleSheet(gaugeBackStyle("#442511", "#441d08", "#331100", "#200900", "#331100")) styleGaugeText(hullGauge, 12) - wireGaugeUpdate(hullGauge, "SHIPHULL", "SHIPMAXHULL", "hl") + wireGaugeUpdate(hullGauge, "Ship.Info.hull", "Ship.Info.maxHull", "hl") local shieldGauge = Geyser.Gauge:new({ x="3%", y=42, @@ -255,7 +266,7 @@ function lotj.infoPanel.createSpaceStats(container) shieldGauge.front:setStyleSheet(gaugeFrontStyle("#31d0d0", "#22cfcf", "#00b2b2", "#009494", "#00b2b2")) shieldGauge.back:setStyleSheet(gaugeBackStyle("#113f3f", "#073f3f", "#003333", "#002222", "#001111")) styleGaugeText(shieldGauge, 12) - wireGaugeUpdate(shieldGauge, "SHIPSHIELD", "SHIPMAXSHIELD", "sh") + wireGaugeUpdate(shieldGauge, "Ship.Info.shield", "Ship.Info.maxShield", "sh") -- Piloting indicator @@ -274,9 +285,8 @@ function lotj.infoPanel.createSpaceStats(container) width=16, height=16 }, pilotBoxCont) - registerAnonymousEventHandler("msdp.PILOTING", function() - local piloting = tonumber(msdp.PILOTING or "0") - if piloting == 1 then + registerAnonymousEventHandler("gmcp.Ship.Base.piloting", function() + if gmcp.Ship.Base.piloting then pilotBox:setStyleSheet("background-color: #29efef; border: 2px solid #eeeeee;") else pilotBox:setStyleSheet("background-color: #073f3f; border: 2px solid #eeeeee;") @@ -290,28 +300,25 @@ function lotj.infoPanel.createSpaceStats(container) }, container) local function updateSpeed() - local speed = tonumber(msdp.SHIPSPEED or "0") - local maxSpeed = tonumber(msdp.SHIPMAXSPEED or "0") + local speed = gmcp.Ship.Base.speed or 0 + local maxSpeed = gmcp.Ship.Base.maxSpeed or 0 speedGauge:echo("Sp: "..speed.."/"..maxSpeed, nil, "l12") end - registerAnonymousEventHandler("msdp.SHIPSPEED", updateSpeed) - registerAnonymousEventHandler("msdp.SHIPMAXSPEED", updateSpeed) - + registerAnonymousEventHandler("gmcp.Ship.Base", updateSpeed) + local coordsInfo = Geyser.Label:new({ x="35%", y=32, width="40%", height=24, }, container) local function updateCoords() - local shipX = tonumber(msdp.SHIPSYSX or "0") - local shipY = tonumber(msdp.SHIPSYSY or "0") - local shipZ = tonumber(msdp.SHIPSYSZ or "0") + local shipX = gmcp.Ship.Base.posX or 0 + local shipY = gmcp.Ship.Base.posY or 0 + local shipZ = gmcp.Ship.Base.posZ or 0 coordsInfo:echo("Coords: "..shipX.." "..shipY.." "..shipZ, nil, "l12") end - registerAnonymousEventHandler("msdp.SHIPSYSX", updateCoords) - registerAnonymousEventHandler("msdp.SHIPSYSY", updateCoords) - registerAnonymousEventHandler("msdp.SHIPSYSZ", updateCoords) + registerAnonymousEventHandler("gmcp.Ship.Base", updateCoords) lotj.infoPanel.spaceTickCounter = Geyser.Label:new({ x="77%", y=6, diff --git a/src/scripts/mapper/mapper.lua b/src/scripts/mapper/mapper.lua index c6dd3df..9f6e125 100644 --- a/src/scripts/mapper/mapper.lua +++ b/src/scripts/mapper/mapper.lua @@ -94,7 +94,7 @@ function lotj.mapper.printMainMenu() lotj.mapper.log("Mapper Introduction and Status") cecho([[ -The LOTJ Mapper plugin tracks movement using MSDP variables. To begin, try map start . +The LOTJ Mapper plugin tracks movement using GMCP variables. To begin, try map start . Once mapping is started, move slowly between rooms to map them. Moving too quickly will cause the mapper to skip rooms. You should wait for the map to reflect your movements before moving again whenever you are in mapping mode. @@ -282,7 +282,7 @@ registerAnonymousEventHandler("lotjUICreated", function() end registerAnonymousEventHandler("sysDataSendRequest", "lotj.mapper.handleSentCommand") - registerAnonymousEventHandler("msdp.ROOMVNUM", "lotj.mapper.onEnterRoom") + registerAnonymousEventHandler("gmcp.Room.Info.vnum", "lotj.mapper.onEnterRoom") end) @@ -444,7 +444,7 @@ function lotj.mapper.checkAmenityLine(roomName, amenityName, wasPending) if addAmenityRoom == nil then -- The room name we're triggering on might be the room we just entered but we haven't - -- received the MSDP event yet, so we'll store this for the next time we do. + -- received the GMCP event yet, so we'll store this for the next time we do. lotj.mapper.pendingAmenity = { roomName = roomName, amenityName = amenityName, @@ -463,14 +463,10 @@ function lotj.mapper.onEnterRoom() if lotj.mapper.current ~= nil then lotj.mapper.last = lotj.mapper.current end - local exits = {} - if msdp.ROOMEXITS ~= "" then - exits = msdp.ROOMEXITS - end lotj.mapper.current = { - vnum = tonumber(msdp.ROOMVNUM), - name = string.gsub(msdp.ROOMNAME, "&.", ""), - exits = exits, + vnum = gmcp.Room.Info.vnum, + name = gmcp.Room.Info.name:gsub("&.", ""), + exits = gmcp.Room.Info.exits or {}, } lotj.mapper.processCurrentRoom() diff --git a/src/scripts/msdp/msdp.lua b/src/scripts/msdp/msdp.lua deleted file mode 100644 index 119b892..0000000 --- a/src/scripts/msdp/msdp.lua +++ /dev/null @@ -1,45 +0,0 @@ -registerAnonymousEventHandler("sysLoadEvent", function() - registerAnonymousEventHandler("msdp.COMMANDS", function() - local msdpVars = {} - - table.insert(msdpVars, "HEALTH") - table.insert(msdpVars, "HEALTHMAX") - table.insert(msdpVars, "WIMPY") - table.insert(msdpVars, "MOVEMENT") - table.insert(msdpVars, "MOVEMENTMAX") - table.insert(msdpVars, "MANA") - table.insert(msdpVars, "MANAMAX") - - table.insert(msdpVars, "OPPONENTNAME") - table.insert(msdpVars, "OPPONENTHEALTH") - table.insert(msdpVars, "OPPONENTHEALTHMAX") - - table.insert(msdpVars, "COMMCHANNEL") - table.insert(msdpVars, "COMMENCRYPT") - table.insert(msdpVars, "OOCLIMIT") - - table.insert(msdpVars, "ROOMNAME") - table.insert(msdpVars, "ROOMEXITS") - table.insert(msdpVars, "ROOMVNUM") - - table.insert(msdpVars, "PILOTING") - table.insert(msdpVars, "SHIPSPEED") - table.insert(msdpVars, "SHIPMAXSPEED") - table.insert(msdpVars, "SHIPHULL") - table.insert(msdpVars, "SHIPMAXHULL") - table.insert(msdpVars, "SHIPSHIELD") - table.insert(msdpVars, "SHIPMAXSHIELD") - table.insert(msdpVars, "SHIPENERGY") - table.insert(msdpVars, "SHIPMAXENERGY") - table.insert(msdpVars, "SHIPSYSX") - table.insert(msdpVars, "SHIPSYSY") - table.insert(msdpVars, "SHIPSYSZ") - table.insert(msdpVars, "SHIPGALX") - table.insert(msdpVars, "SHIPGALY") - table.insert(msdpVars, "SHIPSYSNAME") - - for _, varName in ipairs(msdpVars) do - sendMSDP("REPORT", varName) - end - end) -end) diff --git a/src/scripts/msdp/scripts.json b/src/scripts/msdp/scripts.json deleted file mode 100644 index 58ff966..0000000 --- a/src/scripts/msdp/scripts.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { - "name": "msdp" - } -] diff --git a/src/scripts/system-map/system-map.lua b/src/scripts/system-map/system-map.lua index bb304af..a20a5ba 100644 --- a/src/scripts/system-map/system-map.lua +++ b/src/scripts/system-map/system-map.lua @@ -90,9 +90,7 @@ registerAnonymousEventHandler("lotjUICreated", function() positionRangeCircle() registerAnonymousEventHandler("sysWindowResizeEvent", positionRangeCircle) - registerAnonymousEventHandler("msdp.SHIPSYSX", "lotj.systemMap.drawMap") - registerAnonymousEventHandler("msdp.SHIPSYSY", "lotj.systemMap.drawMap") - registerAnonymousEventHandler("msdp.SHIPSYSZ", "lotj.systemMap.drawMap") + registerAnonymousEventHandler("gmcp.Ship.Base", "lotj.systemMap.drawMap") end) function lotj.systemMap.resetItems() @@ -115,13 +113,13 @@ function lotj.systemMap.drawMap() end -- We use ship max speed as a proxy for "do we have ship data at all" - if tonumber(msdp.SHIPMAXSPEED or "0") == 0 then + if gmcp.Ship.Base.maxSpeed == nil then return end - local shipX = tonumber(msdp.SHIPSYSX or "0") - local shipY = tonumber(msdp.SHIPSYSY or "0") - local shipZ = tonumber(msdp.SHIPSYSZ or "0") + local shipX = gmcp.Ship.Base.posX + local shipY = gmcp.Ship.Base.posY + local shipZ = gmcp.Ship.Base.posZ local selfData = {name="You", x=shipX, y=shipY, z=shipZ} local itemsToDraw = {}