Classes

Concepts

Libraries

advertisement »

ambientSounds »

bitser »

contentPoints »

eventBoxText »

factValidity »

frameBuffer »

officeBuildingInserter »

priorityRenderer »

randomEvents »

scaling »

spritesheetParser »

statusIcons »

test3 »

util »

Objects

registerNew

Description

Register a new developer action.

Arguments

1 table data

the data.

2 string inherit

optional. Another developerAction to inherit.

Example

--taken from game/developer/actions.lua


local useWaterDispenser = {}
useWaterDispenser.id = "use_water_dispenser"
useWaterDispenser.targetObjectClass = "water_dispenser"
useWaterDispenser.interactTime = 1
useWaterDispenser.validObjects = {}

function useWaterDispenser:reset()
	table.clearArray(self.validObjects)
	self.done = false
end

function useWaterDispenser:init(target)
	self.employee = target
	self.done = false
	
	events:addFunctionReceiver(self, useWaterDispenser.handleObjectSell, studio.expansion.EVENTS.REMOVED_OBJECT)
end

function useWaterDispenser:finish()
	useWaterDispenser.baseClass.finish(self)
	
	self:removeEventHandler()
end

function useWaterDispenser:removeEventHandler()
	events:removeFunctionReceiver(self, studio.expansion.EVENTS.REMOVED_OBJECT)
end

function useWaterDispenser:handleObjectSell(object)
	if object == self.targetObject then
		self.employee:abortCurrentAction()
	end
end

function useWaterDispenser:isEligible(officeObject)	
	table.clearArray(self.validObjects)
	local list = officeObject:getObjectsByClass(self.targetObjectClass)
	
	if list then
		for key, object in ipairs(list) do
			if object:isPartOfValidRoom() and object:isValidForInteraction() and not object:getInteractionTarget() then
				self.validObjects[#self.validObjects + 1] = object
			end
		end
	end

	return #self.validObjects > 0
end

function useWaterDispenser:canPick(target)
	return target:isThirsty()
end

function useWaterDispenser:begin(target)
	local randomIndex = math.random(1, #self.validObjects)
	local randomObject = self.validObjects[randomIndex]
	
	self.employee = target
	self.employeeAvatar = target:getAvatar()
	self.targetObject = randomObject
	randomObject:setInteractionTarget(target)
	
	table.clearArray(self.validObjects)
end

function useWaterDispenser:isDone()
	return self.done
end

function useWaterDispenser:abort(target)
	useWaterDispenser.baseClass.abort(self, target)
	
	self.employee:setWalkPath(nil)
	self.employee = nil
	self.targetObject:setInteractionTarget(nil)
	self.targetObject = nil
	
	self:removeEventHandler()
end

function useWaterDispenser:onPathInvalidated()
	return self.targetObject:isValidForInteraction() -- make sure the object is still valid for interaction

end

function useWaterDispenser:update(dt)
	if not self.path then
		local path, result = studio:getPathToObjectEntrance(self.employee, self.targetObject)
		-- if result is nil it means it's not yet done trying to find a path, if it's false it means it failed

		
		if result == false then -- pathfinding failed, don't do anything

			self.done = true
			self:abort()
		elseif result == true then
			self.path = path -- we got a path, apply it to the employee and let him do the rest

			self.employee:setWalkPath(path)
		end
	else		
		if not self.employee:getWalkPath() and not self.employee.requiresPathRecomputation then
			if not self.facing then
				self.facing = true
				self.employee:faceObject(self.targetObject)
			else
				if self.employee:getAvatar():isAnimQueueEmpty() then
					self.path = nil
					self.done = true -- the employee has walked up to the toilet and taken a piss, end here

					self.targetObject:setInteractionTarget(nil)
				end
			end
		end
	end
end

developerActions.registerNew(useWaterDispenser)