Modding Rundown: Animations

Started by thetommyboy2002, March 10, 2007, 11:21AM

Previous topic - Next topic
I'm pretty certain now that only one biped is exported as "active" (ie plays its animation at the correct time). I've made several scenes and always get the same result.
And I still have yet to find a way of exporting more than one working custom animation at a time.
More experiments to follow as and when I have time.

October 29, 2009, 03:02PM #76 Last Edit: October 29, 2009, 03:14PM by Mr. Law^^
I went through some files. 2 things are in every animation file:

- afakeanim
- Motion

Okay. So, I grouped every animationgroup under "Motion". Didn't work.

EDIT: I removed a few lines, seems that I made some mistakes XD

Anyway, I'm trying some new ideas out.

EDIT2: renaming Motion to afakeanim also did not work. I thought: why not group all groups together in 1, renaming the main group to afakeanim (why else is it there?) and setting the default anim to afakeanim.. Didn't work.

Another thing I tried:

The make 1 anim work by using multibipeds & groups method, when exported opening it with a hexeditor and hex one entry of the animation name to the one that wasn't exported (for example, menu_action is the animation defined in the igActor, I renamed one entry to menu_idle).

We need more thinkers here. My main concern is that the exporter just limits us with multi animations. Therefore, I'm posting the script used by the exporter:

Quote from: actor_editor.ms
--
--  $Id: actor_editor.ms,v 1.5 2002/07/30 19:12:44 ericb Exp $
--                                                                       
--          Copyright (C) 1999-2002, Intrinsic Graphics, Inc.           
--                         All Rights Reserved.                         
--                                                                       
--  UNPUBLISHED -- Rights  reserved  under  the  copyright  laws  of the
--  United States.  Use  of a copyright notice is precautionary only and
--  does not imply publication or disclosure.                           
--                                                                       
--  THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
--  OF   INTRINSIC   GRAPHICS,  INC.    ANY  DUPLICATION,  MODIFICATION,
--  DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
--  EXPRESS WRITTEN PERMISSION OF INTRINSIC GRAPHICS, INC.               
--

-----------------------------------------------------------------
--  Actor Animation Editor Helper for Intrinsic Alchemy
-----------------------------------------------------------------
rollout igActorEditor "Actor Editor" 

   -----------------------------------------------------------------
   --  Constant local variables
   -----------------------------------------------------------------
   local ACTOR_ID = "igActor"
   local ACTOR_ANIMATION_NAME = "actorAnimation"

   -----------------------------------------------------------------
   --  Gets the name of the animation
   --  Returns a new unique name if there is no user propertie
   --    with the node
   -----------------------------------------------------------------
   function getActorAnimationName obj =
   (
      local name = getUserProp obj ACTOR_ANIMATION_NAME
      if name != undefined then name else uniqueName(obj.name + "_Animation")
   )
   
      -----------------------------------------------------------------
   --  Sets the name of the animation
   -----------------------------------------------------------------
   function setActorAnimationName obj name =
   (
      setUserProp obj ACTOR_ANIMATION_NAME name
   )
   
   -----------------------------------------------------------------
   --  Current edited actor and its list of components
   -----------------------------------------------------------------
   local selected_object
   local edit_actor
   local list_actorobjects

   -----------------------------------------------------------------
   --  Returns the actor group if it is an actor
   --  returns undefined otherwise
   -----------------------------------------------------------------
   function isActorGroup obj =
   (
      local g = getUserProp obj ACTOR_ID
      if g == true then obj else undefined
   )
   
   
   -----------------------------------------------------------------
   --  Returns the Actor group if the object is inside an actor
   --  returns undefined otherwise
   -----------------------------------------------------------------
   function isActorObject obj =
   (
      local p = obj.parent
      if p != undefined then isActorGroup p else undefined
   )

   
   -----------------------------------------------------------------
   --  Go through an array and returns a common actor group
   --    returns undefined if no common group is found
   -----------------------------------------------------------------
   function multipleActorSelection objs =
   (
      local i = objs[1]
      local g = isActorGroup i
      local n = if g!=undefined then g else isActorObject i
      
      if n==undefined do return undefined
      
      deleteItem objs 1
      for i in objs do
      (
       g = isActorGroup i
       local n2 = if g!=undefined then g else isActorObject i

       if n2!=n do return undefined
      )

      return n
   )
   
   
   -----------------------------------------------------------------
   --  Adds an object to an actor
   -----------------------------------------------------------------
   function addObjectToActor actor obj =
   (
      append actor.children obj
   )
   
   
   -----------------------------------------------------------------
   --  Create an actor from the selection
   -----------------------------------------------------------------
   group "Create Actor"
   (
      button createActor "Create from selection"
   )

   on createActor pressed do
   (
      local objects = getRootSelection()

      if objects.count > 0 do
      (
         local actor_name = uniqueName ACTOR_ID
         local actor_pos = getValidPositionFromList objects
         local actor = Dummy name:actor_name pos:actor_pos
         setUserProp actor ACTOR_ID true

         -- This will return a temporary value if the name is not set
         local animation = getActorAnimationName actor
         setActorAnimationName actor animation
         
         for obj in objects do
         (
            addObjectToActor actor obj
         )

         select actor
      )

   )

   
   -----------------------------------------------------------------
   --  UI actor object rollout group
   -----------------------------------------------------------------
   group "Actor component"
   (
      label       label_name_child "Name: " across:2 align:#left
      label       actor_object_name "" align:#left
      button      select_actor "Select Actor" enabled:false \
            tooltip:"Select the Actor node"
   )

   -----------------------------------------------------------------
   --  Select the actor group of this component
   -----------------------------------------------------------------
   on select_actor pressed do
   (
      if selected_object != undefined do
      (
         local actor = selected_object.parent
         select actor
      )
   )

   -----------------------------------------------------------------
   --  UI Edit actor rollout group
   -----------------------------------------------------------------
   group "Actor"
   (
      label       label_edited_actor "Name:" across:2 align:#left
      label       edited_actor "" align:#left
      
      edittext   animation_name      "Animation:"      enabled:false
      
      listbox      edited_objects "Components" items:#() height:4 \
            tooltip:"Double-click to select object"

      button      remove_obj   "Remove from list" \
            tooltip:"Remove object from list"
      button      add_obj "Add selection" \
            tooltip:"Add selection to Actor components"
      button      select_objects "Select All" \
            tooltip:"Select the Actor and its components"
   )

   
   -----------------------------------------------------------------
   --  Select the double-clicked object
   -----------------------------------------------------------------
   on edited_objects doubleclicked cur_obj do
   (
      select list_actorobjects[cur_obj]
   )


   -----------------------------------------------------------------
   --  Change the name of the animation
   -----------------------------------------------------------------
   on animation_name changed name do
   (
       if animation_name.enabled and (edit_actor != undefined) do
      (
         setActorAnimationName edit_actor name
      )
   )

   -----------------------------------------------------------------
   --  Update the Edit actor rollout group
   -----------------------------------------------------------------
   function updateEditActor =
   (
      if edit_actor != undefined then
      (
         edited_actor.text = edit_actor.name
         list_actorobjects = edit_actor.children
         
         local items = for i in list_actorobjects collect i.name
         edited_objects.items = items
         
         animation_name.text = getActorAnimationName edit_actor
         animation_name.enabled = true
         
      )
      else
      (
         edited_actor.text = ""
         animation_name.enabled = false
         animation_name.text = ""
         list_actorobjects = #()
         edited_objects.items = #()
      )

   )
   
   
   -----------------------------------------------------------------
   --  Add the selection to the editable actor group
   -----------------------------------------------------------------
   on add_obj pressed do
   (
      if edit_actor!=undefined do
      (
         local elements = getRootSelection()

         for i in elements do
         (
            if i != edit_actor do addObjectToActor edit_actor i
         )

         updateEditActor()
         select elements
      )
   )
   
   
   -----------------------------------------------------------------
   --  Remove the selected object from the actor group
   -----------------------------------------------------------------
   on remove_obj pressed do
   (
      if edit_actor!=undefined and edited_objects.selection>0 do
      (
         local element = list_actorobjects[edited_objects.selection]
         element.parent = edit_actor.parent
         updateEditActor()
         select element
      )
   )
   
   
   -----------------------------------------------------------------
   --  Select the actor and its components
   -----------------------------------------------------------------
   on select_objects pressed do
   (
      if edit_actor!=undefined do
      (
          select edit_actor
         selectMore edit_actor.children
      )
   )
   
   -----------------------------------------------------------------
   --  Enable/disable the buttons in the actor object rollout
   -----------------------------------------------------------------
   function enableComponentsUI b =
   (
      select_actor.enabled = b
   )

   
   -----------------------------------------------------------------
   --  Update the rollout with current selection
   -----------------------------------------------------------------
   function updateRollout =
   (
   selected_object = undefined
   enableComponentsUI(false)
   actor_object_name.text = ""

   -- number of selected objects
   local c = selection.count
   local s = getCurrentSelection()
   if c > 0 do
   (
      local o = s[1]
      local g = multipleActorSelection s
      
      if g != undefined do
      (
         -- we changed actor group
         if g != edit_actor do
         (
            edit_actor = g

            -- callback for actor deleted
            when edit_actor deleted obj do
            (
                deleteAllChangeHandlers id:#edit_actor_change
               edit_actor = undefined
               updateEditActor()
            )
   
            -- callback for actor renamed
            when name edit_actor changes id:#edit_actor_change do updateEditActor()
   
            updateEditActor()
         )
      )

      -- update information for a single actor component
      if c==1 do
      (
         local a = isActorObject o
         if a != undefined do
         (
            actor_object_name.text = o.name
            enableComponentsUI(true)
            selected_object = o
         )
      )
   )
   
   )

   
   -----------------------------------------------------------------
   -- Update for current selection
   -----------------------------------------------------------------
   on igActorEditor open do updateRollout()

)  -- end rollout igActorEditor


-- vim:syntax=lace:

And no, adding ACTOR_ANIMATION_NAME2 = actorAnimation2.. aka adding multiple lines like that doesn't work. What we need it the ability to create multiple animations in 1 database in 1 file, otherwise combining anims. If anyone else wants to see other scripts, feel free to ask.

Yes, looking at the .ini files (used to "optimize" exports) reveals some stuff which looks interesting and relevant but which yields little to me upon editing.
Sadly my script-fu is weak and I cannot see how to do what we want. Yet.

Bump

I think I might have found a way to get multiple animations in a game for a character. But it's a long ass theory but let me start.

What do you need:

1. 1 file for each animation you have, renamed as you want them (idk if folders work but, trying <namechar>/xx_charname_p1.igb would be an example here). So, for example: Hydroman/182_Hydroman_p1.igb     This file would contain the power 1 animation, as we are limited to that.
2. Rigged external objects or skins
3. Most likely a script.
4. The invisibility code (not code as in cheat code) or script or w/e it takes, I never got that far with modding yet


Okay so, what now?

IF folders works, try that. IF NOT, our ACTORS folder will be damn full like hell, but w/e.

Again, there can be only ONE animation in a custom skeleton, which is damn fookt. Therefore, we need to have like, any amount of animation you want but they HAVE to be recognizable with the game.

Second, we all know they ARE usable. Why? Tommy could import a custom animation. I could. So it's possible. And yes even in the combat zone as in the menu.

But the problem is: we can only use 3 skeletons at a time. So how the fck do we fix it?

BY USING A DUMMY THAT YOU CAN CONTROL WHILE HIDING YOUR OWN CHARACTER.

Basicly, a MIND CONTROL. It IS possible for sure. So what's the deal?

- The main character becomes INVISIBLE. Not stealthed, INVISIBLE when the power is activated.
- The coding in the powerstyle needs to have an animation for the dummy/minion in it for the power. This means that you can only use THAT animation. This means that the minion COMES and the minion GOES. Perhaps mind control ain't even needed. But the minion HAS to be spawned at YOUR LOCATION. The EXACT same spot.
- Power is executed and when it ends, the main character is back and the minion is gone. There, bypassed.

Thoughts? PLEASE ONLY USEFUL COMMENTS OR MINDS THAT THINK. FCK OFF WITH YOUR "OMG GREAT IDEA" "OMG YOUR COOL" "GOOD WORK" ONLY COMMENTS. This might be a breakthrough, even if it's a long one.

it sounds like a pretty good idea. my one worry would be choppiness when switching between the dummy and the real character and vice versa.
by the way i was asking about invisibility a little while back: http://marvelmods.com/forum/index.php/topic,5694.msg111882.html#msg111882

That would work. Thanks for that link D.

I am going to try out that theory of mine this weekend. I am not a pro with animations so i will just make something simple lol. But if it does work, it could open up new options for modding.

September 10, 2012, 01:49PM #83 Last Edit: September 10, 2012, 02:33PM by BLaw
BUMP.

Back to brainstorming.

I tried to make an animated cape. To say that I did get it animated alright, but not really well rigged but I did figure out how to do it.

I opened up 64_death_hand_cape.igb with a Hexeditor. I saw these entries:

Quote
Cape_00
Cape_01
Cape_02
Cape_03

I assumed these were renamed bones. And I was correct.

I tried putting 2 physique modifiers on the same cape. One that is rigged to Bip01 which would be the upper part of the cape. The rest on Cape_00 which starts from the upper part of the cape and goes down to Cape_05. Yes Cape_05, because Cape_04 can't be rigged without Cape_05. I hid Cape_05 and started rigging.

Well that didn't work. 3ds Max crashed on me when I tried to rig with 2 physique modifiers.

I tried rigging on the same modifier, adding floating bones. That worked in max, but not in-game. Not even when I put the model itself as a bolton. The cape just wouldn't animate.

So I loaded up a new file, containing only the cape, rigged to only Cape_00 to Cape_04 with Cape_05 hidden, exported it. Bam. Worked. But my rigging wasn't flawless + it was frekkin upside down and a bit off -_-. So it started animating. I guess I figured out how to animate a cape. I guess the same way goes for making an animated wings bolton.



EDIT:


Ok discovery.

The first bone (which will be near the normal Bip01 Spine2) is called Cape_01.
The next one (a bit lower down the cape) is called Cape_02.
The next one (a bit lower down again) is called Cape_03.
And the final one is called Cape_00. Because THIS one can NOT be rigged.

And now it's animating fluently. But I am having trouble positioning. -_-

Positioning the rigged cape is a bitch. I've been on it for 2 hours straight now. Almost 3. The damn cape animates like a boss, but no matter how I position it, the frecker just won't get into the right spot. I'm done -_-

I've come back to this to play alittle, as I am wont to do every few years, like a digital salmon forlornely returning to it's spawning grounds...
Anyway, whats new this time out is my recent discovery that the sgFinalizer can process our user made models and externalize the textures, causing them to be ...err.. external, and the saved model to load said external textures.
This naturally leads me to wonder if we can do a similar trick with our "animationDB" type files, exported lo, many many moons ago.
The goal being to get the model to "read" all those "DB" files each containing a separate animation, at least in the viewer if not in the game itself.
A quick poke around in the finalizer reveals no option to "externalize" animations, only geometry or textures.
But the alchemy tool in max has options to set paths for external anims, and options to export models with external anims.
The finalizer does have a few animation related optimizations you can run on a model, but nothing I've seen yet looks promising.

To recap on the issue as I see it:
1 The game has animation files containing many animations all in one igb, which are all labelled as what they are (run, attack etc) so the game can use them.
2. We can export animations but dunno how to "label" them such that the game knows which is which, other than one at a time (ie we can export "run" OR export "menu_idle", but not both together)
3. When we do our single anim only exports, the game recognises them, ie plays the "run" labelled one for running, "menu idle" in the menu etc etc. So we are doing something right.
4. The "labelling" is done in the bottom of the actor tool in max in the "actor editor"> "animation" rollout.
5. Attempts at multiple actors each named for a single anim have as yet not worked.

that's all I have for now. It's not really much more than we knew 2 years ago..

Right, in order to ensure I don't need to experiment next time I come back in 3 years, heres some step by step with pics type instructions:


The pic above is my settings to export a single animation, "menu_idle".
The anim is @40 frames in max, and I have the time bar such that only those frames are exposed (ie frames 1-40).
I have one biped and one actor, "igActor01".
I click on the actor to select it, then in the "actor editor" of the "Alchemy dialog" I type in "menu_idle" in the "animation" field.
I have everything except "images" selected in "export settings", including "save full igb".
In "default animation" the "animation" box is selected, "animation type" is "repeat", and the "static frame #" is "1" (I think it sets the static frame itself on export)
I use the "file export" > "export as" button and name my export "01_flash.igb". Obviously the character name can be whomever you are working on. It happens to be the Flash here.
I copy/paste the 01_flash.igb into the main "actors" folder, replacing whats there already (having made a copy for safety first, of course).
Then, if I start a new game, preferably by quitting MUA to the desktop and starting again, my new "menu_idle" animation appears in the correct places:
See? Here he is in the team select screen:

And here in the game itself in the team management screen:


So far, so several years ago.
Things to note;
Still only one anim, at this point.
The actor could be named anything and it works, the critical bit is the animation name in the actor editor. If I change that to "run" and re-export, the same animation now gets played when he runs.
I can add other Actors to the scene, and give them animation names like run, menu_action or whatever, and although these names will be in the igb, visible to a hex editor, no animations play at the time the game calls those animations.
The intrinsic alchemy help file does say: "Operations such as changing skins, combining animations, and other features of the Alchemy animation system are out of the scope of this plug-in: the actor editor simply creates one igActor from the scene." as I've noted before.
Now I wonder if perhaps editing the max script for the plug-in is the way to go.
Here is the max script for the "actor_editor.ms", which I believe is what we need to alter:

--
--  $Id: actor_editor.ms,v 1.5 2002/07/30 19:12:44 ericb Exp $
--                                                                       
--          Copyright (C) 1999-2002, Intrinsic Graphics, Inc.           
--                         All Rights Reserved.                         
--                                                                       
--  UNPUBLISHED -- Rights  reserved  under  the  copyright  laws  of the
--  United States.  Use  of a copyright notice is precautionary only and
--  does not imply publication or disclosure.                           
--                                                                       
--  THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
--  OF   INTRINSIC   GRAPHICS,  INC.    ANY  DUPLICATION,  MODIFICATION,
--  DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
--  EXPRESS WRITTEN PERMISSION OF INTRINSIC GRAPHICS, INC.               
--

-----------------------------------------------------------------
--  Actor Animation Editor Helper for Intrinsic Alchemy
-----------------------------------------------------------------
rollout igActorEditor "Actor Editor" 

-----------------------------------------------------------------
--  Constant local variables
-----------------------------------------------------------------
local ACTOR_ID = "igActor"
local ACTOR_ANIMATION_NAME = "actorAnimation"

-----------------------------------------------------------------
--  Gets the name of the animation
--  Returns a new unique name if there is no user propertie
--    with the node
-----------------------------------------------------------------
function getActorAnimationName obj =
(
local name = getUserProp obj ACTOR_ANIMATION_NAME
if name != undefined then name else uniqueName(obj.name + "_Animation")
)

-----------------------------------------------------------------
--  Sets the name of the animation
-----------------------------------------------------------------
function setActorAnimationName obj name =
(
setUserProp obj ACTOR_ANIMATION_NAME name
)


-----------------------------------------------------------------
--  Current edited actor and its list of components
-----------------------------------------------------------------
local selected_object
local edit_actor
local list_actorobjects

-----------------------------------------------------------------
--  Returns the actor group if it is an actor
--  returns undefined otherwise
-----------------------------------------------------------------
function isActorGroup obj =
(
local g = getUserProp obj ACTOR_ID
if g == true then obj else undefined
)


-----------------------------------------------------------------
--  Returns the Actor group if the object is inside an actor
--  returns undefined otherwise
-----------------------------------------------------------------
function isActorObject obj =
(
local p = obj.parent
if p != undefined then isActorGroup p else undefined
)


-----------------------------------------------------------------
--  Go through an array and returns a common actor group
--    returns undefined if no common group is found
-----------------------------------------------------------------
function multipleActorSelection objs =
(
local i = objs[1]
local g = isActorGroup i
local n = if g!=undefined then g else isActorObject i

if n==undefined do return undefined

deleteItem objs 1
for i in objs do
(
g = isActorGroup i
local n2 = if g!=undefined then g else isActorObject i

if n2!=n do return undefined
)

return n
)


-----------------------------------------------------------------
--  Adds an object to an actor
-----------------------------------------------------------------
function addObjectToActor actor obj =
(
append actor.children obj
)


-----------------------------------------------------------------
--  Create an actor from the selection
-----------------------------------------------------------------
group "Create Actor"
(
button createActor "Create from selection"
)

on createActor pressed do
(
local objects = getRootSelection()

if objects.count > 0 do
(
local actor_name = uniqueName ACTOR_ID
local actor_pos = getValidPositionFromList objects
local actor = Dummy name:actor_name pos:actor_pos
setUserProp actor ACTOR_ID true

-- This will return a temporary value if the name is not set
local animation = getActorAnimationName actor
setActorAnimationName actor animation

for obj in objects do
(
addObjectToActor actor obj
)

select actor
)

)


-----------------------------------------------------------------
--  UI actor object rollout group
-----------------------------------------------------------------
group "Actor component"
(
label     label_name_child "Name: " across:2 align:#left
label     actor_object_name "" align:#left
button select_actor "Select Actor" enabled:false \
tooltip:"Select the Actor node"
)

-----------------------------------------------------------------
--  Select the actor group of this component
-----------------------------------------------------------------
on select_actor pressed do
(
if selected_object != undefined do
(
local actor = selected_object.parent
select actor
)
)

-----------------------------------------------------------------
--  UI Edit actor rollout group
-----------------------------------------------------------------
group "Actor"
(
label     label_edited_actor "Name:" across:2 align:#left
label     edited_actor "" align:#left

edittext animation_name    "Animation:" enabled:false

listbox edited_objects "Components" items:#() height:4 \
tooltip:"Double-click to select object"

button remove_obj "Remove from list" \
tooltip:"Remove object from list"
button add_obj "Add selection" \
tooltip:"Add selection to Actor components"
button select_objects "Select All" \
tooltip:"Select the Actor and its components"
)


-----------------------------------------------------------------
--  Select the double-clicked object
-----------------------------------------------------------------
on edited_objects doubleclicked cur_obj do
(
select list_actorobjects[cur_obj]
)


-----------------------------------------------------------------
--  Change the name of the animation
-----------------------------------------------------------------
on animation_name changed name do
(
if animation_name.enabled and (edit_actor != undefined) do
(
   setActorAnimationName edit_actor name
)
)


-----------------------------------------------------------------
--  Update the Edit actor rollout group
-----------------------------------------------------------------
function updateEditActor =
(
if edit_actor != undefined then
(
edited_actor.text = edit_actor.name
list_actorobjects = edit_actor.children

local items = for i in list_actorobjects collect i.name
edited_objects.items = items

animation_name.text = getActorAnimationName edit_actor
animation_name.enabled = true
)
else
(
edited_actor.text = ""
animation_name.enabled = false
animation_name.text = ""
list_actorobjects = #()
edited_objects.items = #()
)

)


-----------------------------------------------------------------
--  Add the selection to the editable actor group
-----------------------------------------------------------------
on add_obj pressed do
(
if edit_actor!=undefined do
(
local elements = getRootSelection()

for i in elements do
(
if i != edit_actor do addObjectToActor edit_actor i
)

updateEditActor()
select elements
)
)


-----------------------------------------------------------------
--  Remove the selected object from the actor group
-----------------------------------------------------------------
on remove_obj pressed do
(
if edit_actor!=undefined and edited_objects.selection>0 do
(
local element = list_actorobjects[edited_objects.selection]
element.parent = edit_actor.parent
updateEditActor()
select element
)
)


-----------------------------------------------------------------
--  Select the actor and its components
-----------------------------------------------------------------
on select_objects pressed do
(
if edit_actor!=undefined do
(
select edit_actor
selectMore edit_actor.children
)
)

-----------------------------------------------------------------
--  Enable/disable the buttons in the actor object rollout
-----------------------------------------------------------------
function enableComponentsUI b =
(
select_actor.enabled = b
)


-----------------------------------------------------------------
--  Update the rollout with current selection
-----------------------------------------------------------------
function updateRollout =
(
selected_object = undefined
enableComponentsUI(false)
actor_object_name.text = ""

-- number of selected objects
local c = selection.count
local s = getCurrentSelection()
if c > 0 do
(
local o = s[1]
local g = multipleActorSelection s

if g != undefined do
(
-- we changed actor group
if g != edit_actor do
(
edit_actor = g

-- callback for actor deleted
when edit_actor deleted obj do
(
deleteAllChangeHandlers id:#edit_actor_change
edit_actor = undefined
updateEditActor()
)

-- callback for actor renamed
when name edit_actor changes id:#edit_actor_change do updateEditActor()

updateEditActor()
)
)

-- update information for a single actor component
if c==1 do
(
local a = isActorObject o
if a != undefined do
(
actor_object_name.text = o.name
enableComponentsUI(true)
selected_object = o
)
)
)

)


-----------------------------------------------------------------
-- Update for current selection
-----------------------------------------------------------------
on igActorEditor open do updateRollout()

)  -- end rollout igActorEditor


-- vim:syntax=lace:



So I'm going to have a stab at it in the coming days.
I'll also try some other stuff too, I've some other ideas to try...see you after I fail...

Before that, a quick return to the idea of multiple bipeds, each linked to its own actor, each assigned a differing animation name, and then exported.
It doesn't work.
I've got 3 bipeds, all labelled Bip01 etc, each Bip01 is linked to its own actor and each actor has its own animation name set up for it.
For good measure, each biped is animated slightly differently so you could see which one controls the character.
Again, frustratingly, in a hex editor you can see both entries for the "extra" actor "animation_nameDB" and then the "animation_name" itself, which if I hadn't run it in-game I'd assume meant those separate animationDBs were in the folder.
And they are, as we shall see in a bit.
Nonetheless, the only anim that plays is the one attached to the "first" biped, by which I mean the one first created. The others are ignored, I think. At least they seem to be.
If I put an actual model in there, linked to igActor01, and export I can see him in the viewer, doing his "menu_idle" anim. Which I can see in-game, too, of course, when I use the model as a "skeleton" animation file ie "01_flash".
I can also see the bones of the other two bipeds doing their different animations in the viewer, and if I export with the model hidden I can see all 3 bipeds in the viewer, animating away.
But it seems the game "sees" only one animation, that attached to the first biped.
And if I try to "link" the 2 other actors to igActor01 I get an error on export. Same if I "link" it to one of them.

But, interestingly,  after the "linking" failure, then the NEXT biped and actor take over, and now the "menu_goodbye" animation is the only one playing in-game.
After some messing about I finally discover that the first biped has come "unlinked" from igActor01, which is why the anim for igActor2 or 3 gets played.
Why this is interesting is it confirms that 3 different animations are being exported into one file, each with it's own name and movements.
At the moment, only one of the three is getting "read" by the game.
What I hope to do is get two exports, one using igActor1's anim, and the other using igActor2's anim, and them compare them, and squish them together in my hands like sausages, making one huge sausage. *ahem*...
It sort of shows the multiple biped/actor idea is not without merit, entirely.



I have an idea.

The game is kinda screwy when it comes to IGBs.
I had to hex my 2 iconsets for Bane so the game sees them as unique iconsets. If I didn't do that, one wouldn't show up.

What if we use a reverse logic for animations.

- So far we can only use 1 animation per handmade skeleton. So we keep it that way and create as many as we want;
- We hex each file, changing the AnimDB (or whatever it's called) to IDNUMBER_CHARNAME (i.e. 01_blade).
- We name each skeleton file (the IGBs) to IDNUMBER_CHARNAME. BUT, we can't do that? Well, the game doesn't give a DWACK if the names look ALMOST SIMILAR. For example:

01_blade
01_blode
01_blide
01_bldde

I hope I was a bit clear with this idea.

Ooof!
Comparison is a biyotch.
I exported once with "menu_idle" as the main anim name, then, altering nothing else, simply changed that name to "menu_action" and exported again.
The resulting files are ridiculously different, right from the word go (well byte 09 actually, first 8 bytes are identical).
Theres a lot of the same stuff in different orders, which I don't get.
Bear in mind all I did was change the name of one thing, adding 2 letters to the length, and it looks like a different file completely.
See for yourself:

And it's the same the whole way through.
This does not bode well for any sort of manual cut'n'paste of animation files, unless it's some sort of fluke.
I may try a few more times tomorrow, but that avenue looks like a dead end tonight.



RE: your idea for multiple slightly changed name animation files, it's worth a shot.
I've got a few already exported single anim files that work on their own as "01_whomever.igb".
My question is, armed with a handfull of 01_flush, 01_flesh, 01_flish etc, how do I point the talent/powerset/whatever in the game towards those?