Some ideas for a monkish class.

All new ideas for the upcoming releases of ToME 4.x.x should be discussed here

Moderator: Moderator

Message
Author
Grey
Loremaster
Posts: 3517
Joined: Thu Sep 23, 2010 10:18 pm
Location: London, England
Contact:

Re: Some ideas for a monkish class.

#31 Post by Grey »

Given the spin away from chi and all that I'd suggest a name change. The current abilities simply don't say "monk". "Martial artist" might be better, or maybe even something like "Brawler".
http://www.gamesofgrey.com - My own T-Engine games!
Roguelike Radio - A podcast about roguelikes

edge2054
Retired Ninja
Posts: 3756
Joined: Fri May 28, 2010 4:38 pm

Re: Some ideas for a monkish class.

#32 Post by edge2054 »

Grey wrote:Given the spin away from chi and all that I'd suggest a name change. The current abilities simply don't say "monk". "Martial artist" might be better, or maybe even something like "Brawler".
My current version is named Martial Artist. I like brawler too though... hmmm.

catwhowalksbyhimself
Wyrmic
Posts: 249
Joined: Sun Aug 15, 2004 1:19 am
Location: Plainville, CT

Re: Some ideas for a monkish class.

#33 Post by catwhowalksbyhimself »

I also like the more generic sounding Brawler, which fits better with a medieval fantasy world anyway.
"I am the cat that walks by himself. All ways are alike to me."
--Rudyard Kipling, "The Cat That Walked By Himself"

madmonk
Reaper
Posts: 2257
Joined: Wed Dec 12, 2007 12:21 am
Location: New Zealand

Re: Some ideas for a monkish class.

#34 Post by madmonk »

What's wrong with Martial Artist? Savate was developed in France; their are numerous martial styles on the Indian sub-continent; Brazil has Capoeira; there is Boxing, wrestling (of whatever form) and so on.

I suppose what I am trying to say is that the martial arts are a universal constant throughout human civilisation... So why call them something different?

Unless of course it is a flavour thing...
Regards

Jon.

catwhowalksbyhimself
Wyrmic
Posts: 249
Joined: Sun Aug 15, 2004 1:19 am
Location: Plainville, CT

Re: Some ideas for a monkish class.

#35 Post by catwhowalksbyhimself »

Absolutely nothing's wrong with Martial Artist at all. It's just a personal preference on my part is all.
"I am the cat that walks by himself. All ways are alike to me."
--Rudyard Kipling, "The Cat That Walked By Himself"

Grey
Loremaster
Posts: 3517
Joined: Thu Sep 23, 2010 10:18 pm
Location: London, England
Contact:

Re: Some ideas for a monkish class.

#36 Post by Grey »

I think "Brawler" sounds cooler, though "Martial Artist" better defines the class.
http://www.gamesofgrey.com - My own T-Engine games!
Roguelike Radio - A podcast about roguelikes

aberk
Higher
Posts: 46
Joined: Sat Dec 18, 2010 12:58 am

Re: Some ideas for a monkish class.

#37 Post by aberk »

Your comments are very understandable and I didn't realize that this was going to be a stamina based class. I have two humble requests:

1. Make the combinations still work even if the character is holding a weapon.

2. Would you consider adding stamina based katas if I coded them?

Thanks for making a great new class.

edge2054
Retired Ninja
Posts: 3756
Joined: Fri May 28, 2010 4:38 pm

Re: Some ideas for a monkish class.

#38 Post by edge2054 »

aberk wrote:Your comments are very understandable and I didn't realize that this was going to be a stamina based class. I have two humble requests:

1. Make the combinations still work even if the character is holding a weapon.

2. Would you consider adding stamina based katas if I coded them?

Thanks for making a great new class.

To give you some idea if what I've got and the theme of the class here's a sample talent tree. The grappling tree is just as focused on unarmed attacks as are the finishing strikes (uppercut, spinning backfist, haymaker... these aren't weapon finishers). If you want to code some weapon kata trees and borrow some stuff from the martial-artist (or brawler) to make more of an eastern monk feeling class or a stance based weapons fighter that uses some unarmed combat be my guest (hopefully the code will be in b22). I think the grappling and combo system I've worked up is sound and could work for a number of different martial arts based classes.

But I don't feel that weapons or weapon katas really fit the theme of the class I'm working on currently and right now every damage talent I've coded is based off unarmed damage or strength.

Code: Select all

newTalent{
	name = "Striking Stance",
	type = {"unarmed/unarmed-other", 1},
	mode = "sustained",
	hide = true,
	points = 1,
	cooldown = 12,
	tactical = { BUFF = 2 },
	type_no_req = true,
	getCriticalPower = function(self, t) return 10 + self:getDex(20) end,
	getDamage = function(self, t) return 20 + self:getDex(20) end,
	activate = function(self, t)
		cancelStances(self)
		local ret = {
			critpower = self:addTemporaryValue("combat_critical_power", t.getCriticalPower(self, t)),
		}
		return ret
	end,
	deactivate = function(self, t, p)
		self:removeTemporaryValue("combat_critical_power", p.critpower)
		return true
	end,
	info = function(self, t)
		local critpower = t.getCriticalPower(self, t)
		local damage = t.getDamage(self, t)
		return ([[Increases your critical damage multiplier by %d%% and the damage multiplier of your bareknuckle and kick boxing talents by %d%%.
		The bonuses will scale with the Dexterity stat.]]):
		format(critpower, damage)
	end,
}

newTalent{
	name = "Rushing Strike",
	type = {"unarmed/bareknuckle-boxing", 1},
	require = mart_dex_req1,
	points = 5,
	random_ego = "attack",
	cooldown = 6,
	message = "@Source@ throws a rushing punch!",
	range = function(self, t) return 2 + math.ceil(self:getTalentLevel(t)/2) end,
	stamina = 8,
	tactical = { ATTACK = 2, DISABLE = 2, CLOSEIN = 2 },
	requires_target = true,
	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.8, 1.4)  + getStrikingStyle(self, dam) end,
	getDuration = function(self, t) return 1 + math.ceil(self:getTalentLevel(t)) end,
	-- Learn the appropriate stance
	on_learn = function(self, t)
		if not self:knowTalent(self.T_STRIKING_STANCE) then
			self:learnTalent(self.T_STRIKING_STANCE, true)
		end
	end,
	on_unlearn = function(self, t)
		if not self:knowTalent(t) then
			self:unlearnTalent(self.T_STRIKING_STANCE)
		end
	end,
	action = function(self, t)
		if self:attr("never_move") then game.logPlayer(self, "You can not do that currently.") return end
	
		local tg = {type="hit", range=self:getTalentRange(t)}
		local x, y, target = self:getTarget(tg)
		if not x or not y or not target then return nil end
		if math.floor(core.fov.distance(self.x, self.y, x, y)) > self:getTalentRange(t) then return nil end

		-- bonus damage for charging
		local charge  = math.floor((core.fov.distance(self.x, self.y, x, y)) -1) / 5
		
		-- do the rush
		local l = line.new(self.x, self.y, x, y)
		local tx, ty = self.x, self.y
		lx, ly = l()
		while lx and ly do
			if game.level.map:checkAllEntities(lx, ly, "block_move", self) then break end
			tx, ty = lx, ly
			lx, ly = l()
		end

		local ox, oy = self.x, self.y
		self:move(tx, ty, true)
		if config.settings.tome.smooth_move > 0 then
			self:resetMoveAnim()
			self:setMoveAnim(ox, oy, 8, 5)
		end
				
		-- force stance change
		if target and not self:isTalentActive(self.T_STRIKING_STANCE) then	
			self:forceUseTalent(self.T_STRIKING_STANCE, {ignore_energy=true, ignore_cd = true})
		end
		
		-- break grabs
		self:breakGrapples()
		
		if math.floor(core.fov.distance(self.x, self.y, x, y)) == 1 then
			local hit = self:attackTarget(target, nil, t.getDamage(self, t) + charge, true)

			-- Try to stun !
			if hit then
				self:buildCombo()
				if target:checkHit(self:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) and target:canBe("stun") then
					target:setEffect(target.EFF_STUNNED, t.getDuration(self, t), {})
				else
					game.logSeen(target, "%s resists the stun!", target.name:capitalize())
				end
			end
			
		end

		return true
	end,
	info = function(self, t)
		local duration = t.getDuration(self, t)
		local damage = t.getDamage(self, t) * 100
		return ([[Attacks the target with a vicious rushing strike that deals %d%%.  If the target is at range you'll rush towards them and deal 20%% bonus damage per tile traveled. If the attack hits, the target may be stunned for %d turns.
		This attack will remove any grapples you're maintaining.
		The stun success chance will scale with the strength stat.
		Performing this attack will switch your stance to Striking Stance and earn one combo point if the blow connects.]])
		:format(damage, duration)
	end,
}

newTalent{
	name = "Double Jab",
	type = {"unarmed/bareknuckle-boxing", 2},
	require = mart_dex_req2,
	points = 5,
	random_ego = "attack",
	cooldown = 3,
	stamina = 8,
	message = "@Source@ throws two quick jabs.",
	tactical = { ATTACK = 2 },
	requires_target = true,
	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.3, 0.7) + getStrikingStyle(self, dam) end,
	action = function(self, t)
		local tg = {type="hit", range=self:getTalentRange(t)}
		local x, y, target = self:getTarget(tg)
		if not x or not y or not target then return nil end
		if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
		
		-- breaks active grapples if the target is not grappled
		if target:isGrappled(self) then
			grappled = true
		else
			self:breakGrapples()
		end
		
		local hit1 = self:attackTarget(target, nil, t.getDamage(self, t), true)
		local hit2 = self:attackTarget(target, nil, t.getDamage(self, t), true)
				
		if hit1 then
			self:buildCombo()
		end
		
		if hit2 then
			self:buildCombo()
		end
				
		return true
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t) * 100
		return ([[Two quick left jabs that deal %d%% damage each.
		Each jab that connects will earn one combo point.]])
		:format(damage)
	end,
}

newTalent{
	name = "Body Shot",
	type = {"unarmed/bareknuckle-boxing", 3},
	require = mart_dex_req3,
	points = 5,
	random_ego = "attack",
	cooldown = 8,
	stamina = 10,
	message = "@Source@ throws a body shot.",
	tactical = { ATTACK = 2, DISABLE = 2 },
	requires_target = true,
	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.5) + getStrikingStyle(self, dam) end,
	getDrain = function(self, t) return self:getTalentLevel(t) * 10 end,
	action = function(self, t)
		local tg = {type="hit", range=self:getTalentRange(t)}
		local x, y, target = self:getTarget(tg)
		if not x or not y or not target then return nil end
		if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
		
		-- breaks active grapples if the target is not grappled
		if target:isGrappled(self) then
			grappled = true
		else
			self:breakGrapples()
		end
			
		local hit = self:attackTarget(target, nil, t.getDamage(self, t), true)
					
		if hit then
			target:incStamina(- t.getDrain(self, t))
			self:buildCombo()
		end
				
		return true
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t) * 100
		local drain = t.getDrain(self, t)
		return ([[A punch to the body that deals %d%% damage and drains %d of the target's stamina.
		If the blow connects it will earn one combo point.]])
		:format(damage, drain)
	end,
}

newTalent{
	name = "Flurry of Fists",
	type = {"unarmed/bareknuckle-boxing", 4},
	require = mart_dex_req4,
	points = 5,
	random_ego = "attack",
	cooldown = 24,
	stamina = 15,
	message = "@Source@ lashes out with a flurry of fists.",
	tactical = { ATTACK = 2 },
	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 1) + getStrikingStyle(self, dam) end,
	action = function(self, t)
		local tg = {type="hit", range=self:getTalentRange(t)}
		local x, y, target = self:getTarget(tg)
		if not x or not y or not target then return nil end
		if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
		
		-- breaks active grapples if the target is not grappled
		if target:isGrappled(self) then
			grappled = true
		else
			self:breakGrapples()
		end
		
		
		local hit1 = self:attackTarget(target, nil, t.getDamage(self, t), true)
		local hit2 = self:attackTarget(target, nil, t.getDamage(self, t), true)
		local hit3 = self:attackTarget(target, nil, t.getDamage(self, t), true)
				
		if hit1 then
			self:buildCombo()
		end
		
		if hit2 then
			self:buildCombo()
		end
		
		if hit3 then
			self:buildCombo()
		end

		return true
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t) * 100
		return ([[Lashes out at the target with three quick punches that each deal %d%% damage.
		Each punch that connects will earn one combo point.]])
		:format(damage)
	end,
}

aberk
Higher
Posts: 46
Joined: Sat Dec 18, 2010 12:58 am

Re: Some ideas for a monkish class.

#39 Post by aberk »

I understand. Do you need a class description?

edge2054
Retired Ninja
Posts: 3756
Joined: Fri May 28, 2010 4:38 pm

Re: Some ideas for a monkish class.

#40 Post by edge2054 »

Code: Select all

	desc = {
		"Rather a pit-fighter, a boxer, or just a practitioner the brawler has learned to use his body and armored hands as weapons just as deadly as any blade.",
		"Many of the brawler's abilities will earn combo points which they can use on finishing moves that will have added effect.",
		"The unarmed fighting styles the brawler uses rely on maneuverability and having both hands available, as such they may not be practiced in massive armor or while a weapon or shield is equipped.",
		"Their most important stats are: Strength, Dexterity, and Cunning",
		"#GOLD#Stat modifiers:",
		"#LIGHT_BLUE# * +3 Strength, +3 Dexterity, +0 Constitution",
		"#LIGHT_BLUE# * +0 Magic, +0 Willpower, +3 Cunning",
	},
And if anyone can write up a better one that'd be great :) But yeah, basically (and this has changed a bit since last night after talking some things over with DG) the class will grapple and strangle things or beat them to death with his gauntlets :) *edit* Not all damage will come from gauntlets, the class will have a hidden level based attack power scaling too.

Now weapons katas could be incorported into these talents with an over ride but right now they check that the class isn't using weapons because jabbing someone with a sword equipped or wrapping them up in a clinch just doesn't make sense. The advanced kicking tree though and the tactical trees are both well suited to weapon users (I'm actually going to see how DG feels about giving rogues the tactical tree).

aberk
Higher
Posts: 46
Joined: Sat Dec 18, 2010 12:58 am

Re: Some ideas for a monkish class.

#41 Post by aberk »

Code: Select all

 desc = {
      "The ravages of the Spellblaze stretched armies thin and left many unprotected. Not everyone could afford the luxury of a weapon.",
      "Without steel or iron, poor communities of all races turned to the strength of their own bodies for defense against the darkness.",
      "The occupation known as brawler still exists today, and some of these unique warriors have even formed one basket orders, their purpose as yet unknown.",
      "Rather a pit-fighter, a boxer, or just a practitioner the brawler has learned to use his body and armored hands as weapons just as deadly as any blade.",
      "Many of the brawler's abilities will earn combo points which they can use on finishing moves that will have added effect.",
      "The unarmed fighting styles the brawler uses rely on maneuverability and having both hands available, as such they may not be practiced in massive armor or while a weapon or shield is equipped.",
      "Their most important stats are: Strength, Dexterity, and Cunning",
      "#GOLD#Stat modifiers:",
      "#LIGHT_BLUE# * +3 Strength, +3 Dexterity, +0 Constitution",
      "#LIGHT_BLUE# * +0 Magic, +0 Willpower, +3 Cunning",
   },
What do you think of this description? It adds a nice background to the class, and even opens the door for a side quest. I also wanted the description to say that the fighting styles that we are talking about came from the races of Middle Earth, which allows us to develop a thematic feel.

edge2054
Retired Ninja
Posts: 3756
Joined: Fri May 28, 2010 4:38 pm

Re: Some ideas for a monkish class.

#42 Post by edge2054 »

I like it. I'll see how DG feels about how it fits in with the lore :) It might be to long though I'll have to see how it fits into the character selection screen.

aberk
Higher
Posts: 46
Joined: Sat Dec 18, 2010 12:58 am

Re: Some ideas for a monkish class.

#43 Post by aberk »

I made a typo. "One basket" should be “monastic."

Grey
Loremaster
Posts: 3517
Joined: Thu Sep 23, 2010 10:18 pm
Location: London, England
Contact:

Re: Some ideas for a monkish class.

#44 Post by Grey »

Weird typo :P

It's definitely not too long a description - most others are longer.
http://www.gamesofgrey.com - My own T-Engine games!
Roguelike Radio - A podcast about roguelikes

aberk
Higher
Posts: 46
Joined: Sat Dec 18, 2010 12:58 am

Re: Some ideas for a monkish class.

#45 Post by aberk »

I use voice software to access my computer. You should see the wacky typos I come up with. What did Dark God say about the lore?

Post Reply