Jump to content


Photo

Unreal Rider Project


  • Please log in to reply
78 replies to this topic

#1 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 30 May 2008 - 11:54 AM

Here's the concept so far, for something that is a game mode for UT3.

Unreal Rider is a two-team competitive game for UT3. Teams must compete to capture the enemy flag and bring it back to their base. Each flag is protected by a shield, and the flag cannot be captured until the shield is removed. The shield can be removed by overloading the enemy shield generators to under 50% - which is done by shooting them. The Link Gun can heal shield generators, but this takes time.

Players may choose which class they play as - the Rocket Rider, the Silent Sentinel or the Double Damage. Each class has unique characteristics. The first is equipped with the Surfer, and may pilot Surfer rockets. The second is gifted with invisibility, and the third is gifted with the ability to dual wield weapons.

Each player may choose a weapon to carry, either the Super Link Gun, Super Sniper Rifle or Super Rocket Launcher (the Double Damage receives two), and has a hoverboard.

Items:
  • CTF Flag: Behaves exactly the same as the standard CTF flag.
  • Shield: A static mesh who's collision component prevents flag capture.
  • Shield Generator: Maps always have two for each team. They start with 100% health, and can be shot by any weapon to have this lowered to a minimum of 1% (they cannot be destroyed). When both shield generators are under 50%, the shield is no longer present.
  • Hoverboard: Same as the UT3 hoverboard, may grapple the Surfer Rocket.
  • Surfer: Similar to UT3's Redeemer. The Surfer fires a large rocket with a big explosion. Alt fire lets the firer use the rocket like a vehicle. Ammunition must be picked up in the environment.
  • Surfer Rocket: A rocket that may be ridden by a Rocket Rider.
  • Super Link Gun: Similar to the Link Gun, has a more powerful primary and secondary. It can heal Shield Generators with it's alt-fire, the way a Link Gun heals vehicles. It cannot heal Surfer Rockets. Has infinite ammo.
  • Super Sniper Rifle: Similar to the Sniper Rifle, has a rapid firing primary, and secondary slowly recharges ammunition.
  • Super Rocket Launcher: Similar to the Rocket Launcher, fires in clusters, and secondary slowly recharges ammunition.

To Do:
  • Game Mode class derived from CTF with new Pawn and PlayerController references.
  • Shield Generator / Shield Content.
  • Pawn class with variable options, and UI Scene to choose.
  • Four Weapon Types.
  • Small tweaks, likely to CTF flag to allow vehicle pickup, and Hoverboard to allow Surfer grapple.

Reckon it's feasible?

#2 Darknet

Darknet
  • Members
  • 75 posts

Posted 30 May 2008 - 02:33 PM

It seem ok but not sure if player wil like it.

It depend how long to take down the shield and there might be gitich for the shield if player able to get the flag if they will gets points. Shield Generator should be random localtion so it be more diffcuilt to try to be cheap.
JP - Darknet

#3 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 30 May 2008 - 02:39 PM

The flag and shield generators will be in different locations from one another, but known to the players if they've played the maps before. The only issue I can think of is if a player is in the forcefield area when the generators are healed and gets trapped. In this case, we kill them instead.

#4 Darknet

Darknet
  • Members
  • 75 posts

Posted 30 May 2008 - 04:16 PM

That good idea incase player get the flag again when they win point right after getting another one before the shield goes up for another try on the flag.
JP - Darknet

#5 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 30 May 2008 - 04:36 PM

I've added some very basic classes to the SVN. These include the fully working super-sniper, a pretty much working super-link with custom particle system (needs link code re-implemented), and a super-rocket launcher that isn't working yet. There is also an experimental super-link that is dual-wield able in there.

#6 xiongmao

xiongmao
  • Members
  • 175 posts
  • Location:Paris

Posted 02 June 2008 - 09:16 PM

I've added
- ShieldGenerator ( a very basic class with no logic implemented yet) we could reuse code from OnslaughtNode or else, I don't know much about that)
- ShieldVolume which can receive action "GeneratorStateChange"
- Event UR_ShieldGeneratorEvent
- Action UR_SeqAct_GeneratorChangeState

A Test Map will be required soon (Darknet maybe ? ;) ). Our goal is not MapSection(at least for Phase 1) but GameMode so a very simple map on which we can show the potential of our gametype should be enough but we need one as soon as possible because of lot of network tests.

#7 Darknet

Darknet
  • Members
  • 75 posts

Posted 02 June 2008 - 09:51 PM

Yeah sure, I been reworking the UV for city buildings to make it layout foldable layout textures.

I haven't work on the gametype build stuff yet.

Edited by Darknet, 02 June 2008 - 10:33 PM.

JP - Darknet

#8 xiongmao

xiongmao
  • Members
  • 175 posts
  • Location:Paris

Posted 02 June 2008 - 11:03 PM

Great John !!
Here is a new video ( YAV )
Enjoy ;)

#9 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 03 June 2008 - 09:00 AM

That video is pretty awesome.

#10 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 07 June 2008 - 07:41 PM

A quick update - I've done a whole load of work on the player class selection; I've written the base for the menu class, which allows you to select

a) whether you are a Rocket Rider, Silent Sentinel or Double Damage.
b) whether you are armed with the Super-Sniper, Mega-Link or Uber-Rox.
c) whether you want a boost in health, armour or speed.

Here's some code:

UR_ClassMenu - a UIScene that can be opened in game to let player choose class - at the moment it is only on death; but it should also be on game start too. I took the colour code from a previous code experiment. If you're interested in the maths, Wikipedia has an article on HSV colour. The SetAndRespawnPlayer function is temporary; it needs to move into the playercontroller, so that it can be stored, so the player doesn't have to reselect all their options every time they spawn.

class UR_ClassMenu extends UTUIScene;

var transient UILabelButton ButClassSurfer, ButClassStealth, ButClassAkimbo, ButWeaponSniper, ButWeaponLink, ButWeaponRox, ButPerkHealth, ButPerkArmour, ButPerkSpeed, ButRespawn;
var transient UTUISlider SliWeaponEffects;

var UR_PlayerController PC;

enum PlayerClass
{
	eSurfer,
	eStealth,
	eAkimbo
};

enum PlayerWeapon
{
	eSniper,
	eLink,
	eRox
};

enum PlayerPerk
{
	eHealth,
	eArmour,
	eSpeed
};

struct PlayerDetails
{
	var PlayerClass PlayerClass;
	var PlayerWeapon PlayerWeapon;
	var PlayerPerk PlayerPerk;
};

var PlayerDetails PlayerSelection;

event PostInitialize()
{
	ButClassSurfer = UILabelButton(FindChild('ButClassSurfer', true));
	ButClassStealth = UILabelButton(FindChild('ButClassStealth', true));
	ButClassAkimbo = UILabelButton(FindChild('ButClassAkimbo', true));
	
	ButWeaponSniper = UILabelButton(FindChild('ButWeaponSniper', true));
	ButWeaponLink = UILabelButton(FindChild('ButWeaponLink', true));
	ButWeaponRox = UILabelButton(FindChild('ButWeaponRox', true));
	
	ButPerkHealth = UILabelButton(FindChild('ButPerkHealth', true));
	ButPerkArmour = UILabelButton(FindChild('ButPerkArmour', true));
	ButPerkSpeed = UILabelButton(FindChild('ButPerkSpeed', true));
	
	ButRespawn = UILabelButton(FindChild('ButRespawn', true));
	
	SliWeaponEffects = UTUISlider(FindChild('SliEffects', true));
	
	SliWeaponEffects.SliderValue.CurrentValue = 0.f;
	SliWeaponEffects.SliderValue.MinValue = 0.f;
	SliWeaponEffects.SliderValue.MaxValue = 360.f;
	SliWeaponEffects.SliderValue.NudgeValue = 10.f;
	SliWeaponEffects.SliderValue.bIntRange = true;

	ButClassSurfer.OnClicked = OnClickedDelegate;
	ButClassStealth.OnClicked = OnClickedDelegate;
	ButClassAkimbo.OnClicked = OnClickedDelegate;
	
	ButWeaponSniper.OnClicked = OnClickedDelegate;
	ButWeaponLink.OnClicked = OnClickedDelegate;
	ButWeaponRox.OnClicked = OnClickedDelegate;
	
	ButPerkHealth.OnClicked = OnClickedDelegate;
	ButPerkArmour.OnClicked = OnClickedDelegate;
	ButPerkSpeed.OnClicked = OnClickedDelegate;
	
	ButRespawn.OnClicked = OnClickedDelegate;
	
	super.PostInitialize();
}

function bool OnClickedDelegate(UIScreenObject EventObject, int PlayerIndex)
{
	switch(EventObject)
	{
		case ButClassSurfer:
			PlayerSelection.PlayerClass = eSurfer;
			return true;
		case ButClassStealth:
			PlayerSelection.PlayerClass = eStealth;
			return true;
		case ButClassAkimbo:
			PlayerSelection.PlayerClass = eAkimbo;
			return true;
			
		case ButWeaponSniper:
			PlayerSelection.PlayerWeapon = eSniper;
			return true;
		case ButWeaponLink:
			PlayerSelection.PlayerWeapon = eLink;
			return true;
		case ButWeaponRox:
			PlayerSelection.PlayerWeapon = eRox;
			return true;
			
		case ButPerkHealth:
			PlayerSelection.PlayerPerk = eHealth;
			return true;
		case ButPerkArmour:
			PlayerSelection.PlayerPerk = eArmour;
			return true;
		case ButPerkSpeed:
			PlayerSelection.PlayerPerk = eSpeed;
			return true;
		case ButRespawn:
			SetAndRespawnPlayer();
			return true;

		Default:
			`log("Event Object was not caught in OnClickedDelegate: " $ EventObject);
			return true;
	}
	
	return false;
}

static simulated function LinearColor CalculateRBGfromHue(float PreucilAngle)
{
	local LinearColor ColourToUse;
	local float DensityMax, DensityMin, Red,Green,Blue,Hue,Saturation,Value,EuclidianDistance,ComponentX,ComponentY,Comp
onentZ;
	local int Ordering;
	
	ColourToUse = MakeLinearColor(255,1,1,1);

	Red =ColourToUse.R;///255.0;
	Green = ColourToUse.G;///255.0;
	Blue = ColourToUse.B;///255.0;

	if(Red == Green && Green == Blue)
	{
		return ColourToUse;
	}

	DensityMax = FMax(Red,FMax(Green,Blue));
	DensityMin = FMin(Red,FMin(Green,Blue));

	if(DensityMax == Red)
	{
		if(Green >= Blue)
		{
			Hue = 60.0*(Green-Blue)/(DensityMax-DensityMin);
		}
		else
		{
			Hue = 60.0*(Green-Blue)/(DensityMax-DensityMin)+360.0;
		}
	}
	else if(DensityMax == Green)
	{
		Hue = 60.0*(Blue-Red)/(DensityMax-DensityMin)+120.0;
	}
	else
	{
		Hue = 60.0*(Red-Green)/(DensityMax-DensityMin)+240.0;
	}

	if(DensityMax == 0.0)
	{
		Saturation = 0.0;
	}
	else
	{
		Saturation = 1.0-DensityMin/DensityMax;
	}

	Value = DensityMax;


	Hue = (Hue + PreucilAngle)%360;
	Ordering = int(Hue/60)%6;
	EuclidianDistance = Hue/60.0-Ordering;
	ComponentX = Value*(1-Saturation);
	ComponentY = Value*(1-EuclidianDistance*Saturation);
	ComponentZ = Value*(1-(1-EuclidianDistance)*Saturation);

	switch (Ordering)
	{ case 0:   return MakeLinearColor(Value,ComponentZ,ComponentX,1);
	  case 1:   return MakeLinearColor(ComponentY,Value,ComponentX,1);
	  case 2:   return MakeLinearColor(ComponentX,Value,ComponentZ,1);
	  case 3:   return MakeLinearColor(ComponentX,ComponentY,Value,1);
	  case 4:   return MakeLinearColor(ComponentZ,ComponentX,Value,1);
	  case 5:   return MakeLinearColor(Value,ComponentX,ComponentY,1);
   }
	return ColourToUse;
}

function ExitMenu()
{
	CloseScene(self);
}

function bool HandleInputKey( const out InputEventParameters EventParms )
{
	local bool bResult;

	bResult=false;

	if(EventParms.EventType==IE_Released)
	{
		if(EventParms.InputKeyName=='Escape')
		{
			ExitMenu();
			bResult=true;
		}
	}

	return bResult;
}

function SetAndRespawnPlayer()
{
	//PC.Pawn.Health = 200;
	
	switch(PlayerSelection.PlayerClass)
	{
		case eSurfer:
			PC.Pawn.Health = 100;
			PC.Pawn.GroundSpeed = 440;
			PC.Pawn.WaterSpeed = 220;
			PC.Pawn.AirSpeed = 440;
			PC.Pawn.JumpZ = 322;
			break;
		case eStealth:
			PC.Pawn.Health = 50;
			PC.Pawn.GroundSpeed = 330;
			PC.Pawn.WaterSpeed = 220;
			PC.Pawn.AirSpeed = 330;
			PC.Pawn.JumpZ = 322;
			break;
		case eAkimbo:
			PC.Pawn.Health = 150;
			PC.Pawn.GroundSpeed = 330;
			PC.Pawn.WaterSpeed = 110;
			PC.Pawn.AirSpeed = 220;
			PC.Pawn.JumpZ = 200;
			break;
		default:
			`log("Class selection failed in SetAndRespawnPlayer");
	}
	
	switch(PlayerSelection.PlayerPerk)
	{
		case eHealth:
			PC.Pawn.Health += 50;
			break;
		case eArmour:
			UR_Pawn(PC.Pawn).VestArmor += 50;
			break;
		case eSpeed:
			PC.Pawn.GroundSpeed += 100;
			PC.Pawn.WaterSpeed += 50;
			PC.Pawn.AirSpeed += 75;
			PC.Pawn.JumpZ += 75;
			break;
		default:
			`log("Perk selection failed in SetAndRespawnPlayer");
		
	}
	
	switch(PlayerSelection.PlayerWeapon)
	{
		case eSniper:
			//PC.Pawn.InvManager.AddInventory(class'UnrealRider.UR_Weap_Xark', true)
			break;
		case eLink:
			//PC.Pawn.InvManager.AddInventory(class'UnrealRider.UR_Weap_MegaLink', true)
			break;
		case eRox:
			//PC.Pawn.InvManager.AddInventory(class'UnrealRider.UR_Weap_MegaRox', true)
			break;
		default:
			`log("Weapon selection failed in SetAndRespawnPlayer");
	}
	
	ExitMenu();
}


UR_Pawn - this doesn't look like much, but that EffectsColour can potentially be looked up by every weapon and used as a parameter and passed to particle systems and materials relating to the player.

class UR_Pawn extends UTPawn;

var LinearColor EffectsColour;

DefaultProperties
{
	EffectsColour = (R=255,G=0,B=0,A=255);
}


The controller, and how it opens the special menu. The Exec function can be typed into the console at any time.

class UR_PlayerController extends UTPlayerController;

exec function ShowClassMenu()
{
	DynamicOpenMenu("LP_UR_Assets.ClassMenu");
}

simulated function DynamicOpenMenu( string MenuPath, optional int PlayerIndex=INDEX_NONE )
{
	local UIScene Scene;
	local GameUISceneClient GS;

	GS = UTGameUISceneClient(class'UIRoot'.static.GetSceneClient());

	Scene = UIScene(DynamicLoadObject(MenuPath, class'UIScene'));
	UR_ClassMenu(Scene).PC = self;
	
	if ( !GS.OpenScene(Scene) )
	{
		`Log("Failed to load menu '" $ MenuPath $"'");
	}
}

state Dead
{
	exec function StartFire( optional byte FireModeNum )
	{
		if ( bFrozen )
		{
			if ( !IsTimerActive() || GetTimerCount() > MinRespawnDelay )
			{
				bFrozen = false;
			}
			return;
		}

		ServerReStartPlayer();

		if (FireModeNum == 1)
		{
			ShowClassMenu();
		}
	}
}

DefaultProperties
{
}

Edited by ambershee, 07 June 2008 - 10:55 PM.


#11 xiongmao

xiongmao
  • Members
  • 175 posts
  • Location:Paris

Posted 09 June 2008 - 07:25 AM

Hi all back from Corsica ^^
Nice Work Luke !! I'll try to work something out on Shield Stuff this evening

#12 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 09 June 2008 - 01:43 PM

I've abstracted it out a bit - all the control code and the effect colour is now in the player controller, so it should be able to remember settings on player respawn - need to add in player selection stuff to the State Dead start fire code (so it's auto-set on spawn if the class menu is not opened).

I also need to track down the pre-game start so class can be selected before the player joins the game, and I need to work out how to add to the appropriate weapons to the inventory.

#13 Darknet

Darknet
  • Members
  • 75 posts

Posted 09 June 2008 - 02:20 PM

Nice. I have work on the map that I improve the light effects I think I am done for the map.
JP - Darknet

#14 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 10 June 2008 - 07:50 PM

An update on my progress - I've successfully abstracted everything out to where it probably should be - the vast majority of all the code is contained within the player controller and the menu class itself. I've added a new HUD and StartMessage class to facilitate the strings "Press [FIRE] to join, Press [ALTFIRE] to choose class" and such, so this is now in place.

I'm currently trying to work out just when the player is spawned when they start the game - I'm going to force the menu up when this happens. Haven't gotten to adding to the inventory, but the code is now in place and just needs a proper addinventory function. If anyone spots a working way, let me know!

I'm also going to tighten the class menu and selection, the current options for extra health / armour / speed will be replaced with damage, speed and armour instead. I'll also add a simple representation of a person and their equipment using textures to illustrate current selection, and get the colour selector working.


Where is everyone else at? Ten days left people!

Edit: Added some graphical effects to classes, but they stick after class change. Need to enforce precisely which sticks and doesn't. I think the whole class sytem needs a quick rethink. The code is pretty simple, so it shouldn't be too hard.

Edited by ambershee, 10 June 2008 - 08:43 PM.


#15 knighteyes

knighteyes
  • Members
  • 21 posts

Posted 10 June 2008 - 11:54 PM

Just to say I'm here.
I'm having some trouble to put the weapons into the game to test them.
I'll keep you up to date.

#16 Darknet

Darknet
  • Members
  • 75 posts

Posted 11 June 2008 - 12:59 AM

giveweapon classpackage.utweap_name
JP - Darknet

#17 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 11 June 2008 - 07:08 AM

Or use Epic's Weapon Replacement mutator.

#18 xiongmao

xiongmao
  • Members
  • 175 posts
  • Location:Paris

Posted 11 June 2008 - 09:21 AM

I've almost finished The ShieldGenerator Stuff (need some tests this evening).
Implemented:
- heal shield
- damage shield
- throw event
- broadcast messages to team

Implemented soon
- health bar (derivated from CorruptDataSegment that would be pretty easy)

I won't be available weekend 20-22 june so we should begin test quite quickly, I'll try to upload code tonight

#19 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 11 June 2008 - 09:47 AM

I may or may not be available that weekend either.

I've redesigned the class system and will implement it today, and will try and get the whole class system done by the end of today so that we can move on right away.

It will now work like this:

  • The player may select their class - Rocket Rider, Silent Sentinel, Double Damage. The Rocket Rider gets the Rideable rocket weapon, the Silent Sentinel is invisible, the Double Damage gets two giant weapons.
  • The class you choose will determine the health and speed of your character - note that this should also be conferred to the Rocket Rider's rockets.
  • The player may select their weapon, either the Impact Hammer, the Link Gun, the Sniper Rifle or the Rocket Launcher. The Rocket Rider cannot have the Rocket Launcher, the Silent Sentinel cannot have the Sniper Rifle, and the Double Damage cannot have the Impact Hammer.
  • The player may select how much armour they want (a slider) - this is limited by player class, and more armour will slow your character down further.
  • The player may select an additional piece of equipment - a Slow Field Generator, a Shield Generator, a Landmine or a (if I can write the code) a Skymine. Unlike UT versions, these will be destroyable, and should die if the owner dies.

This system should be fairly flexible; it allows a good level of customisation, and lets players mix and match freely without imbalancing anything.

Notably, if we're running out of time, we can drop the 'double' weapons on the double damage, and just use giant weapons instead. The equipment should hopefully be relatively easy - although my main issue with it is UT deployables can't be switched and a weapon used, which will need looking in to. They are based on weapons, so hopefully it won't be difficult to change.

Edit: Nearly done!

I just need to do some final additions, like writing code to switch in and out some description text and images, and we'll have a nice useable class selection UI. I'll also add in functionality to highlight the player's current selection, then I'll attach it to the forums. This blasted machine still won't let me create a repository for SVN.

Edit: All done bar one thing. When the player moves the armour slider up, the image should change to show where the player has armour and how much. Trick is, how do I get the UIScene to know that the slider value has changed?

Edited by ambershee, 11 June 2008 - 06:53 PM.


#20 ambershee

ambershee

    Nimbusfish Rawks

  • Hosted
  • 3,114 posts
  • Location:Derby, UK
  • Projects:Mutator Week & Unreal 3 Projects
  •  Mad Mod Boffin

Posted 12 June 2008 - 05:28 PM

Update: I've dismissed the slider updating values as impossible, and removed the fancy graphics from the UI :(

I've spotted a bug with armour, which for some reason is retained after death, and later added to when the player uses the class menu. Will need to find a solution for that, probably a code reorganisation. Also need to organise the UI scene, and get the description text working dynamically.

How's everyone else doing? We could really be doing with wrapping everything up soon and working on fixes.




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users