dinsdag 25 maart 2008

een nieuwe andere Taal

Een paar maanden geleden heb ik een Ajax .Net cursus gegeven. De javascript omgeving die daar bij hoort is voor mij redelijk nieuw. Het leren van de javascript omgeving was redelijk eenvoudig.

De afgelopen maand heb ik een cursus Flex gegeven. Een ontwikkel omgeving van Adobe die met gebruik van flash het mogelijk maakt om makkelijk een UI te maken en te gebruiken in de browser omgeving (flex library als componenten flash als runtime en actionscript/javascript als code). Hierover volgt als tijd het toestaat binnenkort nog een blog. Het is best raar om in een managed omgeving te werken zonder daar 'alles' van te weten zoals ik met de .Net omgeving werk.

Na het oppakken van 2 nieuwe talen was ik wel weer toe aan een nieuwe uitdaging.
Ik speel zelf graag world of warcraft en speel daarin een hunter. Een hunter loopt samen met zijn 'pet' (meestal krijgen ze een naam) door de wereld om daar allerlei avonturen te beleven.

Het leven van een pet is redelijk eenvoudig, ze zeggen nooit iets en laten alleen af en toe merken dat ze minder blij zijn. Als je ze vervolgens wat te eten geven worden ze weer blijer en doe ze ook meer schade aan monsters om hun heen.

Om een 'pet' wat meer leven te geven bestaat er een wow-addon. De wow engine draait custom script code die allerlei eenvoudige akties kan uitvoeren (niets 'complex' omdat je dan makkelijk een wow-hack kan maken). Een van de akties die een wow addon mag uitvoeren zijn het vertellen van berichtjes nav een aktie in de wereld.

Een mede add-on bouwer heeft een addon geschreven die als je je 'Pet' voerd laat merken dat hij blij is met het eten. Zelf heb ik deze addon uitgebreid met functionaliteit om de pet meer te laten zeggen. Als de pet een tegenstander mist laat hij blijken dat hij dat verveldn vind en als ik in gevecht ben wilt mijn pet mij helpen mijn target te vermoorden.

De taal waar de add-ons in geschreven zijn heet Lua en is een scripting taal. Het herladen van een add-on kan met het commando /reloadui.

Een voorbeeld stukje Lua:
bestand PetEmote.lua:
function PetEmote_OnLoad ()
this:RegisterEvent("UNIT_HAPPINESS");
this:RegisterEvent("CHAT_MSG_SPELL_TRADESKILLS");
this:RegisterEvent("CHAT_MSG_COMBAT_PET_MISSES");
end
--dit is commentaar
--deze functie word aangeroepen bij elk event
--waarschijnnlijk worden meerdere events in een function call verwerkt dus daarom geen if else
function PetEmote_OnEvent()
if (event == "UNIT_HAPPINESS") then
PetEmote_HappinessChanged();
end
if (event == "CHAT_MSG_SPELL_TRADESKILLS") then
MarsMessageParser_ParseMessage("PetEmote", arg1);
end
if(event == "") then
end
if(event == "CHAT_MSG_COMBAT_PET_MISSES") then
--do not spam messages every event
if(random(1,5) > 2) then
if (PetEmote_HasPet()) then
PetEmote_Miss();
end
end
end
end

-this function is called on pet miss
--this function is abused to force random emotes other then misses
function PetEmote_Miss()
local arandom = random(1, 6);
--PetEmote_DoEmote(arandom);
local missEmotes = getn(PetEmote_MissMessages["default"]);
--PetEmote_DoEmote(missEmotes);
local randomEmote = random(1 , missEmotes);
--PetEmote_DoEmote(randomEmote);

local pName = UnitName("player");
local pTarget = UnitName("target");
local petTarget = UnitName("pettarget");

local emptyMessage = PetEmote_MissMessages["default"][randomEmote];
local replacedEmote = "";

--if we dont have any targets
if( pName ~= nil and pTarget ~= nil and petTarget ~= nil) then
replacedEmote = gsub(emptyMessage, "$n", pName);
replacedEmote = gsub(replacedEmote, "$t", pTarget);
replacedEmote = gsub(replacedEmote, "$x", petTarget);
end
if( pName ~= nil and pTarget ~= nil and petTarget ~= nil) then
PetEmote_DoEmote(replacedEmote);
end
end

bestand localization.lua

PetEmote_MissMessages={
["default"] = {
"is sad he missed",
"growls at missing his target",
"hits the empty air",
"looks at $n for some help",
"wants to hit $t very hard",
"wants to help $n kill $t",
},
["Debug"] = {
"looks at $n for some help",
"wants to hit $x very hard",
"wants to help $n kill $t",
},
-- ["Bat"] = {},
}
addon definitie bestand Petemote.xml
span style="font-style:italic;">Script file="MarsMessageParser.lua"/
Script file="PetEmote.lua"/>
Frame name="PetEmote" parent="UIParent" hidden="false">
Scripts>
OnLoad> PetEmote_OnLoad();
OnEvent> PetEmote_OnEvent();
/Scripts>
/Frame>
/Ui>


Het leuke aan deze taal is dat er een VS.2005 plug in voor is met syntax highlighting auto complete en een gedeeltelijke intellisense.
www.codeplex.com/WarcraftAddOnStudio

Geen opmerkingen: