Gondor vs Mordor 2 logo
Home Forum Wiki Map Downloads
Become part of the community!
 
 
User Info
Welcome, Guest. Please login or register.
Did you miss your activation email?
16 April 2024, 18:49

Login with username, password and session length

Search:     Advanced search
News Box
Welcome to (Gondor vs Mordor)².

Key Stats
13122 Posts in 1336 Topics by 1240 Members
Latest Member: azihohaloyen
Home Help Search Calendar Login Register
Gondor vs Mordor  |  Gondor vs Mordor 1  |  GvM1 Future Talk (Moderator: Rade)  |  Class: Rangers
Pages: [1] Print
Author Topic: Class: Rangers  (Read 4816 times)
Rade
Moderator
Poster
*****
Offline Offline

Posts: 253



View Profile
« on: 02 September 2008, 18:57 »


Quote
[Gandalf]: Aragorn, do you need haste?
Now why does that caption not fit here?

In the Lord of the Rings, rangers are practically top dogs. Legolas and Aragorn are both "rangers" in their own right; although Aragorn is slightly assisted at gaining power because of his royal blood.

'Recent' changes like redoing blade thirst for rangers are great. Rangers are still fairly powerful right now, but they have one huge problem: They're slow.

Something else you never saw was Legolas or Aragorn asking others for directions.

So what I suggest are a simple change and a complicated change.

The simple change: Give rangers a scripted item, Wild Sprint, that grants haste for 2 rounds/ranger level (just like a casters' extended haste) with 1 use/day.

The complicated change: Implement a tracking system for rangers. This can be fired off another tool, basically it looks at creatures in the area, compares them and their bearing to the position of the ranger, and rolls off Spot to determine how accurately the ranger tracks. I could see this being very useful for PvP in large areas or if you saw a PvP but lost him, and were a ranger. If we like the idea, I'd edit the script to roll off Search instead of spot and probably a few other minor changes to accommodate our server.
The script I have below was written by a DM Agrafes from another server I used to play (City of Arabel), and it is written for NWN2, but I don't see what the problem would be changing it from NWN2 to NWN1.

If you hate reading code, I'm done saying everything so you can just skip past it.

Code:
/** tracking
 ** Tracking system using Vshar's rules
 **
 **/

//#include "hc_inc_track"
//#include "hc_text_track"
//#include "spw_inc"
//#include "inc_undead"
#include "debug__inc"
#include "tools__inc"
#include "text__inc"

#include "dm__inc"

const float TRACK_DURATION = 6.0;
/*
//** only available for rangers
int StartingConditional()
{
    if (GetLevelByClass(CLASS_TYPE_RANGER, GetPCSpeaker()) > 0)
        return TRUE;

    return FALSE;
}
*/



// i=0: random class
// i=1: random race
// i=2: random gender
// i=3: random direction
// i=4: random freshness
// i=5: random clothing
string randomSomething(int i);
string randomSomething(int i)
{
  string s;
  int x;
  switch (i)
  {
    case 0: x=d3(); if(x==1) s="Rogue"; else if(x==2) s="Warrior"; else s="Spellcaster"; break;
    case 1: x=d6(); if(x==1) s="Dwarf"; else if(x==2) s="Elf"; else if(x==3) s="Gnome";
            else if(x==4) s="Halfling"; else if (x==5) s="Half-orc"; else s="Human"; break;
    case 2: if(d2()==1) s="Female"; else s="Male";break;
    case 3: x=d8(); if(x==1) s="N"; else if(x==2) s="NE"; else if(x==3) s="E";
            else if(x==4) s="SE"; else if(x==5) s="S"; else if(x==6) s="SW";
            else if(x==7) s="W"; else s="NW"; break;
    case 4: x=d4(); if(x==1) s="Very fresh tracks of"; else if(x==2) s="Fresh tracks of";
            else if(i==3) s="Moderate tracks of"; else s="Weathered tracks of"; break;
    case 5: x=d4(); if(x==1) s="wearing no armor"; if(x==2) s="wearing light armor";
            else if(x==3) s="wearing medium armor"; else s="wearing heavy armor"; break;
  }
  return s;

}

void deleteLastTrackArea(object oPC,object oArea)
{
    if  (GetLocalObject(oPC,"lastTrackArea")==oArea)
        DeleteLocalObject(oPC,"lastTrackArea");
}

string EvaluateTracks(object oTracker, object oTarget, int iRoll)
{
    //Get Direction
    string sDir = GetCompassDirectionBetween(oTracker, oTarget);
    string sMsg;

DebugMessage( GetName(oTracker) + " looking at tracks of " + GetName(oTarget));

    //Get Clothing
    object oClothing=GetItemInSlot(INVENTORY_SLOT_CHEST,oTarget);
    string sClothing;
    if (GetItemACValue(oClothing)==0)
        sClothing="wearing no armor";
    else if (GetItemACValue(oClothing)<=3)
        sClothing="wearing light armor";
    else if (GetItemACValue(oClothing)<=5)
        sClothing="wearing medium armor";
    else
        sClothing="wearing heavy armor";


    string sFresh;
    if (iRoll > 5)
    {
        float  fFresh;
        //Get how fresh the Track is
        fFresh=GetDistanceBetween(oTracker, oTarget);
        if(fFresh<=20.00)
            sFresh="Very fresh tracks of" ;
        else if(fFresh<=60.00)
            sFresh="Fresh tracks of";
        else if(fFresh<=100.00)
            sFresh="Moderate tracks of";
        else
            sFresh="Weathered tracks of";
    } else {
        sFresh = randomSomething(4);
    }

    //SendMessageToPC(oTracker,GetName(oPC)+":"+IntToString(i));
    if (iRoll <=-20)
        sMsg = sFresh +" a "+randomSomething(2)+" "+randomSomething(1)+", "+randomSomething(0)+", "+randomSomething(5)+" at "+randomSomething(3);
    else if (iRoll<=-10)
        sMsg = sFresh +" a "+randomSomething(1)+", "+randomSomething(0)+" at "+randomSomething(3);
    else if (iRoll<=0)
        sMsg = "";
    else if(iRoll<=5)
        sMsg = sFresh+" a "+ GetRaceName(oTarget) +" at " + sDir;
    else if(iRoll<=8)
        sMsg = sFresh+" a "+GetRaceName(oTarget)+", "+GetClassName(oTarget)+" at "+sDir;
    else if(iRoll<=10)
        sMsg = sFresh+" a "+GetGenderString(oTarget)+" "+GetRaceName(oTarget)+", "+GetClassName(oTarget)+" at "+sDir;
    else if(iRoll<=15)
        sMsg = sFresh+" a "+GetGenderString(oTarget)+" "+GetRaceName(oTarget)+", "+GetClassName(oTarget)+", "+sClothing+" at "+sDir;
    else
        sMsg = sFresh+" "+GetName(oTarget)+", a "+GetGenderString(oTarget)+", "+GetRaceName(oTarget)+", "+GetClassName(oTarget)+", "+sClothing+" at "+sDir;

    return sMsg;
}

void DoTracking(object oTracker, object oArea)
{
//    object globalVars = GetModule(); //  GetObjectByTag("GlobalVars");
    string sMsg;
//    string areaName=GetName(GetArea(OBJECT_SELF));

    //** Determine how the environment influences tracking
    int iEnvironment = -10;
    // Modify roll according to the weather
/*
    if(GetPersistentInt(globalVars,"CurrentWeather")==WEATHER_RAIN)
        iEnvironment -= -5;
    else if(GetPersistentInt(globalVars,"CurrentWeather")==WEATHER_SNOW)
        iEnvironment -= 5;
*/
    // Modify roll if it is night
    if(GetIsNight()==TRUE)
        iEnvironment-=2;

    //** harder to track in a built environment
    if (GetIsAreaNatural(oArea)==AREA_ARTIFICIAL)
        iEnvironment -= 10;

    int iSkill = GetSkillRank(SKILL_SPOT,oTracker)+GetLevelByClass(CLASS_TYPE_RANGER,oTracker)/2;

    int iRoll;
    int iCount = 1;
    //** Tracks all creatures within the area that are alive
    object oTarget=GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, oTracker, 1);
    while(GetIsObjectValid(oTarget))
    {
          if (!GetIsVirtualDM(oTarget) && oTarget!=oTracker)
          {
            //** Roll Tracking skill based on SPOT and Ranger level
            iRoll = d20() + iSkill + iEnvironment;

            //** Modify roll according to target's size
            switch (GetCreatureSize(oTarget)) {
              case CREATURE_SIZE_HUGE:
                iRoll+=2;    break;
            case CREATURE_SIZE_LARGE:
                iRoll+=1;    break;
            case CREATURE_SIZE_SMALL:
                iRoll-=1;    break;
            case CREATURE_SIZE_TINY:
                iRoll-=2;    break;
            }

            //** If target is trying to cover his tracks, apply Move in Silence against the Ranger's roll
            if (GetStealthMode(oTarget)==STEALTH_MODE_ACTIVATED)
                iRoll -= GetSkillRank(SKILL_MOVE_SILENTLY,oTarget);

            //** Trackless Step gives immunity
             if (GetHasFeat(FEAT_TRACKLESS_STEP,oTarget))
                if (GetIsAreaNatural(oArea)==AREA_NATURAL)
                    iRoll = 0;

            //** birs and other flyers?

            sMsg = EvaluateTracks(oTracker, oTarget, iRoll);
            if (sMsg != "" )
                SendMessageToPC(oTracker, sMsg);
        }

        iCount++;
        oTarget=GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, oTracker, iCount);
    }

    SendMessageToPC(oTracker,"This is all you can find.");
}

void main()
{
    object oTracker = GetPCSpeaker();
    object oArea = GetArea(oTracker);

    // Checks if the area was tracked
    if (GetLocalObject(oTracker,"lastTrackArea")==oArea && !GetIsVirtualDM(oTracker))
    {
        SendMessageToPC(oTracker,"You have searched the area recently.");
        return;
    }
    SetLocalObject(oTracker,"lastTrackArea",oArea);
    DelayCommand(15.0, deleteLastTrackArea(oTracker,oArea));

//    SetLocalLocation(oTracker, "locTrackPosition"
    // Analyze tracks animation
    AssignCommand(oTracker, PlayAnimation(ANIMATION_LOOPING_GET_LOW, 0.8, TRACK_DURATION));
    AssignCommand(oTracker, ActionWait(TRACK_DURATION));
    AssignCommand(oTracker, DoTracking(oTracker, oArea));
}
Logged
pinkpuff
Poster
**
Offline Offline

Posts: 402


View Profile
« Reply #1 on: 02 September 2008, 20:29 »

Windsprint sure, but only in the wilderness tilesets.

And change the damage from Blade Thirst to something else, I just don't see a ranger as being remotely  magical. Make it a physical type, like bludgeoning, since no ranger uses bludge weapons and the damage will stack.
Logged
WooldorSockbat
Poster
**
Offline Offline

Plays: Not Set
Posts: 39


View Profile
« Reply #2 on: 03 September 2008, 02:27 »

Windsprint sure, but only in the wilderness tilesets.

And change the damage from Blade Thirst to something else, I just don't see a ranger as being remotely  magical. Make it a physical type, like bludgeoning, since no ranger uses bludge weapons and the damage will stack.

I could see it being divine damage, as they are wisdom based spellcasters.

As for the speed deal, make it permanent on wilderness terrain, none anywhere else. As for the argument about Aragorn being as fast as Legolas... I didn't know archer elves got haste for free?  Tongue
Logged
ShinsFortress
Poster
**
Offline Offline

Posts: 299


Beauty and the beast.


View Profile
« Reply #3 on: 03 September 2008, 09:39 »

If it wasn't for a certain fight with a certain Uruk-Hai, I would have said that Aragorn could nowhere near match Legolas for combat speed.  If....
Logged

MORS VINCIT OMNIA
KrazyKuban
Poster
**
Offline Offline

Posts: 179



View Profile
« Reply #4 on: 03 September 2008, 15:08 »

Well, seeing as Lurtz never existed in the books, I'd say he's comparable...

I'd certainly like to see an increase in movement speed for Rangers(without the AC boost).  There's always been a call for faster movement speed where many classes are concerned, but there was always the tricky situation about the added boost from Perma-haste.  I think something like this would be great alternative.

I don't think Blade Thirst should be divine, as I don't agree their powers are necessarily divinely inspired(IE divine damage).  Imho it should be something along the lines of a natural damage type.  Either extra physical a la what Pinky said, or perhaps cold/fire/elec bonuses.
Logged

ShinsFortress
Poster
**
Offline Offline

Posts: 299


Beauty and the beast.


View Profile
« Reply #5 on: 03 September 2008, 16:18 »

You want added movement speed without AC boost?  It's called Expedious Retreat!   Grin  Which won't stack with the spell or a Haste, like Monk speed would.
Logged

MORS VINCIT OMNIA
Abimael
Poster
**
Offline Offline

Posts: 324


What can change the nature of a man?


View Profile
« Reply #6 on: 03 September 2008, 18:32 »

I like the Track idea a lot, that would be a superb Ranger ability. I'd consider giving extra bonus depending on the favored enemies chosen by the Ranger (I remember that there was a description on D&D Player book saying that a lvl 20 ranger that took goblin as favored enemy at lvl 1 could detect they marched 3 days ago, with heavy rain and erasing their tracks).
Logged
Terrorble
GvM1 Admin
Poster
****
Offline Offline

Posts: 765


View Profile
« Reply #7 on: 03 September 2008, 22:06 »

The tracking is cool.  Makes you feel more like a ranger and not some slight variant of another fighter class.  You could potentially use your invis purge or a trap better if you knew kinda when someone was close or in the area.  It's funny but acceptable that it could potentially track someone who hasn't even traversed the ground you're on yet.  I don't see this as being hugely beneficial to the class as far as making them stronger but definitely fun. 

I'm not the bestest code reeder yet but it appears to track any NPC which might not be necessary (I mean I do not readily see the use in tracking NPCs in PW where we know where they all are anyways).  Could just have it return info only on PCs and then adding favored enemies would be easier since you could get away with just using the player races (wouldn't be perfect for things that shift but most everything).

Along the lines of haste, maybe it's time we made the duration of blinding speed increase with levels in certain classes.  AA/ranger/rogue/assassin/SD...  At least to the point that it's a worthwhile option to spend a precious feat on.  That's probably another topic altogether.
Logged
Rabbac
Poster
**
Offline Offline

Plays: Mordor
Posts: 111


Och aye, bonnie Scotland


View Profile
« Reply #8 on: 19 September 2008, 15:50 »

Legolas a ranger? First i've heard  Grin hes from Mirkwood (when's that coming) and son of the king of the woodelves there to my knowledge. As for speed i dont remember Aragorn sprinting much unless your refering to the run across rohan to get merry and pippin. If that the case i think endurance boost would be more appropriate. Legolas could have left both Gimli and Aragorn in his wake  wink
Logged

Cometh the hour, cometh the man.
Pages: [1] Print 
Jump to:  

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines
Theme by Nesianstyles | Buttons by Andrea