1. We have added the ability to collapse/expand forum categories and widgets on forum home.
    Dismiss Notice
  2. All Civ avatars are brought back and available for selection in the Avatar Gallery! There are 945 avatars total.
    Dismiss Notice
  3. To make the site more secure, we have installed SSL certificates and enabled HTTPS for both the main site and forums.
    Dismiss Notice
  4. Civ6 is released! Order now! (Amazon US | Amazon UK | Amazon CA | Amazon DE | Amazon FR)
    Dismiss Notice
  5. Dismiss Notice
  6. Forum account upgrades are available for ad-free browsing.
    Dismiss Notice

[Map Script] SpiralGalaxy.py for Final Frontier

Discussion in 'Civ4 - Map Scripts' started by cephalo, Feb 12, 2008.

  1. God-Emperor

    God-Emperor Chieftain

    Joined:
    Jul 18, 2009
    Messages:
    3,551
    Location:
    Texas
    I think you need to reconsider the meanings of the "if" statements inside your loops.

    I haven't looked at the scrip to see what the GetIndex function is doing, but I have to assume it is basically the equivalent of "mmap.plotNum(xx,yy)". If so, then what the "if" statement immediately after it doing is making the function return false if you ware within 25% of the map width or height of an edge.

    I assume the function is used to allow the placement of a wormhole. If so, then that first "if" makes it impossible for you to place one within a very wide border around the edge of the map.

    The second "if" condition is insisting that every single plot in the very wide area must have the same feature on it. I seriously doubt that you will find any region measuring half the side of the map in both directions where every single plot has the same feature. Thus it will effectively always return false. If the thing calling this loops until it returns true, then this would make it an infinite loop.

    My suggestions, based on some assumptions about what you really want:

    In the first "if" make it a "continue" instead of a "return False" so that the loops will keep looping, just skipping the rest of the statements in the loop when the plot is off the map (if that's what i = -1 means)

    For the second "if" it is less clear what you want. I am guessing that what you really want is to find out if there is already some feature (a wormhole, I expect) in the area. In that case, change the condition from "!=" to "==", so that you will bail out if you find the feature instead of bailing out if you don't find the feature.
     
  2. TC01

    TC01 Chieftain

    Joined:
    Jun 28, 2009
    Messages:
    2,216
    Location:
    Irregularly Online
    There are actually three if statements there, though.

    For the first one (the wide radius around the edge of the map), I'll delete that one. I changed the values of xStart, xEnd, yStart, and yEnd from the original checkForRoom function and didn't look to see where else they were used. So I'll just get rid of this part.

    For the second one (what you later say the first one), I'll change it to a continue.

    For the third one (the second one, as you say), you are correct in what I want... again, I based it off of the original function, where it is a "!=", but it's a "no feature", rather than a specific feature. I'll change it to a "=="



    Just tested it, it worked fine. Thanks God-Emperor!
     
  3. God-Emperor

    God-Emperor Chieftain

    Joined:
    Jul 18, 2009
    Messages:
    3,551
    Location:
    Texas
    Oops. Bad editing - I left out the line that was supposed to say something like "The first one may be OK but the next two are probably wrong", with my later numbering refering to the two that were wrong. Fortunately you figured out what I meant.

    Way back in highschool I had a math teacher who said that when at the blackboard she would write A, say B, think C, but really mean D. I am, fortunately, usually a step or two closer to what I really mean than that.

    You're welcome.
     
  4. Daryl95

    Daryl95 Templar

    Joined:
    Nov 9, 2008
    Messages:
    271
    Location:
    America
    How can I add new features to this map and change the features used for spiral arms and the center of the galaxy. I have made new features but when I try to add them to this map it disappears from the map script selection screen. I even tried adding them to the original FinalFrontier.py but then the game crashed. I just copied and pasted code and changed the feature names.
     
  5. TC01

    TC01 Chieftain

    Joined:
    Jun 28, 2009
    Messages:
    2,216
    Location:
    Irregularly Online
    I was able to add features (see the discussion above).

    In your XML, are the features added to the top or bottom of the file? There are apparently problems if you add to the top. (I used a module so it worked fine).
     
  6. Daryl95

    Daryl95 Templar

    Joined:
    Nov 9, 2008
    Messages:
    271
    Location:
    America
    They are at the bottom. I added the Quasar then I loaded the game and it didn't show up. Then I added the Spiral Arm and the mapscript wouldn't show up. It's possible this is from me adding to the FinalFrontier.py but I think it was this one. I know I was having problems with this particular one though.
     
  7. TC01

    TC01 Chieftain

    Joined:
    Jun 28, 2009
    Messages:
    2,216
    Location:
    Irregularly Online
    First, do you have python exceptions on?

    The process to add a feature to this mapscript is quite complicated. Here's how I did it for WormholesSpiralGalaxy (and for the generic supernova when I did more complicated stuff)

    1. Define how many of your feature to be placed per plot. I only wanted two on the entire map, so I don't have a value for this (so it's just the supernova). Put it at the top of the file:

    Code:
    SupernovasPerPlot = 0.00042
    2. Add a "ft = featureDef" statement under def initFeatureDefList. These values control, well, I'm not quite sure for some. armDistance controls how far it is from each arm, that I know. You can compare the Solar System and the Black Hole FeatureDefs if you want...

    Code:
            ft = FeatureDef(self.featureWormhole)
            ft.arcLength = 0.5
            ft.arcLengthRange = 0.7
            ft.arcLengthMaxChance = 1.0
            ft.armDistance = 0.2
            ft.armDistanceRange = 0.3
            ft.armDistanceMaxChance = 0.5
            self.featureDefList.append(ft)
    3. Declare your feature in the beginning of def generateFeatures.

    Code:
            self.featureWormhole = gc.getInfoTypeForString("FEATURE_WORMHOLE")
    4. Define how many times you want your feature to appear on the map. For WormholesSpiralGalaxy, I only wanted two, so this is the Supernova line:

    Code:
            numSupernovas = int(float(numPlots) * SupernovasPerPlot)
    5. Again, this is the supernova, since I did different stuff. But this is the actual code to find the plot the feature should be placed. Same function as the two above.

    Code:
            #Supernovas
            numPlaced = 0
            iterations = 0
            while(True):
                iterations += 1
                if iterations > 20:
                    print "Not all supernovas could be placed!!!!!!!!!!!!!!"
                    break
                if numPlaced == numSupernovas:
                    break
                for n in range(len(plotList)):
                    x,y = plotList[n]
                    if self.shouldPlaceFeature(x,y,self.featureSupernova) and self.checkForRoom(x,y,self.featureSupernova):
                        numPlaced += 1
                        self.placeSupernova(x,y)
                        if numPlaced == numSupernovas:
                            break
            print "Placed %(p)d out of %(n)d supernovas" % {"p":numPlaced,"n":numSupernovas}
    6. Then, there's the function to actually place the feature (called from the function above. It should be idented under the def generateFeatures function. The "placeholder" is whatever feature you want to surround the feature. Here is the wormhole one again:

    Code:
        def placeWormhole(self, x, y):
            gc = CyGlobalContext()
            mmap = gc.getMap()
            xStart = x - 2
            xEnd = x + 3
            yStart = y - 2
            yEnd = y + 3
            for yy in range(yStart,yEnd):
                for xx in range(xStart,xEnd):
                    if (yy == yStart or yy == yEnd - 1) and (xx == xStart or xx == xEnd - 1):
                        continue #skipping corners
                    plot = mmap.plot(xx,yy)
                    if x == xx and y == yy:
                        plot.setFeatureType(self.featureWormhole,0)
                    else:
                        plot.setFeatureType(self.featurePlaceHolder,0)
     
  8. Challs

    Challs Chieftain

    Joined:
    Apr 11, 2010
    Messages:
    106
    Location:
    Denmark
    Looks nice in the picture. I just hope i does the same in game :)
     
  9. God-Emperor

    God-Emperor Chieftain

    Joined:
    Jul 18, 2009
    Messages:
    3,551
    Location:
    Texas
    It works well.

    They are a bit larger (in total number of plots) than the regular Final Frontier map of the same size category but there are typically more unusable plots so it works out to a similar number of star systems (it might be slightly more). Exploration is a little harder and maintenance is a little higher due to things being a little more spread out.
     
  10. PsiCorps

    PsiCorps FF: Babylon 5 mod team

    Joined:
    Dec 30, 2007
    Messages:
    1,411
    Location:
    Britain
    I realize that this may well be classed as a dead thread but I have a question about Final Frontier map features.

    Is it possible to have the 2nd and 3rd radii effects of the black hole set as an invisible effect?

    What I am thinking is this. A scout ship goes out into space and is opening up the depths of space for your civ... unfortunately it is caught in a gravity field it was unable to detect due to the quality of it's equipment. The ship is lost and the Civ only has a rough idea of where they lost contact with their vessel.. The area of space becomes a no go zone until such time as they develop equipment that enables them to identify exactly where the event horizon of the black hole is and thus revealing the entirety of the Black Hole.

    If it's possible to hide the central and outer regions of the black hole until a tech is researched I'd really like to know.
     

Share This Page