News:

One Minute Game Review by The Happy Friar: https://ugetube.com/@OneMinteGameReviews
Also on Rumble: https://rumble.com/c/c-1115371

idTech 4 (aka Doom 3 tech) Discord Server! https://discord.gg/9wtCGHa

Main Menu

Spider mastermind model

Started by VGames, May 30, 2015, 01:05:43 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

solarsplace

Hi

Try this... I can't test it as at work ATM, but it should work. That monster only uses 1 animation channel 'channel legs ( *origin )' so don't try to play animations on torso or its going to fail.

In the AI script file:

About line 41 add:

void Torso_Idle();

About line 80 add:

void monster_boss_asmodeus::Torso_Idle() {
idleAnim( ANIMCHANNEL_LEGS, "idle" );

eachFrame {
if ( AI_FORWARD ) {
animState( ANIMCHANNEL_LEGS, "Legs_Walk", ASMODEUS_IDLE_TO_WALK );
}
}
}


You may well find that there are further errors as the script gets past various points, but they can be tackled one at a time...

Cheers

VGames

Ok he attacks me and he dies but he doesn't walk. He just slides around with a walking animation that is stuck in one frame and there is not sound.
Get the latest on Perfected Doom 3 here - http://www.moddb.com/mods/perfected-doom-3-version-500

TeaMonster

Check the Animations.  D3 Animations have the model walking off the centre point. Sounds like the spider has been animated without that consideration.

solarsplace

Hi

Not to cast aspersions on the people that made the mod you downloaded, but the Spider Mastermind is broken in that download. It would never have worked. However, I know nothing about that mod, and perhaps they never even stated it was present and working?

Anyway, I fixed it for you :) - I copied the spiders .DEF, .script and MD5 files into a standalone mod and added a reference to the spider's script into the "doom_main.script". I also copied the default aas.def and added the  spiders .aas definition. The sounds seem to work for me too, make sure to copy over the sound shader file and the audio files. Plus you will need to root out the material files, textures, particles etc.

Anyway here are the fixes so you don't need the rest of that mod to use it apart from all the spider assets.

In "monster_boss_asmodeus.def" change "channel legs" to "channel torso"

I personally find that the Doom3 AI setup is a bloody confusing mess of a system....

Fixed script below. Search for "SOLARSPLACE" to see the changes.

/***********************************************************************

ai_monster_boss_asmodeus.script

monster_boss_spidermastermind

***********************************************************************/

#define ASMODEUS_RANGE_ATTACK_RANGE 3000
#define ASMODEUS_NEXTATTACK_DELAY 3
#define ASMODEUS_NOFOVATTACK_DELAY 3
#define ASMODEUS_NUM_PROJECTILES 70
#define ASMODEUS_ATTACK_RATE .1

// anim blend times
#define ASMODEUS_PAIN_TO_PAIN 7
#define ASMODEUS_PAIN_DELAY 2
#define ASMODEUS_PAIN_TO_IDLE 2
#define ASMODEUS_IDLE_TO_PAIN 2
#define ASMODEUS_SIGHT_TO_SIGHT 3
#define ASMODEUS_SIGHT_TO_IDLE 2
#define ASMODEUS_BLAST_TO_IDLE 3
#define ASMODEUS_IDLE_TO_BLAST 3
#define ASMODEUS_WALK_TO_IDLE 3
#define ASMODEUS_IDLE_TO_WALK 1
#define ASMODEUS_RANGE_TO_IDLE 1
#define ASMODEUS_IDLE_TO_RANGE 3
#define ASMODEUS_BLAST_DELAY 3.5

//SOLARSPLACE - Changed all ANIMCHANNEL_LEGS to ANIMCHANNEL_TORSO

//SOLARSPLACE
#define RIGHT_ANGLE 90.0

object monster_boss_asmodeus : monster_base {
float nextAttack;
float nextBlast;
float nextNoFOVAttack;
entity combat_node;
entity blast_entity;
float nextpain;

//SOLARSPLACE - Changed Legs_ to Torso_
void Torso_RangeAttack();
void Torso_Walk();
void Torso_Idle();
void Torso_Pain();
void Torso_Sight();
void Torso_Death();

void init();
void state_Begin();
void state_Idle();
void do_attack(float attack_flags);
float check_attacks();
void combat_range();
void combat_blast();
void fire_shot();

//SOLARSPLACE
float arcsinTwo(float sine, float result, float power);
float arcsin(float oppHypRatio);
float removeMe;
};

//SOLARSPLACE
float monster_boss_asmodeus::arcsinTwo(float sine, float result, float power)
{
float higher_result = result + power;
if (result == higher_result)
{   
return result;   
}
 
if ( (higher_result <= RIGHT_ANGLE) && (sys.sin(higher_result) <= sine) )
{
result = higher_result;
}
return arcsinTwo(sine, result, power / 2);
}

//SOLARSPLACE
float monster_boss_asmodeus::arcsin( float oppHypRatio )
{
if (oppHypRatio < 0.0)
{
float a = -1 * arcsinTwo(-oppHypRatio, 0.0, RIGHT_ANGLE);
return a;
}
return arcsinTwo(oppHypRatio, 0.0, RIGHT_ANGLE);
}

/***********************************************************************

animation control

***********************************************************************/

void monster_boss_asmodeus::Torso_Sight() {
playAnim( ANIMCHANNEL_TORSO, "sight" );

while( !animDone( ANIMCHANNEL_TORSO, ASMODEUS_SIGHT_TO_SIGHT ) ) {
waitFrame();
}

//SOLARSPLACE
finishAction( "sight" );

animState( ANIMCHANNEL_TORSO, "Torso_Idle", ASMODEUS_SIGHT_TO_IDLE );
}

void monster_boss_asmodeus::Torso_Idle() {
idleAnim( ANIMCHANNEL_TORSO, "idle" );

eachFrame {
if ( AI_FORWARD ) {
animState( ANIMCHANNEL_TORSO, "Torso_Walk", ASMODEUS_IDLE_TO_WALK );
}
}
}

void monster_boss_asmodeus::Torso_Pain() {
float currenttime;

stopSound( 1, 1 );
currenttime = sys.getTime();

if ( currenttime > nextpain ) {
playAnim( ANIMCHANNEL_TORSO, "pain" );
nextpain = sys.getTime() + ASMODEUS_PAIN_TO_PAIN;
while( !animDone( ANIMCHANNEL_TORSO, ASMODEUS_PAIN_DELAY ) ) {
waitFrame();
}
animState( ANIMCHANNEL_TORSO, "Torso_Idle", ASMODEUS_PAIN_TO_IDLE );
}
}

void monster_boss_asmodeus::Torso_RangeAttack() {
playAnim( ANIMCHANNEL_TORSO, "ranged_attack" );

while( !animDone( ANIMCHANNEL_TORSO, ASMODEUS_RANGE_TO_IDLE ) ) {
waitFrame();
}

//SOLARSPLACE
finishAction( "range_attack" );

animState( ANIMCHANNEL_TORSO, "Torso_Idle", ASMODEUS_RANGE_TO_IDLE );
}

void monster_boss_asmodeus::Torso_Walk() {
playAnim( ANIMCHANNEL_TORSO, "walk" );
startSound( "snd_walk", 1, 1 );

while( !animDone( ANIMCHANNEL_TORSO, ASMODEUS_WALK_TO_IDLE ) ) {
waitFrame();
}

animState( ANIMCHANNEL_TORSO, "Torso_Idle", ASMODEUS_WALK_TO_IDLE );
}

void monster_boss_asmodeus::Torso_Death() {
playAnim( ANIMCHANNEL_TORSO, "death" );

while( !animDone( ANIMCHANNEL_TORSO, ASMODEUS_WALK_TO_IDLE ) ) {
waitFrame();
}
}

/***********************************************************************

AI

***********************************************************************/


/*
=====================
monster_boss_asmodeus::state_Dead
=====================
*/
void monster_boss_asmodeus::state_Dead() {
becomeNonSolid();
clearEnemy();

playAnim( ANIMCHANNEL_TORSO, "death" );
sys.wait(7);

remove();
}

/*
=====================
monster_boss_asmodeus::init
=====================
*/
void monster_boss_asmodeus::init() {
setSmokeVisibility( 0, 0 );
nextpain = 0;
nextBlast = 0;
nextAttack = 0;

setState( "state_Begin" );
}

/*
=====================
monster_boss_asmodeus::state_Begin
=====================
*/
void monster_boss_asmodeus::state_Begin() {
animState( ANIMCHANNEL_TORSO, "Torso_Idle", 0 );
monster_begin();
setMoveType( MOVETYPE_ANIM );
setState( "state_Idle" );
}

/************************

Combat

************************/

/*
=====================
monster_boss_asmodeus::state_Idle
=====================
*/
void monster_boss_asmodeus::state_Idle() {

//SOLARSPLACE
/*
if (stayOnMission) {
if (!attackMission) {
m_mission = getMission();

if ( m_mission ) {
m_mission_vec = m_mission.getOrigin();
faceEntity( m_mission );
if ( testMoveToPosition( m_mission_vec ) ) {
moveToPosition( m_mission_vec );
waitMove();
}
}
}
} else {
*/
wait_for_enemy();
//}

nextAttack = 0;

setState( "state_Combat" );
}

/*
=====================
monster_boss_asmodeus::do_attack
=====================
*/
void monster_boss_asmodeus::do_attack( float attack_flags ) {
nextNoFOVAttack = sys.getTime() + ASMODEUS_NOFOVATTACK_DELAY;
if ( attack_flags & ATTACK_MISSILE ) {
combat_range();
} else if ( attack_flags & ATTACK_MELEE ) {
combat_blast();
} else if ( attack_flags & ATTACK_COMBAT_NODE ) {
combat_ainode( combat_node );
}
}

/*
=====================
monster_boss_asmodeus::check_attacks
=====================
*/
float monster_boss_asmodeus::check_attacks() {
float currentTime;
float attack_flags;
vector org;

attack_flags = 0;
currentTime = sys.getTime();

org = getOrigin();
blast_entity = findActorsInBounds( org + '-295 -295 0', org + '295 295 295' );
if ( blast_entity ) {
if(  sys.getTime() > nextBlast ) {
attack_flags |= ATTACK_MELEE;
}
}

if ( !blast_entity ) {
combat_node = getCombatNode();
if ( combat_node ) {
attack_flags |= ATTACK_COMBAT_NODE;
}
}

if ( ( ( sys.getTime() > nextNoFOVAttack ) && AI_ENEMY_VISIBLE ) || AI_ENEMY_IN_FOV ) {
if ( !canReachEnemy() || ( currentTime >= nextAttack ) ) {
if ( canHitEnemyFromJoint( "Turret" ) ) {
attack_flags |= ATTACK_MISSILE;
}
}
}

if ( AI_PAIN ) {
animState( ANIMCHANNEL_TORSO, "Torso_Pain", ASMODEUS_IDLE_TO_PAIN );
}

return attack_flags;
}

/*
=====================
monster_boss_asmodeus::combat_blast
=====================
*/
void monster_boss_asmodeus::combat_blast() {

startFx( getKey( "blast_fx" ) );
sys.radiusDamage( getOrigin(), self, self, self, "blastWave", 1.0 );

nextBlast = sys.getTime() + ASMODEUS_BLAST_DELAY;
}

/*
=====================
monster_boss_asmodeus::combat_range
=====================
*/
void monster_boss_asmodeus::combat_range() {

stopSound( 1, 1 );
fire_shot();

while( !animDone( ANIMCHANNEL_TORSO, ASMODEUS_RANGE_TO_IDLE ) ) {
waitFrame();
}

nextAttack = sys.getTime() + ASMODEUS_NEXTATTACK_DELAY;
nextNoFOVAttack = sys.getTime() + ASMODEUS_NOFOVATTACK_DELAY;
animState( ANIMCHANNEL_TORSO, "Torso_Idle", ASMODEUS_RANGE_TO_IDLE );
}

/*
=====================
monster_boss_asmodeus::fire_shot
=====================
*/
void monster_boss_asmodeus::fire_shot() {
vector orgOne;
vector orgTwo;
float turretJoint;
vector ang;
float x;
entity enemy;
vector enemyPos;
float spread;
float directAccuracy;
float hypotenuse;
float opposite;

turretJoint = getJointHandle( "Turret" );
spread = getIntKey( "spread" );
directAccuracy = getIntKey( "direct_accuracy" );

startSound( "snd_attack", 1, 1 );
setSmokeVisibility( 0, 1 );

for ( x = 0; x < ASMODEUS_NUM_PROJECTILES; x++ ) {
enemy = getEnemy();
orgOne = getOrigin();
if( !canHitEnemyFromJoint( "Turret" ) ) {
break;
}

if( AI_ENEMY_DEAD ) {
break;
}

blast_entity = findActorsInBounds( orgOne + '-295 -295 0', orgOne + '295 295 295' );
if ( blast_entity ) {
if(  sys.getTime() > nextBlast ) {
combat_blast();
}
}

faceEnemy();
orgTwo = getJointPos( turretJoint );
ang = getAngles();

playAnim( ANIMCHANNEL_TORSO, "ranged_attack" );
startFx( getKey( "gunLight" ) );

if( sys.random( spread ) <= spread/directAccuracy ) {
directDamage( enemy, "damage_asmodeus_bullet" );
} else {
if ( int( sys.random( 2 ) ) + 1 == 1 ) {
ang_y -= sys.random( spread );
} else {
ang_y += sys.random( spread );
}

enemyPos = enemy.getJointPos( getJointHandle( "Body" ) );

opposite = enemyRange2D();
hypotenuse = sys.sqrt( enemyRange2D()*enemyRange2D() + (orgTwo_z - enemyPos_z)*(orgTwo_z - enemyPos_z) );

if( hypotenuse == 0 ) {
break;
}

if( orgTwo_z > enemyPos_z ) {
ang_x = 90 - arcsin( opposite/hypotenuse );
} else {
ang_x = arcsin( opposite/hypotenuse ) - 90;
}

launchMissile( orgTwo, ang );
}
sys.wait( ASMODEUS_ATTACK_RATE );
}
stopSound( 1, 1 );
setSmokeVisibility( 0, 0 );
}

BielBdeLuna

for Arx end if Sun how do you guys do the AI?

solarsplace

Quote from: BielBdeLuna on June 10, 2015, 01:23:51 PM
for Arx end if Sun how do you guys do the AI?

Hi

In Arx I use basically just the standard Doom3 AI SDK code and scripts for the enemy AI. I have fiddled with the code and scripts in many places for game specific tweaks, but its basically working just like standard. I have spent many hours working with the AI scripts and they are a bloody nightmare!

However for friendly AI that can help the player attack the monster AI - I use a highly modified version of Ivan The B's "Smart AI" code / mod ( Can't find a download :( - http://planetdoom.gamespy.com/View993a.html?view=POTD.Detail&id=616 ).

Smart AI really is very awesome :) - I will PM Ivan tomorrow and hope he can provide a new download link...

Hope that answered the question.

Thanks

BielBdeLuna

great to hear it, what is significantly different in ivan_the_b code?

VGames

Ok he walks but if I get behind something and then pop back out he tends to lose track of me and just sits there. Sometimes he'll start shooting again when I pop back out into view but then he'll soon stop after about a few seconds of shooting. Have you tried him out yourself? I tested him in the lotsofimps test map. It's the only test map big enough for him. Here's my def file. My script is just like yours so any changes I made are in here.


/***********************************************************************



monster_boss_spidermastermind.def



***********************************************************************/



model monster_boss_asmodeus {

mesh models/md5/monsters/asmodeus/Asmodeus.md5mesh
channel torso ( *origin )
anim death models/md5/monsters/asmodeus/Asmodeus_Death.md5anim {
frame 1 sound_voice snd_death
frame 10 sound_body snd_step
frame 25 sound_body snd_step
frame 40 sound_body snd_step
frame 55 sound_body snd_step }
anim idle models/md5/monsters/asmodeus/Asmodeus_Idle.md5anim {
frame 1 sound_voice snd_idle }
anim sight models/md5/monsters/asmodeus/Asmodeus_Pain.md5anim {
frame 1 sound_voice snd_sight
frame 20 sound_body snd_step
frame 50 sound_body snd_step }
// anim move models/md5/monsters/asmodeus/asmodeus_move.md5anim
anim pain models/md5/monsters/asmodeus/Asmodeus_Pain.md5anim {
frame 1 sound_body snd_pain
frame 20 sound_body snd_step
frame 50 sound_body snd_step  }
anim ranged_attack models/md5/monsters/asmodeus/Asmodeus_Ranged_Attack.md5anim
anim walk models/md5/monsters/asmodeus/Asmodeus_Walk.md5anim
// anim weaken models/md5/monsters/asmodeus/Asmodeus_Weaken.md5anim
}


entityDef monster_boss_asmodeus {

"editor_mins" "-200 -245 0"

"editor_maxs" "200 245 385"


"inherit" "monster_default"

"scriptobject" "monster_boss_asmodeus"

"model" "monster_boss_asmodeus"

"size" "400 490 385"

"use_aas" "aas_mastermind"

"team" "4"

"rank" "3"

"health" "60000" // 4500

"melee_range" "300"

"score" "1500"
"print_name" "Spider Mastermind"
"print_form" " "
"respondByEntity" "1"
"af_push_moveables" "1"
"spread" "8" //determines horizontal spread of projectiles
"direct_accuracy" "4" //determines directDamage accuracy. Lower = More Accurate. Cannot be 0
"fov" "200"
"angle" "0"
"big_monster" "1"

"def_projectile" "projectile_asmodeus_bullet"


"blast_fx" "fx/asmodeus_blast"
"gunLight" "fx/asmodeus_gunlight"
"smokeParticleSystem" "Turret"

"turn_rate" "270"


"look_min" "-120 -150 0"

"look_max" "55 150 0"

"mass"    "2000000"



"ik_numLegs" "6"

"ik_footSize" "8"

"ik_footDownTrace" "64"

"ik_waist" "Body"

"ik_ankle1" "Rleg1"

"ik_ankle2" "Rleg2"

"ik_ankle3" "Rleg3"

"ik_ankle4" "Lleg1"

"ik_ankle5" "Lleg2"

"ik_ankle6" "Lleg3"

"ik_dir1" "Rknee1"

"ik_dir2" "Rknee2"

"ik_dir3" "Rknee3"

"ik_dir4" "Lknee1"

"ik_dir5" "Lknee2"

"ik_dir6" "Lknee3"

"ik_foot1" "Rfoot1"

"ik_foot2" "Rfoot2"
"ik_foot3" "Rfoot3"

"ik_foot4" "Lfoot1"


"ik_foot5" "Lfoot2"

"ik_foot6" "Lfoot3"





"snd_sight" "monster_boss_asmodeus_sight"

"snd_step" "monster_boss_asmodeus_step"

"snd_idle" "monster_boss_asmodeus_idle"

"snd_pain" "monster_boss_asmodeus_pain"

"snd_death" "monster_boss_asmodeus_death"

"snd_walk" "monster_boss_asmodeus_walk"

"snd_attack" "monster_boss_asmodeus_fire"
}



entityDef projectile_asmodeus_bullet {
"spawnclass" "idProjectile"
"mins" "-1 -1 -1"
"maxs" "1 1 1"
"cone" "3"
"scale" "0.1"
"noshadows" "1"
"tracers" "1"
"model_tracer" "models/particles/tracer/tracer.lwo"

"snd_flesh" "bullet_impact_flesh"
"snd_metal" "bullet_impact_metal"
"snd_stone" "bullet_impact_stone"
"snd_wood" "bullet_impact_wood"
"snd_cardboard" "bullet_impact_cardboard"
"snd_glass" "bullet_impact_glass"
"snd_liquid" "bullet_impact_liquid"
"snd_plastic" "small_plastic"
"snd_ricochet" "bullet_ricochet"
"snd_impact" "bullet_impact_metal" // we need a much smaller impact sound for the chaingun bullet  "bullet_impact_metal"
"snd_tracer" "bullet_flight"

"decal_scale" "8"

"def_damage" "damage_asmodeus_bullet"
"def_splash_damage" "damage_asmodeus_bullet_Splash"

"launchFromBarrel" "1"
"health" "0"
// slowed down for tracers
"velocity" "4500 0 0" // .38 Special 600 fps.  Source: Petzal, David E. "How fast is a speeding bullet." Field and Stream. 97 (1992): 23
"angular_velocity" "0 0 0"
"thrust" "0"
"thrust_start" "0"
"thrust_end" "0"
"linear_friction" "0"
"angular_friction" "0"
"contact_friction" "0"
"bounce" "0.6"
"mass" "2"
"gravity" "0"
"fuse" "4"

"detonate_on_fuse" "0"
"detonate_on_death" "0"
"detonate_on_world" "1"
"detonate_on_actor" "1"

"impact_damage_effect" "1"
"impact_gib" "0"

"mtr_detonate" "textures/decals/cg_bulleth02"
"decal_size" "30"

"model_smokespark" "cgsmokeandspark.prt"
"model_ricochet" "cgsmokeanddebris.prt"

"smoke_detonate" "smokeandspark.smoke"
"smoke_residue" "" //particles/chaingun_residue.particle"
"smoke_bounce" "" //particles/chaingun_bounce.particle"
"smoke_fuse" ""

// "mtr_light_shader" ""
// "light_color" "0 0 0"
// "light_radius" "0"
// "light_offset" "0 0 0"

"mtr_explode_light_shader" "lights/impflyflash"
"explode_light_color" "1 1 0.8"
"explode_light_radius" "60"
"explode_light_fadetime" "0.25"
}

entityDef damage_asmodeus_bullet {
"damage" "7"
"kickDir" "1 0 0"

"mtr_blob" "genericDamage"
"blob_time" "300"
"blob_size" "400"
"blob_offset_x" "400"

"knockback" "1"

"gib" "0"

"smoke_wound_flesh" "cglargeburstysquirt.prt"
"smoke_wound_metal" "cgsmokeandspark.prt"
"smoke_wound_stone" "cgsmokeanddebris.prt"
"smoke_wound_wood" "cgsmokeanddebris.prt"
"smoke_wound_cardboard" "cgsmokeanddebris.prt"
"smoke_wound_glass" "cgsmoke.prt"
"smoke_wound_liquid" "cgsmoke.prt"
"smoke_wound_plastic" "cgsmokeanddebris.prt"
"smoke_wound_ricochet" "cgsmokeandspark.prt"
//"smoke_wound_impact" "cgsmokeandspark.prt"

"mtr_wound_flesh" "textures/decals/chaingunhurt01"
"mtr_wound_metal" "textures/decals/hurtmetal"
"mtr_wound_ricochet" "textures/decals/hurtmetal"
"mtr_splat_flesh" "textures/decals/dsplat2"
"mtr_splat_flesh2" "textures/decals/dsplat5"
"mtr_splat_flesh3" "textures/decals/dsplat7"
"mtr_splat_flesh4" "textures/decals/dsplat11"
"snd_flesh" "bullet_impact_flesh"

"kick_time" "100"
//"kick_time" "10"
"kick_amplitude" "0.1"

//"dv_time" "100"
}

entityDef damage_asmodeus_bullet_splash {
"damage" "3"
"radius" "3" //changed by Tim 6-22-04 from 132
"push" "2000"
"knockback" "10"
"attackerDamageScale" "0.2"
"attackerPushScale" "0.2"
"gib" "0"
"mtr_blob" "genericDamage"
"blob_time" "300"
"blob_size" "400"
"blob_offset_x" "400"
"smoke_wound_flesh" "burstysquirt.prt"
"mtr_wound_flesh" "textures/decals/plasmahurt01"
"mtr_splat_flesh" "textures/decals/dsplat2"
"mtr_splat_flesh2" "textures/decals/dsplat5"
"mtr_splat_flesh3" "textures/decals/dsplat7"
"mtr_splat_flesh4" "textures/decals/dsplat11"
}

entityDef blastWave {
"damage" "100"
"radius" "175"
"knockback" "400"
"push" "10000"
}
Get the latest on Perfected Doom 3 here - http://www.moddb.com/mods/perfected-doom-3-version-500

BielBdeLuna

VGames you just posted the definition file, not the script

VGames

My script is just like his that's why I didn't test it. I only made changes in the def. Just look at the script solarsplace posted before. I just wanted to make sure the changes I made in the def aren't causing the problem.
Get the latest on Perfected Doom 3 here - http://www.moddb.com/mods/perfected-doom-3-version-500

BielBdeLuna


solarsplace

Hi

I tested the monster in a big empty box map. I spent a good couple of hours on him that I really should have spend on Arx as there is still so much to complete.

I took him from totally broken to now chasing me and shooting me. I did not test what happens if I hide from him, perhaps there is something else broken in their script. I didn't change script logic as such that is all still what they wrote, I just added fixes to get what was already there to function in a rudimentary way.

Did you rebuild a new AAS for the map using his AAS file? you should have a "mapname.aas_mastermind" file of several KB / MB in size?

If you don't have a valid AAS file the AI path-finding and route to player plotting falls back to a less than optimal state.

I probably won't be able to do any further work on this for about a week now.

Can you put sys.print statements in all the methods and see if you can see where it gets stuck?

Thanks


VGames

I'm just using one of the stock test maps. That's probably why he's losing track of me. Don't worry about it for now. Take care of your project. When I have an actual map for him then I'll update on his behavior. Now to find a good map for him. If anybody has any suggestions for a user made map that would work for a boss fight with this big sucker let me know please.
Get the latest on Perfected Doom 3 here - http://www.moddb.com/mods/perfected-doom-3-version-500

VGames

#28
I wanted to show you guys my finished product. Reskinned the face, adjusted normal maps, changed the color of his lights, and gave him an actual brain texture with new normal and specular maps. I'm very happy with the way he turned out. Now I need a map to put him in.

http://www.moddb.com/mods/perfected-doom-3-version-500/images/spider-mastermind
Get the latest on Perfected Doom 3 here - http://www.moddb.com/mods/perfected-doom-3-version-500

motorsep

Nice one. Btw, since Desura bankrupted its parent company, I have a feeling that moddb / indiedb can go down pretty soon. Maybe it makes sense to offload mods to another, safer place?