The Scorpio Project is used to build an addon platform for World of Warcraft.
It's designed based on the PLoop, although the Lib is created based on the OOP system, it provided a pure functional programming style to easy the addon development.
The Scorpio provides several features to simple and power the addons:
A declarative functional programming style to register and handle the system events, secure hooks and slash commands.
-- Use a Scorpio Module to change the code environment
-- so the declarative functional style can be used
Scorpio "Test" ""
-- Register UNIT_SPELLCAST_START system event and bind its handler
__SystemEvent__()
function UNIT_SPELLCAST_START(unit, spell)
print(unit .. " cast " .. spell)
end
A full addon life-cycle management. Addons can split their features into several modules for management.
-- Addon Module can have sub-modules, the sub-modules can share all global variables defined in its parent module
Scorpio "Test.SubModule" ""
-- Triggered when the addon(module) and it's saved variables is loaded
function OnLoad()
end
-- Triggered when the addon(module) is enabled or player logined, so all player data can be accessed
function OnEnable()
end
-- Triggered when player specialization changed or player logined, we can check the player's specialization
function OnSpecChanged(spec)
end
-- Triggered when the addon(module) is disabled, normally no use, the module will disable its event handlers
-- when it's disabled.
function OnDisable()
end
-- Triggered when the player logout, we can modify the saved variables for the last time
function OnQuit()
end
An asynchronous framework to avoid the using of callbacks, and have all the asynchronous tasks controlled under a task schedule system, so the FPS will be smooth and almost no dropping caused by the Lua codes.
Scorpio "Test" ""
-- So the endless task will be started when player logined
__Async__()
function OnEnable()
local count = 0
while true do
-- Delay the code execution for 10s, only works in
-- function with `__Async__` declaration
Delay(10)
count = count + 10
print("you have played for " .. count .. " sec")
end
end
A new UI & Skin system, It'll split the functionality and display of the widgets, so we can create functionality UIs in one addons, and let's other authors do the skin parts very easily.
Scorpio "Test" ""
Style[UIParent] = {
-- Here a fontstring will be created on the center of the screen
-- widget like Label are property child, they can be released and re-used
-- Change the code to `Label = NIL`, it'll be released and waiting for the next usage
-- So we don't need create those ui elements in the core logic, it's just a skin settings
-- We'll see more in the observable introduction
Label = {
location = { Anchor("CENTER") },
-- Bind the label's text to observe the player's unit health
-- Need lose some hp to trigger the UNIT_HEALTH event
text = Wow.FromEvent("UNIT_HEALTH") -- An observable generate from the UNIT_HEALTH event
:MatchUnit("player") -- A filter operation that only allow player
:Map(UnitHealth), -- A map operation that change the unit -> health
}
}
A well designed secure template framework, so we can enjoy the power of the secure template system provided by the blizzard and stay away the hard part.
You can find the documents in Scorpio Documents