Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[2.2]Programmable AI via scripting
#81
the program looks realy good, but I cant open the 7z file, the 7zip say that is corrupted, can u plz upload it again with winrar or winzip?
Reply
Thanks given by:
#82
I've got a few questions I would like to have answered if somebody (aka YinYin or Silva) finds the time:

- Is it possible to store entity-based, static values? As in, f.e., counting the number of melee strikes beformed by a specific character. And will this work INDIVIDUALLY for multiple instances of the same character ID?
- Is there a more efficient way in determining what is in a specific area, other then iterating through the entire list of loaded objects and checking every single one?
-Has there been any reports of fps-loss due to complex AI? F.e. 20 AI-constrolled characters onfield, all iterating through all 400 loaded objects every tick.
-Did anyone extract/recreate/copy the basic 'id();' LF2 uses for all vanilla chars? If not, did somebody write an own complete id() which could be refitted by me for my own characters? Or at the very least does somebody have a datasheet/list of all features performed by an basic id()-AI (aka fighting, approaching, running, picking objects etc)?
(AI - unrelated
-Is there a state that permits a character to change his facing based upon pressing left / right WITHOUT influencing the characters frame-behavior (which pretty much cancels out states 0 and 1, I guess)?)
My Creations: (Click to View)

Return (String) System.getNewsOfTheDay();
Barely active, expect slow responses. If at all.


Greetz,
Alblaka
Reply
Thanks given by:
#83
(02-04-2013, 06:10 PM)Alblaka Wrote:  -Is there a state that permits a character to change his facing based upon pressing left / right WITHOUT influencing the characters frame-behavior (which pretty much cancels out states 0 and 1, I guess)?)

4/5?

Else, I guess one could go with a hex-edit :P
Silverthorn / Blue Phoenix
~ Breaking LFE since 2008 ~

"Freeze, you're under vrest!" - Mark, probably.

» Gallery | » Sprites | » DeviantArt
Reply
Thanks given by: Alblaka
#84
(02-04-2013, 06:10 PM)Alblaka Wrote:  I've got a few questions I would like to have answered if somebody (aka YinYin or Silva) finds the time:
Or someone else.

(02-04-2013, 06:10 PM)Alblaka Wrote:  - Is it possible to store entity-based, static values? As in, f.e., counting the number of melee strikes beformed by a specific character. And will this work INDIVIDUALLY for multiple instances of the same character ID?
Yes, however there is currently no efficient way to do so.
One way is to create a static array (declare it outside of functions, as you would do in most languages), and then have each slot from 0 to 399 correspond to each ID. the problem with this solution is that you are going to waste a lot of memory, since you are hardly using every one of them.
The other way would be to store it within some of the unused chunks of the LF2 data structures, however this might cause unexpected results, and there might not be enough memory available for what you need.

(02-04-2013, 06:10 PM)Alblaka Wrote:  - Is there a more efficient way in determining what is in a specific area, other then iterating through the entire list of loaded objects and checking every single one?
No, nor do I believe there is a way to make it more efficient, with the exception of multi-core stuff, or writing a function in the DLL to do the checking, but neither of those are built in.

(02-04-2013, 06:10 PM)Alblaka Wrote:  -Has there been any reports of fps-loss due to complex AI? F.e. 20 AI-constrolled characters onfield, all iterating through all 400 loaded objects every tick.
Not that I know of.
The best way to check it would be to have a character clone himself to infinity, with some sort of stupidly complex AI.
If this turns out to ever be a problem I might look into writing a JIT-compiler which might speed up the process.

(02-04-2013, 06:10 PM)Alblaka Wrote:  -Did anyone extract/recreate/copy the basic 'id();' LF2 uses for all vanilla chars? If not, did somebody write an own complete id() which could be refitted by me for my own characters? Or at the very least does somebody have a datasheet/list of all features performed by an basic id()-AI (aka fighting, approaching, running, picking objects etc)?
(AI - unrelated
I don't believe that is the case, and sadly my assembly skills are not nearly enough to try and help you out.
Silva managed to reverse engineer the random function of LF2 so he might be able to reverse engineer the id function as well, but there is no guarantee as it is way more complicated.

(02-04-2013, 06:10 PM)Alblaka Wrote:  -Is there a state that permits a character to change his facing based upon pressing left / right WITHOUT influencing the characters frame-behavior (which pretty much cancels out states 0 and 1, I guess)?)
The only one that pops into my mind is state 7 (defend), but that only works in certain frames I believe.

If you feel like it you can download the DLL source and try to implement some of the things above. If you do so don't hesitate to contact me and I will update the DLL ASAP.
Age ratings for movies and games (and similar) have never been a good idea.
One can learn a lot from reinventing wheels.
An unsound argument is not the same as an invalid one.
volatile in C++ does not mean thread-safe.
Do not make APIs unnecessarily asynchronous.
Make C++ operator > again
Trump is an idiot.
Reply
Thanks given by: Alblaka
#85
Ow sorry, seems I forgot a name there ^^' Thanks for the answer.

@static variables:
If creating Arrays is possibe, there is a simpler solution: Creating a basic map.
Implement two static Arrays, the first contains a number of 'num's, the second one the associated value, write a function
int getValueFor (int num)
and done.

@Area detection:
Guess I will proceed with my previous code then, exspecially since
@fps usage:
this doesn't seem to be an issue at all.

@Basic id-ai:
Meh... means it will take more then otherwise necessary debugging for characters whose id() I override. Will post a checklist once I'm done with recreating it, so you at least have a base frame of 'necessary functions' for an id().

@turn-able states:
I'm not sure whether jumping actually works, could be frame-hardcoded as well. Will have to check that.
Regarding state 5, one can't turn middash, accordingly it's not part of my searched solution.
Je, state 7 won't work outside of defense frames (which is a major part of Dokum's complex defense, as D automatically jumps to 110, but I need multiple frames for the entire defense, preventing him from turning).

Ramond edited this post 02-04-2013 08:34 PM because:
You're wrong on turnable states, one can turn middash (as long as you don't attack). The problem with using states 4 and 5 is that when you press attack, the char will go to the respective attack frame (jump_attack or dash_attack).

Otherwise I'm pretty sure state 4 does allow turning around, regardless of frame number...
My Creations: (Click to View)

Return (String) System.getNewsOfTheDay();
Barely active, expect slow responses. If at all.


Greetz,
Alblaka
Reply
Thanks given by:
#86
- Is it possible to store entity-based, static values? As in, f.e., counting the number of melee strikes beformed by a specific character. And will this work INDIVIDUALLY for multiple instances of the same character ID?
as someone else said
I've managed to replicate team commands that way

- Is there a more efficient way in determining what is in a specific area, other then iterating through the entire list of loaded objects and checking every single one?
http://www.lf-empire.de/forum/showthread.php?tid=7976
if you are looking for a specific kind of object you can try to only investigate the range where it is most likely to appear
also object slots always get filled up from low to high numbers - so if you are iterating over a larger empty area (empty object slots) you can cancel the iteration hoping that there won't be an old object lost on a higher slot because the ones below became free (blast/items disappearing)
also I suggest only iterating once, getting important/dangerous object slots (target/item/dangerous attack/ally) and then work with these numbers within all of your script

-Did anyone extract/recreate/copy the basic 'id();' LF2 uses for all vanilla chars? If not, did somebody write an own complete id() which could be refitted by me for my own characters? Or at the very least does somebody have a datasheet/list of all features performed by an basic id()-AI (aka fighting, approaching, running, picking objects etc)?
I am/was trying to create a new basic AI: http://www.lf-empire.de/forum/showthread.php?tid=8187
you can help me if you like

(AI - unrelated
-Is there a state that permits a character to change his facing based upon pressing left / right WITHOUT influencing the characters frame-behavior (which pretty much cancels out states 0 and 1, I guess)?)

no
there are only two frames that allow this: 110, 212
also the dash frames: 213, 214, 216, 217 (they redirect to 213, 214 though)
then there is the dircontrol in cpoints
and lastly this:
http://www.lf-empire.de/forum/showthread.php?tid=4470

(02-04-2013, 07:30 PM)Alblaka Wrote:  @static variables:
If creating Arrays is possibe, there is a simpler solution: Creating a basic map.
Implement two static Arrays, the first contains a number of 'num's, the second one the associated value, write a function
int getValueFor (int num)
and done.
that still uses the same amount of memory, won't it?

edit: you've posted inside the threads I am linking to yourself ... why exactly are you asking these questions?
Reply
Thanks given by: Alblaka
#87
(02-04-2013, 08:44 PM)YinYin Wrote:  - Is there a more efficient way in determining what is in a specific area, other then iterating through the entire list of loaded objects and checking every single one?
http://www.lf-empire.de/forum/showthread.php?tid=7976
if you are looking for a specific kind of object you can try to only investigate the range where it is most likely to appear
also object slots always get filled up from low to high numbers - so if you are iterating over a larger empty area (empty object slots) you can cancel the iteration hoping that there won't be an old object lost on a higher slot because the ones below became free (blast/items disappearing)
also I suggest only iterating once, getting important/dangerous object slots (target/item/dangerous attack/ally) and then work with these numbers within all of your script
Jep, but I cannot afford to lose information when dealing with complex AIs. Imagine just THAT important T3 object was created right after the 120-object smoke cloud and then is never found by the AI, causing it to (f.e.) spam release moves without success (because it can't find the limiter condition).
I do only iterate once per character, though.

Quote:-Did anyone extract/recreate/copy the basic 'id();' LF2 uses for all vanilla chars? If not, did somebody write an own complete id() which could be refitted by me for my own characters? Or at the very least does somebody have a datasheet/list of all features performed by an basic id()-AI (aka fighting, approaching, running, picking objects etc)?
I am/was trying to create a new basic AI: http://www.lf-empire.de/forum/showthread.php?tid=8187
you can help me if you like
I will drop in my notes if I manage to figure out something you haven't already ^^

Quote:(AI - unrelated
-Is there a state that permits a character to change his facing based upon pressing left / right WITHOUT influencing the characters frame-behavior (which pretty much cancels out states 0 and 1, I guess)?)

no
there are only two frames that allow this: 110, 212
also the dash frames: 213, 214, 216, 217 (they redirect to 213, 214 though)
then there is the dircontrol in cpoints
and lastly this:
http://www.lf-empire.de/forum/showthread.php?tid=4470
Oh right, that method. Totally forgot about it. Thanks ^^

Quote:
(02-04-2013, 07:30 PM)Alblaka Wrote:  @static variables:
If creating Arrays is possibe, there is a simpler solution: Creating a basic map.
Implement two static Arrays, the first contains a number of 'num's, the second one the associated value, write a function
int getValueFor (int num)
and done.
that still uses the same amount of memory, won't it?
Not necessary. You can f.e. create a length 16 Array, assuming there will never be 16 duplicates of the ID in question.

Quote:edit: you've posted inside the threads I am linking to yourself ... why exactly are you asking these questions?
Because I seem to have forgotten all of that already ^^'
My Creations: (Click to View)

Return (String) System.getNewsOfTheDay();
Barely active, expect slow responses. If at all.


Greetz,
Alblaka
Reply
Thanks given by:
#88
Updated to version 3.3:
Download: http://www.mediafire.com/?pxd026nqoqgw0
  • Allows you to read data from stage mode.
    • This also includes 3 new global variables: current_phase, current_phase_count, current_stage
    • Check the source code (sgame.h) if you want the full list of variables.
  • Fixes for reading large offsets. This basically means that you can read background data and character names now.
  • Made the API naming less crazy.
    • This includes renaming some variables that no one were really using, but also adding a few having to do with sprites.
    • Check the source code (sgame.h) if you want the full list of variables.
There is also a new function printAddr. It is mostly useful for reverse engineering, but if you want to experiment with that, then you can try it out.
Age ratings for movies and games (and similar) have never been a good idea.
One can learn a lot from reinventing wheels.
An unsound argument is not the same as an invalid one.
volatile in C++ does not mean thread-safe.
Do not make APIs unnecessarily asynchronous.
Make C++ operator > again
Trump is an idiot.
Reply
Thanks given by: YinYin
#89
okay so YinYin advised me to post in here:
I can't get this to work.
What it does exactly?
The console opens, quits and lf2 is not even starting, instead the lf2 symbol just disappears and everything is practically gone.
I am running it on a OSX - System, here using basically Wine in a pretty box (that thing is called Crossover and is actually pretty neat). I have set the ddraw.dll as native in the Wine configs and thus got this problem. Earlie Lf2 did not start the console.
So any ideas/advices on that?
[sig placeholder until my new sig is finished]
should totally allow people to be all trolley on their birthday :D
Reply
Thanks given by:
#90
No freaking clue. The way this works is by abusing specific windows internals. Wine may not emulate that stuff properly.
[Image: doty7Xn.gif]

10 ʏᴇᴀʀs sɪɴᴄᴇ ɪʀᴄ ɢᴏᴏᴅ.ɪ ᴡᴀʟᴋ ᴛʜʀᴏᴜɢʜ ᴛʜᴇ ᴇᴍᴘᴛʏ sᴛʀᴇᴇᴛs ᴛʀʏɪɴɢ ᴛᴏ ᴛʜɪɴᴋ ᴏғ sᴏᴍᴇᴛʜɪɴɢ ᴇʟsᴇ ʙᴜᴛ ᴍʏ ᴘᴀᴛʜ ᴀʟᴡᴀʏs ʟᴇᴀᴅs ᴛᴏ ᴛʜᴇ ɪʀᴄ. ɪ sᴛᴀʀᴇ ᴀᴛ ᴛʜᴇ sᴄʀᴇᴇɴ ғᴏʀ ʜᴏᴜʀs ᴀɴᴅ ᴛʀʏ ᴛᴏ sᴜᴍᴍᴏɴ ᴛʜᴇ ɢᴏᴏᴅ ɪʀᴄ. ɪ ᴡᴀᴛᴄʜ ᴏᴛʜᴇʀ ɪʀᴄ ᴄʜᴀɴɴᴇʟs ʙᴜᴛ ɪᴛ ɪs ɴᴏ ɢᴏᴏᴅ. ɪ ᴘᴇsᴛᴇʀ ᴢᴏʀᴛ ᴀɴᴅ ᴛʀʏ ᴛᴏ ʀᴇsɪsᴛ ʜɪs sᴇxɪɴᴇss ʙᴜᴛ ɪᴛ ɪs ᴀʟʟ ᴍᴇᴀɴɪɴɢʟᴇss. ᴛʜᴇ ᴇɴᴅ ɪs ɴᴇᴀʀ.ɪ ᴛʜᴇɴ ᴜsᴜᴀʟʟʏ ʀᴇᴀᴅ sᴏᴍᴇ ᴏʟᴅ ɪʀᴄ ʟᴏɢs ᴀɴᴅ ᴄʀʏ ᴍʏsᴇʟғ ᴛᴏ sʟᴇᴇᴘ.


Reply
Thanks given by:




Users browsing this thread: 1 Guest(s)