Scripting

From Domdaria Wiki
Jump to: navigation, search

Text formatting options[edit | edit source]

The text formatting option is denoted after the ':' in the variable reference in the text. For instance "{0:Names} kick{0:s} {1} in the head". The formatting options in that string are: Names, s and no formatting option.

All formatting options starting with an uppercase will result in an uppercase string. All examples are written with

  • name → you, 'name of character' (same as no formatting option)
  • name's → your, Afara's
  • s → s, 'nothing'
  • he → you, he, she, it
  • his → your, his, her or its
  • him → you, him, her, it
  • was → were, was
  • is → are, is
  • has → have, has
  • does → do, does
  • doesn't → don't doesn't
  • es → es, 'nothing'
  • ies → y, ies
  • sir → lady, sir
  • himself → yourself, himself, herself, itself
  • hisown → your own, his own, her own, its own

Text colors[edit | edit source]

  • $Em$ → Normal text. Colored text. Normal text.
  • $Damage$ → Normal text. Colored text. Normal text.
  • $Heal$ → Normal text. Colored text. Normal text.
  • $Poison$ → Same as $Heal$?
  • $Fire$ → Normal text. Colored text. Normal text.

Scripting examples[edit | edit source]

Prevent leaving[edit | edit source]

room.RoomEvents[RoomEvent.CreatureLeaving] = function(ev)
    if ev.Exit.Direction == "small cave" then
        ev.Canceled = true
        room:Write('{0:Name} tried to enter a small cave but {0:was} blocked by a magical barrier.', ev.Creature)
    end
end

Scripted object interaction[edit | edit source]

-- Find a trapdoor behind the stall when searching section
room.RoomEvents[RoomEvent.CreatureObjectInteraction] = function (ev)
    if ev.Verb == 'Search' and ev.Object.Name:Contains('section in the back') then
        -- Make sure the search message is not shown
        ev.Handled = true

        -- Print search message
        room:Write("{0:Name} search{0:es} a section in the back...", ev.Creature)
        -- Open the trapdoor and print mesage         room.Exits.down:Open()         room:Write("A trapdoor was found under a layer of dust!");     end end

Complete quest objective[edit | edit source]

local littleKid = 'b3cec951-83c0-41df-8209-8f0f9f088826'

npc.RoomEvents[RoomEvent.CreatureEntered] = function(ev) 
	if ev.Creature.Id == littleKid then
		npc.Room:Write("{0:Name} starts crying and hugs {1} intensively", npc, ev.Creature)
		npc:SayTo(ev.Creature.FollowTarget, "Thank you! My hero!")
		
		local leader = ev.Creature.FollowTarget
		ev.Creature:StopFollowing()
		leader.Quests['e8037651-5218-45e4-ae2a-6ca663faf758']?.Objectives['974d91fa-779f-4c41-af71-b88140261343']?.Complete()
		
		server:ScheduleTask(function()
			npc.Room:Write("{0:Name} walks home with her kid", npc)
			npc:Despawn()
			ev.Creature:Despawn()
		end, 5000)
	end
end

Transfer creature on room enter[edit | edit source]

-- Player Slips or Slips and Falls in the Large Pool!
function HandleCreatureEnteredRoom (ev) 
   local roll = math.random()
   if roll < 0.2 then
       room:Write("{0:Name} slip{0:s} but regain{0:s} {0:his} balance quickly!", ev.Creature)
   elseif roll < 0.5 then
       room:Write("$Damage${0:Name} slip{0:s} falling into murky pool below!$$", ev.Creature)
       ev.Creature:Move(server:GetRoom("sewers1.73"))
       ev.Creature:Paralyze(2000)
   end
end

room.CreatureEntered:Add(HandleCreatureEnteredRoom)

Paralyze creature on room enter[edit | edit source]

-- Here's one with three possible outcomes:
-- Player Slips, Gets Splashed or Falls In!
function HandleCreatureEnteredRoom (ev) 
   local roll = math.random()
   if roll < 0.3 then
       room:Write("{0:Name} slip{0:s} but regain{0:s} {0:his} balance quickly!", ev.Creature)
   elseif roll < 0.3 then
       room:Write("{0:Name} slip{0:s} and get{0:s} splashed in {0:his} face with nasty water!", ev.Creature)
   elseif roll < 0.4 then
       room:Write("{0:Name} slip{0:s} and fall{0:s} into the swirling pool of nasty water!", ev.Creature)
       -- Pause the player 2 seconds.
       ev.Creature:Paralyze(2000, {
           Complete = function() 
               room:Write("{0:Name} pull{0:s} {0:himself} out of the water and onto the bulkhead.", ev.Creature)
           end
       })
   end
end

room.CreatureEntered:Add(HandleCreatureEnteredRoom)

Damage creature on enter room[edit | edit source]

-- Here's one where the creature takes damage:
-- Creature Enters, May get Splashed by Boiling Water!
function HandleCreatureEnteredRoom (ev) 
    if math.random() < 0.5 then
        if ev.Creature:CanTakeDamage(ForceType.Fire) then
            damage = 10
            room:WriteDamage("{0:Name} slip{0:s}, sliding right under the scalding hot water for {1} damage!", ev.Creature, damage)
            ev.Creature:TakeDamage(damage, ForceType.Fire)
        elseif math.random() < 0.9 then
            room:Write("{0:Name} slip{0:s}, barely avoiding the scalding hot water!", ev.Creature)
        end
    end
end

room.CreatureEntered:Add(HandleCreatureEnteredRoom)

Searching a Room Object to Reveal an Exit[edit | edit source]

--find a hole in the wall
function HandleCreatureObjectInteraction (ev)
   if ev.Verb == "Search" and ev.Object.Name:Contains('trash') then
   	ev.Handled = true
       room:Write("{0:Name} search{0:es} the pile of trash...", ev.Creature)
       
       ev.Creature:Paralyze(1500, {
           Complete = function() 
               if ev.Creature:RollSkillBinary(CreatureAttribute.SearchSkill, 3, 0.75) then
           		-- Opens the door to the west
                   room.Exits.west:Open()
                   room:Write("A large hole has been found behind the trash in the western wall!");
                   
               else
                   local ran = math.random(0, 3)
                   if ran == 0 then
                       room:Write("{0:Name} find{0:s} nothing but manure.", ev.Creature)
                   elseif ran == 1 then
                       room:Write("{0:Name} pull{0:s} out a piece of something disgusting.", ev.Creature)
                   else
                       room:Write("{0:Names} hand get{0:s} bitten by something!", ev.Creature)
                       if ev.Creature:CanTakeDamage() then
                           ev.Creature:TakeDamage(5)
                       end
                   end
               end
           end
       })         
    end
end

room.CreatureObjectInteraction:Add(HandleCreatureObjectInteraction)


Creature Searches Object and is Trapped[edit | edit source]

-- Search Treasures to Find a Very Rare Item OR Get Trapped!
function LockRoom (ev)
   if ev.Verb == "Search" and ev.Object.Name:Contains('treasures') then
       ev.Handled = true
       room:Write("{0:Name} search{0:es} the many treasures...", ev.Creature)
       
       if (not ev.Creature:HasItem('0818e982-cca4-4c61-9162-2b0f48f9e433')) and 
       	ev.Creature:RollSkillBinary(CreatureAttribute.SearchSkill, 3, 0.7) then
           local key = ev.Creature.SpawnItem('0818e982-cca4-4c61-9162-2b0f48f9e433')
           room:Write('{0:Name} search{0:es} {1} and find{0:s} {2}!', ev.Creature, ev.Object, key)
       else
           local ran = math.random(0, 1)
           if ran == 0 then
               room:Write("{0:Name} can't decide on what {0:he} want{0:s}...", ev.Creature)
               
           else
               room:Write("{0:Name} grab{0:s} a suspicious golden idol -- **CLiCK**", ev.Creature)
               -- script waits 2 sec
               server:ScheduleTask(function()
                   room:Write("A series of clicks and pulleys are heard around the room... IT's A TRAP!", ev.Creature)
                   
                   -- script waits 1 sec                    
                   server:ScheduleTask(function()
                       room:Write("Suddenly a solid metal slab falls over the hole in the wall and automatically locks with heavy bolts!", evCreature)
                       -- remove or lock the exit east.   Player will have to wait for someone to help them or recall.
                       -- This will simulate a death trap.  But really, it will force the player to socialize with SOMEONE, or to heed the advice
                       -- (I'll have a warning to keep a scroll of recall with you, to low level players going in.)
                       room.Exits.east:Lock()
                   end, 1000)
               end, 2000)
           end
       end
   end
end

room.CreatureObjectInteraction:Add(LockRoom)

Searching a Room Object for a Quest Item[edit | edit source]

-- Searching the Dead Body
local lastSearch = server.Now
function HandleCreatureObjectInteraction (ev)
if ev.Verb == "Search" and ev.Object.Name:Contains('body') then
    ev.Handled = true
    room:Write("{0:Name} search{0:es} a dead body...", ev.Creature)
       

-- NOT IMPLEMENTED: check if player has quest and finished quest: f49b76d5-434f-4d6f-811d-3af8403a9250 if lastSearch:AddSeconds(10) > server.Now then room:Write("{0:Name} can't find anything, as if it's already been picked clean.", ev.Creature)

elseif (not ev.Creature:HasItem('0818e982-cca4-4c61-9162-2b0f48f9e433')) and ev.Creature:RollSkillBinary(CreatureAttribute.SearchSkill, 3, 0.75) then lastSearch = server.Now

local key = ev.Creature:SpawnItem('0818e982-cca4-4c61-9162-2b0f48f9e433') room:Write('{0:Name} search{0:es} {1} and find{0:s} {2}!', ev.Creature, ev.Object, key)

else lastSearch = server.Now

     		local ran = math.random(0, 3)
           if ran == 0 then
               room:Write("{0:Name} STOP{0:s} as the skull falls off, and rolls away!", ev.Creature)
               
           elseif ran == 1 then
               room:Write("{0:Name} pull{0:s} out a hand covered in rancid goo.", ev.Creature)
               
           elseif ran == 2 then
               room:Write("{0:Names} hand get{0:s} bitten by something!", ev.Creature)
               if ev.Creature:CanTakeDamage() then
                   ev.Creature:TakeDamage(5)
               end
               
           else
               room:Write("{0:Name} pull{0:s} {0:his} hand back in shock!", ev.Creature)
               -- small rat
               room:Spawn("309d0cf8-5963-4db1-9e9e-d86b288cfb1f"):Attack(ev.Creature)
           end
       end
   end
end

room.CreatureObjectInteraction:Add(HandleCreatureObjectInteraction)


Searching Multiple Room Objects in a Whole Zone[edit | edit source]

-- Rat's Nest Zone Script (in room)
room.CreatureObjectInteraction:Add(room.Zone.Share.CreateRatNestHandler(room))

--Zone Script!
zone.Share.CreateRatNestHandler = function(room)
   local lastSearch = server.Now
   
   return function(ev)
       if ev.Verb == "Search" and ev.Object.Name:Contains('rat') then
       	ev.Handled = true
           room:Write("{0:Name} search{0:es} the trashy rat's nest...", ev.Creature)
           
           if lastSearch:AddSeconds(10) > server.Now then
               room:Write("{0:Name} end{0:s} up empty handed as someone just searched this pile of trash...", ev.Creature)    
               
           else
               lastSearch = server.Now
             	local ran = math.random(0, 5)
               if ran == 0 then
                   room:Write("{0:Name} find{0:s} a wad of slimy gunk.", ev.Creature)
               elseif ran == 1 then
                   room:Write("{0:Name} pull{0:s} out a holy boot.", ev.Creature)
               elseif ran == 2 then
                   room:Write("{0:Names} hand get{0:s} bitten by something!", ev.Creature)
                   if ev.Creature:CanTakeDamage() then
                       ev.Creature:TakeDamage(5)
                   end
               elseif ran == 3 then
                   room:Write("{0:Name} pull{0:s} {0:his} hand back in surprise!", ev.Creature)
                   -- small rat
                   room:Spawn("309d0cf8-5963-4db1-9e9e-d86b288cfb1f"):Attack(ev.Creature)
               else
                   room:Write("{0:Name} pull{0:s} {0:his} hand back in shock!", ev.Creature)
                   -- mama rat
                   room:Spawn("9e10185a-596d-448c-878e-055898498f46"):Attack(ev.Creature)
                   -- small rats
                   room:Spawn("309d0cf8-5963-4db1-9e9e-d86b288cfb1f"):Attack(ev.Creature)
                   room:Spawn("309d0cf8-5963-4db1-9e9e-d86b288cfb1f"):Attack(ev.Creature)
               end
           end            
       end
   end
end

Spawn additional enemies at 50% health[edit | edit source]

local npcSpawnBlocked = false
function HandleCreatureHealthChanged(ev)
  if not npcSpawnBlocked and npc.HealthRatio < 0.5 then
    npc.Room:Write("{0:Name} yells, 'GUARDS! GUARDS!'", npc)
  
    for crea in iter(npc.Room.Creatures) do      
      if crea.IsPlayer then
        local spawnedCreature = npc.Room:Spawn("gobnest-goblin-guard")
        npc.Room:Write("{0:Name} comes to rescue his king", spawnedCreature)
        spawnedCreature:Attack(crea)
      end
    end
    
    npc.Room:Write("{0:Name} says, 'KILL THEM! BIG PAIN!'", npc)
    
    npcSpawnBlocked = true
  elseif npc.HealthRatio > 0.99 then
    npcSpawnBlocked = false
  end
end

npc.Events[Event.HealthChanged] = HandleCreatureHealthChanged