Professional Documents
Culture Documents
Kevin Heis
June 2010
Heis, Muziko Kreito Universo: Project Documentation, 2
Muziko Kreito Universo, a project prepared by Kevin Heis in partial fulfillment of the
requirements for the Master of Music degree in the School of Music and Dance. This
terminal project has been approved and accepted by:
___________________________________________________________________________
Dr. Jeffrey Stolet
Chair of the Examining Committee
___________________________________________________________________________
Date
Committee in Charge:
Dr. Jeffrey Stolet, Chair
Ying Tan
Craig Hickman
Robert Ponto
Dr. Steve Vacchi
Accepted by:
___________________________________________________________________________
Dr. Ann B. Tedards
Associate Dean and Director of Graduate Studies, School of Music and Dance
Heis, Muziko Kreito Universo: Project Documentation, 3
Thanks
Committee
Dr. Jeffrey Stolet, Professor of Music Technology, Advisor
Professor Ying Tan, Associate Professor of Digital Art
Professor Craig Hickman, Professor of Digital Art
Professor Robert Ponto, Associate Professor of Conducting
Dr. Steve Vacchi, Associate Professor of Bassoon
Colleagues
Jenifer Jaseau
Simon Hutchinson
Chi Wang
Clay Kent
Jon Bellona
Loren Mohler
Kevin Drake
Tammy Coles
Technology
The Cycling '74 team
The developers of Cosm at the University of California, Santa Barbara
Heis, Muziko Kreito Universo: Project Documentation, 5
Table of Contents
Abstract 6
Concept 6
Technology 6
In conjunction 6
Textual Description 7
State Machine Diagram 11
Source code 12
Max patches 13
Lua source code 18
File: mku.lua 18
File: universal.lua 19
File: tween_delay.lua 22
File: color.lua 23
File: flicker.lua 24
File: bolts.lua 24
File: kreito.lua 25
File: kreito_template.lua 34
File: radiuso.lua 35
File: flugilo.lua 37
File: konko.lua 40
File: streko.lua 43
File: drivo.lua 45
File: mku_c74.txt 49
Heis, Muziko Kreito Universo: Project Documentation, 6
Abstract
Concept
Muziko Kreito Universo is a three-dimensional visual and ambisonic sound installation. The
participants act as gods influencing the environment as the creatures strive for auditory
greatness. The work explores themes of creation and destruction, of power and servitude,
and of the role of humans in an environment with other beings, as well as the fundamental
Technology
The primary technologies used in Muziko Kreito Universo are:
In conjunction
A video demonstration can be found at:
http://kevinheis.net/mku/
Textual Description
Muziko Kreito Universo is an original audiovisual interactive work based on concepts
creatures. These musical creatures live full life cycles as they strive for auditory greatness.
A human acts as a god to the musical creatures by influencing various aspects of the
ambisonic universe. Muziko Kreito Universo works with ideas of creation and destruction,
power and servitude, the role of humans in an environment with other beings, and the
The audiovisual interactive work is inspired by video games, real world animals, and
scholarly and artistic works. Some of the influential video games include Flow, The Sims,
Osmos, Elektroplankton, Spore, and Black and White. The models and animations of the
creatures are based on deep sea creatures, as seen in Planet Earth and The Deep. Some of
the scholarly influences include Visual Space Music by mememamo, Marc Downie's work on
intelligent music characters at MIT, and works using the Cosm framework from UC, Santa
Barbara.
Muziko Kreito Universo is built out of a combination of software and human user
environment, Cosm, a framework for building virtual worlds in Max/MSP/Jitter, the Lua
scripting language, and OpenGL. The user interaction devices are a SpaceNavigator, a six-
degree, three-dimensional mouse, and an iPod Touch running the c74 application.
Heis, Muziko Kreito Universo: Project Documentation, 8
The creatures in the Muziko Kreito Universo environment are driven by state
agent is an entity that makes decisions. Each creature has a state machine. The state
machine is comprised of a set of states. For each state machine in the Muziko Kreito
Universo environment, only one state can be active at a time. Within each state there exists
a set of behaviors. These behaviors include embedded rules that can cause the active state
Each creature has three attributes with which to guide decision-making. The three
attributes are age, health, and energy. At any point in time, each creature is in one of
twelve creature states, which are birth, follow parent, wander, sleep, pursue, play,
procreate, hunt, fight, chase, flee, and death. The three kinds of creature relationships,
parent and children, playmates, and prey and predator, have been formulated in this world.
The creatures move in space by use of steering forces. A steering force is an algorithm for
Muziko Kreito Universo's creatures are represented in the universe both visually and
sonically. The sound system is rendered in real time in ambisonics, an audio methodology
for encoding and decoding multiple audio channels to create a realistic spatialization of
sound producing objects. The ambisonic system uses panning, volume, low-pass filtering,
reverberation, and pitch to spatialize sound producing objects. Each creature type has a set
of sound samples associated with it that change over time. These samples are played back
with changes in rhythm, pitch, volume, and distortion depending on the creature's active
There are five types of creatures in Muziko Kreito Universo. These are named radiuso
(jelly), flugilo (ray), konko (shelled creature), streko (eel), and drivo (drifter). These models
are rendered in OpenGL using simple geometric shapes, like spheres and cones.
Each of these models has a set of animations that are associated with the model.
These animations are move, procreate, sleep, death, flee, and four possible play/fight
animations. The animations are executed by use of tweens, an algorithm that changes a
numeric variable over time. The colors and animations of the creatures represent the
The human participant interacts with these creatures with a SpaceNavigator and an
iPod Touch running the c74 application. The SpaceNavigator provides the end user the
ability to move through the digital universe by rotating, pushing, and pulling on a knob
that can be moved in six directions. The c74 application allows the participant to influence
the creatures' health and energy globally, pause the universe, or return the position of the
participant to the starting position. The influence over health and energy is represented by
a heads-up style display, with colors to represent the strength and type of influence the
The primary challenges of creating Muziko Kreito Universo were the issue of playing
god, the challenge of multiplicity, and working in three visual and sonic dimensions. The
question of playing god is a natural part of creating an artificial intelligent system, and
provokes questions such as 'What is the effect of a god?' The system has been designed to
conceptual and technological. With up to thirty-two creatures in the space, the creatures
Heis, Muziko Kreito Universo: Project Documentation, 10
needed to be simple and obvious in their actions. Finally, the three-dimensional challenges
The work will be installed on Monday, April 19th from 8:30am to 12:30pm in the
University of Oregon School of Music in room 140; Friday, April 30th from 10am to 3pm in
the University of Oregon Erb Memorial Union in the concourse; Saturday, May 1st from 6pm
to 10pm in the University of Oregon School of Music in room 140 as part of the [m] event;
and performed on Saturday, May 8th at the Future Music Oregon concert at 8pm.
Heis, Muziko Kreito Universo: Project Documentation, 11
PROCREATE HUNT
[provoked] FIGHT
Source code
The source code of this document is divided into two sections: Max patches, and Lua
source code.
Heis, Muziko Kreito Universo: Project Documentation, 13
Max patches
Heis, Muziko Kreito Universo: Project Documentation, 14
Heis, Muziko Kreito Universo: Project Documentation, 15
Heis, Muziko Kreito Universo: Project Documentation, 16
Heis, Muziko Kreito Universo: Project Documentation, 17
Heis, Muziko Kreito Universo: Project Documentation, 18
importfile('kreito.lua')
importfile('radiuso.lua')
importfile('flugilo.lua')
importfile('konko.lua')
importfile('streko.lua')
importfile('drivo.lua')
File: universal.lua
u = {}
u.time = 0
u.time_elapse = 0
u.interact_elapse = 0
u.global_health = 0
u.global_energy = 0
u.global_age = 0
u.is_running = 1
u.life_rate = 0.0000024 --life is approximately 4 minutes long
u.slow_rate = 0.000012
u.mid_rate = 0.000024
u.fast_rate = 0.000048
u.stop_rate = 0
u.walk_rate = 0.004
u.run_rate = 0.012
u.pitch_rate = u.mid_rate * 240
u.time_range = 2500
u.lumo_hue = 0
u.lumo_saturation = 0
u.specular_intensity = 0
u.kreitoj = {}
u.kreitoj_count = {}
u.age_to_octave = {4, 2, 1, 1/2, 1/4, 1/8, 1/8, 1/8, 1/8, 1/8}
u.kreito_types = {"radiuso", "flugilo", "konko", "streko", "drivo"}
u.desired_radius = 1
u.slices = 10
u.loc = ""
u.h_pi = math.pi / 2
u.sketch = jit.new("jit.gl.sketch", this.drawto)
u.sketch:reset()
u.sketch.smooth_shading = 1
u.sketch.lighting_enable = 1
u.sketch.blend_enable = 1
u.sketch.auto_material = 0
u.sketch.shininess = 50
u.sketch.blend_mode = {6, 1}
u.sketch:glmatrixmode("modelview")
u.sketch.enable = 1
u.sketch.depth_clear = 1
u.sketch.depth_enable = 1
u.sketch.layer = 9999
u.masterx = 0
u.mastery = 0
u.masterz = 0
u.lookatx = 0
u.lookaty = 0
u.lookatz = 0
function u.createClass (...)
! local function search (k, plist)
! ! for i=1, table.getn(plist) do
! ! ! local v = plist[i][k]
! ! ! if v then return v end
! ! end
! end
! local c = {}
Heis, Muziko Kreito Universo: Project Documentation, 20
! end
! u.lumo_hue = par_h + par_e
! --Calculate color and send it out
! u.lumo_color:hsl2rgb(u.lumo_hue, u.lumo_saturation, u.lumo_light)
! u.send("intensity", intensity)
! u.send("lighting", "light_diffuse", u.lumo_color.r, u.lumo_color.g, u.lumo_color.b)
! u.send("lighting", "light_specular", u.specular_intensity, u.specular_intensity,
! ! u.specular_intensity)
! u.send("lumo_color", "color", u.lumo_color.r, u.lumo_color.g, u.lumo_color.b,
! ! u.lumo_saturation)
end
function u.count_kreitoj ()
! --set the count for all types to zero
! for j in ipairs(u.kreito_types) do
! ! u.kreitoj_count[u.kreito_types[j]] = 0
! end
! --add each kreito to its faction's count
! for j in pairs(u.kreitoj) do
! ! for k in ipairs(u.kreito_types) do
! ! ! if u.kreitoj[j].kreito_type == u.kreito_types[k] then
! ! ! ! local m = u.kreitoj_count[u.kreito_types[k]]
! ! ! ! u.kreitoj_count[u.kreito_types[k]] = m + 1
! ! ! end
! ! end
! end
! --if a faction has no member, make one
! for j in ipairs(u.kreito_types) do
! ! if u.kreitoj_count[u.kreito_types[j]] == 0 then
! ! ! u.genesis(u.kreito_types[j])
! ! end
! end
end
function u.ra()
! return (math.random() * u.world_size * 2 - u.world_size) * 9/10
end
function u.genesis (kind)
! --find an empty slot
! local childnum = nil
! for i = 1, u.max_kreitoj do
! ! if u.kreitoj[i] == nil then
! ! ! childnum = i
! ! ! break
! ! end
! end
! --make a kreito of the correct kind in the empty slot
! if childnum ~= nil then
! ! u.kreitoj[childnum] = u[kind]:new()
! ! local c = u.kreitoj[childnum]
! ! c:setup()
! ! c.name = childnum
! ! c:set_position{u.ra(), u.ra(), u.ra()}
! ! c:set_rotate{90, u.ra(), u.ra(), u.ra()}
! ! c:add_tween{0, 1, 2000, 'linear', 'alpha'}
! end
end
function u.update_resetter ()
! u.interact_elapse = u.interact_elapse + u.time_elapse
! if u.interact_elapse > 20000 then
! ! u.send("reset_controls", 'bang')
! ! u.interact_elapse = 0
! end
! u.send("time_elapse", u.time_elapse)
end
u.color_table = {
! birth = 0,
Heis, Muziko Kreito Universo: Project Documentation, 22
! follow_parent = 60/360,
! wander = 180/360,
! sleep = 240/360,
! pursue = 150/360,
! play = 120/360,
! procreate = 300/360,
! hunt = 20/360,
! fight = 0,
! chase = 0,
! flee = 270/360,
! death = 0
}
u.volume_table = {
! birth = 1/2,
! follow_parent = 1/3,
! wander = 1/3,
! sleep = 1/10,
! pursue = 1/2,
! play = 1,
! procreate = 1,
! hunt = 1/2,
! fight = 1,
! chase = 2/3,
! flee = 1/2,
! death = 1/2
}
File: tween_delay.lua
--tween
tween = {}
function tween:set ( t )
! --[[
! t[1] = begin (int)
! t[2] = end (int)
! t[3] = duration (int)
! t[4] = tween type (string)
! t[5] = super's property (string)
! t[6] = super's final function (string)
! ]]--
! self.begin = t[1]
! self.change = t[2] - t[1]
! self.duration = t[3]
! self.tween_type = t[4]
! self.property = t[5]
! self.final_function = t[6]
! self.start_time = u.time
end
function tween:update ()
! if u.time - self.start_time > self.duration then
! ! if self.final_function ~= nil then
! ! ! self.super[self.final_function](self.super)
! ! end
! ! u.remove(self.super.tweens, self)
! else self[self.tween_type](self)
! end
end
function tween:linear ()
! self.super[self.property] = self.change * (u.time - self.start_time) /
! ! self.duration + self.begin
end
function tween:sine ()
! self.super[self.property] = self.change / 2 * (1 - math.cos(math.pi * (u.time
! ! - self.start_time) / self.duration)) + self.begin
end
Heis, Muziko Kreito Universo: Project Documentation, 23
u.tween = u.createClass(tween)
--delay
delay = {}
function delay:set (t)
! --[[
! t[1] = duration (int)
! t[2] = function (string)
! ]]--
! self.start_time = u.time
! self.duration = t[1]
! self.func = t[2]
end
function delay:update ()
! if u.time - self.start_time > self.duration then
! ! self.super[self.func](self.super)
! ! u.remove(self.super.delays, self)
! end
end
u.delay = u.createClass(delay)
File: color.lua
color = {}
color.r = 0
color.g = 0
color.b = 0
function color:hsl2rgb (h, s, l)
! if s == 0 then
! ! self.r = l
! ! self.g = l
! ! self.b = l
! else
! ! local q
! ! if l < 1/2 then
! ! ! q = l * (1 + s)
! ! else
! ! ! q = l + s - l * s
! ! end
! ! local p = 2 * l - q
! ! self.r = self:hue2rgb (p, q, h + 1/3)
! ! self.g = self:hue2rgb (p, q, h)
! ! self.b = self:hue2rgb (p, q, h - 1/3)
! end
end
function color:hue2rgb (p, q, t)
! while t < 0 do t = t + 1 end
! while t > 1 do t = t - 1 end
! if t < 1/6 then
! ! return p + (q - p) * 6 * t
! elseif t < 1/2 then
! ! return q
! elseif t < 2/3 then
! ! return p + (q - p) * (2/3 - t) * 6
! else
! ! return p
! end
end
color = u.createClass(color)
Heis, Muziko Kreito Universo: Project Documentation, 24
File: flicker.lua
flicker = {}
flicker.rate = 30000
flicker.time = 0
flicker.count = 1
flicker.folders = 10
flicker.set = math.ceil(math.random() * flicker.folders)
flicker.localpath = nil
function flicker:update ()
! self.time = self.time + u.time_elapse
! if self.time > self.rate then
! ! self:flick()
! end
end
flicker.toAl = { 'a', 'b', 'c', 'd', 'e', 'f' }
function flicker:flick ()
! if self.count > #u.kreito_types then
! ! self.count = 1
! ! self.set = math.ceil(math.random() * self.folders)
! end
! if self.localpath ~= nil then
! ! local p = self.localpath.."/"..self.set.."/"..flicker.toAl[self.count]..".aiff"
! ! u.send("buf_"..u.kreito_types[self.count], "read", p)
! end
! self.time = 0
! self.count = self.count + 1
end
File: bolts.lua
u.bolts = {}
function u.bolts:draw ()
! local kposx
! local kposy
! local kposz
! local ox = u.bolts.x
! local oy = u.bolts.y
! local oz = u.bolts.z
! u.bolts.x = (u.masterx - 4 * (u.lookatx - u.masterx) + ox ) / 2
! u.bolts.y = (u.mastery - 4 * (u.lookaty - u.mastery) + oy ) / 2
! u.bolts.z = (u.masterz - 4 * (u.lookatz - u.masterz) + oz ) / 2
! local constant = u.lumo_saturation * .01
! u.sketch:glpushmatrix()
! u.sketch:glcolor(u.lumo_color.r, u.lumo_color.g, u.lumo_color.b, u.lumo_saturation *
! ! math.random() / 2)
! for i in pairs(u.kreitoj) do
! ! if u.kreitoj[i] ~= nil then
! ! ! kposx = u.kreitoj[i].position_x
! ! ! kposy = u.kreitoj[i].position_y
! ! ! kposz = u.kreitoj[i].position_z
! ! ! u.sketch:glbegin("tri_strip")
! ! ! u.sketch:glvertex(u.bolts.x, u.bolts.y+constant, u.bolts.z)
! ! ! u.sketch:glvertex(u.bolts.x, u.bolts.y-constant, u.bolts.z)
! ! ! u.sketch:glvertex(kposx, kposy, kposz)
! ! ! u.sketch:glend()
! ! end
! end
! u.sketch:glpopmatrix()
end
u.bolts.x = 0
u.bolts.y = 0
u.bolts.z = -100
Heis, Muziko Kreito Universo: Project Documentation, 25
File: kreito.lua
kreito = {}
function kreito:setup ()
! --movement parameters
! self.mvmt_hault = 2
! self.mvmt_ease = 7
! self.check_dist = 1
! self.azimuth = 0
! self.elevation = 0
! self.delta_azimuth = 0
! self.delta_elevation = 0
! self.magnitude = 0
! self.max_speed = 0
! self.speed = 0
! self.w_target_x = u.ra()
! self.w_target_y = u.ra()
! self.w_target_z = u.ra()
! self.position_x = 0
! self.position_y = 0
! self.position_z = 0
! self.rotate_r = 0
! self.rotate_x = 0
! self.rotate_y = 0
! self.rotate_z = 0
! --ai parameters
! self.age = 0
! self.health = 1
! self.energy = 1
! self.name = 0
! self.delta_health = 0
! self.delta_energy = 0
! self.current_state = "birth"
! --relationship parameters
! self.prey = nil
! self.predator = nil
! self.parent_self = nil
! self.playmates = {}
! self.children_kreito = {}
! --sound parameters
! self.volume = 1/2
! self.delta_pitch = 0
! self.overdrive = 1
! self.frequency = 0
! self.lasttick = u.time
! self.millis = 0
! self.pulse = 0
! self.pitch = math.random() * 12
! --tween and delay
! self.tweens = {}
! self.delays = {}
! --color variables
! self.hue = u.color_table["follow_parent"]
! self.saturation = 0
! self.light = 1/4
! self.alpha = 0
! self.color = color:new()
! --faction param setup
! self:setup_faction()
! --fade in
! self:add_tween{0, 1, 2000, 'linear', 'alpha'}
end
--movement functions
function kreito:mvmt_stop ()
! self.speed = 0
Heis, Muziko Kreito Universo: Project Documentation, 26
! self.delta_azimuth = 0
! self.delta_elevation = 0
end
function kreito:set_wtarget ()
! self.w_target_x = u.ra()
! self.w_target_y = u.ra()
! self.w_target_z = u.ra()
end
function kreito.wrap90 (n)
! while n > 45 do
! ! n = n - 45
! end
! while n < -45 do
! ! n = n + 45
! end
! return n
end
function kreito:steer (mode, target)
! --figure out the difference vector
! if mode == "flee" then
! ! self.v_x = self.position_x - target.position_x
! ! self.v_y = self.position_y - target.position_y
! ! self.v_z = self.position_z - target.position_z
! elseif mode == "wander" then
! ! self.v_x = self.w_target_x - self.position_x
! ! self.v_y = self.w_target_y - self.position_y
! ! self.v_z = self.w_target_z - self.position_z
! else
! ! self.v_x = target.position_x - self.position_x
! ! self.v_y = target.position_y - self.position_y
! ! self.v_z = target.position_z - self.position_z
! end
! --store previous values for delta calculation
! self.prev_azimuth = self.azimuth
! self.prev_elevation = self.elevation
! --get magnitude and normalize difference vector
! self.magnitude = math.sqrt((self.v_x)^2 + (self.v_y)^2 + (self.v_z)^2)
! if self.magnitude < self.mvmt_hault then
! ! self.magnitude = 0
! ! self.azimuth = 0
! ! self.elevation = 0
! else
! ! self.v_x = self.v_x / self.magnitude
! ! self.v_y = self.v_y / self.magnitude
! ! self.v_z = self.v_z / self.magnitude
! ! self.azimuth = math.atan2(self.v_x, self.v_z) * 180 / math.pi
! ! self.elevation = math.acos(self.v_y) * 180 / math.pi - 90
! end
! --calcuate change
! self.t_e = u.time_elapse / 10
! self.delta_azimuth = self.wrap90(self.azimuth - self.prev_azimuth) * self.t_e
! self.delta_elevation = self.wrap90(self.elevation - self.prev_elevation) * self.t_e
! --add easing to speed, changes in target
! if mode == "arrive" and self.magnitude < self.mvmt_ease then
! ! self.chunk = self.magnitude / (self.mvmt_ease + self.mvmt_hault / 2)
! ! self.delta_azimuth = self.delta_azimuth * self.chunk
! ! self.delta_elevation = self.delta_elevation * self.chunk
! ! self.speed = self.max_speed * self.chunk
! elseif mode == "wander" and self.magnitude < self.mvmt_ease then
! ! self:set_wtarget()
! ! self.speed = 0
! else
! ! self.speed = self.max_speed
! end
end
Heis, Muziko Kreito Universo: Project Documentation, 27
! ! self.overdrive = 10
! elseif self.current_state == "hunt" then
! ! self.overdrive = 5
! elseif self.current_state == "flee" then
! ! self.overdrive = 3
! else self.overdrive = 1
! end
! --set volume, pitch
! self.volume = (self.health * 2/3 + 1/3) * u.volume_table[self.current_state]
! self.pitch = self.pitch + self.delta_pitch
! if self.pitch < 0 then
! ! self.pitch = self.pitch + 12
! end
! --frequency
! self.q_pitch = 2^((self.pitch % 12) / 12)
! self.q_age = math.ceil(self.age * 8)
! self.frequency = u.age_to_octave[self.q_age] * self.q_pitch
! --pulsation
! if u.time > self.millis + self.lasttick then
! ! self.pulse = 1
! ! self.lasttick = u.time
! ! self.rate = (1 - self.age + self.energy + self.health) / 3
! ! self.millis = (1 - self.rate) * u.time_range + 50
! else
! ! self.pulse = 0
! end
end
function kreito:color_calc ()
! if self.current_state ~= "birth" and self.current_state ~= "death" then
! ! self.alpha = self.health * 2/3 +1/3
! ! self.saturation = self.energy * 2/3 +1/3
! else
! ! self.saturation = 0
! end
! self.color:hsl2rgb(self.hue, self.saturation, self.light)
end
function kreito:change_state (a_state)
! self.current_state = a_state
! self:add_tween{self.hue, u.color_table[a_state], 500, 'linear', 'hue'}
end
function kreito:death_test ()
! if self.health < 0 or self.age > 1 then
! ! self:anim_death()
! ! self:change_state( "death" )
! ! self:add_tween{self.alpha, 0, 2000, 'linear', 'alpha'}
! ! self:add_delay{2000, 'terminate'}
! end
end
--tween and delay functions
function kreito:add_tween (t)
! local tw = u.tween:new()
! tw.super = self
! tw:set(t)
! self.tweens[#self.tweens+1] = tw
end
function kreito:cancel_tweens ()
! while self.tweens[1] do
! ! self.tweens[#self.tweens] = nil
! end
end
function kreito:update_tweens ()
! for i in ipairs(self.tweens) do
! ! self.tweens[i]:update()
! end
end
Heis, Muziko Kreito Universo: Project Documentation, 29
! ! self:change_state("hunt")
! --go to sleep
! elseif self.energy < 1/5 then
! ! self:anim_sleep()
! ! self:change_state("sleep")
! --go to procreate
! elseif (self.energy + self.health + self.age) > #u.kreito_types * 8/3 *
! ! u.kreitoj_count[self.kreito_type] / u.max_kreitoj then
! ! self:anim_procreate()
! ! self:change_state("procreate")
! ! self:add_delay{5000, 'make_child'}
! --go to pursue(playmate)
! elseif (self.energy + self.health) > 3/2 then
! ! self:anim_flee()
! ! self:change_state("pursue")
! end
end
function kreito:sleep_state ()
! self:clear_playmates()
! self.delta_health = 0
! self.delta_energy = u.fast_rate * u.time_elapse
! self.max_speed = u.stop_rate * u.time_elapse
! self.delta_pitch = self:pitch_match(0, true)
! self:mvmt_stop()
! --go to wander
! if self.energy > 1 then
! ! self:anim_move()
! ! self:change_state("wander")
! end
end
function kreito:pursue_state ()
! --go to wander's
! if self.energy < 1/4 then
! ! self:clear_playmates()
! ! self:anim_move()
! ! self:change_state("wander")
! elseif self.playmates[1] == nil then
! ! self:find_playmate()
! ! self.delta_pitch = 0
! ! self:steer("wander")
! else
! ! self.delta_pitch = self:pitch_match(self.playmates[1].pitch, false)
! ! self:steer("arrive", self.playmates[1])
! ! --go to play
! ! if self.magnitude < 1/10 then
! ! ! self:change_anim_play()
! ! ! self:change_state("play")
! ! ! self.playmates[1]:change_anim_play()
! ! ! self.playmates[1]:change_state("play")
! ! end
! end
! self.delta_health = 0
! self.delta_energy = -u.mid_rate * u.time_elapse
! self.max_speed = u.run_rate * u.time_elapse
end
function kreito:find_playmate ()
! local bidder
! local high_energy = 0
! --find the kreito with highest energy in range
! for i in pairs(u.kreitoj) do
! ! if i ~= self.name and u.kreitoj[i] ~= nil then
! ! ! local st = u.kreitoj[i].current_state
! ! ! if st == "wander" or st == "pursue" or st == "play" then
! ! ! ! local l_x = u.kreitoj[i].position_x - self.position_x
! ! ! ! local l_y = u.kreitoj[i].position_y - self.position_y
Heis, Muziko Kreito Universo: Project Documentation, 31
! ! self.delta_pitch = 0
! ! self:steer("wander")
! else
! ! self.delta_pitch = self:pitch_match(self.prey.pitch, false)
! ! self:steer("arrive", self.prey)
! ! --go to fight
! ! if self.magnitude < 1/10 then
! ! ! self:change_anim_play()
! ! ! self:change_state("fight")
! ! ! self.prey:decide_provoked(self)
! ! end
! end
end
function kreito:decide_provoked (pred)
! self.predator = pred
! --go to fight
! if self.health > 1/10 or self.current_state == "hunt" then
! ! self:change_anim_play()
! ! self:change_state("fight")
! --go to flee
! else
! ! self:anim_flee()
! ! self:change_state("flee")
! end
end
function kreito:find_prey ()
! local bidder = nil
! local low_health = 1
! --find kreito with lowest health in range
! for i in pairs(u.kreitoj) do
! ! if i ~= self.name and u.kreitoj[i] ~= nil then
! ! ! local st = u.kreitoj[i].current_state
! ! ! if st == "wander" or st == "sleep" or st == "hunt" then
! ! ! ! local l_x = u.kreitoj[i].position_x - self.position_x
! ! ! ! local l_y = u.kreitoj[i].position_y - self.position_y
! ! ! ! local l_z = u.kreitoj[i].position_z - self.position_z
! ! ! ! local l_m2 = (l_x)^2 + (l_y)^2 + (l_z)^2
! ! ! ! if l_m2 < 16384 then --16384 = 128^2
! ! ! ! ! local n_health = u.kreitoj[i].health
! ! ! ! ! if n_health < low_health then
! ! ! ! ! ! bidder = u.kreitoj[i]
! ! ! ! ! ! low_health = n_health
! ! ! ! ! end
! ! ! ! end
! ! ! end
! ! end
! end
! --set up predator and prey relationship
! if bidder ~= nil then
! ! self.prey = bidder
! ! if self.prey.current_state == "hunt" then
! ! ! self.prey.predator = self
! ! end
! end
end
function kreito:fight_state ()
! self:clear_playmates()
! self.delta_health = -u.fast_rate * u.time_elapse
! self.delta_energy = -u.fast_rate * u.time_elapse
! self.max_speed = u.stop_rate * u.time_elapse
! self:mvmt_stop()
! --go to chase state
! if self.prey ~= nil then
! ! self.delta_pitch = self:pitch_match(self.prey.pitch, false)
! ! if self.prey.current_state == "flee" then
Heis, Muziko Kreito Universo: Project Documentation, 33
! ! ! self:anim_flee()
! ! ! self:change_state("chase")
! ! end
! --go to flee state
! elseif self.predator ~= nil then
! ! self.delta_pitch = self:pitch_match(self.predator.pitch, false)
! ! if self.health < 1/20 then
! ! ! self:anim_flee()
! ! ! self:change_state("flee")
! ! end
! --go to wander state
! else
! ! self.delta_pitch = 0
! ! self:anim_move()
! ! self:change_state("wander")
! end
end
function kreito:chase_state ()
! if self.prey ~= nil then
! ! self.delta_pitch = self:pitch_match(self.prey.pitch, false)
! ! self.delta_health = -u.fast_rate * u.time_elapse
! ! self.delta_energy = -u.fast_rate * u.time_elapse
! ! self.max_speed = u.fast_rate * u.time_elapse
! ! self:steer("arrive", self.prey)
! -- go to wander state
! else
! ! self:anim_move()
! ! self:change_state("wander")
! end
end
function kreito:flee_state ()
! self:clear_playmates()
! self.delta_health = -u.fast_rate * u.time_elapse
! self.delta_energy = -u.fast_rate * u.time_elapse
! self.max_speed = u.run_rate * u.time_elapse
! if self.predator ~= nil then
! ! self.delta_pitch = self:pitch_match(self.predator.pitch, false)
! ! self:steer("flee", self.predator)
! --go to wander state
! else
! ! self:anim_move()
! ! self:change_state("wander")
! end
end
function kreito:death_state ()
! self.health = 0
! self.energy = 0!
! self.max_speed = 0
! self.delta_pitch = self:pitch_match(0, true)
! self:mvmt_stop()
end
function kreito:make_child ()
! self:anim_move()
! self:change_state("wander")
! --find an empty slot
! local childnum = nil
! for i = 1, u.max_kreitoj do
! ! if u.kreitoj[i] == nil then
! ! ! childnum = i
! ! ! break
! ! end
! end
! --make a kreito of the correct kind in the empty slot
! if childnum ~= nil then
! ! u.kreitoj[childnum] = u[self.kreito_type]:new()
Heis, Muziko Kreito Universo: Project Documentation, 34
! ! local c = u.kreitoj[childnum]
! ! c:setup()
! ! c.name = childnum
! ! c.parent_kreito = self
! ! self.children_kreito[#self.children_kreito+1] = c
! ! c:set_position{self.position_x, self.position_y, self.position_z}
! ! c:set_rotate{self.rotate_r, self.rotate_x, self.rotate_y, self.rotate_z}
! ! c:add_tween{0, 1, 2000, 'linear', 'alpha'}
! end
end
function kreito:terminate ()
! self:cancel_tweens()
! --end all relationships
! self:clear_playmates()
! self:clear_children()
! if self.predator ~= nil then
! ! self.predator.health = 1
! ! self.predator.prey = nil
! elseif self.prey ~= nil then
! ! self.prey.health = 1
! ! self.prey.predator = nil
! end
! --delete this from the great array
! u.kreitoj[self.name] = nil
end
function kreito:pitch_match (t, cd)
! local direction = 1
! if cd == false then
! ! direction = -1
! end
! if t > self.pitch then
! ! return u.pitch_rate * direction
! else
! ! return -u.pitch_rate * direction
! end
end
File: kreito_template.lua
a_kreito = {}
function a_kreito:setup_faction()
! self.kreito_type = "a_kreito"
! self.faction_health = x/12 * u.slow_rate
! self.faction_energy = 12-x/12 * u.slow_rate
! --setup animation parameters
! self.tailflip = 0
end
function a_kreito:draw()
! --age calculation
! u.sketch:glpushmatrix()
! self:setup_sketch()
! --main
! u.sketch:glpopmatrix()
end
function a_kreito:anim_move()
! self:cancel_tweens()
! --tweens and sets
end
function a_kreito:anim_procreate()
! self:cancel_tweens()
! --tweens and sets
end
function a_kreito:anim_sleep()
! self:cancel_tweens()
! --tweens and sets
Heis, Muziko Kreito Universo: Project Documentation, 35
end
function a_kreito:anim_death()
! self:cancel_tweens()
! --tweens and sets
end
function a_kreito:anim_flee()
! self:cancel_tweens()
! --tweens and sets
end
--these all end with 'change_anim_play' function call
function a_kreito:anim_play1()
! self:cancel_tweens()
! --tweens and sets
end
function a_kreito:anim_play2()
! self:cancel_tweens()
! --tweens and sets
end
function a_kreito:anim_play3()
! self:cancel_tweens()
! --tweens and sets
end
function a_kreito:anim_play4()
! self:cancel_tweens()
! --tweens and sets
end
u.a_kreito = u.createClass(kreito, a_kreito)
File: radiuso.lua
--radiuso
radiuso = {}
function radiuso:setup_faction()
! self.kreito_type = "radiuso"
! self.faction_health = 8/12 * u.slow_rate
! self.faction_energy = 4/12 * u.slow_rate
! self.spin = 0
! self.radius = 2/3
! self.space = 7/5
! self.translate = 1
! self.flip = 0
! self.outradius = 0
! self.tentacles = 1
end
function radiuso:draw()
! self.tentacles = self.age * 13
! u.sketch:glpushmatrix()
! self:setup_sketch()
! --head
! u.sketch:glcolor(self.color.r, self.color.g, self.color.b, self.alpha)
! u.sketch:glpushmatrix()
! u.sketch:sphere(1)
! u.sketch:glpopmatrix()
! --tentacles
! u.sketch:glcolor(self.color.r, self.color.g, self.color.b, self.alpha*2/3)
! u.sketch:glrotate(self.flip, -1, 0, 0)
! u.sketch:gltranslate(0, 0, -self.space * self.translate)
! for i = 0, self.tentacles do
! ! u.sketch:glpushmatrix()
! ! u.sketch:glrotate(self.spin + i * 360 / self.tentacles, 0, 0, 1)
! ! u.sketch:gltranslate(0, -self.radius, 0)
! ! u.sketch:sphere(1/3)
! ! u.sketch:glrotate(self.outradius, -1, 0, -1)
! ! u.sketch:gltranslate(0, 0, -self.space)
! ! u.sketch:cylinder(1/3, 0, 1)
Heis, Muziko Kreito Universo: Project Documentation, 36
! ! u.sketch:glpopmatrix()
! end
! u.sketch:glpopmatrix()
end
function radiuso:anim_move()
! self:cancel_tweens()
! self:add_tween{self.space, 6/5, 500, 'sine', 'space'}
! self:add_tween{self.outradius, -10, 500, 'sine', 'outradius', 'open_to_push'}
! self.spin = 0
! self.radius = 2/3
! self.translate = 1
! self.flip = 0
end
function radiuso:push_forward()
! self:cancel_tweens()
! self:add_tween{self.spin, 360, 3000, 'sine', 'spin'}
! self:add_tween{self.radius, 2/3, 3000, 'sine', 'radius'}
! self:add_tween{self.space, 6/5, 3000, 'sine', 'space'}
! self:add_tween{self.outradius, -10, 3000, 'sine', 'outradius', 'open_to_push'}
end
function radiuso:open_to_push()
! self:cancel_tweens()
! self:add_tween{self.radius, 4/3, 1000, 'sine', 'radius'}
! self:add_tween{self.space, 2, 1000, 'sine', 'space'}
! self:add_tween{self.outradius, 30, 1000, 'sine', 'outradius', 'push_forward'}
! self.spin = 0
end
function radiuso:anim_procreate()
! self:cancel_tweens()
! self:add_tween{self.radius, 3/2, 1000, 'sine', 'radius'}
! self:add_tween{self.translate, 0, 1000, 'sine', 'translate'}
! self:add_tween{self.flip, -90, 1000, 'sine', 'flip'}
! self:add_tween{self.outradius, 90, 1000, 'sine', 'outradius', 'anim_procreate_spin'}
! self.space = 7/5
! self.spin = 0
end
function radiuso:anim_procreate_spin()
! self:cancel_tweens()
! self:add_tween{0, 360, 750, 'linear', 'spin', 'anim_procreate_spin'}
end
function radiuso:anim_sleep()
! self:cancel_tweens()
! self:add_tween{self.flip, 90, 1000, 'sine', 'flip'}
! self.space = 7/5
! self.outradius = 0
! self.spin = 0
! self.radius = 2/3
! self.translate = 1
end
function radiuso:anim_death()
! self:cancel_tweens()
! self:add_tween{self.flip, -90, 1000, 'sine', 'flip'}
! self.space = 7/5
! self.outradius = 0
! self.spin = 0
! self.radius = 2/3
! self.translate = 1
end
function radiuso:anim_flee()
! self:cancel_tweens()
! self:add_tween{0, 360, 500, 'linear', 'spin', 'anim_flee'}
! self.space = 7/5
! self.outradius = 0
! self.radius = 2/3
! self.translate = 1
Heis, Muziko Kreito Universo: Project Documentation, 37
! self.flip = 0
end
function radiuso:anim_play1()
! self:cancel_tweens()
! self:add_tween{0, 360, 2000, 'sine', 'spin', 'change_anim_play'}
! self.space = 7/5
! self.outradius = 0
! self.radius = 2/3
! self.translate = 1
! self.flip = 0
end
function radiuso:anim_play2()
! self:cancel_tweens()
! self:add_tween{self.flip, 180, 1000, 'sine', 'flip'}
! self:add_tween{self.radius, 0, 1000, 'sine', 'radius', 'anim_play2_exit'}
! self.space = 7/5
! self.outradius = 0
! self.spin = 0
! self.translate = 1
end
function radiuso:anim_play2_exit()
! self:cancel_tweens()
! self:add_tween{self.flip, 0, 1000, 'sine', 'flip'}
! self:add_tween{self.radius, 2/3, 1000, 'sine', 'radius', 'change_anim_play'}
end
function radiuso:anim_play3()
! self:cancel_tweens()
! self:add_tween{self.flip, -90, 1000, 'sine', 'flip'}
! self:add_tween{self.outradius, 30, 1000, 'sine', 'outradius'}
! self:add_tween{0, 360, 1000, 'sine', 'spin', 'anim_play3_exit'}
! self.space = 7/5
! self.radius = 2/3
! self.translate = 1
end
function radiuso:anim_play3_exit()
! self:cancel_tweens()
! self:add_tween{self.flip, 0, 1000, 'sine', 'flip'}
! self:add_tween{self.outradius, 0, 1000, 'sine', 'outradius', 'change_anim_play'}
end
function radiuso:anim_play4()
! self:cancel_tweens()
! self:add_tween{self.translate, 0, 1000, 'sine', 'translate'}
! self:add_tween{self.radius, 3/2, 1000, 'sine', 'radius'}
! self:add_tween{self.outradius, 90, 1000, 'sine', 'outradius'}
! self:add_tween{self.flip, -45, 1000, 'sine', 'flip'}
! self:add_tween{0, 360, 1000, 'linear', 'spin', 'anim_play4_exit'}
! self.space = 7/5
end
function radiuso:anim_play4_exit()
! self:cancel_tweens()
! self:add_tween{self.translate, 1, 1000, 'sine', 'translate'}
! self:add_tween{self.radius, 2/3, 1000, 'sine', 'radius'}
! self:add_tween{self.outradius, 0, 1000, 'sine', 'outradius'}
! self:add_tween{self.flip, 0, 1000, 'sine', 'flip'}
! self:add_tween{0, 360, 1000, 'linear', 'spin', 'change_anim_play'}
end
u.radiuso = u.createClass(kreito, radiuso)
File: flugilo.lua
--flugilo
flugilo = {}
function flugilo:setup_faction()
! self.kreito_type = "flugilo"
! self.faction_health = 9/12 * u.slow_rate
Heis, Muziko Kreito Universo: Project Documentation, 38
! self.wingflip = 0
! self.tailflip = 0
! self.nod = 0
! self.neckspace = 1
! self.tailtwirl = 0
end
function flugilo:flap_wings()
! self:cancel_tweens()
! self:add_tween{self.wingflap, -45, 1000, 'sine', 'wingflap', 'flap_wings_up'}
end
function flugilo:flap_wings_up()
! self:cancel_tweens()
! self:add_tween{-45, 45, 1000, 'sine', 'wingflap', 'flap_wings'}
end
function flugilo:anim_procreate()
! self:cancel_tweens()
! self:add_tween{self.nod, -15, 1000, 'sine', 'nod'}
! self:add_tween{0, 360, 1000, 'linear', 'wingflip'}
! self:add_tween{0, 720, 1000, 'linear', 'tailtwirl', 'anim_procreate_up'}
! self.wingflap = 0
! self.tailflip = 0
! self.neckspace = 1
end
function flugilo:anim_procreate_up()
! self:cancel_tweens()
! self:add_tween{-15,15,1000,'sine','nod'}
! self:add_tween{0,360,1000,'linear','wingflip'}
! self:add_tween{0,720,1000, 'linear', 'tailtwirl', 'anim_procreate'}
end
function flugilo:anim_sleep()
! self:cancel_tweens()
! self:add_tween{self.wingflap, -15, 1000, 'sine', 'wingflap'}
! self:add_tween{self.nod, -15, 1000, 'sine', 'nod'}
! self:add_tween{self.tailflip, 15, 1000, 'sine', 'tailflip'}
! self.wingflip = 0
! self.neckspace = 1
! self.tailtwirl = 0
end
function flugilo:anim_death()
! self:cancel_tweens()
! self:add_tween{self.wingflap, -90, 1000, 'sine', 'wingflap'}
! self:add_tween{self.nod, -30, 1000, 'sine', 'nod'}
! self:add_tween{self.tailflip, 30, 1000, 'sine', 'tailflip'}
! self.wingflip = 0
! self.nod = 0
! self.neckspace = 1
! self.tailtwirl = 0
end
function flugilo:anim_flee()
! self:cancel_tweens()
! self:add_tween{0, 360, 750, 'linear', 'wingflip'}
! self:add_tween{0, 720, 750, 'linear', 'tailtwirl', 'anim_flee'}
! self.wingflap = 0
! self.tailflip = 0
! self.nod = 0
! self.neckspace = 1
end
function flugilo:anim_play1()
! self:cancel_tweens()
! self:add_tween{0, 720, 2000, 'linear', 'tailtwirl', 'change_anim_play'}
! self.wingflap = 0
! self.wingflip = 0
! self.tailflip = 0
! self.nod = 0
! self.neckspace = 1
Heis, Muziko Kreito Universo: Project Documentation, 40
end
function flugilo:anim_play2()
! self:cancel_tweens()
! self:add_tween{self.neckspace, 7/5, 1000, 'sine', 'neckspace', 'anim_play2_exit'}
! self.wingflap = 0
! self.wingflip = 0
! self.tailflip = 0
! self.nod = 0
! self.tailtwirl = 0
end
function flugilo:anim_play2_exit()
! self:cancel_tweens()
! self:add_tween{self.neckspace, 1, 1000, 'sine', 'neckspace', 'change_anim_play'}
end
function flugilo:anim_play3()
! self:cancel_tweens()
! self:add_tween{self.wingflap, 90, 1000, 'sine', 'wingflap', 'anim_play3_exit'}
! self.wingflip = 0
! self.tailflip = 0
! self.nod = 0
! self.neckspace = 1
! self.tailtwirl = 0
end
function flugilo:anim_play3_exit()
! self:cancel_tweens()
! self:add_tween{self.wingflap, 0, 1000, 'sine', 'wingflap', 'change_anim_play'}
end
function flugilo:anim_play4()
! self:cancel_tweens()
! self:add_tween{self.tailflip, -45, 1000, 'sine', 'tailflip', 'anim_play4_exit'}
! self.wingflap = 0
! self.wingflip = 0
! self.nod = 0
! self.neckspace = 1
! self.tailtwirl = 0
end
function flugilo:anim_play4_exit()
! self:cancel_tweens()
! self:add_tween{self.tailflip, 0, 1000, 'sine', 'tailflip', 'change_anim_play'}
end
u.flugilo = u.createClass(kreito, flugilo)
File: konko.lua
--konko
konko = {}
function konko:setup_faction()
! self.kreito_type = "konko"
! self.faction_health = 3/12 * u.slow_rate
! self.faction_energy = 9/12 * u.slow_rate
! self.radius = 2/3
! self.feet = 3
! self.spin = 0
! self.coneflip = 0
! self.feetflip = 0
! self.coneradius = 10
! self.conespin = 0
! self.feettrans = 1
end
function konko:draw()
! --age
! self.feet = self.age * 9 + 1
! u.sketch:glpushmatrix()
! self:setup_sketch()
! --head
Heis, Muziko Kreito Universo: Project Documentation, 41
function konko:anim_death()
! self:cancel_tweens()
! self:add_tween{self.coneflip, 180, 1000, 'sine', 'coneflip'}
! self:add_tween{self.feetflip, -180, 1000, 'sine', 'feetflip'}
! self.radius = 2/3
! self.spin = 0
! self.conespin = 0
! self.feettrans = 1
end
function konko:anim_flee()
! self:cancel_tweens()
! self:add_tween{self.coneflip, 90, 1000, 'sine', 'coneflip'}
! self:add_tween{self.feetflip, -90, 1000, 'sine', 'feetflip'}
! self:add_tween{self.radius, 1, 1000, 'sine', 'radius', 'spin_and_twirl'}
! self.spin = 0
! self.conespin = 0
! self.feettrans = 1
end
function konko:anim_play1()
! self:cancel_tweens()
! self:add_tween{0, 360, 2000, 'linear', 'conespin'}
! self:add_tween{self.coneflip, 15, 2000, 'sine', 'coneflip', 'change_anim_play'}
! self.radius = 2/3
! self.spin = 0
! self.feetflip = 0
! self.conespin = 0
! self.feettrans = 1
end
function konko:anim_play2()
! self:cancel_tweens()
! self:add_tween{self.feetflip, 90, 2000, 'sine', 'feetflip', 'change_anim_play'}
! self.radius = 2/3
! self.spin = 0
! self.coneflip = 0
! self.conespin = 0
! self.feettrans = 1
end
function konko:anim_play3()
! self:cancel_tweens()
! self:add_tween{0, 360, 1000, 'linear', 'spin'}
! self:add_tween{self.feettrans, 0, 1000, 'sine', 'feettrans'}
! self:add_tween{self.radius, 6/5, 1000, 'sine', 'radius', 'anim_play3_exit'}
! self.spin = 0
! self.coneflip = 0
! self.feetflip = 0
! self.conespin = 0
end
function konko:anim_play3_exit()
! self:cancel_tweens()
! self:add_tween{0, 360, 1000, 'linear', 'spin'}
! self:add_tween{self.feettrans, 1, 1000, 'sine', 'feettrans'}
! self:add_tween{self.radius, 2/3, 1000, 'sine', 'radius', 'change_anim_play'}
end
function konko:anim_play4()
! self:cancel_tweens()
! self:add_tween{self.radius, -2/3, 1000, 'sine', 'radius', 'anim_play4_exit'}
! self.spin = 0
! self.coneflip = 0
! self.feetflip = 0
! self.conespin = 0
! self.feettrans = 1
end
function konko:anim_play4_exit()
! self:cancel_tweens()
! self:add_tween{self.radius, 2/3, 1000, 'sine', 'radius', 'change_anim_play'}
Heis, Muziko Kreito Universo: Project Documentation, 43
end
u.konko = u.createClass(kreito, konko)
File: streko.lua
--streko
streko = {}
function streko:setup_faction()
! self.kreito_type = "streko"
! self.faction_health = 11/12 * u.slow_rate
! self.faction_energy = 1/12 * u.slow_rate
! self.tailflip = 0
! self.nod = 0
! self.neckspace = 1
! self.tailspace = 8/5
! self.tailjoints = 5
! self.orbit = 0
! self.tailtwirl = 0
end
function streko:draw()
! --age
! self.tailjoints = self.age * 12 + 1
! u.sketch:glpushmatrix()
! self:setup_sketch()
! --main
! for i=0, self.tailjoints do
! ! if i < 5 then
! ! ! u.sketch:glcolor(self.color.r, self.color.g, self.color.b,
! ! ! ! self.alpha*(6-i)/6)
! ! else
! ! ! u.sketch:glcolor(self.color.r, self.color.g, self.color.b, self.alpha/3)
! ! end
! ! u.sketch:glpushmatrix()
! ! if i == 0 then
! ! ! u.sketch:glrotate(self.nod, 0, 1, 0)
! ! ! u.sketch:gltranslate(0, 0, self.neckspace - 1/2)
! ! else
! ! ! u.sketch:glrotate(self.delta_azimuth * 4 * i, 0, -1, 0)
! ! ! u.sketch:glrotate(self.delta_elevation * 4 * i, -1, 0, 0)
! ! ! u.sketch:glrotate(self.tailflip * i, -1, 0 ,-1)
! ! ! u.sketch:glrotate(self.tailtwirl * i / 2, 0, 1, 1)
! ! ! u.sketch:glrotate(self.orbit * i, 0, 1, 0)
! ! end
! ! u.sketch:gltranslate(0, 0, -self.tailspace * i)
! ! if i < 5 then
! ! ! u.sketch:sphere((6-i)/6)
! ! else
! ! ! u.sketch:sphere(1/3)
! ! end
! ! u.sketch:glpopmatrix()
! end
! u.sketch:glpopmatrix()
end
function streko:anim_move()
! self:cancel_tweens()
! self.orbit = 0
! self.tailflip = 0
! self.nod = 0
! self.neckspace = 1
! self.tailtwirl = 0
end
function streko:anim_procreate()
! self:cancel_tweens()
! self:add_tween{self.nod, -15, 1000, 'sine', 'nod'}
! self:add_tween{0, 360, 1000, 'linear', 'orbit'}
Heis, Muziko Kreito Universo: Project Documentation, 44
File: drivo.lua
drivo = {}
function drivo:setup_faction()
! self.kreito_type = "drivo"
! self.faction_health = 1/12 * u.slow_rate
! self.faction_energy = 11/12 * u.slow_rate
! --setup animation parameters
! self.headspin = 0
! self.neckspace = 0
! self.armspin = 0
! self.legspin = 0
! self.armsforback = 0
! self.legsforback = 0
! self.armfan = 0
! self.legfan = 0
! self.armspace = 1
! self.legspace = 1/3
end
function drivo:draw()
! --age calculation
! self.arms = self.age * 4 + 1
! self.legs = self.age * 8 + 1
! u.sketch:glpushmatrix()
! self:setup_sketch()
! --body
! u.sketch:glcolor(self.color.r, self.color.g, self.color.b, self.alpha)
! u.sketch:glpushmatrix()
! u.sketch:glrotate(90, 1, 0, 0)
! u.sketch:glscale(1, 2/3, 1)
! u.sketch:cylinder(1/2, 1/2, 1/2)
! u.sketch:glpopmatrix()
! --head
! u.sketch:glpushmatrix()
! u.sketch:gltranslate(0, 1, 0)
! u.sketch:glrotate(self.headspin, 0, 1, 0)
! u.sketch:gltranslate(0, 0, self.neckspace)
! u.sketch:sphere(1/2)
! u.sketch:glpopmatrix()
! --arms
! u.sketch:glcolor(self.color.r, self.color.g, self.color.b, self.alpha * 2/3)
! u.sketch:glpushmatrix()
! u.sketch:glrotate(self.armsforback, 1, 0, 0)
! u.sketch:gltranslate(0, 1/2, 0)
! for i=0, self.arms do
! ! u.sketch:glpushmatrix()
! ! u.sketch:glrotate(i * 360 / (self.arms + 1) + self.armspin - 90, 0, 1, 0)
! ! u.sketch:gltranslate(0, 0, self.armspace-1/4)
! ! u.sketch:glrotate(self.armfan, 1, 0, 0)
! ! u.sketch:gltranslate(0, 0, 1/4)
! ! u.sketch:cylinder(0, 1/4, 1/2)
! ! u.sketch:glpopmatrix()
! end
Heis, Muziko Kreito Universo: Project Documentation, 46
! u.sketch:glpopmatrix()
! --legs
! u.sketch:glpushmatrix()
! u.sketch:glrotate(self.legsforback, 1, 0, 0)
! u.sketch:gltranslate(0, -3/4, 0)
! for i=0, self.legs do
! ! u.sketch:glpushmatrix()
! ! u.sketch:glrotate(i * 360 / (self.legs + 1) - 90 + self.legspin, 0, 1, 0)
! ! u.sketch:gltranslate(0, 0, self.legspace)
! ! u.sketch:glrotate(self.legfan, 1, 0, 0)
! ! u.sketch:gltranslate(0, -1/4, 0)
! ! u.sketch:glrotate(-90, 1, 0, 0)
! ! u.sketch:cylinder(1/4, 0, 1/2)
! ! u.sketch:glpopmatrix()
! end
! u.sketch:glpopmatrix()
! --close
! u.sketch:glpopmatrix()
end
function drivo:anim_move()
! self:cancel_tweens()
! --tweens and sets
! if self.armfan > 0 then
! ! self:add_tween{self.armfan, -15, 1000, 'sine', 'armfan'}
! else
! ! self:add_tween{self.armfan, 15, 1000, 'sine', 'armfan'}
! end
! if self.legsforback < 29 then
! ! self:add_tween{self.legsforback, 30, 500, 'sine', 'legsforback'}
! else
! ! self.legsforback = 30
! end
! self:add_tween{0, 360, 1000, 'linear', 'legspin', 'anim_move'}
! self.armsforback = 0
! self.headspin = 0
! self.neckspace = 0
! self.armspin = 0
! self.legfan = 0
! self.armspace = 1
! self.legspace = 1/3
end
function drivo:anim_procreate()
! self:cancel_tweens()
! --tweens and sets
! if self.armfan > 0 then
! ! self:add_tween{self.armfan, -30, 500, 'sine', 'armfan'}
! else
! ! self:add_tween{self.armfan, 30, 500, 'sine', 'armfan'}
! end
! if self.legfan > 0 then
! ! self:add_tween{self.legfan, -30, 500, 'sine', 'legfan'}
! else
! ! self:add_tween{self.legfan, 30, 500, 'sine', 'legfan'}
! end
! if self.neckspace < 9/10 then
! ! self:add_tween{self.neckspace, 1, 500, 'sine', 'neckspace'}
! else
! ! self.neckspace = 1
! end
! self:add_tween{0, 360, 500, 'linear', 'headspin'}
! self:add_tween{0, 360, 500, 'linear', 'armspin'}
! self:add_tween{0, 360, 500, 'linear', 'legspin', 'anim_procreate'}
! self.armsforback = 0
! self.legsforback = 0
! self.armspace = 1
Heis, Muziko Kreito Universo: Project Documentation, 47
! self.legspace = 1/3
end
function drivo:anim_sleep()
! self:cancel_tweens()
! --tweens and sets
! self.headspin = 0
! self.neckspace = 0
! self.armspin = 0
! self.legspin = 0
! self.armsforback = 0
! self.legsforback = 0
! self:add_tween{self.armfan, -45, 1000, 'sine', 'armfan'}
! self:add_tween{self.legfan, 45, 1000, 'sine', 'legfan'}
! self.armspace = 1
! self.legspace = 1/3
end
function drivo:anim_death()
! self:cancel_tweens()
! --tweens and sets
! self.headspin = 0
! self.neckspace = 0
! self.armspin = 0
! self.legspin = 0
! self.armsforback = 0
! self.legsforback = 0
! self:add_tween{self.armfan, -90, 1000, 'sine', 'armfan'}
! self:add_tween{self.legfan, 90, 1000, 'sine', 'legfan'}
! self:add_tween{self.armspace, 0, 1000, 'sine', 'armspace'}
! self:add_tween{self.legspace, 0, 1000, 'sine', 'armspace'}
end
function drivo:anim_flee()
! self:cancel_tweens()
! --tweens and sets
! if self.armsforback < 89 then
! ! self:add_tween{self.armsforback, -90, 500, 'sine', 'armsforback'}
! else
! ! self.armsforback = -90
! end
! if self.legsforback < 89 then
! ! self:add_tween{self.legsforback, 90, 500, 'sine', 'legsforback'}
! else
! ! self.legsforback = 90
! end
! if self.armfan < 89 then
! ! self:add_tween{self.armfan, 90, 500, 'sine', 'armfan'}
! else
! ! self.armfan = 90
! end
! self:add_tween{0, 360, 500, 'linear', 'armspin'}
! self:add_tween{0, 360, 500, 'linear', 'legspin', 'anim_flee'}
! self.headspin = 0
! self.neckspace = 0
! self.legfan = 0
! self.armspace = 1
! self.legspace = 1/3
end
--these all end with 'change_anim_play' function call
function drivo:anim_play1()
! self:cancel_tweens()
! --tweens and sets
! if self.neckspace < 2/5 then
! ! self:add_tween{self.neckspace, 1/2, 1000, 'sine', 'neckspace'}
! else
! ! self:add_tween{self.neckspace, 0, 1000, 'sine', 'neckspace'}
! end
Heis, Muziko Kreito Universo: Project Documentation, 48
File: mku_c74.txt
clear
brgb 0. 0. 0. 1.
hslider healthSlider 25 25 270 80
bgcolor healthSlider 1. 0.67 0.67 1.
comment healthLabel 25 105 HEALTH
textcolor healthLabel 1. 1. 1. 1.
comment healthPointer 156 105 ▲
textcolor healthPointer 1. 1. 1. 1.
hslider energySlider 25 165 270 80
bgcolor energySlider 0.67 1. 0.67 1.
comment energyLabel 25 245 ENERGY
textcolor energyLabel 1. 1. 1. 1.
comment energyPointer 156 245 ▲
textcolor energyPointer 1. 1. 1. 1.
toggle activeToggle 25 305 80
bgcolor activeToggle 0.67 0.5 1. 1.
comment activeLabel 25 385 ACTIVE
textcolor activeLabel 1. 1. 1. 1.
button homeButton 215 305 80
bgcolor homeButton 0.67 1. 1. 1.
comment homeLabel 215 385 HOME
textcolor homeLabel 1. 1. 1. 1.
set healthSlider 0.5
set energySlider 0.5
set activeToggle 1.
bordercolor healthSlider 1. 1. 1. 1.
bordercolor energySlider 1. 1. 1. 1.
bordercolor activeToggle 1. 1. 1. 1.
bordercolor homeButton 1. 1. 1. 1.