-
Posts
126 -
Joined
-
Quote:Oh, that. But people can also do their own pimp_malloc() and pimp_free() in C, it's the same again. It's not because it was made popular by a language that it doesn't exist anywhere. There is *no* language that doesn't allow the user to fool up. It may be easier or harder, but you would be surprised.I disagree. C *only* has malloc/calloc/realloc/free; those are the standards. C++ has new and delete, but also many different varieties of wrappers on top of them (and of course malloc/free themselves). In many cases, when integrating frameworks, you have to disentangle the thing that was built on top of new/delete and then rewrap it for the benefit of the next layer in the stack. C++ operator overloading is a bit of a double edged sword here because it's possible and very tempting to make your own syntactic sugar that is almost, but not quite, entirely unlike the one your neighbor made.
Quote:The STL containers are neat, but asking everyone to be as smart as Stroustrup in order to make rational re-usable classes is unrealistic to say the least. One of Java's biggest successes is that it assumes the average implementor is much, much more naive than the language designers. Which bothers to no end those implementors who are actually smarter than the language designers.
Quote:Automatic Reference Counting. It's a language feature built on top of notational conventions in Objective-C that allow the toolset to automatically generate the appropriate retain/release semantics, so the developer doesn't have to do any explicit memory management but you still get deterministic object lifetime semantics. It advertises being both headache-free and GC-pause-free at the same time, which is a huge win for mobile development.
Except if Objective-C has found a way to code an Oracle, it's just the same algorithm as in boost::shared_ptr, as these are also reference counting, and it's still vulnerable to circle-referencing. In boost you have weak pointers for that at least. But I never used that yet, never needed to. I prefer to see the ownerships of things and clear creation such as deep copies and shallow copies.
On other news, I think I've nailed the attribmod library, I'm tackling the Powers & Effects (restricted to attribmod effects, discarding the summon, setmode etc...) one, but that one is hairy, especially the "Ignore buffs&debuffs" flag on powers >_> I need that to "handle how Combat Training: Offensive buffs itself" (which it does at the moment) and resistance toggles. and a whole other bunch of things, with real entities. I could do it quick & dirty but it wouldn't be nice. -
Quote:Dang, you're right. I feel stupid ^^Try replacing the period at the end of Arcanaville's sentence with a question mark. Or, here:
"Can X even move the needle much at all?" where X is "what you do in any number of hours on a weekend"
Quote:On the subject of C++, I love the language; it's still the only OOP implementation I know where I can "feel" how the code I write will be represented on the machine. (Java is close, but the lack of determinism in object life cycles hurts.)
But C++ has a huge Achilles' heel when it comes to large projects, and that is the lack of a standard mechanism for managing heap objects. Smart pointer? std::auto_ptr? Manual new/delete with clear ownership? Something custom? While it's obviously a solvable problem locally, when you start to integrate large systems with different ideas of "standard" you get messy interfaces, difficult bugs, and general lack of developer efficiency. Because of this, frameworks become difficult both to write and to integrate, and you end up with C++ seeming very support-poor when it comes to modern application development.
Quote:I want to learn more about ARC because it seems like something of that nature could be applied to C++ also, and if it were adopted broadly and incorporated into all the tooling, it could really go a long way toward solving this issue. But I don't know enough about ARC yet to say for sure, and of course filtering something like that through the C++ specs would take considerably longer than Apple just declaring it by fiat. -
Quote:same as me, and I did throw myself in this little show of wit because I needed to get that off my head anyway, even if I fail miserably it was driving me insane, and it could even provide an example of what to do or not do.I code in my head, so when you'd start the clock is iffy on me.
Quote:I also have a nearly complete data dictionary which few people would be able to start with. I think the time spent figuring out what to do, separate from the mechanics of data dumping, really ought to count. Otherwise we'd be talking about a hypothetical person that knows exactly what to do and can just type out code like they are banging out the dictionary. I don't know about anyone else, but much of the time I spend "programming" is either time thinking about algorithms and implementation techniques while nowhere near a keyboard, and fast iteration of code that I write, and rewrite, and rewrite, and rewrite.
Quote:To be honest, though, counting hours is mostly quibbling. The question is whether the depth and complexity of the problem is such that it could be done in any small number of weekend efforts. The question is more about pace than anything else. Can what you do in any number of hours on a weekend even move the needle much at all. (nice typo ^^ produce a few more and you'll end up the subject of a Zero Wing video. As a tribute, of course.)
Quote:And even an attribmod calculator, that only deals with what happens at a single moment in time for all possible sets of attribmods, requires a lot of complexity. Just getting resistance right is something I think most people are going to get wrong the first time, as trivial as that sounds on its face.
Quote:One other thing: my estimates were for C, where its harder to iterate code and you'd need to build up your own data structures (or use the appropriate libraries). My best guestimate for how long it would take me to code the engine in python, where I'm faster and can iterate code quicker, based on laying out the design last night, is about 900 hours.
Quote:I had the notion to use a project like this to teach me LUA. Its been on my mind even before Dr. Aeon's revelation LUA was spliced into the game engine. That would, of course, make it take a whole lot longer.
Quote:PS: writing the engine in Objective-C would also be a very interesting experiment, albeit mostly for the potential for meta architectural novelty than anything else. -
-
Ok I just remembered I have IRL things to do before tonight, I'll finish my day of work tomorrow or maybe after dinner.
What's a week-end worth of coding by the way ? 2*8 hours or 2*As many hours as you stay awake ? -
Quote:Thanks for the cheering, because I'm not trying to accomplish something, I'm doing something. I'm assessing how much can be done in a week-end day by a moderately knowledgeable programmer/engineer.Quote:Originally Posted by Mister_BisonSo, off to implement the attribmod calculator !
*grabs popcorn*
Salt or sugar popcorn ?
EDIT: Okay, first throw is done, I think. Now I need data to test it. Approx 4 hours (had a social meal). Then again, I was just writing what I had already pictured in my head.
I think I'll need to add some things though, but now the time is on pause until I get some creating and coding done to feed data to the calculator. Then I'll need some more time to make a UI to test it. I just need bulk import from some City of Data tables.
EDIT2: heh, forgot to take level into account, brb. -
Quote:I'm sorry Codewalker, I should have answered specifically earlier. I have heard you so it changed my meaning of "take data is in City of Data" to "begin where City of Data left off, which is still a good start", and any programmer would be interested, if he has to, look at the work done to take apart what's still good in it and correct the wrongs that could still be sitting in the code as "//OMG this is ulgy fix it later". But I continued to use "take city of data" because it was more near than far of what is needed, I think. Of course that takes a computer engineer, not a programmer, to do that.And since I've seen it mentioned a couple more times, I'll repeat: The City of Data database is not where you'd want to start for something like that. It's a mess. I've been trying to clean it up here and there, but it's still missing a lot of fields, some are the wrong type or have the wrong precision (chance was rounding at hundredths, so things like 0.5% chance on Overwhelming Force showed as 0...), some make assumptions that they shouldn't, and many things are shoehorned into a relational structure that they were never designed to be in.
The AT modifiers table was one of the most mind-bogglingly strange SQL designs I've ever seen, which is why it non-obviously broke once the devs went past 50 player + NPC classes. I had to pull it out entirely and redesign it from scratch.
If you're seriously considering writing a combat engine just for the hell of it, you're much, much better off just figuring out how to parse powers.bin directly...
Did I mention I graduated as engineer, not from programmer background ?
So, off to implement the attribmod calculator ! -
that, but the server isn't real-time... at least not hard realtime... because the event loop can overflow.
Quote:Dual box sometime. Then ask how its possible to see what you're seeing and still have a sane game.
Quote:Effects can have a Requirement in order to take effect, for example TargetType = player (for PvP effects) or source.kMeter > 0 (stalker hidden). These are entered into the power data as postfix expressions. It takes an integrated script processing engine to understand what "source.kMeter > 0" means, and it implies you either have to translate that into another concept on the fly programmatically, or you have to add entity tracking code that knows what kMeter's value is on the source of the power at the time its activated. Even the magnitude of the power is sometimes an expression: (source.TeamSize(30) * 0.03 + 0.07 >= rand()) * @StdResult -> the Assassin's strike non-hidden PvE critical.
If you don't know these things even exist, I'm not sure how you can be so certain about your estimates for how long it would take to reproduce all of the combat engine's behavior.
Quote:Technically, there's only one thing to do:
Code:while(true): evaluate(power)
Quote:I recommend you to spend just a single weekend writing as much of an attribmod calculator as you can
Quote:I never said anything about combinations of effects. If you think I mean combinations when I say the engine does hundreds of things, you don't understand what the game engine does. It does hundreds of discrete, singular, computationally different things. Magnitude resistance is different from Duration resistance: they require different code because the formulas are totally different. MaxMax buffs are totally different from Strength buffs. Zero duration effects are handled differently from non-zero duration effects. Extend stacking is different from conventional stacking. Cur is different from Abs. (Base) Defense is a special case of Attack type in the attack/defense type summation code. There are hundreds of different things in the engine, not dozens of things in hundreds of combinations. Hundreds of different things that require completely different code because they cannot be procedurally summarized. {evaluate(power);} hides it even more. The complexity is in the evaluate, and I'm aware of that.
Quote:The difficult parts of making a real MMO engine are all the optimizations involved in making working map servers, real time network code and event queues, etc. Things I have no current interest in doing. Replicating the game engine would be, for me, an intellectual challenge to see how well I actually understand it. And part of the reason for the large time estimate is that I'm pretty certain there are interesting problems in the way the engine does things that I won't really understand fully into I try to implement that in code. In a real project, debugging and reimplementing code to account for problems represents a large fraction of the total time. The time to program something is not identical to the amount of time it takes to type the final source code.
Quote:I know I spent a couple of weeks, off and on, just musing to myself how the game engine must work for unresistable resistance debuffs to work they way they do and for Combat Training: Offensive's accuracy buff to work as it does. When I posted my results on ranged damage metrics in the beta fast snipe thread a legitimate question was whether I had properly accounted for sonic blast buffing its own DoT with -Res - which I had not, because my calculator (deliberately, due to time constraints) did not deal with effect over time specifically in that manner. But that has a very significant impact on Sonic's numbers.
Quote:Having written damage calculators, damage mitigation simulators, and other discrete calculators gives me a particular perspective on this topic. The sheer amount of stuff the game engine does is enormous compared to the amount of time it takes to account for each effect. -
Quote:Because you have an in-game tool to do exactly that, it's the power analyzer (MK3 to hit any mob). Once it has hit you have the hit entity's real numbers (attributes), and so this data would have come to nullify the need for this power.May I ask why the NPC data was always kept hidden in the back-end of things? I've often wanted to be able to, say, look at how much resistance various enemies have, or exactly what the various powers of the Awakened are doing behind the scenes as they charge up and flash text at me, and it's always been a bit frustrating to know that it's in CoD, just hard to find.
-
Quote:Recoded and implemented a Learning (Artificial Intelligence) framework. In a team I'm currently working on... something... I guess I could say multi-sensors calibration and in particular, Kinect handling in an existing framework, the thing is enormous but I'm still green in this project. I didn't do real-time game development, I've had real-time courses though, and the server is NOT real time (else it would never "lag" (I'm talking about cimerora/hami lag))EDIT: forgot to tackel the networking code. I did do the master part of an I2C communication system as part of amateur robotics system back in school. I also pretty well remember the practical sessions with linux virtual machines.Mister_Bison, out of curiosity, don't take this wrong I just want to see where we all standing here and where everyone is comming from:
What is the largest coding project you have engaged on solo? What about in a team?
What about experience with networking code?
What about real-time game development?
Sure I'm not a multi-decade code veteran here, I didn't code in Basic or Fortran, nor on Amiga or Amstrad, but that doesn't mean I don't have a brain and can't learn or work, or that what I was taught was crap. Doesn't mean I know it all either. I actually want to appear stupid and get told things harshly than people saying nothing and letting me in the wrong. Actually, I've come to see this little explanation as tutoring on the game's mechanisms, making notes here and there that could see better use than in the dark corners of a single brain. Also, I'd like some people to come to term with their assumptions that there is only the harsh way to an implementation.
Quote:Originally Posted by ArcanaVilleMore or less. Critically, the 30/sec loop also calculates when animations start and stop, because that has to be in sync with the client that does animations. At launch, there were all sorts of odd glitches where the player would activate a power and the character would just stand there. That's because the server told the client "do this" and the client said "can't, still doing that" and then the client said "done, now what" and the server said "forget it, I'm already moving on to the next thing." The server has to know what the client is doing, which is why the server, among other things, has to now what is happening at every 30th of a second, because the client works on that clock.
Quote:This interplay generates the server side lag we call "Arcanatime." But even if you didn't want to reproduce this behavior, I'm not sure there's any significantly easier way to reproduce all of the events in the game engine as they occur. It actually took me a couple of days of thought and experimentation to come up with the design for a reasonable scheduler that would properly process everything that happens in City of Heroes.
What's actually the most unnerving in network play ? movement lag. Power lag, everybody can do with it, but jumping a fraction of a second too late and your down the hole instead of on the other side. So movement has a special treatment in network games, everytime. Since you have the network lag, it's no use doing it 120 times a second, that's why the Entity placement engine is on this 1/8 timer, and power launching is the duty of the placement engine because line of sight is one of the requirements. But the combat/effect timer can be as fast as you want, basically, because you have events based on time, and in a second it doesn't matter if you loop 2 or 6 times because you'll have to do as much processing (well, not to maintain every timers) but you'll have as many messages to send.
Quote:Originally Posted by ArcanaVilleAssuming I'm an idiot will only cause me to conclude you're one. Because every *other* programmer in this thread that has worked on something larger than "Hello World!" I'm pretty sure understood what I meant, which was that every data element in the power schema represents a data field which is processed by the game engine, each in a completely different way. Especially within the context of everything else I've said in the thread.
[/quote]On top of that, many fields are themselves indirectly processed, like the Expression fields which themselves require an entire scripting engine just to process. And parsing the grammar of the Expression fields is exactly zero percent of the problem. The real problem is writing the code to properly evaluate all of the indirect references to the game. Which *itself* requires entity tracking code to allow for those indirect references to go somewhere. AttributeRequires as a single field could end up taking ten times more code than fully processing all of the damage-type attribute fields because of that.[/quote]What's this "expression field" you're waving around ? never heard of that. That's the list of power effects ? Codewalker already said it was done, and I'm not one to let done work spoil.
Quote:(Since Abs and Cur modifiers on those attributes actually point to Health, they can all be processed with an iterated loop of code, but they cannot be processed with the same code as all other attributes with their own separate attribute values directly. Doing crazy pointer magic to make all of the attributes work with a single processing loop would save some coding time, but probably add significant debugging time to the process.)
EDIT: As I lied down to sleep, I understood your point about damagetype attributes and health now. That does shake my already-laid coding plan, but I'll make up a workaround this night I think, else tomorrw, else, with an ugly hack.
Quote:At this point, I'm really interested to see what sort of code you generate, to represent your understanding of the actual problem being discussed. -
Quote:Okay so the action loop is filling the event loop's data ? Action's loop is processing the "launch power"s and the event loop the "Do X points of damage"s ? (notwithstanding all the other things in the event)The 8/sec loop determines when actions can start, the 30/sec loop specifies when events occur, and it keeps the server and the client synchronized.
The difference between what I'm calling an "action" and an "event" is: activating a power is an action. A regeneration tick is an event.
[quote]Nope. Every bit of data implies hundreds of lines of code to do something with that data.[quote]NO NO NO NO and NO for god's sake ! What kind of project manager believes that ?
Once you've implemented something able to decode the data behind, let's say, the Nemesis Staff, it's far easier to do the Force Field.Force Bolt ! But you can't directly do Smite then, except if you've done Shadow Punch ! You have a baseline of minimal data to process and then all the data can be processed by the engine ! It's not because you've got 1000 powers and that it takes 1000 lines to implement Brawl at first that it's going to require 1000x1000 to implement everything ! Gosh !
Quote:Also, this assumes the person looking at the data knows what they are looking at.
Quote:That would be more definitive than debating it, because honestly there's not all that much to discuss without flat-out writing a spec for the engine. Only by looking at the data for real and writing code for real are you likely to appreciate the scope of what we're discussing. Or alternatively, your idea of the scope of what we're discussing is radically different than mine. But actually, we have been writing the tech specs nonetheless, at least it's table of content.
-
We are making progress
Quote:I actually miswrote that. I meant: What makes you think the 1/30 sec loop is the animation one ? Is it exclusively animation ? I think it's the combat/vitals loop, and the 1/8 sec loop the positionning loop, and animation is just a by-product of the power part of combat.Quote:What makes you think there is a 30/sec animation loop ?
2. Because pohsyb confirmed the existence of that system when I discussed game clocking with him.
Quote:If anything, my estimate actually went up. You seem to be dismissing anything that isn't "hard" as taking essentially no time, when the problem isn't complexity, its thoroughness.
Quote:For example:
That's just a postfix expression. But you're focused on the grammar, and not on all the systems that grammar implies have to exist. Its referencing entity properties set by other mechanics, all of which would require more code. There's no possible way to make the expression system work in a week end.
To you its just tokens. But its actually an example of the number of moving parts in the game engine you can't trivially simplify.
Quote:There are dozens of attributes with half a dozen aspects, plus over a hundred mechanically different ways to affect them. That's hundreds of hours just to create a complete attribmod calculator. If you spent 24 hours a day for four weekends I would bet anything you would not be finished with that, and that's maybe 15% of a working combat game engine.
Honestly, I recommend you to spend just a single weekend writing as much of an attribmod calculator as you can. Not even an engine, just a calculator that can be given a set of attribmods and will calculate what the attribute values are for the entity that has them for the full duration of those attribmods, moment by moment. That's like at most 1/6th of a full combat engine. If you think you can write a full combat engine in four weekends, you should be able to do this in one without missing the NFL late game.
Just try it for even one hour and see how far you get. I can only assume you are dramatically underestimating the time necessary because you have no reference to compare to.
Quote:It took me two weekends worth of work to write the code to simulate enough attack calculations to generate my attack set metrics for I24 beta ranged set metrics, and I hadn't finished adding the tohit tracking for fast snipe. That would be about 0.5% of a working combat engine. -
Arcanaville, thank you for asking so many questions !
Quote:You're thinking the seconds2frames is made while the game runs, of course that's inefficient. You've got to pretreat the data. Is it still inefficient ? I think it's the least-size representation, since the seconds get rounded to frames anyway. And least-size is always the most efficient (given everything else being equal). In truth I can't see what you mean by making the power activation period explicitly supported in the primary event loop, except what I'm doing: expressing the delays & time in general expressed in event loops, that is, frames (which is the end-product of a loop).That would be highly inefficient. I would make power and attribmod activation period explicitly supported in the primary event loop.
Quote:Where is your data going to come from, if your engine doesn't have a one-to-one mapping of mechanics to the data we have?
For each effect that a power performs, here an incomplete list of what a game engine would have to understand, not counting superficial things (like floating text and combat spam):
Attribute affected (i.e. Smashing, Melee_Attack, Regeneration)
Aspect affected (i.e. Cur, Abs, Str, Res, MaxMax)
Scale value
Table (i.e. Ranged_Damage, Melee_Buff_Tohit, Melee_Ones)
Attribmod target (i.e. self, target)
Period (i.e. how often the effect occurs)
Duration (i.e. how long the effect lasts)
Chance (i.e. chance the effect will take effect)
Delay (i.e. how long to delay effect after hit before taking effect)
NearGround, AllowStrength, AllowResistance, AllowCombatMods (flags)
Requires (postfix expression which must evaluate true for effect to occur)
AttribmodType (i.e. Magnitude, Duration, Expression)
StackingType (i.e. stack, ignore, replace, extend)
StackLimit (maximum number of times this specific effect can stack)
Duration (used for Magnitude type)
Magnitude (used for Duration type)
MagnitudeExpression (postfix expression used for Expression type attribmods to calculate magnitude scale value)
InnerRadius, OuterRadius (min and max radius allowed for effect used when power is spherical AoE)
SuppressionCodes (codes representing conditions under which effect is temporarily suppressed)
Reward (used to define powers granted with GrantPower effects)
EntityDef (used to define special entities for EntityCreate effects)
Quote:Alternatively, if you want to make up your own engine in a couple weeks that doesn't have this complexity, you'll then have to convert all the powers data to that new engine somehow.
Quote:How long would it take just to write the expression engine that figures out what to do with:
kMeter,source>,.9,<,kHeld,target>,0,>,kSleep,targe t>,0,>,||,&&,enttype,target>,player,eq,&& (stalker crit)
Quote:And how would you make Dual Pistols work: would you properly implement GlobalChanceMod or would you just recreate the powerset by hand? http://tomax.cohtitan.com/data/power...d.Dual_Pistols
But there is something you can use already, the "mode" variable every entity has. Like "disableAll" etc. These are just bits in a bitfield right ? It can be set/deset as part of effects too.
Quote:Would you write a completely new combo system and redo all the Dual Blades powers by hand, or implement mode setting and use the original data: http://tomax.cohtitan.com/data/power...ee.Dual_Blades
Or you can use modes or a mode-like system. A special bitfield for use by powersets, like the dual blade, dual pistols, or street fighting, Titan Weapon, Staff Fighting (notice these are all offensive powersets, so mutually exclusive on one single toon). Fiery Embrace is an exception, but it's a single power, it could manage with only one bit of the new bitfield. Each new power could use specific bitmasks to apply to the new bitfield, given the effect. This has to be done for these 5 or 6 power sets, and you have to code the method to parse these commands, but it's not goint to take 10 hours.
Quote:Do you write your own Fury system and redo all Brute attacks, or implement the Rage bar and Brute fury damage buffs within the data?
Quote:I think its easy to say "just convert the data to formulas" without actually seeing the data or knowing the mechanics. I would challenge anyone to just *list* the mechanics that would have to be implemented in four weekends much less actually implement them in code.
Quote:Basically, although there's some extra complexity in there that causes some effects players might not care about. My guess is that there's at least three main timing "loops": a 30/sec animation synchronization event loop that synchronizes server events with client activity, an 8/sec impulse action loop that the game engine uses to initiate events and actions, and I have some evidence for a 2/sec decision loop that determines when critters decide to take a course of action.
I've actually put more thought than is really useful into how to account for time in CoH. How to deal with things like recharge and regeneration (tick decrementers seems the best approach), event overflow (i.e. Hami lag: global clock tick-based correction seems the best there) stuff like that.
Quote:I should also mention that how we conceptualize what powers do as players and what they actually do mechanically are often very different. So if you decide to make a game based on the conceptual nature of the powers you may find yourself recreating the powers from scratch, because the data we have doesn't do what you think it does.
Quote:For example, CoH has no "chaining" mechanic. None. Chaining powers grant powers to targets which create an aura around the target which forces the target to grant additional powers to a limited number of the targets around them which themselves damage the target and grant the same aura to those targets and set a flag which prevents the same target from being hit again by the target it hit with its own aura.
All the data says is "give that guy a new power." It takes human comprehension to look at the sum total of what's going on and say "that's a chaining attack." But if you make a game engine with a chaining mechanic, what's going to use it? None of the powers in City of Heroes, until you make them do so by hand. Unless you're smart enough to create an expert system that can deduce developer intent from the data.
Quote:A lot of powers work like this. Tanker single target attacks aren't: they are AoEs, all of them. That's so that taunt can hit multiple targets. But the damage in them is restricted to only the targets exactly zero feet from the center of the AoE. Which, in the modern game, is at most one thing. Do you implement that behavior directly, or do you again, by hand, change the definition of all those tanker attacks to be single target and implement a new mechanic for AoE taunt effects as a special case?
[/quote]Do you directly implement exactly how our game engine deals with buffs that buff themselves? Or do you fudge, again by hand, Combat Training: Offense?[/quote]You mean things like resistible resistance debuffs ? Hell, I would straightly implement it without trying to fix it. It's part of the compliance. Buffs are always Irresistible and/or "Ignores Enhancement & buffs" to try to diminish these effects, even for resistance (doesn't take +dam into account)
Quote:There's actually a set of flags that tell the game engine to treat things like enhancements differently than powers - enhancements actually *are* powers, just powers that work differently. Do you hard code implement that distinction directly, and then have to deal with things like Luck of the Gambler: Def/+GlobalRech as yet another hand-edited special case? This is another case where we think of something as one thing, but the game thinks of it as something completely different, and there are cases where the difference is important. In the above enhancement, the +Def Strength should only affect the power its slotted into. The +Rech Strength should affect the entire player.
There's no "rule of five" except in the devs' head. That's not something the game engine is directly aware of. Its actually just another Requires clause on the passive powers that are granted by the inventions as the set bonuses. Do you implement that in a hard coded fashion or do you implement that specific field in a general purpose manner? Because if you don't, you'll then have to make a special case rule for the "rule of one" used by Bruising, and the "rule of three" for the Might of the Tanker proc.
Quote:If you don't implement all of the complexity of the game engine, you'll be left with the actual data being a cloud of special cases, which would probably take more time to implement in the long run. What we see and what the game engine does are often radically different in the details, and the game obscures a lot of funky activity the data contains to make interesting things happen. Skip that complexity in the engine, eat it in the data. There's no way around that.
What's a single target attack, what's a pet, what's a buff, what's an enhancement - these all sound like easy questions to answer. But they aren't, at least not by just looking at the data.
Conclusion:Hey hey hey ! we nearly went over all the mechanics of the combat in the game in a single post ! And you still think this would take 1000 hours ? Okay, I'll give you the time we are spending discussing this -
Quote:I knew you were too exhaustive. The combat engine I was thinking about only encompassed the vitals, not the positionning. Making an engine where you can run/jump/fly is basics in any game and engine, and *it* should handle the line of sight, just pass the command to launch the power through it and *it* will queue the power until it can get launched, where it will notify the combat engine that will continue to queue it for (eventual) animation reasons, and pass it back to the positioning engine when ok etc... as long as they don't agree back-to-back (in the same frame), in which case the power is launched. So I'm only talking about the power/animation/vitals engine.I wasn't really thinking about animations. I was thinking about the code to properly translate the raw powers database into powers, attribmods, and the relevant elements of the VFX tables (particularly the sequence and animation data that can be converted into root times) into a time-accurate engine that accounts for all attribmod effects, power enhancement, and combat mechanics. Also a rudimentary AI.
In other words, the entire combat engine minus most of the graphical hooks, three-dimensional real time positioning, and large-scale entity tracking. A 2D side scroller version of the entire combat engine.
If you want to know where the 3000 hours went, consider this: how many of your 800 hour estimate was allocated to handle projectile velocity. How many to implement the asynchronous entity database used by GrantPower. How many to handle rooting. How many to handle all the different kinds of stacking (stack, replace, ignore, extend, overlap, limited). The postfix expression system. Diminishing returns.
There's a lot of stuff in there when you stop to itemize it all. I would guestimate there's about 200 different distinct effects or systems in the combat engine you'd have to account for to properly emulate all of the player and critter powers. Pseudo pets. Requires clauses. CancelOnMiss. Magnitude and Duration based Resistance equations. The complete tohit algorithm. Interruptibility. IgnoreStrength lists. Power redirection. Rage bars. The recharge system. The combat clock. Endurance and recovery. Perception. Intangibility. Mez. Range. I'm not even going anywhere near the physics engine.
Just think about how much code it would take just to understand how to correctly calculate Cur, Abs, Strength, Res, and MaxMax effects on the approximately fifty different attributes each entity has. There's probably a good twenty hours of coding just for that.
Edit: and I'm not as fast a coder as I used to be. A really really fast coder might be able to do all that in 1000 hours. Maybe.
The key here is not to think of arcanaTime as a thing to implement, put it in the engine, like fighting game do. Time (as in wall time) doesn't really exist, only frames do. And every player has seen evidence of this in CoH, because when it lagged in Cimerora, the time was lengthened because the game needed more time to compute every event that happened at the same time in a "frame". It doesn't need to be "time-accurate", because it gives the "tic" and everything waits on it.
Graphics and game engine were tightly intertwined back in the old days, basically because you had no need of processing events inbetween longer-to-render frames, or at least so the game devs thought. Basically, the whole server (I think that's how you discovered ArcanaTime) is frame-based, it's just a receiver that gets notified of entities (including user) input (including placements) and executes scripts - the powers. Given a programmer that had the full specifics to leverage the Mids database (which I suppose he could ask the Titan to give), he already has the power data, he just needs to translate it in frames and effects and so it's just a request-based server that takes requests from the entities and produces everything you talked about: the recharge, the effects, etc... It's just translating each and every power effects into a modification, formulas to apply to values and delays in frames (these delay are calculated in frames at launch, either because the distance between the to entities and the velocity of the projectile is know, or the effect just states "after Xseconds"), and recharge is translated into "points" that, if full, the power is recharged and at each frame, the recharge rate is calculated to produce the number of points given to each power on cooldown.
In the case of CancelOnMiss of DoTs/HoTs, for instance, these are just chained scripts/effect, where the first application (what's actually listed in the power effects) isqueue script2), where scriptN contains (OnHit
apply damage and queue scriptN+1)). and ends at scriptM for a DoT with M ticks. In the case of pseudopets, spawn the correct entity.
I may have jacked up the calculus because I supposed the power effect lists are a given, but if you consider power effect as data, and not the engine, it is *not* upward of 1000 hours to make. Maybe not 3 week-ends as I said, but still, 1000 hours ? That's taking far too many feature into account, not just the *power/vitals* engine. Plus, I didn't include the AI, just the thing that would make everything "live" and tick based on AI and player input.
And also, I want to say that it's how *I* would implement it, and it should be compliant to how the game plays, if it's not *the* way it's implemented. If I'm wrong about this idea, I'd like to be challenged with cases where it doesn't work. -
I don't know perl, but I do know programming. You've done a great feat here for such a small personnal result, but it will snowball through the community. Wonderful !
-
Quote:You're thinking one programmer has to do it alone, but the right analysis can break down the problem into thousands of pieces and then make is combine gracefully like the devs never imagined before because they use old tools. To simulate the combat dynamics only, one wouldn't need more than 2 or 3 week-ends, double that to make it optimized. I mean with the present data.If I was still in college and judgment-proof, I'd be all over it.
I think my idea to make a Mybrute-like simulacrum of the combat system is something I would one day try to tackle. But my guestimate is 3000 hours of coding just to accomplish that. Two to five man-years of effort is what I figured it would take to recreate the CoH game engine. That's a lot of sustained effort required. Which is not to say a community effort couldn't get pieces of it up in less time: the costume editor for example, or a non-combat fly-around map server. But our combat system is a complex tangle, and if you try to reimplement it that's a major undertaking and if you don't you have a good chance of being unable to directly use all the powers data we have for players and critters. That would be a tough call.
One of the biggest stops right now is not being legally able to use the assets of the game nor being able at all to use the assets on the servers. The assets that really give life to the game; spawn points, scripts and conversations.
To program all that from scratch won't take long, it's the content that will take time. -
Just making counts here.
There are people that work toward saving City of heroes from closing.
There are people that work toward making something that'll accomodate the players after City closes.
And then there are people that are on the forum, barking their opinions sitting on their backside.
I'm from the first two populations here, I have proof for these. One of them is my signature. The second is on a private part of another forum. But first I was from the third too. But that lasted a day or two. Now can everybody look deep inside himself or herself and prove otherwise and stop being of the third population ? Because THAT is a waste of oxygen.
Of all the epochs and throughout all the time, it wasn't policitians or their decision that made things go. It was Action.
Do, don't say, be productive. We can do it. Whatever it is. Believe, or let everything go. -
Even Castle:
send the kudos to eabrace on the titan network forum ! -
Snif, ça va faire plaisir à certains, mais je me serais donc trompé, sur certains comptes au moins ! (même sur certains comptes VIP, désolé pour l'oubli :P)
Les sections Francophones ALL-ACCESS étant pauvres, je vais essayer de faire ouvrir la section Vigi pour nous, francophones. (si on se fait pourrir pae des free anglais, tant pis... mais je pense que (french legacy) va les refroidir...)
Merci pour le lien Momox, ça va faire plaisir aux Titans ça ! (Vu comment ça me fait plaisir)
Je suis désolé pour la perte de vitesse, mais grosse urgence au boulot pour demain, j'ai eu que quelques heures le soir et pas beaucoup pour le rapport. Sachez qu'une bonne centaine d'articles sont sortis depuis le "Black Friday", que 3 "stars" du monde video ludiques retweetent certains trucs, et que le ralliement est encore un succès aujourd'hui, car Atlas 1-33 n'ont pas disparus depuis Samedi soir(les gens restent loggés)
Pour ce qui est de l'action pour motiver les médias français, j'aimerais faire une vidéo personnelle que j'essaierai de faire voir à certains youtubers/webséries pour avoir de la vision (Le Joueur du Grenier, diablox9, Fanta & Bob, NOOB) histoire qu'ils donnent un coup de pouce au tourniquet et que les vidéos s'envolent !
J'ai essayé de contacter Dark Freeman pour avoir du soutien logistique ou ne serait-ce que des avis, mais il répond pas. Notamment, qui c'était la webserie qu'il voulait rencontrer pour l'interviewer: la Flander's Company je crois ?
Allez, tenez bon les amis, et puis si le bateau doit couler, ça sera un ****** de naufrage dans le sang et les larmes -
Quote:Everything is possible in the software world. Even making something exactly the same, it's just going to cost time and time for adjustments, but it's not infeasible to at least have something similar that just needs to be tweaked around the edges.Selfishly, perhaps, I thought the same thing. I would have no problem answering questions and making limited contributions to an attempt to recreate the engine, especially if there were no objections from Paragon, but actually reimplementing an MMO engine is such an enormous undertaking that if I had the time and resources I'd probably go make an actual game. Even with toolkits, it seems a daunting task. And toolkits are not likely to be able to reproduce City of Heroes' gameplay with fidelity, given our rather unique design.
Do bear in mind that if we recreate something today, it won't be with yesterday's tools -
Quote:Fanks for the splanation.If you are asking about the ones I linked, they were under-development special power pools. The first one of these pools we would have seen was the Sorcery Pool, currently available on the beta server.
Everyone can access these pools regardless of character orgin, but they were premium power pools you had to pay for. -
Wait, what are those origin pools ?
When I respecced my brute, nothing did show, because it was natural and Fighting is the Natural one ? -
C'est un mécanisme de défense émotionel, plus tu lâches vite, moins tu souffres. Et ensuite, les français qui parlent anglais, c'est rare. Beaucoup sont partis rien que depuis que la traduction est finie. Jouer à un jeu auquel tu comprends rien est assez frustrant et insécurisant, même quand tu joues avec d'autres francophones.
-
Too many Atlas Park. The Code can create Atlas Park 1 to 9, but after that, it needs too many characters to make the new name...
It's year 2000 all over again ^^' -
Le ralliement aura lieu dans 3 heures, 10h du soir, à Atlas Park sur Virtue. Venez nombreux, déguisés en dev ou pas !