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.
- Check the Aim for nameplates, use its defaultskin.lua can simply change all the skins.
- Check the AshToAsh for raid panel, it can smoothly relayout during combat.
- Check the ShadowDancer for action bars, it provide all your need for the action bars, also with special features.
- Check the BagView for containers.
You can find the documents in Scorpio Documents