001package com.fs.starfarer.api.impl.campaign.eventide;
002
003import java.io.IOException;
004import java.util.LinkedHashMap;
005import java.util.Map;
006
007import com.fs.starfarer.api.Global;
008
009public class Actions {
010
011        //public static String TEX = "/photoshop stuff/starfarer/out/pop_anim.png";
012        public static String TEX = "graphics/misc/characterSheet00.png";
013        
014        public static String SOUND_CLOTH = "soe_cloth";
015        public static String SOUND_FALL = "soe_fall";
016        public static String SOUND_RIP = "soe_rip";
017        public static String SOUND_CLASH = "soe_clash";
018        public static String SOUND_STEP = "soe_step";
019        public static String SOUND_SWISH = "soe_swish";
020        
021        public static final String IDLE = "IDLE";
022        public static final String IDLE_HIGH = "IDLE_HIGH";
023        public static final String BLOCK = "BLOCK";
024        public static final String ATTACK = "ATTACK";
025        public static final String RIPOSTE = "RIPOSTE";
026        public static final String BLOCK_LOW = "BLOCK_LOW";
027        public static final String ATTACK_HIGH = "ATTACK_HIGH";
028        public static final String RIPOSTE_HIGH = "RIPOSTE_HIGH";
029        public static final String ATTACK_RECOVERY = "ATTACK_RECOVERY";
030        public static final String ATTACK_HIGH_RECOVERY = "ATTACK_HIGH_RECOVERY";
031        public static final String MOVE_BACK = "MOVE_BACK";
032        public static final String MOVE_BACK_HIGH = "MOVE_BACK_HIGH";
033        public static final String MOVE_FORWARD = "MOVE_FORWARD";
034        public static final String MOVE_FORWARD_HIGH = "MOVE_FORWARD_HIGH";
035        public static final String GOT_HIT = "GOT_HIT";
036        public static final String FALL = "FALL";
037        
038        
039        public static Map<String, CharAnim> ANIMATIONS = new LinkedHashMap<String, CharAnim>();
040        
041        
042        public static void initActions() {
043                try {
044                        
045//                      SOUND_CLOTH = "";
046//                      SOUND_STEP = "";
047//                      SOUND_CLOTH = "soe_cloth";
048//                      SOUND_STEP = "soe_step";
049//                      SOUND_STEP = "mine_ping";
050//                      SOUND_CLOTH = "";
051//                      Global.getSettings().profilerSetEnabled(true);
052//                      Global.getSettings().profilerReset();
053//                      
054//                      for (int i = 0; i < 1; i++) {
055//                              Global.getSettings().profilerBegin("loading sheet");
056                                Global.getSettings().unloadTexture(TEX);
057                                Global.getSettings().forceMipmapsFor(TEX, true);
058                                Global.getSettings().loadTexture(TEX);
059//                              Global.getSettings().profilerEnd();
060                                //Global.getSettings().loadTextureConvertBlackToAlpha(TEX);
061
062//                              Global.getSettings().profilerBegin("loading sprites");
063//                              File down = new File("/Users/Alex/Downloads/Tiles");
064//                              for (File curr : down.listFiles()) {
065//                                      if (curr.isFile() && curr.getName().endsWith("png")) {
066//                                              String path = curr.getAbsolutePath();
067//                                              Global.getSettings().unloadTexture(path);
068//                                              Global.getSettings().loadTexture(path);
069//                                      }
070//                              }
071//                              Global.getSettings().profilerEnd();
072//                      }
073//                      Global.getSettings().profilerPrintResultsTree();
074//                      Global.getSettings().profilerRestore();
075//                      Global.getSettings().profilerSetEnabled(false);
076                        
077                        
078                } catch (IOException e) {
079                        throw new RuntimeException("Error loading texture", e);
080                }
081                
082                //float sheetHeight = 2048;
083                float sheetHeight = 1536;
084                
085                float frameHeight = 207f; //202.5f;
086                float frameDur = 1f / 7f;
087                frameDur = 1f / 10f;
088                //float scale = 3f;
089                float scale = 1f;
090                //scale = 0.75f;
091                //scale = 0.5f;
092        //      frameDur *= 3f;
093                float textureScale = 1f;
094                CharAnim curr;
095                
096                float bodyW = 38;
097                
098                float y;
099                
100                //frameDur *= 3f;
101                //y = 752;
102                y = sheetHeight - frameHeight;
103                curr = new CharAnim(TEX, IDLE, frameHeight);
104                curr.interruptableBy(MOVE_BACK, MOVE_FORWARD, 
105                                                ATTACK, RIPOSTE, BLOCK, ATTACK_HIGH, RIPOSTE_HIGH, BLOCK_LOW, GOT_HIT, FALL);
106                curr.scale = scale;
107                curr.skip(2);
108                curr.addFrame(y, 168, frameDur * 2f);
109                curr.last.setHittable(-60, bodyW);
110                curr.addFrame(y, 167, frameDur * 2f);
111                curr.last.setHittable(-60, bodyW);
112                curr.addFrame(y, 166, frameDur * 2f);
113                curr.last.setHittable(-60, bodyW);
114                curr.skip(-166f + -167); // this goes back!
115                curr.addFrame(y, 166, frameDur * 2f);
116                curr.last.setHittable(-60, bodyW);
117                addAnim(curr, textureScale);
118                
119                
120                //frameDur *= 3f;
121                y = sheetHeight - frameHeight;
122                curr = new CharAnim(TEX, IDLE_HIGH, frameHeight);
123                curr.interruptableBy(MOVE_BACK, MOVE_FORWARD, 
124                                ATTACK, RIPOSTE, BLOCK, ATTACK_HIGH, RIPOSTE_HIGH, BLOCK_LOW, GOT_HIT, FALL);
125                curr.scale = scale;
126                curr.skip(505);
127                curr.addFrame(y, 170, frameDur * 2f);
128                curr.last.setHittable(-60, bodyW);
129                curr.addFrame(y, 171, frameDur * 2f);
130                curr.last.setHittable(-60, bodyW);
131                curr.addFrame(y, 169, frameDur * 2f);
132                curr.last.setHittable(-60, bodyW);
133                curr.skip(-171 -169); // * 2f);// - 1f);
134                curr.addFrame(y, 171, frameDur * 2f);
135                curr.last.setHittable(-60, bodyW);
136                addAnim(curr, textureScale);
137                
138                
139                //frameDur *= 3f;
140                y = 296;
141                y = sheetHeight - frameHeight;
142                curr = new CharAnim(TEX, GOT_HIT, frameHeight);
143                curr.interruptableBy(FALL);
144                curr.scale = scale;
145                curr.initialRelativeOffset = 0f;
146                curr.skip(1015);
147                // moveback ~54 total
148                curr.addFrame(y, 148, frameDur * 2f);
149                curr.last.setHittable(-50, bodyW);
150                curr.last.soundIds.add(SOUND_RIP);
151                //curr.last.move.x -= 14f;
152                curr.addFrame(y, 144, frameDur * 1f);
153                curr.last.setHittable(-40, bodyW);
154                //curr.last.move.x -= 28f;
155                curr.last.move.x -= 15f;
156                curr.last.soundIds.add(SOUND_CLOTH);
157                curr.addFrame(y, 159, frameDur * 1f);
158                curr.last.setHittable(-30 - 14f, bodyW);
159                curr.last.move.x += 14f;
160                curr.moveToIdle.x -= 10f;
161                addAnim(curr, textureScale);
162                //frameDur /= 3f;
163                
164                
165                //y = 752;
166                //frameDur *= 3;
167                y = sheetHeight - frameHeight * 2f;
168                curr = new CharAnim(TEX, MOVE_FORWARD, frameHeight);
169                curr.interruptableBy(ATTACK, RIPOSTE, BLOCK, ATTACK_HIGH, RIPOSTE_HIGH, BLOCK_LOW, GOT_HIT, FALL);
170                curr.scale = scale;
171                // total move should be >= 21 (which is MOVE_BACK's dist) 
172                curr.addFrame(y, 166, frameDur);
173                curr.last.setHittable(-60, bodyW);
174                curr.last.move.x += 5f;
175                curr.last.soundIds.add(SOUND_CLOTH);
176                curr.addFrame(y, 167, frameDur);
177                curr.last.setHittable(-54, bodyW);
178                curr.last.move.x += 7f;
179                curr.last.soundIds.add(SOUND_STEP);
180                curr.addFrame(y, 164, frameDur);
181                curr.last.move.x += 8f;
182                curr.last.setHittable(-60, bodyW);
183                curr.moveToIdle.x += 3f;
184                addAnim(curr, textureScale);
185                
186                y = sheetHeight - frameHeight * 7f;
187                curr = new CharAnim(TEX, MOVE_FORWARD_HIGH, frameHeight);
188                curr.interruptableBy(ATTACK, RIPOSTE, BLOCK, ATTACK_HIGH, RIPOSTE_HIGH, BLOCK_LOW, GOT_HIT, FALL);
189                curr.scale = scale; 
190
191                curr.addFrame(y, 175, frameDur);
192                curr.last.setHittable(-60, bodyW);
193                curr.last.move.x += 5f;
194                curr.last.soundIds.add(SOUND_CLOTH);
195                curr.addFrame(y, 171, frameDur);
196                curr.last.setHittable(-54, bodyW);
197                curr.last.move.x += 7f;
198                curr.last.soundIds.add(SOUND_STEP);
199                curr.addFrame(y, 165, frameDur);
200                curr.last.move.x += 8f;
201                
202                curr.last.setHittable(-60, bodyW);
203                curr.moveToIdle.x += 3f;
204                addAnim(curr, textureScale);
205                
206                
207                //frameDur *= 3;
208                y = sheetHeight - frameHeight * 2f;
209                curr = new CharAnim(TEX, MOVE_BACK, frameHeight);
210                curr.interruptableBy(ATTACK, RIPOSTE, BLOCK, ATTACK_HIGH, RIPOSTE_HIGH, BLOCK_LOW, GOT_HIT, FALL);
211                curr.scale = scale;
212                curr.skip(507);
213                curr.addFrame(y, 181, frameDur);
214                curr.last.setHittable(-60, bodyW);
215                curr.last.move.x -= 11f;
216                curr.last.soundIds.add(SOUND_CLOTH);
217                curr.addFrame(y, 177, frameDur);
218                curr.last.setHittable(-60, bodyW);
219                curr.last.move.x -= 4f;
220                curr.last.soundIds.add(SOUND_STEP);
221                curr.addFrame(y, 172, frameDur);
222                curr.last.move.x -= 3f;
223                curr.last.setHittable(-60, bodyW);
224                curr.moveToIdle.x -= 1f;
225                
226//              curr.skip(30);
227//              curr.addFrame(y, 38, frameDur);
228//              curr.last.setHittable(-12, 12);
229//              curr.last.move.x -= 5f;
230//              curr.skip(-(30 + 38));
231//              curr.addFrame(y, 30, frameDur);
232//              curr.last.setHittable(-12, 12);
233                addAnim(curr, textureScale);
234                
235                
236                
237                // move back ~- 21 total
238                y = sheetHeight - frameHeight * 7f;
239                curr = new CharAnim(TEX, MOVE_BACK_HIGH, frameHeight);
240                curr.interruptableBy(ATTACK, RIPOSTE, BLOCK, ATTACK_HIGH, RIPOSTE_HIGH, BLOCK_LOW, GOT_HIT, FALL);
241                curr.scale = scale;
242                curr.skip(513);
243                
244                curr.addFrame(y, 184, frameDur);
245                curr.last.setHittable(-60, bodyW);
246                curr.last.move.x -= 11f;
247                curr.last.soundIds.add(SOUND_CLOTH);
248                curr.addFrame(y, 179, frameDur);
249                curr.last.setHittable(-60, bodyW);
250                curr.last.move.x -= 4f;
251                curr.last.soundIds.add(SOUND_STEP);
252                curr.addFrame(y, 171, frameDur);
253                curr.last.move.x -= 3f;
254                curr.last.setHittable(-60, bodyW);
255                curr.moveToIdle.x -= 1f;
256                
257                addAnim(curr, textureScale);
258                
259                
260                
261                // Block high
262                //y = 752;
263                //frameDur *= 5f;
264                y = sheetHeight - frameHeight * 6f;
265                curr = new CharAnim(TEX, BLOCK, frameHeight);
266                curr.interruptableBy(GOT_HIT, FALL);
267                curr.scale = scale;
268                
269                // need +26 movement
270                //frameDur *= 3f;
271                curr.addFrame(y, 165 , frameDur);// 40f/60f
272                curr.last.setHittable(-50, bodyW);
273                curr.last.setBlock(-30, 50);
274                curr.last.move.x -= 10f;
275                curr.last.soundIds.add(SOUND_CLOTH);
276                
277                curr.addFrame(y, 165, frameDur); // * 80f/60f
278                curr.last.setHittable(-50, bodyW);
279                curr.last.setBlock(-30, 50);
280                curr.last.move.x -= 2f;
281                
282                
283                curr.addFrame(y, 165, frameDur); // * 70f/60f
284                curr.last.setHittable(-50, bodyW);
285                curr.last.setBlock(-30, 50);
286                curr.last.move.x += 5f;
287                
288                curr.addFrame(y, 165, frameDur); // * 50f/60f
289                curr.last.setHittable(-50, bodyW);
290                //curr.last.setBlock(-30, 70);
291                curr.last.move.x += 12f;
292                
293                curr.moveToIdle.x += 15f;
294                addAnim(curr, textureScale);
295                
296                
297                // Block mid
298                // total movement: +24px
299                y = 709;
300                y = sheetHeight - frameHeight * 6f;
301                //frameDur *= 5f;
302                curr = new CharAnim(TEX, BLOCK_LOW, frameHeight);
303                curr.interruptableBy(GOT_HIT, FALL);
304                curr.scale = scale;
305                curr.skip(165*4);
306                
307                curr.addFrame(y, 165, frameDur); // 40f/60f);
308                curr.last.setHittable(-50, bodyW);
309                curr.last.setBlock(-30, 50);
310                curr.last.move.x -= 4f;
311                curr.last.soundIds.add(SOUND_CLOTH);
312                //curr.last.move.x -= 5f;
313                
314                curr.addFrame(y, 165, frameDur); // 50f/60f);
315                curr.last.setHittable(-55, bodyW);
316                curr.last.setBlock(-30, 50);
317                curr.last.move.x += 4f;
318                
319                curr.addFrame(y, 165, frameDur); // 100f/60f);
320                curr.last.setHittable(-60, bodyW);
321                curr.last.setBlock(-30, 50);
322                curr.last.move.x += 7f;
323                //curr.last.move.x -= 1f;
324                
325                curr.addFrame(y, 165, frameDur); // 50f/60f);
326                curr.last.setHittable(-55, bodyW);
327                //curr.last.setBlock(-30, 90);
328                curr.last.move.x += 5f;
329                curr.moveToIdle.x += 12f;
330                addAnim(curr, textureScale);
331                
332                
333                y = 804;
334                y = sheetHeight - frameHeight * 3f;
335                //frameDur *= 5f;
336                // Total movement: 0px.
337                curr = new CharAnim(TEX, ATTACK, frameHeight);
338                curr.interruptableBy(GOT_HIT, FALL);
339                curr.scale = scale;
340
341                curr.addFrame(y, 118, frameDur);
342                curr.last.setHittable(-40, bodyW);
343                curr.last.move.x -= 20f;
344                curr.last.soundIds.add(SOUND_CLOTH);
345                
346                curr.addFrame(y, 95, frameDur);
347                curr.last.setHittable(-25, bodyW);
348                curr.last.move.x -= 20f;
349                
350                curr.addFrame(y, 98, frameDur);
351                curr.last.setHittable(-25, bodyW);
352                curr.last.move.x += 10f;
353                
354                curr.addFrame(y, 113, frameDur);
355                curr.last.setHittable(-30, bodyW);
356                curr.last.move.x += 4f;
357                curr.last.soundIds.add(SOUND_SWISH);
358                curr.last.soundIds.add(SOUND_CLOTH);
359                
360                curr.addFrame(y, 176, frameDur);
361                curr.last.setHittable(-40, bodyW);
362                //curr.last.setAttack(8, 15);
363                curr.last.move.x += 33f;
364                
365                curr.addFrame(y, 237, frameDur * 2f);
366                curr.last.setHittable(-45, bodyW);
367                //curr.last.setAttack(18, 15);
368                curr.last.setAttack(35, 83);
369                curr.last.move.x += 40f;
370                curr.last.soundIds.add(SOUND_STEP);
371                
372                curr.addFrame(y, 200, frameDur);
373                curr.last.setHittable(-30, bodyW);
374                curr.last.move.x -= 25f;
375                curr.last.soundIds.add(SOUND_CLOTH);
376                
377                curr.addFrame(y, 170, frameDur);
378                curr.last.setHittable(-35, bodyW);
379                curr.last.move.x -= 15f;
380                
381                curr.moveToIdle.x -= 7f;
382                addAnim(curr, textureScale);
383                
384                y = 804;
385                y = sheetHeight - frameHeight * 4f;
386
387                //frameDur *= 5f;
388                
389                curr = new CharAnim(TEX, ATTACK_HIGH, frameHeight);
390                curr.interruptableBy(GOT_HIT, FALL);
391                curr.scale = scale;
392                //curr.skip(2);
393                //frameDur *= 3f;
394                curr.addFrame(y, 124, frameDur);
395                curr.last.setHittable(-40, bodyW);
396                curr.last.move.x -= 20f;
397                curr.last.soundIds.add(SOUND_CLOTH);
398                
399                curr.addFrame(y, 98, frameDur);
400                curr.last.setHittable(-25, bodyW);
401                curr.last.move.x -= 20f;
402                
403                curr.addFrame(y, 98, frameDur);
404                curr.last.setHittable(-25, bodyW);
405                curr.last.move.x += 10f;
406                
407                curr.addFrame(y, 121, frameDur);
408                curr.last.setHittable(-30, bodyW);
409                curr.last.move.x += 4f;
410                curr.last.soundIds.add(SOUND_SWISH);
411                curr.last.soundIds.add(SOUND_CLOTH);
412                
413                curr.addFrame(y, 161, frameDur);
414                curr.last.setHittable(-40, bodyW);
415                curr.last.move.x += 33f;
416                
417                curr.addFrame(y, 238, frameDur * 2f);
418                curr.last.setHittable(-45, bodyW);
419                //curr.last.setAttack(18, 15);
420                curr.last.setAttack(35, 83);
421                curr.last.move.x += 40f;
422                curr.last.soundIds.add(SOUND_STEP);
423                
424                curr.addFrame(y, 210, frameDur);
425                curr.last.setHittable(-30, bodyW);
426                curr.last.move.x -= 25f;
427                curr.last.soundIds.add(SOUND_CLOTH);
428                
429                curr.addFrame(y, 172, frameDur);
430                curr.last.setHittable(-35, bodyW);
431                curr.last.move.x -= 15f;
432                curr.moveToIdle.x -= 7f;
433                addAnim(curr, textureScale);
434                
435                
436                curr = ANIMATIONS.get(ATTACK).clone();
437                curr.action = RIPOSTE;
438                curr.removeFirstFrame();
439                curr.removeFirstFrame();
440                curr.frames.get(0).move.x -= 28;
441                curr.frames.get(curr.frames.size() - 1).move.x += 5;
442                addAnim(curr, textureScale);
443                
444                curr = ANIMATIONS.get(ATTACK_HIGH).clone();
445                curr.action = RIPOSTE_HIGH;
446                curr.removeFirstFrame();
447                curr.removeFirstFrame();
448                //curr.frames.get(0).move.x -= 40;
449                addAnim(curr, textureScale);
450        
451                // will need to be adjusted per frame; this is just for testing, split evenly between
452                // the last 2 frames of recovery -am
453                float recoveryMoveBack = 62f;
454                // ah, right! attack recovery *needs* to be this much to counter the back movement of the last part of
455                // the attack that got interrupted by the recovery
456                //recoveryMoveBack = 30f;
457                recoveryMoveBack = 23;
458                
459                // Attack recovery ... high?
460                y = 752;
461                y = sheetHeight - frameHeight * 5f;
462                //frameDur *= 5f;
463                curr = new CharAnim(TEX, ATTACK_HIGH_RECOVERY, frameHeight);
464                curr.interruptableBy(GOT_HIT, FALL);
465                curr.scale = scale;
466
467                curr.addFrame(y, 192, frameDur);
468                curr.last.setHittable(-45, bodyW);
469                curr.last.move.x += 8f;
470                curr.last.soundIds.add(SOUND_CLASH);
471                
472                curr.addFrame(y, 192, frameDur); // +16
473                curr.last.setHittable(-45, bodyW);
474                curr.last.move.x += -22f;// +8f; 
475                curr.last.soundIds.add(SOUND_CLOTH);
476                
477                curr.addFrame(y, 168, frameDur); // +8
478                curr.last.setHittable(-35, bodyW);
479                curr.last.move.x += -14f;// +4f; 
480                curr.last.soundIds.add(SOUND_STEP);
481                
482                curr.moveToIdle.x += -6f;
483                addAnim(curr, textureScale);
484                
485                
486                // Attack recovery mid?
487                // total movement: -16
488                
489                y = 752;
490                //y = sheetHeight - frameHeight * 7f;
491                y = sheetHeight - frameHeight * 2f;
492                //frameDur *= 5f; 
493                curr = new CharAnim(TEX, ATTACK_RECOVERY, frameHeight);
494                curr.interruptableBy(GOT_HIT, FALL);
495                curr.scale = scale;
496
497                curr.skip(1038);
498                curr.addFrame(y, 190, frameDur);
499                curr.last.setHittable(-45, bodyW);
500                curr.last.move.x += 8f;
501                curr.last.soundIds.add(SOUND_CLASH);
502
503                curr.addFrame(y, 176, frameDur);
504                curr.last.setHittable(-35, bodyW);
505                curr.last.move.x += -22f; 
506                curr.last.soundIds.add(SOUND_CLOTH);
507                
508                y = sheetHeight - frameHeight * 3f; 
509                curr.widthSoFar = 1210;
510                curr.addFrame(y, 168, frameDur);
511                curr.last.setHittable(-11, bodyW);
512                curr.last.move.x += -14f; 
513                curr.last.soundIds.add(SOUND_STEP);
514                
515                curr.moveToIdle.x += -6f;
516
517
518                addAnim(curr, textureScale);
519                
520                
521                //frameDur *= 5f;
522                y = 296;
523                y = sheetHeight - frameHeight * 5f;
524                //frameDur *= 5f;
525                curr = new CharAnim(TEX, FALL, frameHeight);
526                //curr.interruptableBy(GOT_HIT, FALL);
527                curr.scale = scale;
528                curr.skip(574);
529                //curr.skip(172);
530                curr.addFrame(y, 158, frameDur * 1f);
531                curr.last.setHittable(-40, bodyW);
532                curr.last.move.x -= 0f;
533                curr.last.soundIds.add(SOUND_RIP);
534                curr.addFrame(y, 144, frameDur * 1f);
535                curr.last.setHittable(-40, bodyW);
536                curr.last.move.x -= 45f;
537                curr.last.soundIds.add(SOUND_CLOTH);
538                curr.addFrame(y, 128, frameDur * 1f);
539                curr.last.setHittable(-40, bodyW);
540                curr.last.move.x -= 19f;
541                curr.addFrame(y, 137, frameDur * 1f);
542                curr.last.setHittable(-40, bodyW);
543                curr.last.move.x -= 40f;
544                curr.addFrame(y, 175, frameDur * 1f);
545                curr.last.setHittable(-40, bodyW);
546                curr.last.move.x -= 12f;
547                curr.last.soundIds.add(SOUND_FALL);
548                curr.addFrame(y, 174, frameDur * 1f);
549                curr.last.setHittable(-40, bodyW);
550                curr.last.move.x += 8f;
551
552                curr.widthSoFar = 1049;
553                
554                y = sheetHeight - frameHeight * 7f;
555                curr.addFrame(y, 178, 100000f);
556                //curr.last.setHittable(-40, bodyW); non-hittable - no shadow, but otherwise you could still, ah, hit them
557                curr.last.move.x += 2f;
558                curr.last.move.y += 1f;
559                
560//              curr.addFrame(y, 34, 100000f);
561                //curr.last.move.x -= 8f;
562                curr.moveToIdle.x += 10f;
563                addAnim(curr, textureScale);
564        }
565        
566        public static void addAnim(CharAnim anim, float textureScale) {
567                anim.updateTextureScale(textureScale);
568                ANIMATIONS.put(anim.action, anim);
569        }
570}
571