Ok let me try to explain to you what skills are and how to use them:
A skill is nothing different than a variable but this var is attached to an object (entity for example).
So this skill is like a property of an object.
In this skill you can store numbers and access them through the entity pointer (my, you e.g.) a dot . and the skill name or - if you didn't define a skill name - the default skill name like skill1, skill2 ...
E.g.:
my.skill1 = 123; //stores the number 123 into the first skill of the entity "my"

Defining a skill:
As I said you can define names for skills.
This is used to make code easier to read plus you wouldnt have to remember which skill does what when you have names which pretty much tell about their use.
Now lets define a skill name.
The skill name definition consists of 3 parts:
1. the keyword "define"
2. the name of the skill "name"
3. the skill number so to speak
So here is a skill defining:
define age,skill1;
age: name of skill1

So now we don't have to write:
my.skill1 = 18; anymore
but we can use age as name:
my.age = 18;

The undefining:
I recommend to undefine a skill at the end of a script file, unless it should be used in a different wdl file aswell.
However errors like: "skill1 defined twice" or something similiar are really annoying.
So we just add the following line at the end of our script file (for the "age" example):
undef age; //yep thats all

Now how to access skills of other entitys:
Lets assume we have 2 entities, the bot_a and bot_b, both have a skill1 named age and we want bot_a to get bot_b's age and compare it to its own age.
So the first new thing are entity pointers.
pointers point towards an entity and are no different than my and you, however my and you are modified by some instructions and better left how they are for now.

So lets create two entity pointers then:
entity* bot_a;
entity* bot_b;

Now we can assign on of thoses pointers to any entity.
However each pointer can only point towards ONE entity at a time.

So lets script thoses dudes then.
First bot_b, because he just stands there and has his age:
Code:

define age,skill1;

entity* bot_a;
entity* bot_b;

action bot_b_act
{
bot_b = my; //now the pointer bot_b points to the entity with the action bot_b_act
my.age = 18;
}


Good, so now we add the bot_a, but to make sure that we don't get an invalid pointer error we must add a safety instruction to make sure that an entity with the bot_b pointer pointing to it exists:
Code:

action bot_a_act
{
bot_a = my;
my.age = 15;

//This is our safety line:
while(!bot_b) { wait(1); }
/* it waits until the entity pointer bot_b points towards an entity
and is getting non-zero that way */
beep; //if you hear the beep sound, the bot_b exists

//now lets get the age of bot_b and compare it to our age:
if(bot_b.age < my.age)
{
beep; //he is younger than we are, so beep once
}
else
{
beep; beep; //he is older, so beep twice
}
}



I hope this helped you a bit.

My advice would be to first learn the basics, like vars, arrays, skills, pointers
And then try to write such actions.
Because if you once got used to bad programming style it will be hard to get away from it.