Mister_Bison

Rookie
  • Posts

    126
  • Joined

  1. Quote:
    Originally Posted by Mind Forever Burning View Post
    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.
    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.

    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.
    Heh, true. But C++ still lacks the amount of standard (but poorly implemented as you said) things that Java has, allowing fast prototyping.

    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.
    You could cut up on the fancy names/acronyms already >_>

    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.
  2. Quote:
    Originally Posted by Mind Forever Burning View Post
    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"
    Dang, you're right. I feel stupid ^^

    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.
    It's *exactly* the same problem in C, and yet C is used for large projects. new() and delete() are just encapsulation of malloc and free with init clean functions. Plus you have STL containers that do help you to properly implement standard features such as Maps, Lists and Dynamic arrays.

    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.
    What's ARC by the way ?
  3. Quote:
    Originally Posted by Arcanaville View Post
    I code in my head, so when you'd start the clock is iffy on me.
    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.

    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.
    And generally that's ten times shorter to reimplement in another language than code the first time. And you still believe the 3000 thousands of hours would be necessary to redo the combat loop only ? I would understand if it was accounting for the total amount of effort required with just the game and the keenest eye and none of your posts or the Wiki, but the game logic has been hashed though a great deal already. We were just discussing the specifics of which loop did what, we were not discussing how Resistance was implemented !

    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.
    Oh yeah, I'll can what I do... in a zip file ! (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.
    Yeah, of course, if you start from scratch. Nobody should ever do that anyway, comparing to something is a better stability than dangling in the void, at least if you have enough critical judgement to stay away from bad code.

    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.
    you would be surprised what a trained and flexible mind can do with C++. It's becoming more and more a no-paradigm programming language. Also, if you ever happen to see both beyond the code what's done in the background, and in the big picture what gets done from back to front, it's not a matter of language anymore. Church's thesis essentially demonstrated all computer languages are equal. Now I wouldn't program City on a Turing Machine, I'm not such a masochist

    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.
    *sob* and again another scripting language.

    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.
    *cough* cough* You may like C++'s templates.
  4. Quote:
    Originally Posted by Gangrel_EU View Post
    16 hours.. going by the standard of a days work being 8 hours...
    I'm asking because coding the week-end is already off-work working so...
  5. 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 ?
  6. Quote:
    Originally Posted by Void_Huntress View Post
    Quote:
    Originally Posted by Mister_Bison
    So, off to implement the attribmod calculator !
    That's so cute.

    *grabs popcorn*
    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.

    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.
  7. Quote:
    Originally Posted by Codewalker View Post
    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...
    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.

    Did I mention I graduated as engineer, not from programmer background ?

    So, off to implement the attribmod calculator !
  8. Quote:
    Originally Posted by Arcanaville View Post
    The intricacies of real-time system programming, mostly.
    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.
    You mean why you need a third person to be arbiters on the snow events ?

    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.
    If I don't know how you name these things, I'm still as puzzled. I knew all these all along, these are on City Of Data, as well as attributes modifiers and scale. That doesn't make me budge.

    Quote:
    Technically, there's only one thing to do:

    Code:
    while(true):
        evaluate(power)
    Wait, you said
    Quote:
    I recommend you to spend just a single weekend writing as much of an attribmod calculator as you can
    you're asking me to also create powers and evaluate powers with this loop, which will call the attribmod calculator, not the other way around.

    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.
    I said combination because that's one of the variability an engine has to deal with, the other being the variability of the effects, and your for(;{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.
    Just pointing I'm feeling the same. But I'm also kicking into touch here and going around the goal pillars because you don't necessarily need to be real time, after certain points, you *can't* be real time. So make the game "timeout" while you get things straight and send updates again afterward, the loop is on a sleep if it ends early, but continues on the contrary.

    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.
    And you already spent all this time, it's now very easy to implement the details.

    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.
    True, but as Codewalker said, it's easier to make the engine that takes each instruction laid out and carries them at normal pace than make a simulator.
  9. Quote:
    Originally Posted by Billy Mailman View Post
    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.
    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.
  10. Quote:
    Originally Posted by Starsman View Post
    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?
    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.

    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 ArcanaVille
    More 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.
    Wait, the client shouldn't do anything, it's a client, it sends request and gets updates, everything happens server-side, well, nearly everything, at least everything combat(and animation)-wise are decided on the server-side and just user input is forwarded by the client (things like respec or real powers for instance use data on the client side plus eventually some constant data received from the server ages ago, like the chosen powersets and currently slotted enhancements). Since you would know some lower bounds to some effects you can program the client to actually don't forward things the player can't do anyway, but ultimately the server has the hand and say 'it's ok'. If it was like you said, if the server kept in sync with the client, how could you have powers showing ready when they are not ? How could I animate Haste (though only the excitation/shrugging, not the pompoms) when I activated it when it wasn't server-ready ? I believe the client does not sync the "animation", the rooting for sure (because it defines what the player is able to do) but not the "play flare animation" part. Animation is fluff, feedback, rooting is an effect, even if it's "animation rooting", isn't this why some powers don't root anymore (non-offensive PBAoEs anyone ?) Or am I missing something

    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.
    This kind of delay always happens when you have numerical systems (instead of analogical), time sampling tends to create delays if not resonnance, at least if you don't compensate for it, which is computationally expensive.

    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 ArcanaVille
    Assuming 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.
    Sorry, didn't mean that you were an idiot, I meant that reading what you said made me think you were an idiot, and I can misread, or read too literally. You could have seen from the answer I took your "data" was the power data, not the entity data, the memory that represented the actual state of the entity. But I did have the first misjudgment so I do understand why you just passed over that =) Also, I'm handicapped, because English is not my mother tongue.

    [/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.)
    That's still only 2 things to do differently, and since you've got functions, with parameters you can code pretty much any number of cases in your functions. It doesn't reduce the complexity though, I agree. It has to be somewhere. But you don't have to code a function for every existing combination of effect. What's the parser for then ?

    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.
    That could sort things out. But do we agree I just have to produce a library that handles entities and all their attributes (inspired from the attribute window plus every hidden attribute/fields I need for the implementation) and "example" functions that apply all power effects that I can think of and translate it into calls to that library ? Then the next stage would be executing said function when parsing the matching power's effects part.
  11. Quote:
    Originally Posted by Arcanaville View Post
    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.
    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)

    [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.
    Of course. In my mind I assumed the person has access to the Mids representation of the data, or the way the Titan Network produce this data from the most obscure representation. Anyway it's the same data.

    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.
    True, true. Benchmarking But actually, we have been writing the tech specs nonetheless, at least it's table of content.
  12. We are making progress
    Quote:
    Originally Posted by Arcanaville View Post
    Quote:
    What makes you think there is a 30/sec animation loop ?
    1. Because there's evidence for it in a number of places including Arcanatime, and the way the game engine attempts to synchronize rooting between the server and the client. I suspected its existence long before, when I first discussed predictable bits with BaB.

    2. Because pohsyb confirmed the existence of that system when I discussed game clocking with him.
    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:
    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.
    Ok, so the only hard part is thoroughness, you say ? My thoughts exactly. But most of the thoroughness is already made by datamining efforts done by the Titan Network with City of Data or the Mids. Essentially, my estimation is that when you get to implement every player power, you've got all the mechanics, and then you just need the bulk of the data, that is not the combat engine, actually, it's the NPC data, the powers each have and what each power does. But I also think what remaining out of our reach is the "which powers has every NPC" database, because we can already have the real numbers of NPC powers.

    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.
    It's an example of what, actually ? When does this get involved, and what does it do client-side ? I did throw grammar at it because I didn't know what that was. I do want to know when and what because that could help me understand the mechanics, not reinvent an emulating mechanism. I know you don't invent things, but I was as puzzled by this as much as if you did. I could have called that an "*** pull". If it's power-related and not in the City of Data database, it's useful. If you just applied that fancy representation just for the pleasure of finding me dumb-founded... well... I don't see the point.

    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.
    ho ho ho, now you're getting interesting ! Okay, I take the bait. Though I don't have access to the database, so I'm going to make a dozen sample powers each from a different set, and that doesn't count, okay ? Also, I may cheat a little because I did code it a bit in my head so I have a headstart (heh). Language is C++ but no inheritance (so C code-efficiency but easier time writing the code).

    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.
    I don't know the functions you implemented nor how you implemented, so I cannot judge. Even if I saw the code I couldn't even fathom the number of times you rewrote this or that.
  13. Arcanaville, thank you for asking so many questions !
    Quote:
    Originally Posted by Arcanaville View Post
    That would be highly inefficient. I would make power and attribmod activation period explicitly supported in the primary event loop.
    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).

    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)
    It *will* have all of these, in some form or another of course. The values each power has of these "power attributes" is supposed to be part of the data used by the engine. True, the Mids database doesn't have all of these. (stacking and near ground at least). I didn't think of suppression up to now, but that would take registering the last supressing effect's occurence.

    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.
    Well, even if it's not the same engline but the same results, it has the same "complexity", but As Codewalker said, there is no need simulating when making the engine, implementing existing designs is far easier than making up a new engine with new designs or a one-shot simulator of each power.

    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)
    Ranging from 2 minutes to a week-end, depends on what that humanly means :S Looks like a coma-separated... thing, each thing between comas is a token meaning... function names, operators and parameters ? You would need to set up a grammar in Yacc or Bison (heh !) and make your hearts desire come true.

    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
    First implementation: A "check toggle" clause for effects (next to the "onHit", etc, a "if X power toggled on"). Or, given this could be used for other powersets, just make a new "attribute" that's set by the toggle (it's just not a "vital" attribute of entities, it's here only for certain powersets).

    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
    Obviously, you pass messages to the UI. And this is done as part of the powers. So be it, also set these "flags" or attribute. Use the decay (inverse to regen, used for Fury & domination) mechanism already implemented to reset this attribute to 0 (no combo) (with infinite decay every T seconds) and use specific values to test for equality with subsequent powers.

    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?
    The second, obviously it's the simplest to implement and not quite inefficient. Why reinvent the wheel ? "Fury" is built as part of the melee powersets (all of them), just that the fury stat is not used (nor shown) to other ATs. You forgot Domination, that works the same way.


    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.
    You already did that. And listing them would be technically beginning to implement the engine.

    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.
    What makes you think there is a 30/sec animation loop ? I think there is no animation loop at all, it's just animation notices sent to the client, and eventually rooting notices to the the movement enging. If there was animation "synchronisation", it would never desync the Flares animation from floating text (which are also noticies to the graphics engine to render. Maybe a max of 3 of them / entity / frame + a total in case of overflow, in order to keep vitals in sync) or at least it would try to reanimate when at point blank. Which I've not seen the game doing even in very bad server lag situations. (like Nova'ing the hell out of towers in the last cimerora mish. I did see reanimating powers in traffic lag when duplicate packets were received.) If there is synchronisation, it's because the animation notifications is part of the combat engine's responsibility, because it knows the power launching, and thus, their animations.

    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.
    That should be done only when it's both more efficient server-wise and if it's compliant with the present behaviour.

    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.
    So what's difficult in doing that ? Here you *specifically* need script1 calling script2 and each needs to be different for it not to loop. Of course the better way would be designing a "chain" target zone, next to single-target, PBSphere, and targeted sphere, and that's more difficult because you have to change the data. But that's only a handful of powers. And I did specify that you could take twice as much time to do something better instead of just reimplementing the game.

    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?
    That requires either a new mechanic, or pretreating the powers. I wouln't like the additional complexity of adding the possibilty of a single effect affecting only a select numbers of target, I would do the 0-range sphere pseudopet technique, even if its displeases me. But hey, I'm not perfect.

    [/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.
    I'd pass the hot potatoe here, I only signed for a combat/vitals engine, the state of the enhancements is modified by another engine and taken to combat engine as input when the entity is a player (Enhancements could be carried to the pseudopets by way of buffs, because an enhancement is a power-restricted buffs, power that spawns the pseudopets).

    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.
    Yes but you can't change what's an engine and what's a data. When you had issue 7 (or the one when city of villain came out) you could have inserted the Demon Summoning Powerset without changing the engine (well, maybe the graphical one), but you could not do the same for the Dual Blade or the Bio Armor/Nature Affinity one because it's using all new mechanisms. Once you have put the Nature Affinity in the game (engine + data) you don't need to modify the engine to make Bio armor work, just list a set of powers, that is data, that the engine interprets.

    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
  14. Quote:
    Originally Posted by Arcanaville View Post
    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.
    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.

    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) is queue script2), where scriptN contains (OnHitapply 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.
  15. 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 !
  16. Quote:
    Originally Posted by Arcanaville View Post
    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.
    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.

    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.
  17. 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.
  18. Mister_Bison

    AP33 Forever!!

    Even Castle:

    send the kudos to eabrace on the titan network forum !
  19. Mister_Bison

    Ci-Git Coh.

    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
  20. Quote:
    Originally Posted by Arcanaville View Post
    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.
    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.

    Do bear in mind that if we recreate something today, it won't be with yesterday's tools
  21. Quote:
    Originally Posted by Starsman View Post
    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.
    Fanks for the splanation.
  22. Wait, what are those origin pools ?

    When I respecced my brute, nothing did show, because it was natural and Fighting is the Natural one ?
  23. Mister_Bison

    Ci-Git Coh.

    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.
  24. 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 ^^'
  25. Mister_Bison

    Ci-Git Coh.

    Le ralliement aura lieu dans 3 heures, 10h du soir, à Atlas Park sur Virtue. Venez nombreux, déguisés en dev ou pas !