|
Post by Fleck on Jul 30, 2011 15:38:12 GMT -8
Well, since we're already going with the Paradigm FF13 terminology, why not have a Synergist and/or Saboteur job classes? Or just combine them into one class and call it Green Mage. Either way, I think it'd be an interesting addition and add more strategy to the game.
|
|
|
Post by Bob on Jul 30, 2011 15:38:19 GMT -8
Yep, I could do that! Just tell me when it's uploaded and I'll check it out! If you'd like to do the other output, you'll need to change all "cout" statements to something new. I learned "myfile" but I think it's just a made-up word. I'll teach you how to make that work, too, in a little bit.
|
|
|
Post by countlieberkuhn on Jul 30, 2011 23:20:55 GMT -8
Bob, the c++ file is uploaded in the same location as before. One thing I just thought about though, is that my code is kinda badly done in that you need to have a player's stats twice for player 1 and player 2 respectively for the sake of my variables, (something that happens everywhere in my code, copy/paste for player 2) so that might be problematic with regards to the player input thingy, unless you can make it do both at once. The myfile thing sounds fine, it'll mean a bit of time changing cout's, but that's what find and replace is for, right? XD Fleck - I'm well up for making a saboteur class! It's a little easier than synergist as there's less things I can improve about a character really. I only need protect, and not shell/wall/reflect as my program isn't smart enough to differentiate between magical and physical damage. It's just damage. It wouldn't be a huge pain in the ass to change it, but saboteur sounds much more fun. I could give saboteurs blind, berserk, sleep, poison, str down and mag down in various skills. I might give them a daze attack that does small damage, but may cause the enemy to miss a turn, too. And not wake up sleep. Plenty to work with there I should probably make one more magical class though, so as to not end up with every pure mage going black mage/white mage/saboteur. I'm tempted to make a summoner paradigm, but I'd have to give that a lot of thought as to how to make it balanced and interesting. Gambler's do have a way they can summon with slots, but there's something like a 1 in 216 chance of that actually happening, so I am quite okay with their summons being way overpowered I'd be open for ideas regarding how summoners work though! I'd like to keep summons powerful, but with a sufficient drawback so as to give people a reason to choose black mages over summoners in some instances. Maybe something like FF8 where your characters hide and let the GF fight on your behalf for a bit, but it costs you a chunky portion of your health to do so? I dunno. IDEAS PEOPLE!
|
|
|
Post by Bob on Jul 31, 2011 8:46:52 GMT -8
It would be tricky to code, but you could have summons deal lots of damage, but take several turns to cast.... *shrug*
|
|
|
Post by countlieberkuhn on Jul 31, 2011 9:45:42 GMT -8
Actually I could probably code that quite easily just need a variable for the countdown, check for the countdown before the turn and when it hits 0 do a summon. I do the same sort of thing with sleep and berserk. Might be worth considering though! I have always wanted summoners in this, but avoided it because I just have no idea how to make it work. Maybe different summons could have different casting conditions.
|
|
|
Post by Bob on Jul 31, 2011 10:17:11 GMT -8
That could work! Okay, I've finished your program! I'm swapping the myfile stuff, then I'll upload it. I made a folder called "SimpleArena" and uploaded it to the spot you've said. When you see the folder, it means I'm done and you can test it out. EDIT: Okay, it's uploaded! I think you can delete all your character stuff, but I didn't want to do it for you since you might need the data. So all the character things can go, the characterChoice function is now useless, and the selectFighters function is useless. Hooray for making the program smaller and easier! Ask me any question you may have, and if you're curious, you can check out the functions I made like player_hp. That's how my program functions now, which is why you can't have two people with the same name. So it has a built-in flaw, but the only flaw is two people having the same name, which would be weird for text-based output anyway
|
|
|
Post by countlieberkuhn on Jul 31, 2011 15:28:10 GMT -8
Cheers Bob! I'm bloody knackered right now so I'll take a look at it tomorrow after a good long sleep. It should all be dandy though I'll be interested to see how it's done, too! I've also been having some ideas regarding summons. I think I'll roll with an FF8 summon-becomes-fighter idea for the most part, but maybe 50% or so of the damage dealt to the eidolon is transferred to the caster. I think I'll use your countdown idea for Bahamut though, as a nice 3-turn countdown to megaflare, as often happens in the games. So far I've decided that Ifrit, Shiva and Bahamut are must-haves. I always view them as the three 'classic' summons, with Alexander as a tentative fourth. I have completed the designs for a saboteur paradigm though! I'll start coding that in once I've had a gander at all the shiny new code Bob's put in!
|
|
|
Post by countlieberkuhn on Aug 1, 2011 4:15:39 GMT -8
Thanks Bob, that all seems to be working perfectly, and it's a lot easier to keep track of characters in a little notepad thingy! No way would I have worked that out for myself XD I won't lie and say I understand it all yet, but I am learning some stuff from it, like how you can declare variables in the brackets after a function's name. At least I think that's what you're doing I really don't get the initiate_player function, but as long as it works it's all good! When I go to uni this September, hopefully all should become clear! Now I can get started on the saboteur. Edit: Saboteur all done now! Getting some nice results. Here's the end to a rather long battle I just simmed. I love the close ones Vanille(Saboteur) HP: 14 Cloud(Monk) HP: 62 Poison: 2 Str Down: 3 ====================== Cloud(Monk) performs a Suplex! Vanille suffers 155 damage! Cloud's zen mastery allows them to recover 24 HP! Cloud loses 81 HP due to poison! ====================== Vanille(Saboteur) HP: 0 Cloud(Monk) HP: 5 Poison: 1 Str Down: 2 ====================== Cloud is victorious! Whole fight can be found below. Now just to think about those damn summoners... blitzball.goatpen.org/miniarena/Vanille%20vs%20Cloud.txtThanks again Bob for all your help! Wouldn't have been able to display a match that long without your txt file output code.
|
|
|
Post by Bob on Aug 1, 2011 8:28:24 GMT -8
Oh, okay, if you don't understand the way you declare variables in functions, then we've got something to learn! I was thinking it was a pretty early topic for functions, but I suppose not! So in theoretical function that we declare, we can declare any variables that will be used as parameters. Example:
int ex_function (int fish_taco){
int tuna_sammich = 2;
int delicious = fish_taco + tuna_sammich;
return delicious;
}
What this means is that we have a variable, "fish_taco" that is an int within our function. We also have an int called tuna_sammich (I must be hungry). When you call this function, the big difference between fish_taco and tuna_sammich is that you can change fish_taco every time you call the function. So let's say we're in our main function. We can call the function as follows:
int one = ex_function(5); int two = ex_function(3); int three = ex_function(one);
So, take your guess on what's going to happen! What is the new variable "one" going to equal? Well, it passes in a 5 for the int "fish_taco," so fish_taco = 5. Now, "delicious" is going to be tuna_sammich + fish_taco, so it'll be 2+5, so 7. And then, since our example function was an int, not a void, we are going to return an int. That means after all is said and done, whatever happens in that function is going to magically turn into whatever integer you're returning. Since we're returning "delicious," that means we'll return 7. So now in our main function, the integer "one" equals 7! Yay learning!
Okay, class! Now figure out what the integer "two" will equal! And give the bonus question a try: what will the integer "three" equal?
|
|
|
Post by countlieberkuhn on Aug 1, 2011 9:58:24 GMT -8
Thanks professor Bob! Now lemme see... two = 5 three = 9 How'd I do sir? XD Yeah, what you're teaching me probably is an early topic, but at my college, programming was only about a quarter of the whole course, with the rest of it being done with business management, IT management, graphics design and animation. Bit of everything, designed to get people into universities with a lot of course options. It used to be more programming heavy, but they lowered it as most students hated it. Not REAL IT students obviously! So, while I know the very basics of javascript, C++, visual basic, java, CSS, and VBScript, in most cases very little beyond Hello World was actually taught in each It was more just introductions into each language, and being able to recognise the differences in syntax between them was the focus more than making decent programs out of any one language in particular. So, that's why my program has been done in a very roundabout way for the most part I'm pretty sure I could almost halve the amount of code by not having a function written for both player 1 AND player 2 by using a clever bit of code, but for now I do things my way XD I'm still proud of it though, as it's way more ambitious than anything I've been taught before, which were probably 300 lines at most.
|
|
|
Post by Fleck on Aug 1, 2011 10:32:55 GMT -8
I like the saboteur so far, but one thing. Dispel seems kinda.... worthless. Correct me if I'm wrong, but not many job classes use positive status effects that can be dispelled in the first place, right? Also, the duration of status effects seems really short as it is, so you have, what, a three turn window in order for dispel to be successful? And even if you cast dispel right when your enemy uses a positive status, you still only spare yourself a couple rounds of that status. Given that Vanille in that fight used dispel like, 2-3 times to no effect, her time spent casting dispel to no avail roughly equaled any time she would have saved by dispelling her opponent.
Anyway, that's just the impression I got. Maybe dispel could have a secondary function that kicks in when it fails to dispel anything? Like, "if not dispel, then cause damage" or something. It just seems to me that if Vanille hadn't cast Dispel so much, she very well could have won the fight.
|
|
|
Post by countlieberkuhn on Aug 1, 2011 10:49:07 GMT -8
Yeah, I was considering that. The actual skill does a fairly significant amount of magical damage for each status that's removed, but I might give it a small amount of base damage regardless to make up for it. The skill itself kinda inclines me to create more positive buffs for it to dispel though, and add them to existing paradigms to use. I wouldn't mind a 3-turn strength increase for warriors, for example.
The idea of dispel is that because it's a shift ability, it'll take away any positive status the enemy may have, so that you won't have anything like regen working against poison, etc once you start actually using the main saboteur skillset. They'll just be a clean slate for the saboteur to start laying waste to. Right now, dispel only really hurts white mages and gamblers though, you're right.
Edit: I've made dispel now do base damage of 50% Mag, which is the same power as Daze. By comparison, Ruin does 100% Mag.
|
|
|
Post by Bob on Aug 1, 2011 19:21:36 GMT -8
You are correct (your earlier answers)!
Statements that return a value (int, double, string, whatever) can be really helpful, mostly because you can use them to call other functions. Like, in a lot of mine, I'll do:
damage = damages(get_pow(player), get_str(player), get_def(target), get_vit(target));
My get functions are what my teacher called "helper functions." They do a very minor thing, but it helps a lot. But that's how I use them to be generalized so that it doesn't matter if player one or two or five or whatever is calling this function. Not really bragging though, just kinda giving advice, y'know? My Arena 1.0 started a LOT like yours, then I just edited it over and over into what it is now (and I'm currently doing MORE editing!).
|
|
|
Post by countlieberkuhn on Aug 2, 2011 1:46:13 GMT -8
Ah, I see! So by using those helper functions to handle player stats, I could avoid having to repeat every combat function for player 1 & 2! It's probably not something I'd want to do to my program as it is now (working and nearly completed), but I do see how it could be done now. Sorta. I'd probably need a bit of experimenting with the get functions to get it to work, but could probably do it with some time and patience XD I've got a few helper functions, like getSlots and getDice, but for the most part I've just shoved all the workings out in the function where they're actually used. It's a bad practice, I know Hooray for editing though! My damage calculator has seen a couple of big revisions since I started it, after realising I could handle a lot of the variables in other functions, and remove a lot of unnecessary booleans, and just rearrange the whole damn thing a bit to make it handle all evasion-type thingies at once. The less hoops a program has to jump through, the more likely it is to work as intended. It's like maths. You can work out almost any problem using things you'd learned by age 13 in a roundabout way, but you can learn more complicated, but far more efficient equations to work out the same things.
|
|
|
Post by Bob on Aug 2, 2011 9:48:22 GMT -8
Well said.
|
|