User Projects and Ideas - Island of the Damned - Alpha1

uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
31 July 2009 17:50:07
I don't know why it keeps asking to install the player. It did even in my computer. I figured it out that the system "supposed" that I had the version 3.0.8
I had to set manually the minimum player requirements in the Setting as 3.0.0. So if it tries to install the player, that means that your system is configured to "think" to have a lower version installed as default player. Sounds crazy but I think it's a registry issue related to several DxStudio installation (I myself have several version of DxStudio for dev-wise reasons).
I attach here the encrypted dxstudio file. Place it in the same directory as the exe.
damned_alpha1c.dxstudio
LF
Freeware Edition
Joined 27 April 2009
31 July 2009 17:52:30
Really Cool! You now got a +1 from me
Funkas
Non-Commercial Pro Edition
Joined 28 February 2008
31 July 2009 17:56:03
Second life for ocean effect, heh?
It looks quite promising IMO. Very nice
JimmDaBimm
Non-Commercial Pro Edition
Joined 25 May 2008
31 July 2009 19:28:24
*arrrr* rapidshare don't let me download it.. i have to wait two more minutes. But the screens looking really promising
Funkas
Non-Commercial Pro Edition
Joined 28 February 2008
31 July 2009 19:48:16
I saw only the screens too. My Opera browser is 100% incompatible with DX Studio, but it should to be so.
Johan L
Freeware Edition
Joined 18 July 2009
31 July 2009 20:36:54
Ah that looks cool. I loved those kind of games... Flashback brings back memories.
I only looked at the screens aswell I DL it but I can't seem to run it. (just keeps wanting to install DX studio evertime I run it)

Keep it up, hope to see more of it
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
31 July 2009 20:44:28
thanks LF!

@Funkas
Lucky for you it's not a web-based demo, it's an exe.
Carl
Non-Commercial Pro Edition
Joined 26 July 2007
31 July 2009 21:27:17
I'm getting the same problem as Johan, it just keeps wanting to install the player even though I have the latest version installed.
Funkas
Non-Commercial Pro Edition
Joined 28 February 2008
31 July 2009 21:32:16
Same here.
MiKo
Commercial Pro Edition
Joined 07 September 2008
31 July 2009 22:52:02
Downloaded. And it worked for me.
I truly hope you can maintain the graphics quality when using own/other models.
It is a real eye-cathcer as it is now...
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
31 July 2009 23:59:51
I don't know why it keeps asking to install the player. It did even in my computer. I figured it out that the system "supposed" that I had the version 3.0.8
I had to set manually the minimum player requirements in the Setting as 3.0.0. So if it tries to install the player, that means that your system is configured to "think" to have a lower version installed as default player. Sounds crazy but I think it's a registry issue related to several DxStudio installation (I myself have several version of DxStudio for dev-wise reasons).
I attach here the encrypted dxstudio file. Place it in the same directory as the exe.
damned_alpha1c.dxstudio
Johan L
Freeware Edition
Joined 18 July 2009
01 August 2009 00:46:11
ok that works and it looks cool
I also have an older version installed so thats probably it then.
JimmDaBimm
Non-Commercial Pro Edition
Joined 25 May 2008
01 August 2009 00:53:09
I got the installer issue too. But yes, great work ! Keep it up .
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
01 August 2009 01:07:40
thanks guys for your kind words. If you are a modeler, consider a collab

something strange happened with the forum and my first post has been substituted by my last one. I hope some admin or moderator could solve the issue (I actually spent some time to write that thing and place the images).
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
01 August 2009 07:50:32
sorry to bump but I cannot modify anymore the first post of the topic. I really don't know why. I'm logged in but no editing button appears in the first post. If the admins cannot restore it I have to re-create another post from scratch .
Uwe Z
Non-Commercial Pro Edition
Joined 04 June 2009
01 August 2009 08:03:31
@uomoartificale - AFAIK, you can only edit your last posting, before the next one writes a reply.
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
01 August 2009 08:07:01
I see, but weirdly my second post got somehow into the first one
Funkas
Non-Commercial Pro Edition
Joined 28 February 2008
01 August 2009 09:44:15
My experince is, when you use some times 'prvious' and 'next' arrow of the browser, and accidentaly click also 'send' button in the forum, you are about to surely lose the control about your postings.
Carl
Non-Commercial Pro Edition
Joined 26 July 2007
01 August 2009 09:48:06
The .dxstudio file works for me. So far so good I'd say, how do you plan to expand it further? It does have a lot of potential though.
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
01 August 2009 10:17:18
Some thoughts about where to go from here:

1) make the controls tighter. That's what I tried to achieve with the initial step before the run. If you just press forward for a sec, then anyway the character makes a whole step forward. So if you press repetedly the forward key, the character doesn't stutter. If you are on a edge and press forward, your character falls. Same goes for the jump (whose code I reworked better after the alpha), you can notice that the character actually step forward when he lands.
I think that the controls are tight enough, then the gameplay has to reward the player who uses correctly the controls, and the opposite holds true as well. That's the lesson learned from flashback and those other great adventure platformers.

2) Extend the navigation capabilities of the player. I would like to have a player swinging himself and climbing the level. That's hard to do in 3d, but I have some ideas to implement a jump-swing-climb system. The problem is that my animation library is made for sword combat so my jump animations are not that good. Smooth animation for me is the key of a good looking game. Metal Gear Solid 2 still looks great today, even if you notice those really low-res textures and rough polygons. Again, joining together this smoothness with gameplay is the second lessons learned from those games (PoP on the top of the list).

3) puzzle creation. The player should recognize the puzzling device in the level (just like the floor triggers or the protruding blades in PoP) and activate them with the right timing. The more the timing is right, the more the game should be rewarding. This could be a lot of fun with a modern physics engine, such PhysiX, but it could be tricky. Definitely we should need more control over the physics, so maybe I should start wth something simple, like moving crates to climb spots difficult to reach, place them of triggers... and so on.

4) a more complex sword fight system. But this is on the bottom of the list because it's complex, envolves an heavy work on AI code and, if the other points are met, it could be distracting. I mean, the game should be more on exploration than fight and the undead guards are perfect for a justified poor AI.

thanks for challenging me to clarify my intentions

P.S. for those who missed: I reposted the links here.
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
01 August 2009 21:26:57
A video showing the basics of jumping swinging climbing.
Notice that the character naturally automatically falls forward when his steps are out of the platform.
I'm bettering off the animations.

climb_basics.zip
Carl
Non-Commercial Pro Edition
Joined 26 July 2007
01 August 2009 21:57:27
Looking real good, look forward to giving this a try. How are you handling the hanging? I assume your using character physics so I'm curious as to how you managed to have such control over it?

Btw check your PM.
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
03 August 2009 14:41:24
@Carl
you have PM too

I detect through a collision the presence of hang spot (an invisible geometry works as a trigger) Then I disable physics on the character and create a sequence on-the-fly via script getting the hang spot coordinates, its rotation and other stuff. The sequence is played and the character is aligned to the hang spot in 0.2 seconds, so you can't tell the physics has been suspended. A similar things happen for the climbing part. when the sequence is over physics is enabled again.
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
17 August 2009 00:24:13
I made several changes, also in the direction of the competition theme. I wanted to post a video about all of them just to tease someone to help me with the level art, instead I'm here showing my latest and maybe more instable addition: bow physics!
About the teasing: level designer I know you are out there!
Screenshots:


I tested a bit the possibily DXSTudio offers to make a physics based platformer, and the engine is fully packed of physical goodies - no doubt about it. Still, somehow they are not ready-hand: using the joints is still a pain, so no rope physics. hinges and point constraints cannot be easily limited in rotations, so no door physics. The PhysX character container it's a special physical entity that reacts weirdly with the other physical objects... and so on, you know the rhyme.

I thought I needed a physical device and here it is: a bow. For combat and puzzles. The arrow physics is still problematic, as you will see, but the basics are there. There's still no interaction between the arrow and the other entities (no damage or other reactions).
Look at how the archer follow the mouse-driven crosshair. The more you aim, the harder he shoots...
I will post something else about the other features I developed so far in the next few days.

Download video:
test.zip (the video uses the XVID codec)
BUnzaga
Commercial Pro Edition
Joined 07 June 2006
17 August 2009 21:47:53
For the arrow collision, you could try attaching a sphere collider object to the tip of the arrow, then use the onCollisionBegin and 'visit' the _otherObjectId to decide how to handle the collision...
//arrow 'tip' collider object
function onCollisionBegin(_otherId){
      objects[_otherId].script.collideWith(this.object);
}

//an object such as a crate
function collideWith(_otherObject){
    switch(_otherObject.type){
        case "arrowTip":
                //explode
        break;
    }
}
BUnzaga
Commercial Pro Edition
Joined 07 June 2006
17 August 2009 21:51:58
Dude. That is a pretty damn cool video. I think for your arrow, you need to start with the end point and work backwards to determine the velocity, angle, etc.

I don't know the first thing on how do to this, as my geometry math sucks, but this is how I would do it. That was so cool how he grabbed onto the edge of the platform. I liked it a lot. :p

It reminds me a little of one of my ideas.
Seminus
Non-Commercial Pro Edition
Joined 08 July 2007
18 August 2009 08:11:59
damn cool video! This reminds me of Trine: http://trine-thegame.com/site/

Can't wait to see more
Aran
Non-Commercial Pro Edition
Joined 18 April 2009
18 August 2009 10:01:42
@uomoartificiale:
Nice work, I like the screen shots & video.
By the way, the game reminds me of Monkey Island / the old 2D Prince of Persia's a lot, not sure why

@Seminus:
That looks very similar too :O
BUnzaga
Commercial Pro Edition
Joined 07 June 2006
18 August 2009 14:39:34
Hey uomoartificiale, would you be willing to email me how you did the grabbing onto the platform? If not, I understand.
Carl
Non-Commercial Pro Edition
Joined 26 July 2007
18 August 2009 15:06:21
@BUnzaga, he explained this back at post Monday, August 03, 2009 2:41:24 PM

Loving the recent video, the game is coming along very nicely. I can't wait to try it out.
BUnzaga
Commercial Pro Edition
Joined 07 June 2006
18 August 2009 15:54:37
Awesome Carl, I had missed that.

Is the collider on the platform, or the character? or both? or attacked to a bone?

It is a very neat effect.
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
18 August 2009 23:18:17
I prepared two things: a video showing some gameplay of the features developed so far and a demo about the grabbing/climbing code. For the latter I stripped down the game at the bare minimum to let you see the important parts. Still it's quite messy so hang up with me for some explanation in order to understand what's happening behind the curtains.

Here's the video:gs2.zip

It shows enemy AI, sword combat techniques (such as blocking, slashing, kicking), jumping-hanging-climbing, destructible entities (the enemy is destructible too!), revised bow physics, piercing arrows, bow combat.
A note about the bow/arrow physics. See how the arrows are piercing the objects and sticking in them. Sometimes it is buggy, yet it has improved a lot. I think it's a feature quite satisfying to see in a game like this. The bow physics is a mix between the original physX you could see in my previous video and some code I wrote to correct the arrow trajectory in order to fake the air viscosity and the mass offset. Practically I check for the vertical posVelocity to force the rotation of the arrow: if the arrow is going up it has to point upwards, if it is going down it has to point downward. Just that.


2) Here's the demo:grab_demo.zip
Look at onUpdate. The first part is what makes my character moving forward and backward, rotate and such. Then quite at the end there's this block:

if(climb)
    {
        //var myTrig = false;
        if(climb_time < object.animationGetDuration("swing")/object.animationSpeed)
        {
            wantAnim = "swing";
        }
        else
        {
            wantAnim = "swing_idle";    


            if((keys.up) && (!ClimbUp))
            {
                ManageRealtimeSound("player_climb2");

                object.animationSpeed = animSpeed *1.3;
                ClimbUp = true;
                object.physics.enable = true;
                up_time = 0;
                var seq = new Sequence("climbup", 0.6);
                if( (objects.find(climb_obj).rot.eulerY > 90) || (objects.find(climb_obj).rot.eulerY < -90) )
                {
                    seq.createKeyframe(0.2, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(climb_obj).posWorld.x) + "' y='" + (objects.find(climb_obj).posWorld.y-1.5) + "' z='" + (objects.find(climb_obj).posWorld.z) + "'/>");
                    seq.createKeyframe(0.4, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(climb_obj).posWorld.x) + "' y='" + (objects.find(climb_obj).posWorld.y) + "' z='" + (objects.find(climb_obj).posWorld.z-0.5) + "'/>");
                    seq.createKeyframe(0.6, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(climb_obj).posWorld.x) + "' y='" + (objects.find(climb_obj).posWorld.y+1.2) + "' z='" + (objects.find(climb_obj).posWorld.z-1.5) + "'/>");
                }
                else
                {
                    seq.createKeyframe(0.2, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(climb_obj).posWorld.x) + "' y='" + (objects.find(climb_obj).posWorld.y-1.5) + "' z='" + (objects.find(climb_obj).posWorld.z) + "'/>");
                    seq.createKeyframe(0.4, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(climb_obj).posWorld.x) + "' y='" + (objects.find(climb_obj).posWorld.y) + "' z='" + (objects.find(climb_obj).posWorld.z+0.5) + "'/>");
                    seq.createKeyframe(0.6, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(climb_obj).posWorld.x) + "' y='" + (objects.find(climb_obj).posWorld.y+1.2) + "' z='" + (objects.find(climb_obj).posWorld.z+1.5) + "'/>");
                }

                object.sequencePlay(seq);
            }

            if((keys.down) && (!ClimbUp))
            {
                ManageRealtimeSound("player_climb1");

                object.physics.enable = true;
                climb = false;
                climb_obj = "none";
                falling_time = 0;
                falling_damage = false;
                falling = true;

            }
        }
        if(ClimbUp)
        {
            wantAnim = "climb";    
            
            if( up_time >= 0.6 )
            {
                climb = false;
                
                falling_time = 0;
                falling_damage = false;
                falling = false;
                object.animationSpeed = animSpeed;
                
                if( (objects.find(climb_obj).rot.eulerY > 90) || (objects.find(climb_obj).rot.eulerY < -90) )
                {
                    facing_direction = 180;
                    moveState = "backward";

                }
                else
                {
                    facing_direction = 0;
                    moveState = "forward";
                }
                climb_obj = "none";

            }
            
            up_time += system.timerDelta;

        }
    
        climb_time += system.timerDelta;
            
    }

this part of the code is responsible for the climbing part, when you are hanging,then you decide if climb or let you fall using the up and down keys. I start explaining from here because it more simple to understand it as state in which the character hangs in the air, introduced by a introduction and an exit.
This is the hanging state. Physis is disabled. Pratically it starts the section playing the swing animation then idles on the swing_idle animation wainting for input. If you press the up key, the ClimbUp var is set to true, and a sequence is crated on the fly getting the rotation data from the climb spot object. My game is two dimensional so I have only two possible orientation on the Y axis 180 or zero. The coordinates of the climbing should get the player right on the platform in the animation time. Then physics is re-enabled.
But how do I get there? ok, look at the onCollision function. To get this result you have play a bit with the collision notification types in order to make the engine get only the collisions you want and forget about the rest. We are interested in the collisions with the yellow bricks.

function onCollision(objectId)
{
    var myObj = objects.find(objectId);    

    if( (myObj.type == "climb_spot") && (system.timer - last_impact_time > 2) ) 
    {
        if( (objects.find(objectId).rot.eulerY > 90) || (objects.find(objectId).rot.eulerY < -90) )
        {
            if(facing_direction == 180)
            {
                Climb(objectId);
                last_impact_time = system.timer;
            }
        }
        else
        {
            if(facing_direction == 0)
            {
                Climb(objectId);
                last_impact_time = system.timer;
            }
        }
    }

    myObj  = null;
        
}

last_impact_time is set to avoid the character caching again the hanging spot right after it has fallen. You can see that the script checks the right orientation for the flayer (again, my game has only to direction) then pass the objectId name to a function called Climb.
The function Climb is the introduction I was referring to before. It disables physics and creates a sequence to place the character in the right position in respect to the climb_spot.

function Climb(objID)
{
    if(climb_obj != objID)
    {
        climb_obj = objID;
        object.physics.enable = false;
        
        climb = true;
        climb_time = 0;
        up_time = 0;
        ResetStates();
        
//        object.pos = objects.find(objID).pos;
        //create a sequence to make the player grab the climb spot
        var seq = new Sequence("grabin", 0.2);
        
        if( (objects.find(climb_obj).rot.eulerY > 90) || (objects.find(climb_obj).rot.eulerY < -90) )
        {
            facing_direction = 180;
            moveState = "backward";
            seq.createKeyframe(0.2, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(objID).posWorld.x) + "' y='" + (objects.find(objID).posWorld.y-2.6) + "' z='" + (objects.find(objID).posWorld.z+0.5) + "'/>");
            seq.createKeyframe(0.2, "<prop id='rot' type='quaternion' tweenin='linear' x='0' y='1' z='0' w='-4.371139E-08' />");                
        }
        else
        {
            facing_direction = 0;
            moveState = "forward";
            seq.createKeyframe(0.2, "<prop id='pos' type='vector' tweenin='stepped' x='" + (objects.find(objID).posWorld.x) + "' y='" + (objects.find(objID).posWorld.y-2.6) + "' z='" + (objects.find(objID).posWorld.z-0.5) + "'/>");
            seq.createKeyframe(0.2, "<prop id='rot' type='quaternion' tweenin='linear' x='0' y='0' z='0' w='1'  />");        
        }    

        ManageRealtimeSound("player_climb1");

        object.sequencePlay(seq);    
    }
    
}

the script set the climb variable to true and let the sequence start. The cycle is complete, we are in the climb section of the onUpdate function once again.

Hope you enjoy it.
Thom Parkin
Non-Commercial Pro Edition
Joined 18 April 2009
19 August 2009 01:52:34
Simply B R I L L I A N T !!!
Seminus
Non-Commercial Pro Edition
Joined 08 July 2007
19 August 2009 07:55:36
this is just fantastic I would give you a +1 if I didnt allready.
Thanks for sharing this with us and I can't wait to see more.
tyree
Freeware Edition
Joined 21 September 2007
19 August 2009 11:16:12
I just watched your video thats the first respectable game I have seen in dx that used characters.
Aran
Non-Commercial Pro Edition
Joined 18 April 2009
19 August 2009 13:07:34
@uomoartificiale:
Can't wait till you release the full version, I enjoyed the jumping around in the demo.
I did fall off a few times though hahah.
BUnzaga
Commercial Pro Edition
Joined 07 June 2006
19 August 2009 20:43:17
"I did fall off a few times though"
LOL so did I.

uomoartificiale, this is brilliant. Thank you so much for sharing it with the community. It reminds me of a quote from Kung Fu Panda... "There is no charge for awesomness, or attractivness". :p

Look at time: 0:50.

I still haven't had a chance to pick this apart, but it's at the top of my to do list.
uomoartificiale
Non-Commercial Pro Edition
Joined 08 September 2008
19 August 2009 20:59:45
thanks alot all you guys for the kind words. I always wanted to do this thing in a 3D game and I always thought it was too difficult. Now I did it in 2D and I understood a way in which how it could work out.

@BUnzaga
Everyone keeps telling you that for a reason: thank you so much YOURSELF, man. I'm only trying to re-balancing the universal karma here.
BUnzaga
Commercial Pro Edition
Joined 07 June 2006
21 August 2009 22:43:54
I wrote out a more detailed explination last night, but I started falling asleep, so I might have pressed the wrong button LOL.

Anyway, I thought of one idea for your surface sounds...
const surface = {wo:"wood", me:"metal", wa:"water", st:"stone", gr:"grass", ca:"carpet"};

//after your particle script...
if(scene.lastHitInfo.object.id.substr(0,2) in surface){
    mat = surface[scene.lastHitInfo.object.id.substr(0,2)];
}
else{
    mat = "dirt"; //default
}

I am still trying to develop my own method for swapping out sounds and tie them to footsteps. I like your method of using a raycast like that. With a little tweaking, you could even use scene.lastHitInfo.textureName so it is based off of the texture on the object, rather than the object name.

I really enjoyed looking at how you put the system together. It gave me some ideas to try and develope for the future.

If you'd like to post to this forum, just create an account on the website, or login with your existing details.

When posting to a forum, you can use limited HTML tags:- 'a' for links, 'b' for bold, 'i' for italic and 'script' to encase a block of DX Studio script.  All tags must be properly closed. e.g. <script>var i=1;</script>

Note: If there are any offensive comments in this topic, please let us know straight away at . Always follow the forum rules.