@@ -205,57 +205,100 @@ i=0;
205205if (instance_exists(obj_enunit)){
206206 for (var i=0 ;i<array_length (unit_struct);i++){
207207 if (marine_dead[i]==0 && marine_casting[i]=1 ){
208- var let,buvvs,buvvs_num;let=" D" ;
209- if (string_count (" D0" ,marine_powers[i])>0 ) then let=" D" ;
210- if (string_count (" B0" ,marine_powers[i])>0 ) then let=" B" ;
211- if (string_count (" P0" ,marine_powers[i])>0 ) then let=" P" ;
212- if (string_count (" T0" ,marine_powers[i])>0 ) then let=" T" ;
213- if (string_count (" R0" ,marine_powers[i])>0 ) then let=" R" ;
214-
215- var powerz,buvvs_roll,tha,p;tha=-1 ;
216- powerz=string_count (let,marine_powers[i]);
217- p=-1 ;repeat (20 ){p+=1 ;buvvs[p]=-1 ;}
218- if (let=" D" ){buvvs[1 ]=2 ;buvvs[2 ]=5 ;buvvs[3 ]=6 ;buvvs_num=3 ;}
219- if (let=" B" ){buvvs[1 ]=2 ;buvvs[2 ]=3 ;buvvs_num=2 ;}
220- if (let=" P" ){buvvs[1 ]=1 ;buvvs[2 ]=2 ;buvvs_num=2 ;}
221- if (let=" T" ){buvvs[1 ]=3 ;buvvs[2 ]=4 ;buvvs_num=2 ;}
222- if (let=" R" ){buvvs[1 ]=2 ;buvvs_num=1 ;}
223-
224- p=0 ;repeat (10 ){p+=1 ;if (buvvs[p]>powerz-1 ){buvvs_num-=1 ;buvvs[p]=-1 ;}}
225- buvvs_roll=floor (random (100 ))+1 ;
226-
227- if (buvvs_roll<=(105 -(obj_ncombat.turns *35 ))) and (obj_ncombat.enemy_forces >=obj_ncombat.player_forces ) and (buvvs_num>0 ){// Cast buffs
228- // if (obj_ncombat.turns<2) and (obj_ncombat.enemy_max>=obj_ncombat.player_max) and (buvvs_num>0){
229- tha=max (buvvs[floor (random (buvvs_num))+1 ],buvvs[floor (random (buvvs_num))+1 ]);
230- }
231-
232- if (buvvs_roll>(105 -(obj_ncombat.turns *35 ))) or (obj_ncombat.enemy_forces <obj_ncombat.player_forces ) or (buvvs_num=0 ){// Slam away
233- // if (obj_ncombat.turns>=2) or (obj_ncombat.enemy_max<obj_ncombat.player_max) or (buvvs_num=0){
234- repeat (100 ){
235- if (tha=-1 ) or (tha=buvvs[1 ]) or (tha=buvvs[2 ]) or (tha=buvvs[3 ]) or (tha=buvvs[4 ]) or (tha=buvvs[5 ]){
236- tha=max (floor (random (powerz)),floor (random (powerz)));
237- if (marine_type[i]=" Chief " +string (obj_ini.role [100 ,17 ])) then tha=powerz-choose (-1 ,0 ,0 ,1 ,1 ,2 );
238- if (marine_type[i]=" Chapter Master" ) then tha=powerz-choose (-1 ,0 ,0 ,1 ,1 ,2 );
208+ try {
209+ var known_powers = string_split (unit_struct[i].specials (), " |" );
210+ if (array_length (known_powers) > 1 ) {
211+ array_pop (known_powers);
212+ }
213+ var power_set_letter = " D" ;
214+ var power_sets = [" D0" , " B0" , " P0" , " T0" , " R0" ];
215+ for (var p = 0 ; p < array_length (power_sets); p++) {
216+ if (string_count (power_sets[p], known_powers) > 0 ) {
217+ power_set_letter = string_char_at (power_sets[p], 1 );
218+ break ;
239219 }
240220 }
241- }
242-
243- enemy=instance_nearest (0 ,y,obj_enunit);enemy2=enemy;
244- if (enemy.men +enemy.veh +enemy.medi <=0 ){
245- var x5=enemy.x ;
246- with (enemy){
247- instance_destroy ();
221+
222+ var power_index;
223+ var power_count = string_count (power_set_letter, known_powers);
224+
225+ var buff_powers = [];
226+ switch (power_set_letter) {
227+ case " D" :
228+ buff_powers = [2 , 5 , 6 ];
229+ break ;
230+ case " B" :
231+ buff_powers = [2 , 3 ];
232+ break ;
233+ case " P" :
234+ buff_powers = [1 , 2 ];
235+ break ;
236+ case " T" :
237+ buff_powers = [3 , 4 ];
238+ break ;
239+ case " R" :
240+ buff_powers = [2 ];
241+ break ;
242+ }
243+
244+ // Decide whenever to cast buffs or attack spells
245+ var buff_cast = 0 ;
246+ var buff_roll=irandom (100 );
247+ if (buff_roll<=(105 -(obj_ncombat.turns *35 ))) and (obj_ncombat.enemy_forces >=obj_ncombat.player_forces ) and (array_length (buff_powers) > 0 ){
248+ // Cast buffs
249+ buff_cast = 1 ;
250+ // Filter the buff powers that the unit knows
251+ var known_buff_powers = [];
252+ for (var i = 0 ; i < array_length (buff_powers); i++) {
253+ if (string_count (known_powers, string (buff_powers[i])) > 0 ) {
254+ array_push (known_buff_powers, buff_powers[i]);
255+ }
256+ }
257+ if (array_length (known_buff_powers) > 0 ) {
258+ power_index = array_random_element (known_buff_powers);
259+ power_index = string_char_at (power_index, 2 );
260+ }
261+ } else {
262+ // Cast attack spells
263+ // Filter the attack powers that the unit knows
264+ var known_attack_powers = [];
265+ for (var i = 0 ; i < array_length (known_powers); i++) {
266+ if (string_count (buff_powers, string (known_powers[i])) == 0 ) {
267+ array_push (known_attack_powers, known_powers[i]);
268+ }
269+ }
270+ if (array_length (known_attack_powers) > 0 ) {
271+ power_index = array_random_element (known_attack_powers);
272+ power_index = string_char_at (power_index, 2 );
273+ }
248274 }
275+
249276 enemy=instance_nearest (0 ,y,obj_enunit);
250277 enemy2=enemy;
278+ if (enemy.men +enemy.veh +enemy.medi <=0 ){
279+ var x5=enemy.x ;
280+ with (enemy){
281+ instance_destroy ();
282+ }
283+ enemy=instance_nearest (0 ,y,obj_enunit);
284+ enemy2=enemy;
285+ }
286+
287+ // I'm not sure what was the plan, but "Z" powers (hacks) are unused in scr_powers
288+ /* var ham=false;
289+ if (marine_type[i]="Chapter Master") and (obj_ncombat.kamehameha=true) and ((obj_ncombat.big_boom>0) or (choose(1,2)=2)){
290+ if (obj_ncombat.enemy_forces>=40) then ham=true;
291+ }
292+
293+ if (ham=false) then scr_powers(string_upper(power_set_letter),power_index,enemy2,i);
294+ if (ham=true) then scr_powers("Z",power_index,enemy2,i); */
295+
296+ scr_powers (string_upper (power_set_letter),power_index,enemy2,i);
297+ } catch (_exception) {
298+ show_debug_message ($" buff_cast: {buff_cast}" );
299+ show_debug_message ($" known_powers: {known_powers}" );
300+ handle_exception (_exception);
251301 }
252-
253- var ham=false ;
254- if (marine_type[i]=" Chapter Master" ) and (obj_ncombat.kamehameha =true ) and ((obj_ncombat.big_boom >0 ) or (choose (1 ,2 )=2 )){
255- if (obj_ncombat.enemy_forces >=40 ) then ham=true ;
256- }
257- if (ham=false ) then scr_powers (string_upper (let),tha,enemy2,i);
258- if (ham=true ) then scr_powers (" Z" ,tha,enemy2,i);
259302 }
260303 }
261304}
0 commit comments