//****************************************************************************************// // // HAL // // First brain using the new Behavioral AI system for MC2. // //****************************************************************************************// module Hal : integer; //****************************************************************************************// const PILOT_EVENT_NONE = -1; PILOT_EVENT_TARGETED = 0; PILOT_EVENT_HIT = 1; PILOT_EVENT_DAMAGED = 2; PILOT_EVENT_FRIENDLY_KILLED = 3; PILOT_EVENT_FRIENDLY_CRIPPLED = 4; PILOT_EVENT_FRIENDLY_DESTROYED = 5; PILOT_EVENT_CRIPPLED = 6; PILOT_EVENT_DESTROYED = 7; PILOT_EVENT_WITHDRAWN = 8; PILOT_EVENT_MORALE_BREAK = 9; PILOT_EVENT_COLLISION = 10; PILOT_EVENT_GUARD_RADIUS_BREACH = 11; PILOT_EVENT_TARGET_KILLED = 12; PILOT_EVENT_MATE_FIRED_WEAPON = 13; PILOT_EVENT_PLAYER_ORDER = 14; PILOT_EVENT_NO_MOVEPATH = 15; PILOT_EVENT_GATE_CLOSING = 16; PILOT_EVENT_CONTACT = 17; TARGET_PRIORITY_NONE = 0; TARGET_PRIORITY_GAMEOBJECT = 1; TARGET_PRIORITY_MOVER = 2; TARGET_PRIORITY_BUILDING = 3; TARGET_PRIORITY_CURTARGET = 4; TARGET_PRIORITY_TURRET = 5; TARGET_PRIORITY_TURRET_CONTROL = 6; TARGET_PRIORITY_GATE = 7; TARGET_PRIORITY_GATE_CONTROL = 8; TARGET_PRIORITY_SALVAGE = 9; TARGET_PRIORITY_MECHBAY = 10; TARGET_PRIORITY_LOCATION = 11; TARGET_PRIORITY_EVENT_TARGETED = 12; TARGET_PRIORITY_EVENT_HIT = 13; TARGET_PRIORITY_EVENT_DAMAGED = 14; TARGET_PRIORITY_EVENT_MATE_DIED = 15; TARGET_PRIORITY_EVENT_FRIENDLY_DISABLED = 16; TARGET_PRIORITY_EVENT_FRIENDLY_DESTROYED = 17; TARGET_PRIORITY_EVENT_FRIENDLY_WITHDRAWS = 18; PILOT_STATE_IDLE = 0; PILOT_STATE_MISSION = 1; PILOT_STATE_RETREAT = 2; PILOT_STATE_PATROL = 3; PILOT_STATE_ATTACK = 4; PILOT_STATE_RETREAT_BUILDING = 5; CONTACT_CRITERIA_NONE = 0; CONTACT_CRITERIA_ENEMY = 1; CONTACT_CRITERIA_VISUAL = 2; CONTACT_CRITERIA_GUARD_BREACH = 4; CONTACT_CRITERIA_NOT_CHALLENGED = 8; CONTACT_CRITERIA_SENSOR = 16; CONTACT_CRITERIA_VISUAL_OR_SENSOR = 32; CONTACT_CRITERIA_NOT_DISABLED = 64; CONTACT_SORT_NONE = 0; CONTACT_SORT_CV = 1; CONTACT_SORT_DISTANCE = 2; MAX_PATROL_POINTS = 20; PATROL_TYPE_LINEAR = 0; PATROL_TYPE_LOOPING = 1; PATROL_DIRECTION_FORWARD = 0; PATROL_DIRECTION_BACKWARD = 1; TACORDER_PARAM_NONE = 0; TACORDER_PARAM_RUN = 1; TACORDER_PARAM_WAIT = 2; TACORDER_PARAM_FACE_OBJECT = 4; TACORDER_PARAM_LAY_MINES = 8; TACORDER_PARAM_PURSUE = 16; TACORDER_PARAM_OBLITERATE = 32; TACORDER_PARAM_ESCAPE_TILE = 64; TACORDER_PARAM_SCAN = 128; TACORDER_PARAM_ATTACK_DFA = 256; TACORDER_PARAM_RANGE_RAMMING = 1024; TACORDER_PARAM_RANGE_LONGEST = 2048; TACORDER_PARAM_RANGE_OPTIMUM = 4096; TACORDER_PARAM_RANGE_SHORT = 8192; TACORDER_PARAM_RANGE_MEDIUM = 16384; TACORDER_PARAM_RANGE_LONG = 32768; TACORDER_PARAM_AIM_HEAD = 65536; TACORDER_PARAM_AIM_LEG = 131072; TACORDER_PARAM_AIM_ARM = 262144; TACORDER_PARAM_DONT_SET_ORDER = 524288; type PatrolState = integer[6]; PatrolPath = real[MAX_PATROL_POINTS, 2]; var static real[3] startPosition; static integer retreatBuilding; static PatrolState patrolState1; static PatrolPath patrolPath1; //**************************************************************************************** order patrol (@PatrolState state, @PatrolPath path) : integer; // state[0] = patrol type // state[1] = num patrol points // state[2] = num cycles // state[3] = current direction // state[4] = current patrol point // state[5] = current cycle var integer patrolType; integer numSteps; integer numCycles; integer curDirection; integer curStep; integer curCycle; real[2] goal; integer i; integer closestPoint; real shortestDist; real dist; integer scanResult; char[25] debugS; code patrolType = state[0]; numSteps = state[1]; numCycles = state[2]; curDirection = state[3]; curStep = state[4]; curCycle = state[5]; if (curStep == -1) then //--------------------------------- // find closest to current position closestPoint = 0; shortestDist = 999999.0; for i = 0 to (numSteps - 1) do goal[0] = path[i, 0]; goal[1] = path[i, 1]; dist = distanceToPosition(-1, goal); if (dist < shortestDist) then closestPoint = i; shortestDist = dist; endif; endfor; curStep = closestPoint; endif; if (curCycle == -1) then //------------------------- // Start new cycle count... curCycle = 0; endif; //--------------------------- // First, scan for targets... scanResult = newScan(0, CONTACT_CRITERIA_VISUAL_OR_SENSOR + CONTACT_CRITERIA_ENEMY + CONTACT_CRITERIA_NOT_DISABLED); if (scanResult > 0) then setPilotState(PILOT_STATE_ATTACK); return(0); endif; debugS = "cs="; concat(debugS, curStep); concat(debugS, ", d="); concat(debugS, curDirection); concat(debugS, ", cyc="); concat(debugS, curCycle); concat(debugS, "/"); concat(debugS, numCycles); setDebugString(-1, 4, debugS); goal[0] = path[curStep, 0]; goal[1] = path[curStep, 1]; newMoveTo(goal, 0); if (patrolType == PATROL_TYPE_LINEAR) then if (curDirection == PATROL_DIRECTION_FORWARD) then curStep = curStep + 1; if (curStep == numSteps) then curStep = curStep - 1; curDirection = PATROL_DIRECTION_BACKWARD; curCycle = curCycle + 1; endif; else curStep = curStep - 1; if (curStep == -1) then curStep = 1; curDirection = PATROL_DIRECTION_FORWARD; curCycle = curCycle + 1; endif; endif; else curStep = curStep + 1; if (curStep == numSteps) then curStep = 0; curCycle = curCycle + 1; endif; endif; state[3] = curDirection; state[4] = curStep; state[5] = curCycle; if (curCycle == numCycles) then return(1); endif; return(0); endfunction; //--------------------------------------------------------------------------------------- order patrolDelayed (@PatrolState state, @PatrolPath path, real startTime) : integer; var integer scanResult; code if (getTime > startTime) then return(patrol(state, path)); else //-------------------- // Scan for targets... scanResult = newScan(0, CONTACT_CRITERIA_VISUAL_OR_SENSOR + CONTACT_CRITERIA_ENEMY + CONTACT_CRITERIA_NOT_DISABLED); if (scanResult > 0) then setPilotState(PILOT_STATE_ATTACK); return(0); endif; endif; return(0); endfunction; //---------------------------------------------------------------------------------------- order coreWait (real waitTime) : integer; var integer scanResult; code if (getTime > waitTime) then return(1); else //-------------------- // Scan for targets... scanResult = newScan(0, CONTACT_CRITERIA_VISUAL_OR_SENSOR + CONTACT_CRITERIA_ENEMY + CONTACT_CRITERIA_NOT_DISABLED); if (scanResult > 0) then setPilotState(PILOT_STATE_ATTACK); return(0); endif; endif; return(0); endfunction; //---------------------------------------------------------------------------------------- function init; code //------------------------------------------- // Set up the pilot's target priority list... setTargetPriority(0, TARGET_PRIORITY_CURTARGET, -1, 300, CONTACT_CRITERIA_ENEMY + CONTACT_CRITERIA_VISUAL_OR_SENSOR + CONTACT_CRITERIA_NOT_DISABLED); //setTargetPriority(1, TARGET_PRIORITY_TURRET_CONTROL, 0, 0, 0); //setTargetPriority(2, TARGET_PRIORITY_GATE_CONTROL, 0, 0, 0); setTargetPriority(1, TARGET_PRIORITY_MOVER, 0, 300, CONTACT_CRITERIA_ENEMY + CONTACT_CRITERIA_VISUAL_OR_SENSOR + CONTACT_CRITERIA_NOT_DISABLED); setTargetPriority(2, TARGET_PRIORITY_TURRET, 0, 0, 0); setTargetPriority(3, TARGET_PRIORITY_NONE, 0, 0, 0); getObjectPosition(-1, startPosition); setPilotState(PILOT_STATE_PATROL); retreatBuilding = getTerrainObjectPartID(0, 0); //------------------------- // Setup the Patrol here... patrolState1[0] = PATROL_TYPE_LINEAR; patrolState1[1] = 3; //num points patrolState1[2] = -1; //num cycles patrolState1[3] = PATROL_DIRECTION_FORWARD; patrolState1[4] = -1; //reset cur point patrolState1[5] = -1; //reset cur cycle patrolPath1[0, 0] = 4330.0; patrolPath1[0, 1] = 1045.0; patrolPath1[1, 0] = 3989.0; //3306.0; patrolPath1[1, 1] = 1216.0; //4501.0; patrolPath1[2, 0] = 4202.0; //3946.0; patrolPath1[2, 1] = 490.0; //3648.0; patrolPath1[3, 0] = 4757.0; patrolPath1[3, 1] = 4202.0; patrolPath1[4, 0] = 4714.0; patrolPath1[4, 1] = 5098.0; patrolPath1[5, 0] = 3946.0; patrolPath1[5, 1] = 5696.0; setDebugWindow(-1, -1); endfunction; //---------------------------------------------------------------------------------------- order update : integer; var boolean processingPilotEvents; boolean thinking; integer pilotEventID; integer pilotState; integer[20] pilotEventParams; integer curTarget; code //--------------------------------------------------------- // First, process the pilot events since the last update... processingPilotEvents = TRUE; while (processingPilotEvents) do pilotEventID = getNextPilotEvent(pilotEventParams); if (pilotEventID == PILOT_EVENT_NONE) then processingPilotEvents = FALSE; else switch (pilotEventID) case PILOT_EVENT_TARGETED: endcase; case PILOT_EVENT_HIT: curTarget = getTarget(-1); if (curTarget == 0) then newAttack(pilotEventParams[0], TACORDER_PARAM_PURSUE); endif; endcase; case PILOT_EVENT_DAMAGED: endcase; case PILOT_EVENT_FRIENDLY_KILLED: endcase; case PILOT_EVENT_FRIENDLY_CRIPPLED: endcase; case PILOT_EVENT_FRIENDLY_DESTROYED: endcase; case PILOT_EVENT_CRIPPLED: endcase; case PILOT_EVENT_DESTROYED: endcase; case PILOT_EVENT_WITHDRAWN: endcase; case PILOT_EVENT_MORALE_BREAK: endcase; case PILOT_EVENT_COLLISION: endcase; case PILOT_EVENT_GUARD_RADIUS_BREACH: endcase; case PILOT_EVENT_TARGET_KILLED: endcase; case PILOT_EVENT_MATE_FIRED_WEAPON: endcase; case PILOT_EVENT_PLAYER_ORDER: endcase; case PILOT_EVENT_NO_MOVEPATH: endcase; case PILOT_EVENT_GATE_CLOSING: endcase; case PILOT_EVENT_TARGETED: endcase; case PILOT_EVENT_CONTACT: setPilotState(PILOT_STATE_RETREAT_BUILDING); endcase; endswitch; endif; endwhile; //---------------------------------- // Now, go through our state code... thinking = TRUE; while (thinking) do thinking = FALSE; pilotState = getPilotState; switch (pilotState) case PILOT_STATE_IDLE: endcase; case PILOT_STATE_PATROL: setDebugString(-1, 3, " PATROLLING "); patrol(patrolState1, patrolPath1); setPilotState(PILOT_STATE_MISSION); endcase; case PILOT_STATE_ATTACK: setDebugString(-1, 3, " ATTACKING "); setDebugString(-1, 4, " "); newAttack(0, TACORDER_PARAM_PURSUE); setPilotState(PILOT_STATE_PATROL); endcase; case PILOT_STATE_MISSION: setDebugString(-1, 3, " MISSIONING "); setDebugString(-1, 4, " "); newScan(0, CONTACT_CRITERIA_VISUAL_OR_SENSOR + CONTACT_CRITERIA_ENEMY + CONTACT_CRITERIA_NOT_DISABLED); newPower(TRUE); //newAttack(0, TACORDER_PARAM_SCAN); newAttack(0, TACORDER_PARAM_PURSUE); setPilotState(PILOT_STATE_RETREAT); thinking = TRUE; endcase; case PILOT_STATE_RETREAT: setDebugString(-1, 3, " RETREATING "); setDebugString(-1, 4, " "); newMoveTo(startPosition, 0); newPower(FALSE); setPilotState(PILOT_STATE_IDLE); thinking = TRUE; endcase; case PILOT_STATE_RETREAT_BUILDING: newMoveToObject(retreatBuilding, 0); //if (not objectOnScreen(me)) then objectRemove(-1); //endif; endcase; endswitch; endwhile; return(0); endfunction; //---------------------------------------------------------------------------------------- // Main Code //---------------------------------------------------------------------------------------- code update; endmodule. //****************************************************************************************