Changeset 925


Ignore:
Timestamp:
02/06/2011 05:21:35 PM (10 years ago)
Author:
dave
Message:

first pass emotional animation, inline optimisations, move to most significant emotional object

Location:
scenarios/GerminationX
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • scenarios/GerminationX/fungi/src/Fungi.hx

    r924 r925  
    2626import truffle.SpriteEntity; 
    2727import truffle.SkeletonEntity; 
     28import truffle.Bone; 
    2829 
    2930// todo: remove this 
     
    157158    var Debug:flash.text.TextField; 
    158159        var BG:Graphics; 
     160    var Emotions:Dynamic; 
    159161 
    160162        public function new(world:World, name:String, pos) 
     
    162164                super(world,pos); 
    163165        Name = name; 
     166        Speed=0.1; 
     167        UpdateFreq=5; 
     168        Hide(true); 
     169        Emotions={Love:0}; 
    164170    } 
    165171 
     
    207213                            Std.parseInt(e.tile.y))); 
    208214 
    209         LogicalPos = new Vec3(Std.parseInt(e.pos.x), 
    210                               Std.parseInt(e.pos.y), 
     215 
     216        LogicalPos = new Vec3(Std.parseInt(e.emotionalloc.x), 
     217                              Std.parseInt(e.emotionalloc.y), 
    211218                              4); 
    212219 
    213         var ee = e.emotions.content; 
     220        Emotions = e.emotions; 
     221 
     222        var ee = e.fatemotions.content; 
    214223        var mood=Std.parseFloat(ee[0].content[0]); 
    215224 
     
    223232 
    224233        text+="Actions:\n"; 
    225         var acs = cast(e.actions,Array<Dynamic>); 
     234        var acs = cast(e.fatactions,Array<Dynamic>); 
    226235        for (i in 0...acs.length) 
    227236        { 
    228             text+=acs[i]+"\n"; 
     237            text+=acs[i].msg+"\n"; 
    229238        } 
    230239 
     
    245254 
    246255        //trace(text); 
     256    } 
     257 
     258    override function Update(frame:Int, world:World) 
     259    { 
     260        if (Emotions!=null) 
     261        { 
     262            //Draw(cast(world,truffle.World)); 
     263            var c=this; 
     264            Root.Recurse(function(b:Bone,depth:Int)  
     265            { 
     266                b.SetRotate(15*Math.sin( 
     267                    (((10-depth)+frame*0.04)*c.Emotions.Love) + 
     268                    (world.MyRndGen.RndFlt()*45*c.Emotions.Hate) 
     269                ));                 
     270            }); 
     271        } 
     272        super.Update(frame,world); 
    247273    } 
    248274} 
     
    526552                for (p in data) 
    527553                { 
    528                     var e = c.Get(new Vec2(p.pos.x,p.pos.y)); 
    529                     if (!Std.is(e,Plant)) 
     554                    var worldpos = new Vec2(p.pos.x,p.pos.y); 
     555                    var e = c.Get("Plant",worldpos); 
     556                    if (e==null) 
    530557                    { 
    531                         var pos = new Vec3(p.pos.x,p.pos.y,e.LogicalPos.z+1);    
    532                         var plant = new Plant(c,p.owner,pos,p.type,p.state); 
    533                         c.Plants.push(plant);                         
     558                        //trace("making new plant"); 
     559                        var cube = c.Get("Cube",worldpos); 
     560                        if (cube!=null) 
     561                        { 
     562                            var pos = new Vec3(p.pos.x,p.pos.y,cube.LogicalPos.z+1);    
     563                            var plant = new Plant(c,p.owner,pos,p.type,p.state); 
     564                            c.Plants.push(plant); 
     565                        } 
    534566                    } 
    535567                    else 
    536568                    { 
    537569                        //trace("updating plant"); 
     570                        //trace(e); 
     571                        //trace(p.state); 
    538572                        cast(e,Plant).StateUpdate(p.state,c); 
    539573                    } 
  • scenarios/GerminationX/fungi/src/truffle/Entity.hx

    r924 r925  
    2525    public var NeedsUpdate:Bool;  
    2626    public var Hidden:Bool; 
    27                  
     27    public var Speed:Float; 
     28    public var UpdateFreq:Int; 
     29         
    2830        public function new(w:World,pos:Vec3)  
    2931        { 
     
    3234        TilePos = null; 
    3335        Depth = Pos.z; 
     36        Speed = 0; 
     37        UpdateFreq=0; 
    3438        NeedsUpdate=false; 
    3539        w.Add(this); 
     
    5761        public function Update(frame:Int, world:World) 
    5862        { 
    59         Pos = Pos2PixelPos(LogicalPos); 
     63        if (Speed==0) 
     64        { 
     65            Pos = Pos2PixelPos(LogicalPos); 
     66        } 
     67        else 
     68        { 
     69            var Dst = Pos2PixelPos(LogicalPos); 
     70            if (!Dst.Eq(Pos)) 
     71            { 
     72                Pos = Pos.Lerp(Dst,Speed); 
     73            } 
     74        } 
     75 
    6076        Depth = Pos.z; 
    6177        } 
  • scenarios/GerminationX/fungi/src/truffle/SkeletonEntity.hx

    r905 r925  
    133133        { 
    134134        super.Update(frame,world); 
    135  
    136         //Root.SetRotate(25*Math.sin(frame*0.04)); 
    137         //Draw(cast(world,truffle.World)); 
    138  
    139         //UpdateDepth(); 
    140         var c=this; 
    141  
    142         Root.Recurse(function(b:Bone,depth:Int)  
    143         { 
    144             b.SetRotate(15*Math.sin((10-depth)*0.58+frame*(0.04+0.01*c.Id))); 
    145         } 
    146         ); 
    147  
    148135        Root.SetPos(new Vec2(Pos.x,Pos.y)); 
    149136        Root.Update(frame,null); 
  • scenarios/GerminationX/fungi/src/truffle/Vec2.hx

    r814 r925  
    2121        public var y:Float; 
    2222         
    23         public function new(px:Float, py:Float) 
     23        public inline function new(px:Float, py:Float) 
    2424        { 
    2525                x=px; y=py; 
    2626        } 
    2727         
    28         public function Add(other:Vec2) : Vec2 
     28        public inline function Add(other:Vec2) : Vec2 
    2929        { 
    3030                return new Vec2(x+other.x,y+other.y); 
    3131        } 
    3232 
    33         public function Sub(other:Vec2) : Vec2 
     33        public inline function Sub(other:Vec2) : Vec2 
    3434        { 
    3535                return new Vec2(x-other.x,y-other.y); 
    3636        } 
    3737 
    38         public function Div(v:Float) : Vec2 
     38        public inline function Div(v:Float) : Vec2 
    3939        { 
    4040                return new Vec2(x/v,y/v); 
    4141        } 
    4242 
    43         public function Mul(v:Float) : Vec2 
     43        public inline function Mul(v:Float) : Vec2 
    4444        { 
    4545                return new Vec2(x*v,y*v); 
    4646        } 
    4747 
    48         public function Mag() : Float 
     48        public inline function Mag() : Float 
    4949        { 
    5050                return Math.sqrt(x*x+y*y); 
    5151        } 
    5252         
    53         public function Lerp(other:Vec2,t:Float) : Vec2 
     53        public inline function Lerp(other:Vec2,t:Float) : Vec2 
    5454        { 
    5555                return new Vec2(x*(1-t) + other.x*t, 
     
    5757        } 
    5858 
    59         public function Eq(other:Vec2) : Bool 
     59        public inline function Eq(other:Vec2) : Bool 
    6060        { 
    6161                return x==other.x && y==other.y; 
    6262        } 
    6363 
    64     public function AsStr() 
     64    public inline function AsStr() 
    6565    { 
    6666        return Std.string(x)+", "+Std.string(y); 
  • scenarios/GerminationX/fungi/src/truffle/Vec3.hx

    r814 r925  
    2222        public var z:Float; 
    2323         
    24         public function new(px:Float, py:Float, pz:Float) 
     24        public inline function new(px:Float, py:Float, pz:Float) 
    2525        { 
    2626                x=px; y=py; z=pz; 
    2727        } 
    2828         
    29         public function Add(other:Vec3) : Vec3 
     29        public inline function Add(other:Vec3) : Vec3 
    3030        { 
    3131                return new Vec3(x+other.x,y+other.y,z+other.z); 
    3232        } 
    3333 
    34         public function Sub(other:Vec3) : Vec3 
     34        public inline function Sub(other:Vec3) : Vec3 
    3535        { 
    3636                return new Vec3(x-other.x,y-other.y,z-other.z); 
    3737        } 
     38 
     39        public inline function Mul(v:Float) : Vec3 
     40        { 
     41                return new Vec3(x*v,y*v,z*v); 
     42        } 
     43 
     44        public inline function Div(v:Float) : Vec3 
     45        { 
     46                return new Vec3(x/v,y/v,z/v); 
     47        } 
    3848         
    39         public function Mag() : Float 
     49        public inline function Mag() : Float 
    4050        { 
    4151                return Math.sqrt(x*x+y*y+z*z); 
    4252        } 
     53 
     54    public inline function Normalise() : Vec3 
     55    { 
     56        return Div(Mag()); 
     57    } 
    4358         
    44         public function Lerp(other:Vec3,t:Float) : Vec3 
     59        public inline function Lerp(other:Vec3,t:Float) : Vec3 
    4560        { 
    4661                return new Vec3(x*(1-t) + other.x*t, 
     
    4964        } 
    5065 
    51         public function Eq(other:Vec3) : Bool 
     66        public inline function Eq(other:Vec3) : Bool 
    5267        { 
    5368                return x==other.x && y==other.y && z==other.z; 
    5469        } 
    5570 
    56     public function AsStr() 
     71    public inline function AsStr() 
    5772    { 
    5873        return Std.string(x)+", "+Std.string(y)+", "+Std.string(z); 
  • scenarios/GerminationX/fungi/src/truffle/flash/FlashSprite.hx

    r924 r925  
    216216        public function Update(frame:Int, tx:Dynamic) 
    217217        { 
     218        // we don't want to pass on the centering offset to the hierachy 
    218219        Transform.identity();         
    219         // we don't want to pass on the centering offset to the hierachy 
    220220        var tmp = new Matrix(Transform.a,Transform.b,Transform.c,Transform.d, 
    221221           Transform.tx-Centre.x,Transform.ty-Centre.y); 
     
    237237        } 
    238238        transform.matrix = tmp; 
     239 
     240        //transform.matrix = Transform; 
     241        //x=x-Centre.x; 
     242        //y=y-Centre.y; 
    239243        } 
    240244} 
  • scenarios/GerminationX/fungi/src/truffle/flash/FlashWorld.hx

    r924 r925  
    5050    } 
    5151 
    52     public function Get(p:Vec2) : Dynamic 
     52    public function Get(type:String, p:Vec2) : Dynamic 
    5353    { 
    54         var top:Entity = null; 
    55         var upper:Float=-9999; 
    56  
    5754        for (e in Scene) 
    5855        { 
    5956            if (p.x==e.LogicalPos.x && 
    60                 p.y==e.LogicalPos.y) 
     57                p.y==e.LogicalPos.y && 
     58                Type.getClassName(Type.getClass(e))==type) 
    6159            { 
    62                 if (e.LogicalPos.z>upper) 
    63                 { 
    64                     top=e; 
    65                     upper=e.LogicalPos.z; 
    66                 } 
     60                return e; 
    6761            } 
    6862        } 
    69         return top; 
     63        return null; 
    7064    } 
    7165 
     
    123117            } 
    124118 
    125             if (e.NeedsUpdate && !e.Hidden) 
     119            if (e.NeedsUpdate && !e.Hidden && 
     120                (e.UpdateFreq==0 || 
     121                (time % e.UpdateFreq)==0)) 
    126122            { 
    127123                e.Update(time,cast(this,truffle.World)); 
  • scenarios/GerminationX/fungi/src/truffle/interfaces/World.hx

    r924 r925  
    2323    public function Add(e:Entity) : Void; 
    2424    public function Remove(e:Entity) : Void; 
    25     public function Get(p:Vec2) : Dynamic; 
     25    public function Get(type:String, p:Vec2) : Dynamic; 
    2626    public function AddSprite(s:Sprite) : Void; 
    2727    public function RemoveSprite(s:Sprite) : Void; 
  • scenarios/GerminationX/oak/run.sh

    r923 r925  
    11java -classpath $( echo lib/*.jar . | sed 's/ /:/g'):src clojure.main src/oak/core.clj & 
    2 sleep 30 
     2sleep 40 
    33echo starting agents... 
    44java -cp lib/FAtiMA.jar FAtiMA.Agent localhost 46874 false CanopySpirit F CanopySpirit CanopySpirit strength:4 hurt:false pose:standing & 
  • scenarios/GerminationX/oak/src/oak/game_world.clj

    r923 r925  
    176176                             "owner" (:layer entity) 
    177177                             "position" (str (:x (:pos entity)) "," (:y (:pos entity))) 
    178                              "tile" "0,0" 
     178                             "tile" (:pos tile) 
    179179                             "type" "object" 
    180180                             "time" time})) 
     
    182182     fw 
    183183     (:entities tile))) 
    184    fatima-world 
     184   ; update the agent's tile position 
     185   (merge fatima-world 
     186          {:agents 
     187           (map 
     188            (fn [agent] 
     189              (merge agent 
     190                     {:tile 
     191                      (:tile 
     192                       (find-spirit game-world (remote-agent-name agent)))})) 
     193            (world-agents fatima-world))}) 
    185194   (:tiles game-world))) 
    186195 
  • scenarios/GerminationX/oak/src/oak/io.clj

    r923 r925  
    3535(defn parse-number [s] 
    3636  (try (Integer/parseInt (.trim s)) 
     37       (catch NumberFormatException e nil))) 
     38 
     39(defn parse-float [s] 
     40  (try (Float/parseFloat (.trim s)) 
    3741       (catch NumberFormatException e nil))) 
    3842 
  • scenarios/GerminationX/oak/src/oak/remote_agent.clj

    r917 r925  
    1414 
    1515(ns oak.remote-agent 
    16   (:use oak.io) 
     16  (:use 
     17   oak.vec2 
     18   oak.io) 
    1719  (:import 
    1820   java.net.Socket 
     
    3638  :done 
    3739  :random 
    38   :reader) 
     40  :reader 
     41  :tile) 
    3942 
    4043(def remote-agent-properties (accessor remote-agent :properties)) 
     
    4952(def remote-agent-random (accessor remote-agent :random)) 
    5053(def remote-agent-reader (accessor remote-agent :reader)) 
     54(def remote-agent-tile (accessor remote-agent :tile)) 
    5155 
    5256(defn remote-agent-add-property [agent property] 
     
    7983     (new java.util.Random) 
    8084     reader 
     85     (make-vec2 0 0) 
    8186     ))) 
    8287 
  • scenarios/GerminationX/oak/src/oak/spirit.clj

    r923 r925  
    2929   name 
    3030   emotions 
    31    actions]) 
     31   emotionalloc 
     32   fatactions 
     33   fatemotions]) 
     34 
     35(defn emotion-map [] 
     36  { "Love" 0 
     37    "Hate" 0 
     38    "Hope" 0 
     39    "Fear" 0 
     40    "Satisfaction" 0 
     41    "Relief" 0 
     42    "Fears-Confirmed" 0 
     43    "Disappointment" 0 
     44    "Joy" 0 
     45    "Distress" 0 
     46        "Happy-For" 0 
     47        "Pitty" 0 
     48        "Resentment" 0 
     49        "Gloating" 0 
     50    "Pride" 0 
     51        "Shame" 0 
     52        "Gratification" 0 
     53        "Remorse" 0 
     54        "Admiration" 0 
     55        "Reproach" 0 
     56        "Gratitude" 0 
     57        "Anger" 0 }) 
    3258 
    3359(defn make-spirit [remote-agent] 
     
    3763   (make-vec2 0 0) 
    3864   (remote-agent-name remote-agent) 
     65   (emotion-map) 
     66   (make-vec2 0 0) 
    3967   '() '())) 
    4068 
     
    4977(defn spirit-update [spirit remote-agent tile] 
    5078; for the moment take a straight copy of actions and emotions 
    51   (let [spirit (modify :emotions 
    52                        (fn [emotions] 
    53                          (remote-agent-emotions remote-agent)) 
    54                        (modify :actions 
    55                                (fn [actions] 
    56                                  (remote-agent-done remote-agent)) 
    57                                spirit))] 
     79  (let [spirit 
     80        (modify 
     81         :emotionalloc ; get the object causing the highest emotion 
     82         (fn [emotionalloc] 
     83           (first 
     84            (reduce 
     85             (fn [r emotion] 
     86               (let [e (:attrs emotion)] 
     87                 (if e 
     88                   (let [intensity (parse-float (:intensity e))] 
     89                     (if (> intensity (second r)) 
     90                       (let [id (fatima-name->id (:direction e))] 
     91                         (if id 
     92                           (let [obj (tile-find-entity tile id)] 
     93                             (if obj 
     94                               (list (:pos obj) intensity) 
     95                               r)) 
     96                           r)) 
     97                       r)) 
     98                   r))) 
     99             (list emotionalloc 0) 
     100             (:content (remote-agent-emotions remote-agent))))) 
     101         (modify 
     102          :emotions ; process emotions into a useable form 
     103          (fn [emotions] 
     104            (reduce 
     105             (fn [r emotion] 
     106               (let [e (:attrs emotion)] 
     107                 (if e 
     108                   (merge r {(:type e) 
     109                             (+ (parse-float (:intensity e)) 
     110                                (get r (:type e)))}) 
     111                   r))) 
     112             (emotion-map) 
     113             (:content (remote-agent-emotions remote-agent)))) 
     114          (modify 
     115           :fatemotions ; copy the fatima stuff for debug output 
     116           (fn [emotions] 
     117             ;(println emotions) 
     118             (remote-agent-emotions remote-agent)) 
     119           (modify 
     120            :fatactions 
     121            (fn [actions] 
     122              (remote-agent-done remote-agent)) 
     123            spirit))))] 
     124     
     125;    (println (:emotionalloc spirit)) 
    58126     
    59127    ; if we have some actions 
    60     (if (not (empty? (:actions spirit))) 
    61       (let [latest-action (first (:actions spirit)) 
     128    (if (not (empty? (:fatactions spirit))) 
     129      (let [latest-action (first (:fatactions spirit)) 
    62130            latest-subject (nth (.split (:msg latest-action) " ") 1) 
    63131            id (fatima-name->id latest-subject)] 
  • scenarios/GerminationX/oak/src/oak/world.clj

    r923 r925  
    1717   oak.forms 
    1818   oak.remote-agent 
    19    oak.io) 
     19   oak.io 
     20   oak.vec2) 
    2021  (:import 
    2122   java.util.ArrayList 
     
    141142    (do 
    142143      (world-broadcast-all world (str "ENTITY-ADDED " (get object "name"))) 
    143       (println (str "added " (get object "name") " " (get object "position") " " 
     144      (comment println (str "added " (get object "name") " " (get object "position") " " 
    144145                    (count (world-objects world)) " objects stored")) 
    145146      (merge world {:objects (cons object (world-objects world))})) 
     
    194195     (= type "look-at") 
    195196     (do 
    196        ;(println (str (remote-agent-name agent) " -----------> LOOKING AT: " (nth toks 1))) 
    197        (send-msg (remote-agent-socket agent) 
    198                  (str "LOOK-AT " (nth toks 1) " " 
    199                       (hash-map-to-string 
    200                        (world-get-properties world (nth toks 1))))) 
    201        (merge agent {:done (max-cons {:time (world-time world) 
    202                                       :msg msg} 
    203                                      (remote-agent-done agent) 4)})) 
     197       (let [object-name (nth toks 1)] 
     198         ;(println (remote-agent-tile agent)) 
     199         ; is the agent on the same tile as the object? 
     200         (if (vec2-eq? (remote-agent-tile agent) 
     201                       (get (world-get-object world object-name) "tile")) 
     202           (do 
     203             (send-msg (remote-agent-socket agent) 
     204                       (str "LOOK-AT " object-name " " 
     205                            (hash-map-to-string 
     206                             (world-get-properties world (nth toks 1))))) 
     207             (merge agent {:done (max-cons {:time (world-time world) 
     208                                            :msg msg} 
     209                                           (remote-agent-done agent) 4)})) 
     210           agent))) 
    204211     (= type "say") 
    205212     (do (println "say") 
Note: See TracChangeset for help on using the changeset viewer.