There were some changes I wanted to make. To share them, I put them in a github repository: https://github.com/zort/lf2-ai-scriptengine Can consider this zort's fork until Silva or SomeoneElse give their approval I guess.
Here's the list of changes:
Here's the DLLs: debug, release
Everything is backwards compatible of course, or at least it should be.
To show some of the new features, here's a script that always targets the nearest enemy (gets very confused):
Here's the list of changes:
- Upgraded to Angelscript 2.32.0 (mainly for array.sort() that takes comparator function)
- Added Object.vrests (was split into int vrest and char unkwn8[396])
- Added global elapsed_time (number of TUs since start of match)
- Added vector3 type
- Copy more fields from Object to Info (the self and target globals):
- x_real, y_real, z_real
- vector3 position, velocity
- wait_counter (also fixed offset in Object, previously was 4 bytes off, as was ctimer and ccatcher)
- weapon_holder
- x_real, y_real, z_real
- Added function setEnemy(int) for use in ego() for setting the enemy that the AI targets when you return 0 from ego() (in fact I initially thought this was what loadTarget did) - though it's only as useful as ego() is, which at the moment is not very useful because it's limited to basic Template AI
- Fixed signatures of Info constructors, now you can construct an Info via Info(object_num) (useful because unlike Object, Info stores its own num and other goodies)
- Made Info fields changeable (non-const), now you can do like obj.frame = obj.data.frames[obj.frame].next to simulate obj in the next TU
- Added enum ItrKinds: Spoiler (Click to View)
Here's the DLLs: debug, release
Everything is backwards compatible of course, or at least it should be.
To show some of the new features, here's a script that always targets the nearest enemy (gets very confused):
AI-Code:
double distance_to(const Info& other) { return (self.position - other.position).length(); } bool closer(const Info& a, const Info& b) { return distance_to(a) < distance_to(b); } array<const Info@> getEnemyObjects() { array<const Info@> ret = {}; for (int i = 0; i < 400; i++) { // exists if (!game.exists[i]) continue; // not us if (i == self.num) continue; // is enemy if (game.objects[i].team == self.team) continue; // is alive if (game.objects[i].hp <= 0) continue; ret.insertLast(Info(i)); } return ret; } array<const Info@> getEnemies() { array<const Info@> enemyObjects = getEnemyObjects(); array<const Info@> ret = {}; for (uint i = 0; i < enemyObjects.length(); i++) { // is human if (enemyObjects[i].type != 0) continue; ret.insertLast(enemyObjects[i]); } return ret; } array<const Info@> attackableEnemies() { array<const Info@> enemies = getEnemies(); array<const Info@> ret = {}; for (uint i = 0; i < enemies.length(); i++) { if (enemies[i].state == STATE_LYING) continue; if (enemies[i].blink != 0) continue; ret.insertLast(@enemies[i]); } return ret; } array<const Info@> attackableEnemiesByDistance() { array<const Info@> attackable_enemies = attackableEnemies(); attackable_enemies.sort(function(a,b){return closer(a,b);}); return attackable_enemies; } int ego() { array<const Info@> enemies = attackableEnemiesByDistance(); if (enemies.length > 0) setEnemy(enemies[0].num); return 0; } |
I get a lot of e-mails that kick off by saying, I"I want to be zort's best bud' but who cares, so do lots of people, you have to more than just want it.