1

Where have all my children gone?

Hope this is a relatively simple answer to a less-than-intelligent question that's a consequence of how I learn things when not doing them for work. In this case I started a game about 3 years ago in AS3 as I was familiar with js at least and had also worked with shockwave back in the day. Anyway, when learning something offline like this I tend to learn just what I need to know to do what I need to do next, and can sometimes get pretty far into one area while missing something obvious and simple because I just haven't crossed that case yet.

We have a playing field and playing pieces. Those playing pieces (sailing ships) you see below are complex objects with dozens of properties and several children including graphics and text fields that change depending on the state of the ship. It's WEGO where each side plots moves, those moves are then executed one ship at a time alternatively between the two sides, then we have gun combat, etc. All that is there and works fine, a few thousand lines of code.

My current problem is that when a player clicks on a ship to select it, I unhide a yellow border to indicate which ship is selected and draw the complex ship detail screen you see top left, but for a long time I've wanted to change the background color of the playing piece as well.

After a long layoff I started working on this again and decided to start there. So I made new counters, added them as keyframes to the already existing symbol/class that contains all of the country default backgrounds, and modified the code. It works fine in that the background is changed to the correct highlighted version, and then goes back to default when deselected.

In the image the currently-selected ship is in the center, USS Constitution, its detail/info screen is also displayed. You can see the problem, all the children are gone on the playing piece. And they don't come back when you go back to the original default background.

At first I thought it was a z order problem but it isn't, I walked the selected ship playing piece background in the z index until they disappeared behind the ocean background, there was just open ocean where the ship playing piece used to be.

My best guess is that maybe the children have to be instanced on each frame of the parent's timeline each time you change the parent's frame but if so I'm not finding reference to or explanation of that. That and that seems really unwieldy way of doing things, I was completely caught off guard by the idea of the children caring what frame its parent is on unless there was coded logic telling it to.

Somehow even though I have thousands of lines of complex dialogs and screens displaying multiple dynamic children I have never changed the base background in any of those cases.

Also tried to google this, but had little luck. I couldn't even figure out a relatively simple question to ask.

I'll be happy to paste code but I don't seem to have a code problem but an understanding problem.

Example-selected ship with highlighted background graphic is in the center

For those who feel the code is important, this is the end of the 1500 line ship-creation function where most of the children get added:

textShipSailSpeed.name = "textShipSailSpeed";
            textShipSailSpeed.width = 20;
            textShipSailSpeed.height = 13;
            textShipSailSpeed.x = 33;
            textShipSailSpeed.y = 14;
            textShipSailSpeed.embedFonts = true;
            textShipSailSpeed.textColor = 0xFFFFFF;
            textShipSailSpeed.rotation -= 90;

            //full sails set
            if ("full" == finalShip.sailState) {

                textShipSailSpeed.text = finalShip.fullSailSpeed;
            }

            //battle sails set, which are reduced sails to improve visibility and reduce sail damage in combat
            else {

                textShipSailSpeed.text = finalShip.battleSailSpeed;
            }

            // textShipBattleSailSpeed and textShipFullSailSpeed no longer used on counters, but still used in Info screens
            var textShipBattleSailSpeed: TextField = new TextField();
            textShipBattleSailSpeed.name = "textShipBattleSailSpeed";
            textShipBattleSailSpeed.text = finalShip.battleSailSpeed;
            textShipBattleSailSpeed.visible = false;

            var textShipFullSailSpeed: TextField = new TextField();
            textShipFullSailSpeed.name = "textShipFullSailSpeed";
            textShipFullSailSpeed.text = finalShip.fullSailSpeed;
            textShipFullSailSpeed.visible = false;

            //create sailState (battle/full) indicator
            var sailStateIndicator: WSIM_Counters_SailtState_Indicator = new WSIM_Counters_SailtState_Indicator();

            //set indicator to correct sailState background graphic
            sailStateIndicator.gotoAndStop("battle");

            if ("full" == finalShip.sailState) {

                sailStateIndicator.gotoAndStop("full");
            }

            finalShip.addChild(sailStateIndicator);

            //add ship and attach text fields
            gridBG1.addChild(finalShip);
            finalShip.addChild(textShipName);
            finalShip.addChild(textShipSailSpeed);
            finalShip.addChild(textShipTurnAllowance);
            finalShip.addChild(textShipBattleSailSpeed);
            finalShip.addChild(textShipFullSailSpeed);
            finalShip.parent.setChildIndex(finalShip, 1);

            //logging
            if (log_shipCreation) {

                trace(finalShip.name + " added added as child of background in createShip()");
            }

            //create background sprite "ship is selected" border
            var border: Sprite = new Sprite();
            border.name = "shipBorder";
            border.graphics.beginFill(0xFFCC00, 1);
            border.graphics.drawRect(-1, -1, 52, 132)
            border.graphics.endFill();
            border.visible = false;

            //create background sprite combat border
            var borderCombat: Sprite = new Sprite();
            borderCombat.name = "borderCombat";
            borderCombat.graphics.beginFill(0xFF0000, 1);
            borderCombat.graphics.drawRect(-1, -1, 52, 132)
            borderCombat.graphics.endFill();
            borderCombat.visible = false;

            //add the borders as children of ship
            finalShip.addChild(border);
            finalShip.addChild(borderCombat);

            //move the borders in z-order to behind ship counter, so they show looking like a border
            border.parent.setChildIndex(border, border.parent.getChildIndex(border) - 5);
            borderCombat.parent.setChildIndex(borderCombat, borderCombat.parent.getChildIndex(borderCombat) - 6);

            //PUSH TO MASTER SHIP ARRAYS
            //finalShip is Side 1, add to master list of ship objects for Side 1
            if (sideList[0] == finalShip.country) { ....

And this is part of the even larger selectShip function, here is where I clear the selected state on all ships on map and then set the current ship's background to currShip.country+"_sel" which is the correct frame label for the "selected" background images.

//clear combat selected state on all ships
            for (var i: int = 0; i < shipListSide1.length; i++) {

                //hide selection border sprite and set select property false
                shipListSide1[i].combatSelected = false;
                var borderChildCombat = shipListSide1[i].getChildByName("borderCombat");
                borderChildCombat.visible = false;

                //show default counter background, build label name
                shipListSide1[i].gotoAndStop(shipListSide1[i].country+"_def");
            }

            for (var i: int = 0; i < shipListSide2.length; i++) {

                //hide selection border sprite and set select property false
                shipListSide2[i].combatSelected = false;

                var borderChildCombat2 = shipListSide2[i].getChildByName("borderCombat");
                borderChildCombat2.visible = false;

                //show default counter background, build label name
                shipListSide2[i].gotoAndStop(shipListSide2[i].country+"_def");
            }

            //check to see if this is selecting a target in gun combat
            if ((false == currShip.side1 && enableCombatSelectSide2) || (currShip.side1 && enableCombatSelectSide1)) {

                combatSelectShip(currShip);
            }

            //we're allowed to select this ship
            if ((enableSelectSide1 && currShip.side1) || (enableSelectSide2 && false == currShip.side1)) {

                //event is from a ship object
                if (currShip is Ship_1) {

                    //remove previous ship info screen
                    if (currShipInfo.parent) {

                        currShipInfo.parent.removeChild(currShipInfo);
                    }


                    //clear selected state on all ships
                    for (var i: int = 0; i < shipListSide1.length; i++) {

                        //hide selection border sprite and set select property false
                        shipListSide1[i].selected = false;

                        var borderChild = shipListSide1[i].getChildByName("shipBorder");
                        borderChild.visible = false;

                        //default graphic already set in clearing combatselect status above
                    }

                    for (var i: int = 0; i < shipListSide2.length; i++) {

                        //hide selection border sprite and set select property false
                        shipListSide2[i].selected = false;

                        var borderChild2 = shipListSide2[i].getChildByName("shipBorder");
                        borderChild2.visible = false;

                        //default graphic already set in clearing combatselect status above
                    }

                    //Change graphic of selected ship to selected, highlighted color
                    currShip.gotoAndStop(currShip.country+"_sel");

                    //set selected state on clicked ship, unhide border
                    currShip.selected = true;
                    borderChild = currShip.getChildByName("shipBorder");
                    borderChild.visible = true;

Ok based on feedback about it being a z-order issue, the below is what I tried to move the missing children back above the playing piece background. If you notice it also has to be a z order issue as the "selected" border, which is a child of the playing piece like the missing ones, that happens to purposely be behind the playing piece graphic, displays correctly when the ship is in the selected state. See the original screenshot, the playing piece in the center that's selected and is missing its children also has a yellow border.

Anyway, below is what I tried. It works in that there are no errors but I really couldn't find these children in the debugger to confirm what happened, and so far I at least appear to have moved them up in the z order to the max before I get an out of range error, and the problem still exists - no ship graphic, ship name, movement allowance, etc.

//Change playing piece background of the selected ship to selected, highlighted color frame
                    currShip.gotoAndStop(currShip.country+"_sel");

                    //trying to move the children of the playing piece back above the playing piece graphic
                    var shipChildrenArray:Array = new Array("textShipName","textShipTurnAllowance","textShipSailSpeed","sailStateIndicator");

                    for each(var childItem:String in shipChildrenArray) {

                        currShip.setChildIndex(currShip.getChildByName(childItem), 3);
                    }
vossiewulf
  • 53
  • 6
  • Check if your MC actually has children first. Check if your background is at z-order of 0 (`mc.getChildIndex(background)`, replace names with your code's. Alter the background's alpha just in case, if the children would fade then check if you're calling `mc.addChild(background)` somewhere, this puts background on top. Everything else requires you posting relevant code pieces. – Vesper Jun 06 '16 at 09:24
  • As a follow-up: it *is* possible that changing your background's frame removes any children, because they were children of background, and they don't exist on the target keyframe if you design them in GUI. The solution is to drop frames, timelines etc, reduce `MovieClip`s to `Sprite`s and manually control adding or removing children *everywhere*. This will eventually help you gain total control over your elements' presence, appearance, z-order etc. – Vesper Jun 06 '16 at 09:27
  • Just spent quite some time in the debugger trying to find a list of children of the ship object with no success. If it's possible, appreciate very much being told how. After more experimentation, it appears to definitely be a z order issue not a frame issue (as in children not existing on the other frames) because the missing children don't come back when I deselect the ship and it returns to the default, original frame. That being said, I'm not having much success by trying to change the children's z order to back above the playing piece background. I'll add a snippet of code above. – vossiewulf Jun 07 '16 at 05:35
  • WRT structure of these symbols, all of them are identical in that they're a group of frames, each frame being a labeled keyframe with a unique bitmap. They're created with the gui and exported for actionscript, everything else is done in code. Having everything be a single unique bitmap that I have to add and move and position each time... not sure how that would be practical, There are already hundreds and most are one state of an object with some or many possible states, changing states by moving along a timeline would be hard to engineer out. – vossiewulf Jun 07 '16 at 06:00
  • @vossiewulf When an object is removed from the display list, it has to be added back with code. And when you go to the frame where the children don't exist, they are removed from the display list. – Neal Davis Jun 08 '16 at 09:00
  • Possible duplicate of [AS3 How can I solve the bug of setChildIndex](http://stackoverflow.com/questions/19757149/as3-how-can-i-solve-the-bug-of-setchildindex) – Neal Davis Jun 11 '16 at 08:32

4 Answers4

1

Your parent movieclip should have layers. The child movieclip that you want to always be visible needs to extend across all frames of the parent.

Note that I did not see what you say I should be able to see on your graphic. Since I don't know what you think it should look like, I wasn't able to spot the difference between what it does look like and that.

You may find you get better feedback if you post a screen capture of the timeline and post any code that's involved.

Amy Blankenship
  • 6,485
  • 2
  • 22
  • 45
  • There are two ships present with the American flag - one has a ship and several text fields and graphic elements on top of that background. The one that I clicked on in the center, which shows an American flag but is a brighter color, you see no ship and no numbers and no additional graphic elements. I will look at the layers, that makes sense but I've never used them. – vossiewulf Jun 06 '16 at 20:05
0

At first I thought it was a z order problem but it isn't,

Actually this is probably exactly your problem.

I walked the selected ship playing piece background in the z index until they disappeared behind the ocean

Really? How? Moving the z-order of display objects in a container can't change the z-order of the container. But if you are moving the ship itself (the container of all your other symbols), then yes, the open ocean will appear. But just shifting things around within the ship won't do that. How to shift things around in the ship container? Go here.


Example

If your game piece (pieceMc) is a child of the ocean background (oceanMc) and the the flag background (flagMc) is a child of the piece then

oceanMc.gamePieceMc.setChildIndex(flagMc,0);

should put the flag to the bottom


Edit 6/11/16 One quick and dirty way to change z-order at runtime is to re add the child; it will be put on top of the stack. You could do

 piece[i].addChild(ship);
 piece[i].addChild(guns);
 piece[i].addChild(nameField);

the result will be that the ship will come to the top, then the guns will be put back on top of that, then the nameField on top of that. If the flag background is also a child of "piece" it will below, like you want.

Community
  • 1
  • 1
Neal Davis
  • 2,010
  • 2
  • 12
  • 25
  • Ok, z order problem and thanks. But the answer you pointed me to left me confused. The ship background graphic that is changing is a child of the main background. The things that are disappearing are its children. I only know how to manipulate z order with reference to parents: the get/set child index methods that require reference to the parent. So I don't see how I move the ship background's z order relative to its own children – vossiewulf Jun 06 '16 at 06:49
  • A child of the "main" background? Clarify – Neal Davis Jun 06 '16 at 11:14
  • One quick and dirty way to change z-order at runtime is to re add the child; it will be put on top of the stack. You could do piece[1].addChild(ship); piece[1].addChild(guns); piece[1].addChild(nameField); the result will be that the ship will come to the top, then the guns will be put back on top of that, then the nameField on top of that. If the flag background is also a child of "piece" it will below, like you want. – Neal Davis Jun 06 '16 at 12:24
  • 1
    The "main" background is the ocean. Playing pieces are children of the background. Relevant dynamic ship stats and image of the ship are children of the playing piece backgrounds. – vossiewulf Jun 06 '16 at 20:00
  • As for re-adding the children, would I not then have two copies of each named the same? I have to repeatedly access these children to change their values and ships are moved and damage occurs. – vossiewulf Jun 06 '16 at 20:01
  • No it will simply change the z-order. I know it doesn't sound like it, but it works. There is a more sophisticated method with parent.setChildIndex(childMc, i); – Neal Davis Jun 06 '16 at 20:21
0

I try to build a simple replica of your hierarchy here:

 package  {

    import flash.display.MovieClip;
    import flash.events.*;

    public class gameTestDoc extends MovieClip {
        var pieceArray:Array = new Array();

        public function gameTestDoc() {
            stage.addEventListener(MouseEvent.CLICK, selectPiece);
            for (var i:int = 0; i < 4; i++){ // creates 4 instances of a class with 6 frames, each having a different colored rectangle. 
                var gamePiece:MovieClip = new backGround();
                addChild(gamePiece);
                gamePiece.x = 50 * i + 200; // space out the game pieces. 
                gamePiece.y = stage.stageHeight/2; // center game pieces. 
                pieceArray.push(gamePiece);// add piece to array. 
                for (var j:int = 0; j < 5; j++){
                    var components:MovieClip = new MovieClip();
                    components.graphics.lineStyle();
                    components.graphics.beginFill(0x00ffcc * j * 200000); //gives different color to each component. 
                    components.graphics.drawRect(0,0,5, 10);
                    components.graphics.endFill();
                    gamePiece.addChild(components);
                    components.y = j * 5;                   
                }
                gamePiece.gotoAndStop(Math.ceil(Math.random()*10)); // give each piece a random frame to go to. 
            }
        }

        function selectPiece(e:MouseEvent):void{ // sends game piece frame to random frame. 
            for (var i:int = 0; i < pieceArray.length; i++){
                e.target.gotoAndStop(Math.ceil(Math.random()*10));
            }
        }
    }   
}

and I have an mc in the GUI library with the linkage name of "backGround". When I click on the pieces, the backgrounds change color, and everything else stays on top. Here is a picture:

beforeClick and after I click the 2nd piece: enter image description here

can you see from my simple code what you might be doing differently?

edit: 6-10-16

    //move the borders in z-order to behind ship counter, so they show looking like a border
    border.parent.setChildIndex(border, border.parent.getChildIndex(border) - 5);
    borderCombat.parent.setChildIndex(borderCombat, borderCombat.parent.getChildIndex(borderCombat) - 6);

wouldn't this be less confusing/prone to strange behavior?:

    //move the borders in z-order to behind ship counter, so they show looking like a border
    border.parent.setChildIndex(border, 0);
    borderCombat.parent.setChildIndex(borderCombat, 0);

Would this not give the same result?

Neal Davis
  • 2,010
  • 2
  • 12
  • 25
  • Thanks for the time and effort, I very much appreciate it - you solved something that I'd been beating head against for several days. That being said, the above conclusions aren't correct. I had to confirm to myself whether it was z order or not, so I went to the parent movieclip (of playing piece backgrounds) and just nuked the bitmap on the US selected frame but left the frame in place. When I ran it again and selected the ship, I could see all the children were there, just under the playing piece. – vossiewulf Jun 09 '16 at 03:37
  • Also, I think you're misunderstanding the topology but I probably haven't been explaining it well. There's a big ocean jpg that is the background and is the child of the movieclip. All of the playing pieces are children of that background. ALL elements drawn on top of the playing pieces are children of those pieces. It's a very orderly tree structure. – vossiewulf Jun 09 '16 at 03:43
  • Ok, so maybe my assumption that is was a frame issue did turn out to be wrong. Good job testing that. You could still fix it by doing as I suggested and all the swapping of depths would be no longer needed. But if you're going to just go with the hack, maybe vote that one as accepted. But it really would be cleaner to have the background be a child of the piece instead of the components being children of the background. – Neal Davis Jun 09 '16 at 04:02
  • It gets weirder. Once I finally got past this problem, I looked into the problem I was having with the side 2 (British in this case) ships, and it was that they're going to the BOTTOM of the z order array. Even though side 1 (US) and side 2 (Brit) ships are created in exactly the same way at the same time in the same place - literally no difference in terms of how they're created. So when I select the US ships, its playing piece goes to the top of the order. When I select ships on the other side, that same graphic goes to the bottom. This looks more like a flash bug than anything intentional. – vossiewulf Jun 09 '16 at 08:35
  • And only way to fix the side 2 problem was to move the border rectangle behind the playing piece which had gone to the bottom of the z order array. So now I have two hack solutions to fix two non-sensical issues, and I'm also confused as to how other folks haven't seen this before. – vossiewulf Jun 09 '16 at 08:40
  • @vossiewulf I just built a simple replica of your piece selection mechanic (as I understand it) and it works fine. Tell me what I'm doing differently. I made an mc in the GUI with 6 frames, each a different color. I added different colored components on top of that, as children of the colored background mc, during runtime. I then made a function that randomly goes to a new frame of only the selected piece (4 are created in a loop using the linkage name in the library). All the components stay on top but the background changes color. So what's different about our setup? – Neal Davis Jun 09 '16 at 18:24
  • See edited solution below, can't post code in comments. – vossiewulf Jun 10 '16 at 05:09
  • Actually yes and I had done the same thing late last night. I finally stared at those lines written two years ago and wondered why I was doing it that way, and it DOES fix the Side 2 part of the problem where the playing piece/flag background was trying to go to the bottom of the stack. Unfortunately on this end we know 0 will always exist, but we get out of range errors if we try to set anything to an index we know will be above anything else. So easiest solution for the Side 1 problem where the background goes to the top remains the remove/add child fix. – vossiewulf Jun 11 '16 at 08:00
  • "on this end we know zero will always exist" what does this mean? – Neal Davis Jun 11 '16 at 08:08
  • http://stackoverflow.com/questions/19757149/as3-how-can-i-solve-the-bug-of-setchildindex – Neal Davis Jun 11 '16 at 08:11
  • This link above suggests to change some of your setChildIndex codes. I've just found a ton of posts where people are complaining about an AS3 bug that breaks the z order linkage when you go to a new frame and the objects were touched by this method (setChildIndex). I've tried to "break" my replica that I made by incorporating setChildIndex to no avail. Maybe they fixed it in the newer release and you are using an old one? At any rate, the suggested method is exactly what I suggested with just adding the Child again. If that is working, maybe it's time to mark that as an accepted answer? – Neal Davis Jun 11 '16 at 08:14
  • https://www.kirupa.com/forum/showthread.php?285768-movieClip-stops-tweening-after-setChildIndex – Neal Davis Jun 11 '16 at 08:21
  • http://board.flashkit.com/board/showthread.php?818335-setChildIndex-kills-frame-animation – Neal Davis Jun 11 '16 at 08:21
  • and one more for good measure from SO http://stackoverflow.com/questions/19757149/as3-how-can-i-solve-the-bug-of-setchildindex – Neal Davis Jun 11 '16 at 08:21
-1

One quick and dirty way to change z-order at runtime is to re add the child; it will be put on top of the stack. You could do piece[1].addChild(ship); piece[1].addChild(guns); piece[1].addChild(nameField); the result will be that the ship will come to the top, then the guns will be put back on top of that, then the nameField on top of that. If the flag background is also a child of "piece" it will below, like you want. – Neal Davis yesterday

Ok, this is the closest to the correct answer I'm going with. As you can see in the update to my original question, I tried to fix the z order problem by either moving the children up or the background down, but had no luck even though the code executes fine.

So I changed my solution to this:

//Change playing piece background of the selected ship to selected, highlighted color frame
                    currShip.gotoAndStop(currShip.country+"_sel");

                    //move the children of the playing piece back above the playing piece graphic. When parent changes frame as above it goes to the top of the z order for some stupid reason
                    var shipChildrenArray:Array = new Array("textShipName","textShipTurnAllowance","textShipSailSpeed","sailStateIndicator", "currShipGraphic");

                    for each(var childItem:String in shipChildrenArray) {

                        //currShip.setChildIndex(currShip.getChildByName(childItem), 5);
                        var childObject = currShip.getChildByName(childItem);
                        currShip.removeChild(childObject);
                        currShip.addChild(childObject);
                    }

It seems very hacky to me, I'd rather correctly manipulate the z order but unless someone has other ideas on how to do that, we'll have to go with this solution. Re-adding the children does indeed move them back to the top of the current z order array.

So:

1) If you have nested movieclips and you change the frame of the parent, it will go to the top of the z order array for reasons I can't begin to fathom. I don't see a way to prevent it either.

2) If you know how to manipulate the z order of the child movieclips better than I do, that would probably be the best solution.

3) A sledgehammer solution is removing and adding all the children back.

...and it won't let me post a screenshot of it working properly because I "need at least 10 reputation points to post more than two links." Makes no sense as this attachment is the SECOND link, not third or more. Oh well.


Responding to Neal's post.

Looking at the code, only difference that I see is that you're adding the pieces as children of the stage, while mine are one nested level down by being children of the ocean graphic.

Since you're interested and spending time with it, I'll post the entire ship creation function below. It gets called iteratively and loops through the side1 master array of ships and then side2, back to back. That's one reason I'm so confused by the two sides' z orders being consistently different, maybe alphabetical is being applied- only z order manipulation I do in the creation is pushing the border children (one normal select one combat) behind the playing piece.

BTW, please also look for another question from me involving a different issue I am having where a dialog is refusing to disappear on removeChild even though the associated code hasn't been touched in a couple years.

This is ship creation. This is a simulation, not a game, so it's reasonably complex with large numbers of properties set. One somewhat unusual thing I do you will see is cast my Ship_1 classes to a generic object to set all the custom properties and then back to Ship_1 once that's done. I always thought that was a little risky but have seen zero problems (unless this issue is tied to that somehow)

//create ship objects, set properties, add to core arrays
        function createShip(currShip) {

            // create Ship_1 obj and cast it temporarily as parent class (which is dynamic) to set custom properties
            var finalShip: Ship_1 = new Ship_1();
            var temp_Ship: Object = finalShip as Object;

            //set basic stats
            temp_Ship.selected = currShip.selected;
            temp_Ship.combatSelected = currShip.combatSelected;
            temp_Ship.name = currShip.name;

            //rigging & rigging damage
            temp_Ship.rigging = currShip.rigging;
            temp_Ship.riggingSlots = currShip.riggingSlots;
            temp_Ship.rigging_1 = currShip.rigging_1;
            temp_Ship.rigging_2 = currShip.rigging_2;
            temp_Ship.rigging_3 = currShip.rigging_3;
            temp_Ship.rigging_4 = currShip.rigging_4;
            temp_Ship.riggingDamage = currShip.riggingDamage;
            temp_Ship.riggingDamage_1 = currShip.riggingDamage_1;
            temp_Ship.riggingDamage_2 = currShip.riggingDamage_2;
            temp_Ship.riggingDamage_3 = currShip.riggingDamage_3;
            temp_Ship.riggingDamage_4 = currShip.riggingDamage_4;

            //hull & hull damage
            temp_Ship.hull = currShip.hull;
            temp_Ship.hull_1 = currShip.hull_1;
            temp_Ship.hull_2 = currShip.hull_2;
            temp_Ship.hull_3 = currShip.hull_3;
            temp_Ship.hullDamage = currShip.hullDamage;
            temp_Ship.hullDamage_1 = currShip.hullDamage_1;
            temp_Ship.hullDamage_2 = currShip.hullDamage_2;
            temp_Ship.hullDamage_3 = currShip.hullDamage_3;

            //guns & guns damage
            temp_Ship.guns = currShip.guns;
            temp_Ship.gunsDamage = currShip.gunsDamage;
            temp_Ship.guns_1 = currShip.guns_1;
            temp_Ship.guns_2 = currShip.guns_2;
            temp_Ship.guns_3 = currShip.guns_3;
            temp_Ship.guns_4 = currShip.guns_4;
            temp_Ship.gunsDamageLeftBow = currShip.gunsDamageLeftBow;
            temp_Ship.gunsDamageLeftBowInitial = currShip.gunsDamageLeftBowInitial;
            temp_Ship.gunsDamageRightBow = currShip.gunsDamageRightBow;
            temp_Ship.gunsDamageRightBowInitial = currShip.gunsDamageRightBowInitial;
            temp_Ship.gunsDamageLeftStern = currShip.gunsDamageLeftStern;
            temp_Ship.gunsDamageLeftSternInitial = currShip.gunsDamageLeftSternInitial;
            temp_Ship.gunsDamageRightStern = currShip.gunsDamageRightStern;
            temp_Ship.gunsDamageRightSternInitial = currShip.gunsDamageRightSternInitial;

            //carronades & carronades damage
            temp_Ship.carronades = currShip.carronades;
            temp_Ship.carronades_1 = currShip.carronades_1;
            temp_Ship.carronades_2 = currShip.carronades_2;
            temp_Ship.carronades_3 = currShip.carronades_3;
            temp_Ship.carronades_4 = currShip.carronades_4;
            temp_Ship.carronadesDamageLeftBow = currShip.carronadesDamageLeftBow;
            temp_Ship.carronadesDamageLeftBowInitial = currShip.carronadesDamageLeftBowInitial;
            temp_Ship.carronadesDamageRightBow = currShip.carronadesDamageRightBow;
            temp_Ship.carronadesDamageRightBowInitial = currShip.carronadesDamageRightBowInitial;
            temp_Ship.carronadesDamageLeftStern = currShip.carronadesDamageLeftStern;
            temp_Ship.carronadesDamageLeftSternInitial = currShip.carronadesDamageLeftSternInitial;
            temp_Ship.carronadesDamageRightStern = currShip.carronadesDamageRightStern;
            temp_Ship.carronadesDamageRightSternInitial = currShip.carronadesDamageRightSternInitial;

            //crew and crew damage
            temp_Ship.crewQuality = currShip.crewQuality;
            temp_Ship.crewDamage = currShip.crewDamage;
            temp_Ship.crew_1 = currShip.crew_1;
            temp_Ship.crew_1_damage = currShip.crew_1_damage;
            temp_Ship.crew_1_lost = currShip.crew_1_lost;
            temp_Ship.crew_1_lostInitial = currShip.crew_1_lostInitial;
            temp_Ship.crew_2 = currShip.crew_2;
            temp_Ship.crew_2_damage = currShip.crew_2_damage;
            temp_Ship.crew_2_lost = currShip.crew_2_lost;
            temp_Ship.crew_2_lostInitial = currShip.crew_2_lostInitial;
            temp_Ship.crew_3 = currShip.crew_3;
            temp_Ship.crew_3_damage = currShip.crew_3_damage;
            temp_Ship.crew_3_lost = currShip.crew_3_lost;
            temp_Ship.crew_3_lostInitial = currShip.crew_3_lostInitial;

            //initial positions, used in plotted movement
            temp_Ship.initialColumn = currShip.initialColumn;
            temp_Ship.initialRow = currShip.initialRow;
            temp_Ship.initialColumn2 = currShip.initialColumn2;
            temp_Ship.initialRow2 = currShip.initialRow2;
            temp_Ship.initialDirection = currShip.initialDirection;

            //movement properties
            temp_Ship.fullSailSpeed = currShip.fullSailSpeed;
            temp_Ship.fullSailSpeedArray = currShip.fullSailSpeedArray;
            temp_Ship.maxFullSailSpeed = currShip.maxFullSailSpeed;
            temp_Ship.initialFullSailSpeed = currShip.initialFullSailSpeed;
            temp_Ship.battleSailSpeed = currShip.battleSailSpeed;
            temp_Ship.battleSailSpeedArray = currShip.battleSailSpeedArray;
            temp_Ship.maxBattleSailSpeed = currShip.maxBattleSailSpeed;
            temp_Ship.initialBattleSailSpeed = currShip.initialBattleSailSpeed;

            //point of sailing (close reach, broad reach, etc.)
            temp_Ship.shipOrientation = currShip.shipOrientation;
            temp_Ship.movementAllowanceUsed = currShip.movementAllowanceUsed;
            temp_Ship.moveLog = currShip.moveLog;

            //turn properties
            temp_Ship.turnAllowanceBase = currShip.turnAllowanceBase;
            temp_Ship.turnAllowance = currShip.turnAllowance;

            //used in movement 
            temp_Ship.turnAllowed = currShip.turnAllowed;
            temp_Ship.moveAllowed = currShip.moveAllowed;

            //special conditions (anchored, grappled, etc.) can block movement/turning
            temp_Ship.canMove = currShip.canMove;
            temp_Ship.fouled = currShip.fouled;
            temp_Ship.anchored = currShip.anchored;
            temp_Ship.grappled = currShip.grappled;
            temp_Ship.onFire = currShip.onFire;

            //dismasted
            temp_Ship.dismasted = currShip.dismasted;
            temp_Ship.initialDismasted = currShip.initialDismasted;
            temp_Ship.dismastedPreviousValue = currShip.dismastedPreviousValue;

            //weapons status
            temp_Ship.loadedLeft = currShip.loadedLeft;
            temp_Ship.loadedRight = currShip.loadedRight;
            temp_Ship.shotType = currShip.shotType;

            //position
            temp_Ship.column = currShip.column;
            temp_Ship.row = currShip.row;
            //stern hex
            temp_Ship.column2 = currShip.column2;
            temp_Ship.row2 = currShip.row2;
            temp_Ship.direction = currShip.direction;

            //country
            temp_Ship.country = currShip.country;

            //class and rating
            temp_Ship.shipClassName = currShip.shipClassName;
            temp_Ship.shipClassNumber = currShip.shipClassNumber;
            temp_Ship.shipRate = currShip.shipRate;
            temp_Ship.originalGuns = currShip.originalGuns;

            //HACK need to find a better solution
            temp_Ship.combatBorderFixed = currShip.combatBorderFixed;

            //value will be frame label of the ship portrait we will use for this ship
            //these will be used by the info screens
            temp_Ship.portraitLabel = "";

            //      <--- begin select ship portrait for Info screens ---->

            //number of options per country + number of guns combo
            var portraitRandLimit:int = 1;

            //actual class that contains all of the ship portrait bitmaps
            var shipPortraitSource:Ship_Portrait = new Ship_Portrait;

            //pull list of all frame labels in shipPortraitSource
            var labelList:Array = shipPortraitSource.currentLabels;

            //iterate through list of frame labels to see if we have one that matches this ship's name
            for each (var frameObject:FrameLabel in labelList) {

                //we have a name match in our list of ship portraits, use specific bitmap for that individual ship
                if (frameObject.name == currShip.name) {

                    temp_Ship.portraitLabel = currShip.name;

                    //LOGGING
                    if (log_shipPortraitSelection) {

                        trace("==================================================");
                        trace("framObject.name: "+frameObject.name+" matched currShip.name: "+currShip.name);
                        trace("temp_Ship.portraitLabel set to: "+temp_Ship.portraitLabel);
                        trace("==================================================");
                        trace("");
                    }
                }
            }

            //we didn't find a name match, select a ship portrait from available options that match the ship country + number of guns it really carried
            //Trying to have 3-4 accurate options in each gun number + country combo
            if ("" == temp_Ship.portraitLabel) {

                //configure the number of options for each country + number of guns combo
                switch(currShip.country) {

                    case "US":

                        switch(currShip.originalGuns) {

                            case 44:
                                portraitRandLimit = 4;
                                break;
                            case 38:
                                portraitRandLimit = 4;
                                break;
                            case 36:
                                break;
                            case 32:
                                portraitRandLimit = 2;
                                break;
                            case 28:
                                portraitRandLimit = 2;
                                break;
                            case 16:
                                break;
                            case 12:
                                portraitRandLimit = 2;
                                break;
                        }

                        break;

                    case "GB":

                        switch(currShip.originalGuns) {

                            case 38:
                                portraitRandLimit = 4;
                                break;
                            case 36:
                                break;
                            case 32:
                                portraitRandLimit = 2;
                                break;
                            case 28:
                                portraitRandLimit = 3;
                                break;
                        }

                        break;  

                    case "FR":
                    case "ES":
                    case "NL":

                        break;
                }

                //now that we know how many options we have for this gun number + country combo, select one randomly
                var portraitNumber:int = Math.ceil(Math.random() * portraitRandLimit);

                //build the label name for us in the info screens, E.G., "GB_38_3", being the third portrait for 38 gun British ships
                temp_Ship.portraitLabel = currShip.country+"_"+currShip.originalGuns+"_"+portraitNumber;

                //LOGGING
                    if (log_shipPortraitSelection) {

                        trace("==================================================");
                        trace("There was no name match selecting a portrait, so building label name");
                        trace("currShip.name: "+currShip.name);
                        trace("portraitRandLimit: "+portraitRandLimit);
                        trace("portraitNumber: "+portraitNumber);
                        trace("temp_Ship.portraitLabel set to: "+temp_Ship.portraitLabel);
                        trace("==================================================");
                        trace("");
                    }
            }

            //      <--- end select ship portrait for Info screens ---->

            //used for movement rules, ship can only turn once per hex. 1 = straight, 2 = turn
            temp_Ship.lastMove = currShip.lastMove;

            //is ship fulll or battle sail
            temp_Ship.sailState = currShip.sailState;

            //designates which sdie ship is on
            temp_Ship.side1 = currShip.side1;
            temp_Ship.starboardHitZone = currShip.starboardHitZone;
            temp_Ship.portHitZone = currShip.portHitZone;
            temp_Ship.initialBroadside = currShip.initialBroadside;

            //ship going down
            temp_Ship.isSinking = currShip.isSinking;
            temp_Ship.isExploding = currShip.isExploding;

            //ship surrender
            temp_Ship.isSurrendered = currShip.isSurrendered;
            temp_Ship.strikeColors = currShip.strikeColors;
            temp_Ship.strikeFirePower = currShip.strikeFirePower;
            temp_Ship.strikeMobility = currShip.strikeMobility;

            //recast back to ship type. This seems risky but it works
            finalShip = temp_Ship as Ship_1;

            //calc initial positions based on column/row properties and a hex-based grid
            finalShip.x = (62 * (finalShip.column - 1)) + 17;

            //y setting is annoying
            finalShip.y = 5 + ((finalShip.row - 1) * 70) + ((finalShip.row - 1) * 1) - 71;

            //odd columns must compensate for half hexes
            if (1 == finalShip.column % 2) {
                finalShip.y += 35;
            }

            //rotate based on ship direction and correct for top left registration point
            switch (finalShip.direction) {

                case 1:
                    //do nothing
                    break;

                case 2:
                    finalShip.rotation = 60;
                    finalShip.x += 99;
                    finalShip.y += 27;
                    break;

                case 3:
                    finalShip.rotation = 120;
                    finalShip.x += 124;
                    finalShip.y += 129;
                    break;

                case 4:
                    finalShip.rotation = -180;
                    finalShip.x += 50;
                    finalShip.y += 202;
                    break;

                case 5:
                    finalShip.rotation = -120;
                    finalShip.x -= 51;
                    finalShip.y += 172;
                    break;

                case 6:
                    finalShip.rotation = -60;
                    finalShip.x -= 76;
                    finalShip.y += 72;
                    break;
            }

            //create ship graphics object. Numerous ship graphics representing all countries and all rates (1st-7th). There are multiple options in some country/rate cases
            var currShipGraphic:WSIM_Ship_Graphics = new WSIM_Ship_Graphics();

            //select correct background and ship graphics. Counter backgrounds are selected by ship country and ship rate sets the correct ship image to place on that background
            switch (finalShip.country) {

                //United States
                case "US":

                    //set US background
                    finalShip.gotoAndStop("US_def");

                    //Select correct ship overlay based on ship rating (1st-7th)
                    switch (finalShip.shipRate) {

                        //US had no ships of the line. Well there was America but she saw no action and was given to the French

                        //everything gets frigate for now
                        case 5:
                        case 6:
                        case 7:

                            currShipGraphic.gotoAndStop("US_5_1");
                            break;
                    }

                    break;

                //Great Britain
                case "GB":

                    //set GB background
                    finalShip.gotoAndStop("GB_def");

                    switch (finalShip.shipRate) {

                        case 1:

                            currShipGraphic.gotoAndStop("GB_1_1");
                            break;

                        case 2:

                            currShipGraphic.gotoAndStop("GB_2_1");
                            break;

                        case 3:

                            currShipGraphic.gotoAndStop("GB_3_1");
                            break;

                        case 4:

                            currShipGraphic.gotoAndStop("GB_4_1");
                            break;

                        //everything gets frigate for now
                        case 5:
                        case 6:
                        case 7:

                            currShipGraphic.gotoAndStop("GB_5_1");
                            break;
                    }

                    break;

                //France
                case "FR":

                    //set FR background
                    finalShip.gotoAndStop("FR_def");

                    switch (finalShip.shipRate) {

                        case 1:

                            currShipGraphic.gotoAndStop("FR_1_1");
                            break;

                        case 2:
                        case 3:

                            //we have multiple options for French 3rd rate SoL
                            var FR_shipGraphicRandom:int = Math.ceil(Math.random() * 2);

                            switch (FR_shipGraphicRandom) {

                                case 1:

                                    currShipGraphic.gotoAndStop("FR_3_1");
                                    break;

                                case 2:

                                    currShipGraphic.gotoAndStop("FR_3_2");
                                    break;
                            }

                            break;

                        case 4:

                            currShipGraphic.gotoAndStop("FR_4_1");
                            break;

                        //everything gets frigate
                        case 5:
                        case 6:
                        case 7:

                            currShipGraphic.gotoAndStop("FR_5_1");
                            break;
                    }

                    break;

                //Spain
                case "ES":

                    //set ES background
                    finalShip.gotoAndStop("ES_def");

                    switch (finalShip.shipRate) {

                        case 1:

                            currShipGraphic.gotoAndStop("ES_1_1");
                            break;

                        case 2:
                        case 3:
                        case 4:

                            currShipGraphic.gotoAndStop("ES_3_1");
                            break;

                        //everything gets frigate
                        case 5:
                        case 6:
                        case 7:

                            currShipGraphic.gotoAndStop("ES_5_1");
                            break;
                    }

                    break;

                //Netherlands
                case "NL":

                    //set NL background
                    finalShip.gotoAndStop("NL_def");

                    switch (finalShip.shipRate) {

                        case 1:
                        case 2:
                        case 3:
                        case 4:

                            currShipGraphic.gotoAndStop("NL_3_1");
                            break;

                        //everything gets frigate
                        case 5:
                        case 6:
                        case 7:

                            currShipGraphic.gotoAndStop("NL_5_1");
                            break;
                    }

                    break;
            }

            currShipGraphic.x = 0;
            currShipGraphic.y = 0;
            currShipGraphic.name = "currShipGraphic";

            //add correct ship graphic to the counter background
            finalShip.addChild(currShipGraphic);

            //font and format for counter text fields
            var arialFont = new Arial();
            var lucidaFont = new Lucida_Cal();

            var textShipNameFormat: TextFormat = new TextFormat();
            textShipNameFormat.size = 11;
            textShipNameFormat.font = lucidaFont.fontName;

            //ship name text field
            var textShipName: TextField = new TextField();
            textShipName.defaultTextFormat = textShipNameFormat;

            textShipName.name = "textShipName";
            textShipName.width = 80;
            textShipName.height = 13;
            textShipName.x = 34;
            textShipName.y = 105;
            textShipName.embedFonts = true;
            textShipName.textColor = 0xFFFFFF;
            textShipName.rotation -= 90;
            textShipName.sharpness = 200;
            textShipName.htmlText = "<p align='center'>" + finalShip.name + "</p>";

            //font format for movement and turn allowance
            var textShipNumbersFormat: TextFormat = new TextFormat();
            textShipNumbersFormat.size = 12;
            textShipNumbersFormat.font = arialFont.fontName;

            //ship turn allowance
            var textShipTurnAllowance: TextField = new TextField();
            textShipTurnAllowance.defaultTextFormat = textShipNumbersFormat;

            textShipTurnAllowance.name = "textShipTurnAllowance";
            textShipTurnAllowance.width = 20;
            textShipTurnAllowance.height = 13;
            textShipTurnAllowance.x = 33;
            textShipTurnAllowance.y = 127;
            textShipTurnAllowance.embedFonts = true;
            textShipTurnAllowance.textColor = 0xFFFFFF;
            textShipTurnAllowance.rotation -= 90;
            textShipTurnAllowance.text = finalShip.turnAllowance;

            //ship movement allowance AS DISPLAYED ON THE COUNTER - display either battle sails speed or full sails speed depending on ship state
            var textShipSailSpeed: TextField = new TextField();
            textShipSailSpeed.defaultTextFormat = textShipNumbersFormat;

            textShipSailSpeed.name = "textShipSailSpeed";
            textShipSailSpeed.width = 20;
            textShipSailSpeed.height = 13;
            textShipSailSpeed.x = 33;
            textShipSailSpeed.y = 14;
            textShipSailSpeed.embedFonts = true;
            textShipSailSpeed.textColor = 0xFFFFFF;
            textShipSailSpeed.rotation -= 90;

            //full sails set
            if ("full" == finalShip.sailState) {

                textShipSailSpeed.text = finalShip.fullSailSpeed;
            }

            //battle sails set, which are reduced sails to improve visibility and reduce sail damage in combat
            else {

                textShipSailSpeed.text = finalShip.battleSailSpeed;
            }

            // textShipBattleSailSpeed and textShipFullSailSpeed no longer used on counters, but still used in Info screens
            var textShipBattleSailSpeed: TextField = new TextField();
            textShipBattleSailSpeed.name = "textShipBattleSailSpeed";
            textShipBattleSailSpeed.text = finalShip.battleSailSpeed;
            textShipBattleSailSpeed.visible = false;

            var textShipFullSailSpeed: TextField = new TextField();
            textShipFullSailSpeed.name = "textShipFullSailSpeed";
            textShipFullSailSpeed.text = finalShip.fullSailSpeed;
            textShipFullSailSpeed.visible = false;

            //create sailState (battle/full) indicator
            var sailStateIndicator: WSIM_Counters_SailtState_Indicator = new WSIM_Counters_SailtState_Indicator();

            //set indicator to correct sailState background graphic
            sailStateIndicator.gotoAndStop("battle");

            if ("full" == finalShip.sailState) {

                sailStateIndicator.gotoAndStop("full");
            }

            sailStateIndicator.name = "sailStateIndicator";
            finalShip.addChild(sailStateIndicator);

            //add ship and attach text fields
            gridBG1.addChild(finalShip);
            finalShip.addChild(textShipName);
            finalShip.addChild(textShipSailSpeed);
            finalShip.addChild(textShipTurnAllowance);
            finalShip.addChild(textShipBattleSailSpeed);
            finalShip.addChild(textShipFullSailSpeed);
            finalShip.parent.setChildIndex(finalShip, 1);

            //logging
            if (log_shipCreation) {

                trace(finalShip.name + " added added as child of background in createShip()");
            }

            //create background sprite "ship is selected" border
            var border: Sprite = new Sprite();
            border.name = "shipBorder";
            border.graphics.beginFill(0xFFCC00, 1);
            border.graphics.drawRect(-1, -1, 52, 132)
            border.graphics.endFill();
            border.visible = false;

            //create background sprite combat border
            var borderCombat: Sprite = new Sprite();
            borderCombat.name = "borderCombat";

            //Great Britain ships are bright red, need to make combat border white
            if ("GB" == finalShip.country) {

                borderCombat.graphics.beginFill(0xFFFFFF, 1);
            }

            else {

                borderCombat.graphics.beginFill(0xFF0000, 1);
            }

            borderCombat.graphics.drawRect(-1, -1, 52, 132)
            borderCombat.graphics.endFill();
            borderCombat.visible = false;

            //add the borders as children of ship
            finalShip.addChild(border);
            finalShip.addChild(borderCombat);

            //move the borders in z-order to behind ship counter, so they show looking like a border
            border.parent.setChildIndex(border, border.parent.getChildIndex(border) - 5);
            borderCombat.parent.setChildIndex(borderCombat, borderCombat.parent.getChildIndex(borderCombat) - 6);

            //PUSH TO MASTER SHIP ARRAYS
            //finalShip is Side 1, add to master list of ship objects for Side 1
            if (sideList[0] == finalShip.country) {

                shipListSide1.push(finalShip);

                //logging
                if (log_shipCreation) {

                    trace(finalShip.name + " added to Shiplist1 in createShip()");
                }

            } 

            //Side 2, add to master list of ship objects for Side 2
            else {

                shipListSide2.push(finalShip);

                //logging
                if (log_shipCreation) {

                    trace(finalShip.name + " added to Shiplist2 in createShip()");
                }
            }

            //disable events on all children
            finalShip.mouseChildren = false;

            //ship selection event handler
            finalShip.addEventListener(MouseEvent.CLICK, selectShip);
        }
vossiewulf
  • 53
  • 6
  • I edited my answer with a new suggestion. I have no idea if it will resolve this new issue, but it's worth a shot. – Neal Davis Jun 10 '16 at 23:56