Arcen Games

Games => Starward Rogue => Starward Rogue Mods & Modding => Topic started by: ptarth on January 11, 2016, 06:13:19 PM

Title: XML questions and answers
Post by: ptarth on January 11, 2016, 06:13:19 PM
Repurposing this thread to be more useful as a Q&A XML thread.

My original Questions (and answers).



Back before Christmas I wrote out some rooms and enemies, which were slightly flawed at the time.

Flaws Included
Title: Re: Update on [.80X] xml changes?
Post by: ptarth on January 11, 2016, 10:07:30 PM
And while I'm at it, I'll do some complaining off topic, having the Room definitions not be in the Configuration folder drives me nuts.
Title: Re: Update on [.80X] xml changes?
Post by: Pepisolo on January 11, 2016, 10:19:22 PM
Back before Christmas I wrote out some rooms and enemies, which were slightly flawed at the time.

Flaws Included
  • Need different room sizes
  • Need different movement patterns
  • ability to change tile under enemy spawn

Is the xml documentation on the wiki up to date? I'd like to see if I could fix some of the issues I was having before shipping it off to Chris to reduce Arcen workload. Cheers.

The wiki is up to date, I'm pretty sure. Regarding room sizes, I haven't done a lot in this area, but you can't choose your own room size, I don't think, but you can choose from the variety of room sizes already available in the editor. As for movement patterns, do you mean enemy or shot movement patterns? You can do all kinds of crazy movements for shots, not so much for enemies (although one big improvement in this area is due). Not sure about your last, issue.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 11, 2016, 11:18:21 PM
Q: I'm trying to create an enemy ship that has to slow down to change corners in nonmomentum mode, a psuedo-inertia style effect. Right now acceleration allows for the increase of current speed up to maximum speed, but then the enemy ship never slows down. That's not quite the effect I was looking for. Ideas?
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 12, 2016, 01:18:00 AM
Q: The wiki example of a ship: https://www.arcengames.com/mediawiki/index.php?title=Starward_Rogue:XML_-_GameEntity_Definitions contains turning_resistance="2.25" has this been deprecated?
A: Yes.
Title: Re: [.80X] xml questions and answers
Post by: Pepisolo on January 12, 2016, 04:23:02 AM
Q: The wiki example of a ship: https://www.arcengames.com/mediawiki/index.php?title=Starward_Rogue:XML_-_GameEntity_Definitions contains turning_resistance="2.25" has this been deprecated?

I'm not 100% sure. There's all kind of things in the engine, I think that may be left over from TLF. Turning resistance is not currently used, though, as far as I'm aware. Probably deprecated, but Chris or Keith should be able to give you a more authoritative answer.
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 12, 2016, 06:28:29 AM
Yep, there's a bunch of stuff that's left over from TLF.  Some things were changed to fit this game, but some were not and remain basically useless.

As enemies go, I've never seen one be affected by momentum and such.  I dont know that their AI in this game supports that anyway.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 12, 2016, 12:10:39 PM
I think turning_resistance was deprecated after that wiki article was started, yea. We do need to clean that up

The best source of examples right now is probably just the existing enemies in the game files, etc.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 14, 2016, 07:04:46 PM
Q: How does the PeriodicMovementMode coding work? I've tried several things, but it can't get it to do anything. No current enemies use it, so it might be nonfunctional at this juncture.
Title: Re: [.80X] xml questions and answers
Post by: Pepisolo on January 14, 2016, 09:34:50 PM
Q: How does the PeriodicMovementMode coding work? I've tried several things, but it can't get it to do anything. No current enemies use it, so it might be nonfunctional at this juncture.

Here's the example, somewhere in the wiki in the modifiers section.

<entity name="SmallEnemy"
   category="Ship"
   display_name="Small Test Enemy"
   behavior="Attacker"
   speed="100"
   max_health="100"
>
   <system type="TestWeapon" offset="20,10" />
   <hitbox radius="32" />
   <periodic_movement_mode type="Reposition" related_point="10,5">
      <modifier type="MovementSpeed" math="Set" magnitude="1000" />
   </periodic_movement_mode>
</entity>

You also need to set a periodic_movement_mode_interval_min and periodic_movement_mode_interval_max. Last I checked it seemed to sort of work, although there aren't many behaviours currently.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 03:27:12 PM
Mostly got it working based upon Pepisolo's entry.

First, updated "fully" functional code:

<entity name="bob" category="Ship" ship_category="Wander_3x3"
   display_name="Small Test Enemy"
   behavior="Attacker"
   speed="100"
   max_health="100"
      periodic_movement_mode_interval_min="0"
   periodic_movement_mode_interval_max="5"
             image_folder="Familiars"
        image_name="Ram"
>
   <hitbox radius="32" />
   <periodic_movement_mode type="Reposition" related_point="10,10">
      <modifier type="MovementSpeed" math="Set" magnitude="1000" />
   </periodic_movement_mode>
</entity>


However, one Reposition has started, it cannot end and generates a fatal error.

FixedUpdate: System.NullReferenceException: Object reference not set to an instance of an object
  at GameEntity.ClearPeriodicMovementMode () [0x00000] in <filename unknown>:0
  at Flock.ReevaluateAIOrders () [0x00000] in <filename unknown>:0
  at CombatEncounter.<DoCombatStep>b__16 (.Flock flock) [0x00000] in <filename unknown>:0
  at CombatSide.DoForFlocks (.ProcessorDelegate Processor) [0x00000] in <filename unknown>:0
  at CombatSide+<>c__DisplayClass4.<DoForFlocksThatAreHostileToMe>b__3 (.CombatSide side) [0x00000] in <filename unknown>:0
  at CombatEncounter.DoForSides (.ProcessorDelegate Processor) [0x00000] in <filename unknown>:0
  at CombatSide.DoForFlocksThatAreHostileToMe (.ProcessorDelegate Processor) [0x00000] in <filename unknown>:0
  at CombatEncounter.DoCombatStep (Single EffectiveDeltaTime) [0x00000] in <filename unknown>:0
  at World.DoWorldStepLogic (Single effectiveDeltaTime, Boolean IsFirstLoop) [0x00000] in <filename unknown>:0
  at World.ProcessSimStepOnPrimaryMachineOnly (Int32 SimLoopNumber) [0x00000] in <filename unknown>:0
  at Game.ProcessSimStep () [0x00000] in <filename unknown>:0
  at ArcenMainCameraImplementations.MainUpdateLogic () [0x00000] in <filename unknown>:0
Stack Trace:   at GameEntity.ClearPeriodicMovementMode () [0x00000] in <filename unknown>:0
  at Flock.ReevaluateAIOrders () [0x00000] in <filename unknown>:0
  at CombatEncounter.<DoCombatStep>b__16 (.Flock flock) [0x00000] in <filename unknown>:0
  at CombatSide.DoForFlocks (.ProcessorDelegate Processor) [0x00000] in <filename unknown>:0
  at CombatSide+<>c__DisplayClass4.<DoForFlocksThatAreHostileToMe>b__3 (.CombatSide side) [0x00000] in <filename unknown>:0
  at CombatEncounter.DoForSides (.ProcessorDelegate Processor) [0x00000] in <filename unknown>:0
  at CombatSide.DoForFlocksThatAreHostileToMe (.ProcessorDelegate Processor) [0x00000] in <filename unknown>:0
  at CombatEncounter.DoCombatStep (Single EffectiveDeltaTime) [0x00000] in <filename unknown>:0
  at World.DoWorldStepLogic (Single effectiveDeltaTime, Boolean IsFirstLoop) [0x00000] in <filename unknown>:0
  at World.ProcessSimStepOnPrimaryMachineOnly (Int32 SimLoopNumber) [0x00000] in <filename unknown>:0
  at Game.ProcessSimStep () [0x00000] in <filename unknown>:0
  at ArcenMainCameraImplementations.MainUpdateLogic () [0x00000] in <filename unknown>:0


   at System.Environment.get_StackTrace()
   at ArcenDebugging.ArcenDebugLog(System.String Message, DebugLogDestination Destination, Boolean IncludeStackTrace, Verbosity Verbosity)
   at ArcenDebugging.ArcenDebugLog(System.String Message, DebugLogDestination Destination, Verbosity Verbosity)
   at ArcenDebugging.ArcenDebugLog(System.String Message, Verbosity Verbosity)
   at EngineConfig.WriteToErrorFile(System.String ErrorFile, System.String ErrorName, System.String ErrorText, Boolean SuppressArcenDebugLog)
   at EngineConfig.WriteToErrorFile(System.String ErrorFile, System.String ErrorName, System.String ErrorText)
   at MainCameraLogic.LogWritten(System.String LogString, System.String StackTrace, LogType Type, System.Exception Cause, Boolean CameFromUnity)
   at MainCameraLogic.LogWritten(System.String LogString, System.String StackTrace, LogType Type, System.Exception Cause)
   at ArcenMainCameraImplementations.Log(System.String LogString, System.String StackTrace, LogType Type, System.Exception Cause)
   at ArcenMainCameraImplementations.MainUpdateLogic()
   at MainCameraLogic.Update()


I'm not sure if it affects only Reposition or all other Periodic Movement types. As it stands it is unuseable.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 15, 2016, 03:28:29 PM
Thanks for the stack trace; I've fixed the bug in my working copy.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 03:41:56 PM
And it happens with ShadowDash....
...And Keith fixed it before I could complete my bug testing in a systematic way.

Arg. You guys keep doing this wrong. This is how this is supposed to work.


Disregarding the process is very nontraditional.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 15, 2016, 03:44:11 PM
We all have our failings, sadly.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 05:18:56 PM
Q: Why can't I use a loop within a BulletPattern?
A: Loop is defined to work within a Bullet, so you have to create a bullet first, then you can have a loop and within it a Bullet pattern.

This would work:
   <bullet_pattern name="ExamplePattern">
     <bullet angle="0" speed="0">
      <loop iterations="5">
      <spawn>
                <bullet_pattern>
      $FlagShot SPEED=260 ANGLE=0 SHOT=WingsRed
      </bullet_pattern>
      </spawn>
      </loop>
      </bullet>
   </bullet_pattern>
   

This does not work:
   <bullet_pattern name="ExamplePatternNotWork">
      <loop iterations="5">
      $FlagShot SPEED=260 ANGLE=0 SHOT=WingsRed
      </loop>
   </bullet_pattern>
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 15, 2016, 05:22:04 PM
And it happens with ShadowDash....
...And Keith fixed it before I could complete my bug testing in a systematic way.

Arg. You guys keep doing this wrong. This is how this is supposed to work.

  • I spend 2 hours testing each of the PeriodicMovement modes.
  • I spend 15 minutes to write up the error and submit it to mantis.
  • It sits on mantis for a few weeks to months.
  • You reject the bug on the grounds of nonreproducibility.
  • I repeat the first 4 steps.
  • You announce you are switching to a new engine.
  • I repeat the first 4 steps again.
  • You fix it.

Disregarding the process is very nontraditional.


You forgot step 9:   Break something else during the fix.  Sometimes 2 things.


And the blasted "modify" button needs to be located.... anywhere other than where it is.   

Q: Why can't I use a loop within a BulletPattern?
A: Loop is defined to work within a Bullet, so you have to create a bullet first, then you can have a loop and within it a Bullet pattern.

This would work:
   <bullet_pattern name="ExamplePattern">
     <bullet angle="0" speed="0">
      <loop iterations="5">
      <spawn>
                <bullet_pattern>
      $FlagShot SPEED=260 ANGLE=0 SHOT=WingsRed
      </bullet_pattern>
      </spawn>
      </loop>
      </bullet>
   </bullet_pattern>
   

This does not work:
   <bullet_pattern name="ExamplePatternNotWork">
      <loop iterations="5">
      $FlagShot SPEED=260 ANGLE=0 SHOT=WingsRed
      </loop>
   </bullet_pattern>

This bit always confused me too.  Looping outside of the bullets would help in some situations.  Like with the Battleswarm bosses and it's 20 lines or so of the same thing because trying to stick it all into the var file confused me and broke a buncha things.  I love when that happens, that's my favorite part.  Usually it's a typo that does it.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 05:45:38 PM
I just spent longer than I care to think about because this:
                ...
      <wait time="0.03" />
      </bullet_pattern>
      </spawn>

crashes, but this
                ...
      </bullet_pattern>
      </spawn>
      <wait time="0.03" />

works just fine.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 15, 2016, 05:54:23 PM
Our parser just ignores anything it doesn't understand.

The XML parser that actually reads in the file takes a very different view.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 05:59:22 PM
Can you declare a variable as a variable?
I.e., something like:
     SHOT1= WidowShotRed
followed by
     SHOT = "[SHOT1]"
in another <var>?
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 15, 2016, 06:03:58 PM
Can you declare a variable as a variable?
I.e., something like:
     SHOT1= WidowShotRed
followed by
     SHOT = "[SHOT1]"
in another <var>?
Give it a try ;)

Recursive templates are supported, though it's only going to try to resolve $(variable name) references; the [SHOT1] or whatever will just be kept verbatim in the search and replace process. So I don't know if it does what you want, off hand.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 06:18:30 PM
That's what I've been trying to get to work. I wasn't sure if it is my syntax or something else that is bugging out. The conflicting XML readers got me again for a good while earlier. When I have good code and then make a change that creates bad code and reload the xml, if it is bad in the right way, it doesn't load, but it also doesn't throw an error message. It just happily uses the preloaded code, which I happen to overlook/forget every single time...

So, I had to take a break from it. Which then lead me to the patch notes, which states:
The Very Easy and Easy difficulty levels slow down all enemy movement and shot patterns -- the patterns and whatnot stay coherent, as everything is slowed down as if time were moving in slow-motion (relative to the frantic pace of the higher difficulties, anyway; it's still plenty snappy).
This doesn't affect your own shots or movements at all. It simply gives you more time to react to enemies.
On normal mode, things are actually slowed down a bit compared to before, too. Not so much, just a bit.

This got me thinking about making a bullet time (a la The Matrix or any number of FPS games) energy system. Which lead me to reading the existing energy systems....

and now I'm back to trying to make a weapon system that shoots flags.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 06:22:33 PM
And then if I exit out and restart SR, then everything works just fine.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 15, 2016, 06:27:23 PM
And then if I exit out and restart SR, then everything works just fine.
Standard Microsoft Engineering.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 06:42:25 PM
Working Example of how to redefine a variable as a variable:

BulletPatterns.xml
Code: [Select]
<bullet_pattern name="FlagUS2Pattern">
$FlagShot88 SPEED=260 ANGLE=0 SHOT1=WingsBlue SHOT2=WingsRed SPOSY=-50
</bullet_pattern>
Bullet_vars.xml
Code: [Select]
        <var name="FlagShot">
               <bullet angle="[ANGLE]" speed="[SPEED]" shot_type="[SHOT]" spawn_offset ="[SPOSX],[SPOSY]">
        </var>

<var name="FlagShot88">
$FlagShot SHOT=[SHOT1] SPOSX=0
$FlagShot SHOT=[SHOT2] SPOSX=10
        </var>
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 15, 2016, 06:59:11 PM
and now I'm back to trying to make a weapon system that shoots flags.

What, like.... shoots actual flags, like the kind that go on poles and wave around?  Or am I just being dense?

Sounds like something I'd come up with.  Hell, the original idea for Labryinth, and the reason it has that name, was because the plan was "it shoots an entire maze at you".  The logistics of that, though, were just a BIT of a headache (though it occurs to me it'd be MUCH easier now), and then I remembered the Obscura Disc, which ended that idea.  Dont need another failed mad science experiment trying to kill you.



I just spent longer than I care to think about because this:
                ...
      <wait time="0.03" />
      </bullet_pattern>
      </spawn>

crashes, but this
                ...
      </bullet_pattern>
      </spawn>
      <wait time="0.03" />

works just fine.


aaaaaaaarrrrgh

Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 07:28:59 PM

What, like.... shoots actual flags, like the kind that go on poles and wave around?  Or am I just being dense?


Nope. That's exactly what I mean.

Now I have to decide if it is too frivolous to submit and how to use it amusingly.
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 15, 2016, 07:33:48 PM
I.... just.... what.  How in the....

It looks like there was probably.... math.... involved.  Alot of it. 

I'm just going to stick to making horrible spinning deathnados, I think.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 15, 2016, 07:35:05 PM
I went to a SHMUP and a soccer game broke out.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 07:51:06 PM
There is no math involved and it is dwarfed by the stuff you've been writing. It really is relatively quite simple. Mind you, I haven't done any of the trickier flags besides the USA (because I'm a nationalist). I've attached all the files you need to generate a test room with the shot in use. The room is a QuadEE room, so you'll need to drop the room definition in there.
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 15, 2016, 08:39:54 PM
Is there a system file somewhere?  It complains about that.

Though just looking at the pattern/var files, I can see how this works.  Very, very interesting.

How you managed to think that up, I dont even know. I am impressed! Woulda just ended up as a pile of flaming space bees or something if I'd tried to do it.  Something like that is only dwarfed by something of mine because anything of mine is hideously inefficient.  I just jam things together in no particular order and hit them with a virtual wrench or something until they function in some fashion.

And looking around in those files.... Rocket Frog, really?

Clearly, the game requires this addition.

What other crazy stuff might you have?
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 15, 2016, 09:00:05 PM
Oy. Sorry about not including the system file. I fixed the download in my previous post, so it now has all the files.

The story of how I came up with it is.. well odd I guess. It started with:

I should make levels that are references back to old video game references, with the first 2 being Pacman and Space Invaders. While I was working on trying to find reasonable and interesting shots for the enemies in the Space Invaders level, I ran into them firing a grid of shots, that were virtually pixels in an image. This then sent me down the route of trying to create pixel art using rooms and shots. The Brain room is an example of that, wherein I did an axial brain view and used it as the floor diagram for the room. Then I started exploring cave art as it would be neat to have mysterious rooms that tugged on unconscious/subliminal memories in player's heads. However, the largest regular rooms are only around 30x30, which doesn't give you much room to work with. That then resulted in me looking around to see what recognizable images you could have at sizes less than 20x20, which lead to flags (11x16 or 11x13 depending on the icon set).

The rocket frog was actually spawned by your conversation with Keith and since no one else wanted to make one, I decided I should give it a shot. That lead to more adventures with Periodic_Movement_Mode. After that I was trying to figure out how to make a frog-related shot, which lead me to thinking about circling flies being shot by the frog. Which lead me to taking the flags and causing them to rotate. And that leads us up to now.

So yeah, it is a strange place over here.
I've attached some screenshots of "fun".
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 18, 2016, 05:50:35 PM
So now with the closing deadline, I'm going to start asking more pointed questions and posting code if anyone wants some half-baked ideas. Plus ZHA putting out 9 variants made me realize I was a huge slacker and i should submit something for all the time I've spent on this.

Name: Healing or Shielding Bot
Concept: An enemy ship that makes nearby enemies stronger, either by healing them or giving them shields.
Progress: Doesn't seem to work. No entities seem to gain health or shields as I tried various variants.
Code: [Select]
Code:
    <system name="ShieldAddSystem"
category="DirectUseSystem"
     shot_type="Invisible"
     damage_type="Ballistic"
     attack_power="1" fire_rate="2"
     range_actual="500"  cue_time="0"
     shots_per_salvo="1"
     targeting_logic="Dumbfire" firing_timing="AllTheTime"
     image_name="Invisible"
     initial_firing_delay="0"
distance_threshold_modifiers_applied_to_nearby_entities="500"
modifiers_applied_to_nearby_entities_can_target_allies="true"
modifiers_applied_to_nearby_entities_can_target_enemies="true"
     >
<modifier target="NearbyEntities" type="MaxHealth" math="add" magnitude="50" timing="OnUse_ParentEntity"/>
  </system>

Name: PeriodicMovementMode Ships
Concept: Using movement to make interesting enemies.
Progress: Keith fixed the exit PeriodicMovementMode problem, but the modes still seem buggy. ShadowDash ships tend to stay phased out. Reposition requires a fixed movement point to relocate to, which is bad for random enemy rooms.

Code: [Select]
<entity name="bob" category="Ship" ship_category="Wander_3x3"
   display_name="bob"
   behavior="Attacker"
   speed="100"
   max_health="100"
    periodic_movement_mode_interval_min="2"
periodic_movement_mode_interval_max="5"
image_folder="Enemy_Pursuers"
image_name="ChargerWhite"
>
   <hitbox radius="26" />
   <periodic_movement_mode type="ShadowDash" chance_to_target_player="50" shockwave_radius ="50">
      <modifier type="MovementSpeed" math="Set" magnitude="1000" />
   </periodic_movement_mode>
    <periodic_movement_mode type="Reposition" related_point="5,5">
<modifier type="MovementSpeed" math="Set" magnitude="1000" />
</periodic_movement_mode>
</entity>

Name:Flag Shots
Concept: Shoot pixel art based flags at the player.
Progress: It works completely. However, more than 3 flags on screen tends to tank frame rate. Possibly due to just how many shots there are generated, 176 shots per flag. It might be reduced by stopping them from spinning and removing the wall collision. The other part is they don't seem to match the game's tone. And yes, that is a pirate alien flag.

Code: [Select]
The code is available in a zip earlier in the thread. There is a lot of it. Below is just a part sufficient to get the idea.
    <entity name="RocketFrog" ship_category="Wander_3x3"
    category="Ship"
    display_name="Rocket Frog"
    behavior="Wanderer"
    speed="50" acceleration="100"
    max_health="100"
    image_folder="Enemy_Pursuers" image_name="ChargerWhite"
    time_to_visually_rotate_180_degrees="0.7"
    >
    <hitbox radius="26" />
<system type="FlagTestSystem" offset="0,0" />
  </entity>
    <system name="FlagTestSystem"
category="Weapon"
     shot_type="BulletPointedYellow"
     damage_type="Ballistic"
     attack_power="-1" fire_rate="3"
     range_actual="2000"  cue_time="0"
     shots_per_salvo="1"
     targeting_logic="Direct" firing_timing="AllTheTime"
     image_name="Invisible" special_bullet_patterns="FlagPIRAPattern"
     initial_firing_delay="1"
     >
  </system>
<var name="FlagShot2134312">
$FlagShot SHOT=[SHOT2] SPOSX=0
$FlagShot SHOT=[SHOT2] SPOSX=10
$FlagShot SHOT=[SHOT1] SPOSX=20
$FlagShot SHOT=[SHOT2] SPOSX=30
$FlagShot SHOT=[SHOT2] SPOSX=40
$FlagShot SHOT=[SHOT2] SPOSX=50
$FlagShot SHOT=[SHOT1] SPOSX=60
$FlagShot SHOT=[SHOT1] SPOSX=70
$FlagShot SHOT=[SHOT1] SPOSX=80
$FlagShot SHOT=[SHOT1] SPOSX=90
$FlagShot SHOT=[SHOT2] SPOSX=100
$FlagShot SHOT=[SHOT2] SPOSX=110
$FlagShot SHOT=[SHOT2] SPOSX=120
$FlagShot SHOT=[SHOT1] SPOSX=130
$FlagShot SHOT=[SHOT2] SPOSX=140
$FlagShot SHOT=[SHOT2] SPOSX=150
</var>
<var name="FlagShot1316131">
$FlagShot SHOT=[SHOT2] SPOSX=0
$FlagShot SHOT=[SHOT1] SPOSX=10
$FlagShot SHOT=[SHOT1] SPOSX=20
$FlagShot SHOT=[SHOT1] SPOSX=30
$FlagShot SHOT=[SHOT2] SPOSX=40
$FlagShot SHOT=[SHOT1] SPOSX=50
$FlagShot SHOT=[SHOT1] SPOSX=60
$FlagShot SHOT=[SHOT1] SPOSX=70
$FlagShot SHOT=[SHOT1] SPOSX=80
$FlagShot SHOT=[SHOT1] SPOSX=90
$FlagShot SHOT=[SHOT1] SPOSX=100
$FlagShot SHOT=[SHOT2] SPOSX=110
$FlagShot SHOT=[SHOT1] SPOSX=120
$FlagShot SHOT=[SHOT1] SPOSX=130
$FlagShot SHOT=[SHOT1] SPOSX=140
$FlagShot SHOT=[SHOT2] SPOSX=150
</var>
<var name="FlagShot484">
$FlagShot SHOT=[SHOT2] SPOSX=0
$FlagShot SHOT=[SHOT2] SPOSX=10
$FlagShot SHOT=[SHOT2] SPOSX=20
$FlagShot SHOT=[SHOT2] SPOSX=30
$FlagShot SHOT=[SHOT1] SPOSX=40
$FlagShot SHOT=[SHOT1] SPOSX=50
$FlagShot SHOT=[SHOT1] SPOSX=60
$FlagShot SHOT=[SHOT1] SPOSX=70
$FlagShot SHOT=[SHOT1] SPOSX=80
$FlagShot SHOT=[SHOT1] SPOSX=90
$FlagShot SHOT=[SHOT1] SPOSX=100
$FlagShot SHOT=[SHOT1] SPOSX=110
$FlagShot SHOT=[SHOT2] SPOSX=120
$FlagShot SHOT=[SHOT2] SPOSX=130
$FlagShot SHOT=[SHOT2] SPOSX=140
$FlagShot SHOT=[SHOT2] SPOSX=150
</var>
<var name="FlagShot4122214">
$FlagShot SHOT=[SHOT2] SPOSX=0
$FlagShot SHOT=[SHOT2] SPOSX=10
$FlagShot SHOT=[SHOT2] SPOSX=20
$FlagShot SHOT=[SHOT2] SPOSX=30
$FlagShot SHOT=[SHOT1] SPOSX=40
$FlagShot SHOT=[SHOT2] SPOSX=50
$FlagShot SHOT=[SHOT2] SPOSX=60
$FlagShot SHOT=[SHOT1] SPOSX=70
$FlagShot SHOT=[SHOT1] SPOSX=80
$FlagShot SHOT=[SHOT2] SPOSX=90
$FlagShot SHOT=[SHOT2] SPOSX=100
$FlagShot SHOT=[SHOT1] SPOSX=110
$FlagShot SHOT=[SHOT2] SPOSX=120
$FlagShot SHOT=[SHOT2] SPOSX=130
$FlagShot SHOT=[SHOT2] SPOSX=140
$FlagShot SHOT=[SHOT2] SPOSX=150
</var>
<var name="FlagShot3116113">
$FlagShot SHOT=[SHOT2] SPOSX=0
$FlagShot SHOT=[SHOT2] SPOSX=10
$FlagShot SHOT=[SHOT2] SPOSX=20
$FlagShot SHOT=[SHOT1] SPOSX=30
$FlagShot SHOT=[SHOT2] SPOSX=40
$FlagShot SHOT=[SHOT1] SPOSX=50
$FlagShot SHOT=[SHOT1] SPOSX=60
$FlagShot SHOT=[SHOT1] SPOSX=70
$FlagShot SHOT=[SHOT1] SPOSX=80
$FlagShot SHOT=[SHOT1] SPOSX=90
$FlagShot SHOT=[SHOT1] SPOSX=100
$FlagShot SHOT=[SHOT2] SPOSX=110
$FlagShot SHOT=[SHOT1] SPOSX=120
$FlagShot SHOT=[SHOT2] SPOSX=130
$FlagShot SHOT=[SHOT2] SPOSX=140
$FlagShot SHOT=[SHOT2] SPOSX=150
</var>
<var name="FlagShot123121321">
$FlagShot SHOT=[SHOT2] SPOSX=0
$FlagShot SHOT=[SHOT1] SPOSX=10
$FlagShot SHOT=[SHOT1] SPOSX=20
$FlagShot SHOT=[SHOT2] SPOSX=30
$FlagShot SHOT=[SHOT2] SPOSX=40
$FlagShot SHOT=[SHOT2] SPOSX=50
$FlagShot SHOT=[SHOT1] SPOSX=60
$FlagShot SHOT=[SHOT2] SPOSX=70
$FlagShot SHOT=[SHOT2] SPOSX=80
$FlagShot SHOT=[SHOT1] SPOSX=90
$FlagShot SHOT=[SHOT2] SPOSX=100
$FlagShot SHOT=[SHOT2] SPOSX=110
$FlagShot SHOT=[SHOT2] SPOSX=120
$FlagShot SHOT=[SHOT1] SPOSX=130
$FlagShot SHOT=[SHOT1] SPOSX=140
$FlagShot SHOT=[SHOT2] SPOSX=150
</var>
<var name="FlagShotPirateShot">
$FlagShot16 SHOT=[SHOT2] SPOSY=-50
$FlagShot2134312 SPOSY=-40
$FlagShot1316131 SPOSY=-30
$FlagShot484 SPOSY=-20
$FlagShot4122214 SPOSY=-10
$FlagShot4122214 SPOSY=-0
$FlagShot484 SPOSY=10
$FlagShot3116113 SPOSY=20
$FlagShot123121321 SPOSY=30
$FlagShot2134312 SPOSY=40
$FlagShot16 SHOT=[SHOT2] SPOSY=50
</var>
<var name="FlagShot16">
$FlagShot SHOT=[SHOT] SPOSX=0
$FlagShot SHOT=[SHOT] SPOSX=10
$FlagShot SHOT=[SHOT] SPOSX=20
$FlagShot SHOT=[SHOT] SPOSX=30
$FlagShot SHOT=[SHOT] SPOSX=40
$FlagShot SHOT=[SHOT] SPOSX=50
$FlagShot SHOT=[SHOT] SPOSX=60
$FlagShot SHOT=[SHOT] SPOSX=70
$FlagShot SHOT=[SHOT] SPOSX=80
$FlagShot SHOT=[SHOT] SPOSX=90
$FlagShot SHOT=[SHOT] SPOSX=100
$FlagShot SHOT=[SHOT] SPOSX=110
$FlagShot SHOT=[SHOT] SPOSX=120
$FlagShot SHOT=[SHOT] SPOSX=130
$FlagShot SHOT=[SHOT] SPOSX=140
$FlagShot SHOT=[SHOT] SPOSX=150
</var>
  <var name="FlagShot">
    <bullet angle="[ANGLE]" speed="[SPEED]" shot_type="[SHOT]" spawn_offset ="[SPOSX],[SPOSY]">
<change self_scale="0.5" />
<wait time="0.5" />
<loop iterations="5">
  <change angle="45" time="0.0001" />
      <wait time=".5" />
  <change angle="90" time="0.0001" />
      <wait time=".5" />
  <change angle="135" time="0.0001" />
      <wait time=".5" />
  <change angle="180" time="0.0001" />
      <wait time=".5" />
  <change angle="225" time="0.0001" />
      <wait time=".5" />
  <change angle="270" time="0.0001" />
      <wait time=".5" />
  <change angle="315" time="0.0001" />
      <wait time=".5" />
  <change angle="0" time="0.0001" />
      <wait time="1" />
  <wait time="2" />
  </loop>
    </bullet>
  </var>
<bullet_pattern name="FlagPIRAPattern">
$FlagShotPirateShot SPEED=260 ANGLE=0 SHOT1=WingsWhite SHOT2=WingsTrueBlue
</bullet_pattern>

Name: Spawn Ships when hit
Concept: When you hit an enemy ship with a shot, it spawns a defensive enemy.
Progress: Dayton created this for the player ships already, I simply stole his code and changed it a little to work for enemies. By itself it isn't enough to create an interesting enemy. It also needs to be change to use the new enemy familiar ship category.
Code: [Select]
  <system name="FrogRevengeRamSystem"
          category="DirectUseSystem"
          firing_timing="WhenParentEntityHit"
          fire_rate="1"
          image_name="Invisible"
          display_name="Revenge Rams" description="Spawns a Ram whenever you're hit."
          spawns_entity="Ram2"
          >
  </system>
    <entity name="Ram2" ship_category="Familiar"
          category="Ship" is_not_ready_to_seed="true"
          familiar_type="NormalShipBehavior" behavior="FamiliarRam" familiar_ram_charge_distance="500"
          speed="100"
  max_health = "50"
          display_name="Ram" description="Deploys a ram to attack any nearby enemy."
          image_folder="Familiars"
  image_name="Ram"
          familiar_regenerates_after_current_room="false"
          is_familiar_that_dies_when_parent_dies="true"
          >
    <hitbox radius="18"/>
    <system type="RamRam" offset="0,0"/>
  </entity>

Name: Shadow Clone Jitsu
Concept: When a ship is hit, fake copies of the ship appear to confuse the player, only one is real.
Progress: Generating a ship when an enemy is hit is done the same was as the previous entry. That's easy. The movement pattern to get the clones to not all sit on top of the spawning ship and to get the original spawning ship to mix itself up with the clones hasn't been accomplished. The other problem is that when I play, I take the strategy of more DAKKA is good DAKKA. So I hose everything with bullets. Even with the enemy producing fake bullets for me to dodge, it didn't really click for me.

Code: [Select]
see above

Name: Miniboss Maze Room
Concept: You have a room filled with a maze of 1 cell-wide paths. There are normal enemies in it and there is a miniboss chasing monster. You have to dodge the Miniboss while doing something else.
Progress: I couldn't make the Miniboss dangerous enough without making him too dangerous. Either he is faster and can always catch up to the player, or not fast enough and can be simply kited. I also tried creating a boundary zone on the outside of the maze (think a shark cage with the shark miniboss on the outside), using a 3-cell wide zone and 3x3 pathfinding on the miniboss, but he tended to get stuck and still didn't seem interesting. Another possibility was to have the miniboss continue to spawn smaller maze-fittable chasers to keep you under pressure, but it still didn't work for me. If someone can get something going out of this, go for it.
Code: [Select]
d,,,,,,,,...,,,,,,,,d
,,,,,,,,,,,,,,,,,,,,,
,,sss,ss,ssss,ss,ss,,
,,s,,,,,,,,,,,,,,,s,,
,,s,ssss,ss,ss,ss,s,,
,,,,,,,,,,+,,,,,s,,,,
,,s,s,ss,sss,ss,s,s,,
,,s,s,s,,,,,,,s,s,s,,
,,,,s,s,ss,ss,,,,,s,,
.,s,,,,,s111s,s,s,s,.
.,s,s,s,,1B1s,s,s,,,.
.,,,s,s,s111,,,,,,s,.
,,s,s,,,s,sss,s,s,s,,
,,s,s,s,,,,,,,s,s,,,,
,,s,,,ss,ss,sss,,,s,,
,,s,s,,,,,,,,,,,s,s,,
,,,,sss,ss,s,ssss,,,,
,,s,,,,,,,,,,,,,,,s,,
,,ss,ss,sss,ssss,ss,,
,,,,,,,,,,,,,,,,,,,,,
d,,,,,,,,...,,,,,,,,d
   <entity name="MazeMaster"
          ship_category="Miniboss"
          display_name="MazeMaster"
          behavior="PathfindingAttacker"
          category="Ship"
          speed="1000"
  acceleration="25"
  turning_resistance="10"
  decceleration="25"
          max_health="1000"
          image_folder="Enemy_LargeChaos"
          image_name="HunterWhite"
          wall_collision_reduction="-17"
          time_to_visually_rotate_180_degrees=".1">
<system type="MazeDroneBaySystem" offset="0,0" />
    <hitbox radius="46" offset="0,0"/>
    <room src="Miniboss/PT_Maze" />
  </entity>
    <entity name="PTMazeSlow" ship_category="Pursuer_1x1"
    category="Ship"
    display_name="Maze Minion Slow"
    behavior="CardinalMover"
    speed="400" acceleration="50"
    max_health="50"
    image_folder="Enemy_Pursuers" image_name="FaceripperBlue"
    time_to_visually_rotate_180_degrees="0.7"
    >
    <hitbox radius="26" />
  </entity>
   
    <entity name="PTMazeFast" ship_category="DeadlyPursuer_1x1"
    category="Ship"
    display_name="Maze Minion Fast"
    behavior="PathfindingAttacker"
    speed="500" acceleration="50"
    max_health="100"
    image_folder="Enemy_Pursuers" image_name="FaceripperGreen"
    time_to_visually_rotate_180_degrees="0.7"
    >
    <hitbox radius="26" />
  </entity>
  <entity name="PTMazeSlowSpawn" ship_category="Pursuer_1x1"
    category="Ship"
    display_name="Maze Minion Slow"
    behavior="CardinalMover"
    speed="400" acceleration="50"
    max_health="50"
    image_folder="Enemy_Pursuers" image_name="ChargerBlack"
    time_to_visually_rotate_180_degrees="0.7"
    >
    <hitbox radius="26" />
  </entity>
    <entity name="PTMazeFastSpawn" ship_category="DeadlyPursuer_1x1"
    category="Ship"
    display_name="Maze Minion Fast"
    behavior="PathfindingAttacker"
    speed="500" acceleration="50"
    max_health="100"
    image_folder="Enemy_Pursuers" image_name="ChargerWhite"
    time_to_visually_rotate_180_degrees="0.7"
    >
    <hitbox radius="26" />
  </entity>

Name: Space Invader Boss
Concept: A homage boss room based on the game Space Invaders.
Progress: Zamboni movement really suggested this one. I have everything set up, but I just can't find the part that makes it more fun.
Code: [Select]
<system name="InvaderSystem1"
category="Weapon"
shot_type="SpineWhite"
damage_type="Ballistic"
attack_power="1"
fire_rate="4"
cue_time = "0"
range_actual="1400"
shots_per_salvo="1"
shot_speed="250"
targeting_logic="Direct"
firing_timing="AllTheTime"
image_name="Invisible"
initial_firing_delay ="8"
>
  </system>
    <system name="HoldFire1System"
category = "DirectUseSystem"
firing_timing="5"
fire_rate="5"
image_name="Invisible"
>
  </system>
  <system name="InvaderSystem2"
category="Weapon"
shot_type="SpineGreen"
damage_type="Ballistic"
attack_power="1"
fire_rate="2"
cue_time = "0"
range_actual="1400"
shots_per_salvo="1"
shot_speed="250"
targeting_logic="Direct"
firing_timing="AllTheTime"
image_folder="Simpler"
image_name="Invisible"
initial_firing_delay ="8"
>
  </system>
  <system name="InvaderSystem3"
category="Weapon"
shot_type="SpineTrueBlue"
damage_type="Ballistic"
attack_power="1"
fire_rate="3"
cue_time = "0"
range_actual="1400"
shots_per_salvo="1"
shot_speed="250"
targeting_logic="Direct"
firing_timing="AllTheTime"
image_folder="Simpler"
image_name="Invisible"
do_parallel_salvo_with_spacing="0"
salvo_angle_difference="5"
initial_firing_delay ="8"
fires_salvos_sequentially="true"
>
  </system>
  <system name="InvaderSystem4"
category="Weapon"
shot_type="SpineEmblazonedYellow"
damage_type="Ballistic"
attack_power="1"
fire_rate="2"
cue_time = "0"
range_actual="1400"
shots_per_salvo="3"
shot_speed="450"
targeting_logic="Dumbfire"
firing_timing="OnlyInRange"
image_folder="Simpler"
image_name="Invisible"
initial_firing_delay ="0"
fires_salvos_sequentially="false"
do_parallel_salvo_with_spacing = "10"
>
  </system>
  <system name="InvaderSystem5"
category="Weapon"
shot_type="SpineTrueBlue"
damage_type="Ballistic"
attack_power="1"
fire_rate="2.4"
cue_time = "0"
range_actual="1400"
shots_per_salvo="3"
shot_speed="350"
targeting_logic="Dumbfire"
firing_timing="AllTheTime"
image_folder="Simpler"
image_name="Invisible"
initial_firing_delay ="0"
salvo_angle_difference="5"
>
  </system>
<entity name="InvaderMinion1" ship_category="Wander_3x3"
display_name="Invader"
    behavior="Zamboni" category="Ship"
    speed="300"
    max_health="10"
    image_folder="Enemy_SmallMobile" image_name="AmberBarrage"
    wall_collision_reduction="-15"
    time_to_visually_rotate_180_degrees="0.3"
on_death_drops_ability_points="0"
always_faces_player ="true"
>
    <system type="InvaderSystem1" offset="0,0" />
<system type="HoldFire1System" offset="0,0" />
    <hitbox radius="37" offset="-10,0" />
  </entity>
    <entity name="InvaderMinion2" ship_category="Wander_3x3"
display_name="Invader"
    behavior="Zamboni" category="Ship"
    speed="300"
    max_health="20"
    image_folder="Enemy_SmallMobile" image_name="GreenBomber"
    wall_collision_reduction="-15"
    time_to_visually_rotate_180_degrees="0.3"
on_death_drops_ability_points="0"
always_faces_player ="true"
>
    <system type="InvaderSystem2" offset="0,0" />
    <hitbox radius="37" offset="-10,0" />
  </entity>
    <entity name="InvaderMinion3" ship_category="Wander_3x3"
display_name="Invader"
    behavior="Zamboni" category="Ship"
    speed="300"
    max_health="30"
    image_folder="Enemy_SmallMobile" image_name="BlueBomber"
    wall_collision_reduction="-15"
    time_to_visually_rotate_180_degrees="0.3"
on_death_drops_ability_points="0"
always_faces_player ="true"
>
    <system type="InvaderSystem3" offset="0,0" />
    <hitbox radius="37" offset="-10,0" />
  </entity>
    <entity name="InvaderMinion4" ship_category="Wander_3x3"
display_name="Invader"
    behavior="Zamboni" category="Ship"
    speed="300"
    max_health="40"
    image_folder="Enemy_SmallMobile" image_name="MiniSwarmBlueGreen"
    wall_collision_reduction="-15"
    time_to_visually_rotate_180_degrees="0.3"
on_death_drops_ability_points="0"
always_faces_player ="true"
>
    <system type="InvaderSystem4" offset="0,0" />

    <hitbox radius="37" offset="-10,0" />
  </entity>
    <entity name="InvaderMinion5" ship_category="Wander_3x3"
display_name="Invader"
    behavior="Zamboni" category="Ship"
    speed="300"
    max_health="50"
    image_folder="Enemy_SmallMobile" image_name="MiniSwarmBlueOrange"
    wall_collision_reduction="-15"
    time_to_visually_rotate_180_degrees="0.3"
on_death_drops_ability_points="0"
always_faces_player ="true"
>
    <system type="InvaderSystem5" offset="0,0" />
    <hitbox radius="37" offset="-10,0" />
  </entity>
  <entity name="InvaderBoss" ship_category="Boss" knockback_resistance="1"
   display_name="Invader"
   behavior="Zamboni" category="Ship"
   speed="200" never_changes_angle_after_spawn="true"
   max_health="500" wall_collision_reduction="-20"
   image_folder="Enemy_Bosses" image_name="CrystalMother"
   starting_angle="0"
   on_death_shot_clearing_explosion_radius="2000"
   do_not_seed_until_x_floors_down="1"
   invincible_while_in_same_room_with="InvaderMinion1,InvaderMinion2,InvaderMinion3,InvaderMinion4,InvaderMinion5"
>
    <system type="InvaderBossSystem" offset="0,0" />
    <hitbox radius="60" offset="0,0" />
    <room src="Boss_Large/Pt_BossSpaceInvader4" buddies="InvaderMinion1,InvaderMinion2,InvaderMinion3,InvaderMinion4,InvaderMinion5"/>
<system type="FrogRevengeRamSystem" offset="0,0" />
  </entity>
  <entity name="PTGhost" ship_category="Pursuer_1x1"
    category="Ship"
    display_name="Blue Ghost-CardinalMover"
    behavior="CardinalMover"
    speed="500" acceleration="50"
    max_health="25"
    image_folder="Enemy_Pursuers" image_name="FaceripperBlue"
    time_to_visually_rotate_180_degrees="0.7"
    >
    <hitbox radius="26" />

  </entity>

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,IIIIIIIIIIIIIIIIIIIIII,,,,,,,
,,IIIIIIIIIIIIIIIIIIIIII.,,,,,,
,,II.......................,,,,
,,II.U.U.U.U.U.............,,,,
,,II........................,,,
,,II.U.U.U.U.U.............II,,
,,II..................yss..II,,
,,II.U.U.U.U.U........ysb..II,,
,,II..................yss..II,,
,,II.U.U.U.U.U.............II,,
,,II.......................II,,
,,II.U.U.U.U.U.............II,,
,,II..................yss..II,,
+,IIBU.U.U.U.U........ysb.+II,+
,,II..................yss..II,,
,,II.U.U.U.U.U.............II,,
,,II.......................II,,
,,II.U.U.U.U.U.............II,,
,,II..................yss..II,,
,,II.U.U.U.U.U........ysb..II,,
,,II..................yss..II,,
,,II.U.U.U.U.U.............II,,
,,II........................,,,
,,II.U.U.U.U.U.............,,,,
,,II.......................,,,,
,,IIIIIIIIIIIIIIIIIIIIII.,,,,,,
,,IIIIIIIIIIIIIIIIIIIIII,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Name: Intermittent Fire
Concept: Probabilistic Firing patterns that are not fixed
Progress: I thought maybe adding a blank system that took X seconds to fire, but failed to generate a shot would work to allow for staggering shots, but I couldn't get it to work. This was inspired by the Space Invader room, having all 55 enemies constantly firing made for a busy room. The code I have left is completely stripped out as I gutted it to stop it from throwing XML issues, but still have a reminder of it.
Code: [Select]
    <system name="HoldFire1System"
category = "DirectUseSystem"
firing_timing="5"
fire_rate="5"
image_name="Invisible"
>
  </system>
Title: Re: [.80X] xml questions and answers
Post by: zharmad on January 18, 2016, 06:33:44 PM
In your defense, I wrote only three enemy types, each with three variants based on floor difficulty.

May have time before release to also see if there's workarounds for some of your ideas.
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 18, 2016, 06:35:39 PM
I can probably finish the concept of the maze miniboss myself; I already have an idea as to what could happen there.

Who says it necessarily needs to get close for all it's damage, after all?
Title: Re: [.80X] xml questions and answers
Post by: zharmad on January 18, 2016, 07:33:01 PM
About the Healership, have you tried making a weapon that explodes, does friendly fire, and do negative damage?
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 18, 2016, 07:37:56 PM
You could have a system with an on-use effect that increases the hull health of all enemies.

Or you could have a system with:
modifiers_applied_to_nearby_entities_can_target_allies="true"
modifiers_applied_to_nearby_entities_can_target_enemies="true"
distance_threshold_modifiers_applied_to_nearby_entities="(whatever range)"

and a modifier with target="NearbyEntities", type="DamagePerSecond", math="Add", and a negative magnitude.

I don't vouch for spelling, syntax, or completeness ;)
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 18, 2016, 07:47:38 PM
About the Healership, have you tried making a weapon that explodes, does friendly fire, and do negative damage?

Shots require a non-zero integer. Negative integers do 0 damage. 0 damage causes an xml explosion.

Quote
You could have a system with an on-use effect that increases the hull health of all enemies.

Or you could have a system with:
modifiers_applied_to_nearby_entities_can_target_allies="true"
modifiers_applied_to_nearby_entities_can_target_enemies="true"
distance_threshold_modifiers_applied_to_nearby_entities="(whatever range)"

and a modifier with target="NearbyEntities", type="DamagePerSecond", math="Add", and a negative magnitude.

I don't vouch for spelling, syntax, or completeness ;)
That is hilarious. Although, per zharmad's question, negative damage seems to deal no damage, not heal.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 18, 2016, 07:49:16 PM
Right, but this wouldn't be using the normal field for damage. I think negative DamagePerSecond does work.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 18, 2016, 09:21:25 PM
Right, but this wouldn't be using the normal field for damage. I think negative DamagePerSecond does work.

Good point. I gave it a shot, but it still doesn't do anything. I looked around for someone using target="NearbyEntities" and couldn't find any, so the targeting logic may be broken for NearbyEntities (or I'm missing something obvious).

I then went on to test a few more things.
Code: [Select]
    <system name="ShieldAddSystem"
category="DirectUseSystem"
     shot_type="Invisible"
     damage_type="Ballistic"
     attack_power="1" fire_rate="1"
     range_actual="500"  cue_time="0"
     shots_per_salvo="1"
     targeting_logic="Dumbfire" firing_timing="AllTheTime"
     image_name="Invisible"
     initial_firing_delay="0"
distance_threshold_modifiers_applied_to_nearby_entities="500"
modifiers_applied_to_nearby_entities_can_target_allies="true"
modifiers_applied_to_nearby_entities_can_target_enemies="true"
     >
<modifier target="MyParentEntity" type="DamagePerSecond" math="add" magnitude="1" do_not_stack="true" duration="-1"/>
  </system>

Produces an effect that kills a 150 health ship in 9 ticks (seconds), a 100 health ship in 6 ticks, and a 50 health ship in 3 ticks. I have no idea what's going on. Giving the ship a -1 magnitude DamagerPerSecond  effect made them regenerate at the same rate. It does not however exceed the maximum health of the ship.
Title: Re: [.80X] xml questions and answers
Post by: zharmad on January 19, 2016, 07:07:09 PM
 Keith, is there any way for EnemyFamiliar Entities to influence their parent? For example, the familiar possesses an entity system that targets and damages/slows the parent when the familiar is hit.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 19, 2016, 07:19:40 PM
Keith, is there any way for EnemyFamiliar Entities to influence their parent? For example, the familiar possesses an entity system that targets and damages/slows the parent when the familiar is hit.
I don't think there's anything like that implemented, no. You could have an enemy that, on death (or on hit, via a system that only triggers on-hit), triggers effects that affect all enemies. But not specifically the familiar's master.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 21, 2016, 01:07:16 AM
I was working with Zharmad and came up with the following neat idea, but I don't have any time to play with it right now.

Effect:
Ship leaves behind a trail of items. If the player doesn't run over the items (i.e., pick them up), they exploded into a massive dangerous shot.

How to:
Use a bullet_pattern with two nested bullets. Set the first bullet to have do_not_do_rest_of_logic_on_early_death="true" and damage_mult="0". This means that a player will not take damage when running over the shot and it will destroy itself instead of continuing to spawn normally. In the second bullet set damage_mult="1". Now the shot is dangerous. The length of the wait between the first and second shot is how long the player has to get rid of it before it turns active.

Here is the functional code in case my explanation is not sufficient.
Code: [Select]

  <var name="ZHAGraspingClawShortShot">
        <bullet angle="[REACH_ANGLE]" speed="[REACH_SPEED]" never_collides_with_terrain="true" shot_type="WidowShotWhite" damage_mult="0" do_not_do_rest_of_logic_on_early_death="true">       
        <change angle="[REACH_TURN]" relative="true" time="[TIME1]" />
        <change speed="0" time="0" />
        <wait time="[TIME2]" />
        <spawn>
        <bullet_pattern>
            <bullet angle="0" speed="[GRAB_SPEED]" shot_type="WidowShotRed"  damage_mult="1">       
            <change angle="[GRAB_TURN]" relative="true" time="[TIME3]" />           
            <die />
            </bullet>
        </bullet_pattern>
        </spawn>       
        <die />
        </bullet>
</var>
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 22, 2016, 10:00:03 PM
So I manage to make the shotpattern interpolation mad at me.



Code: [Select]
<var name="RotaryShot2">
<bullet angle="[ANGLE]" speed="0" shot_type="[SHOT]" rotates_around_firing_entity="false" moves_with_firing_entity="true" spawns_offset_from_firing_entity="[CENTERX],[CENTERY]" never_collides_with_terrain="true" dumbfire="true">
<spawn>
<bullet_pattern>
$RotaryShot ROTSPEED=1 ANGLE=30 SHOT=QuadRed SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=60 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=90 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=120 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=150 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=180 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=210 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=240 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=270 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=300 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=330 SHOT=QuadGreen SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
$RotaryShot ROTSPEED=1 ANGLE=360 SHOT=QuadBlue SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=100 CENTERY=-100
</bullet_pattern>
</spawn>
<loop iterations="-1">
<change offset_from_parent="[CENTERX],[CENTERY]" time="0"/>
</loop>
</bullet>
  </var>

<var name="RotaryShot">
<bullet angle="[ANGLE]" speed="0" shot_type="[SHOT]" rotates_around_firing_entity="false" moves_with_firing_entity="true" spawns_offset_from_firing_entity="[SPOSX],[SPOSY]" never_collides_with_terrain="true" dumbfire="true" offset_is_relative_to_parent_bullet_instead_of_firing_entity="true">
<loop iterations="-1">
<change offset_from_parent="[SPOSX],[SPOSY]" time="0"/>
<change relative="true" angle="180" time="1"/>
</loop>
            <die />
</bullet>
  </var>
  <bullet_pattern name="RotaryPattern">
  $RotaryShot2 ROTSPEED=1 ANGLE=360 SHOT=QuadBlue SPOSX=-100 SPOSY=100 SCALE=2 CENTERX=-100 CENTERY=-100
  </bullet_pattern>
    <system name="RotarySystem"
category="Weapon"
shot_type="QuadGreen"
damage_type="Ballistic"
attack_power="1"
fire_rate="50"
cue_time = "0.5"
range_actual="800"
shots_per_salvo="1"
shot_speed="0"
targeting_logic="Dumbfire"
firing_timing="AllTheTime"
image_name="QuadGreen"
special_bullet_patterns="RotaryPattern"
>
  </system>


Every few rotations it makes 1-5 of the shots counter-rotate. I'm guessing because the shots move past the starting mark in some calculation and then its faster to counter rotate instead of rotate. Regardless changing to 179 degrees fixes it.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 23, 2016, 01:25:03 AM
Q: Anyone have an idea on why I can't keep the shots in the following weapon from dying?

Code: [Select]
  <entity name="Rotary" ship_category="LocalGuard_1x1"
    category="Ship"
    display_name="Buzzsaw"
    behavior="LineOfSightAttacker"
    speed="200" acceleration="50"
    max_health="25"
    image_folder="Enemy_Pursuers" image_name="Abmoog1Green"
    time_to_visually_rotate_180_degrees="0.7"
    >
    <hitbox radius="26" />
<system type="RotarySystem" offset="0,0" />
  </entity>

    <system name="RotarySystem"
category="Weapon"
shot_type="QuadGreen"
damage_type="Ballistic"
attack_power="1"
fire_rate="2"
cue_time = "0.5"
range_actual="10"
shots_per_salvo="1"
shot_speed="0"
targeting_logic="Direct"
firing_timing="AllTheTime"
image_name="QuadGreen"
special_bullet_patterns="RotaryPattern"
shots_never_collide_with_terrain="true"
shots_use_performance_sensitive_logic="true"
>
<modifier target="MyShots" type="IgnoresCollisionWithNonWallTerrain"/>
<modifier target="MyShots" type="IgnoresCollisionWithWallTerrain"/>
  </system>


  <bullet_pattern name="RotaryPattern">
  $RotaryShot ROTSPEED=.25 SHOT=QuadBlue SPOSX=-50 SPOSY=50 SCALE=2 CENTERX=115 CENTERY=-100 ROTDIR=-90
$RotaryShot ROTSPEED=.25 SHOT=QuadBlue SPOSX=50 SPOSY=50 SCALE=2 CENTERX=-115 CENTERY=-100 ROTDIR=90
  </bullet_pattern>
  <var name="RotaryShot">
<bullet angle="0" speed="0" shot_type="[SHOT]" rotates_around_firing_entity="true" moves_with_firing_entity="true" spawns_offset_from_firing_entity="[CENTERX],[CENTERY]" never_collides_with_terrain="true" dumbfire="false" is_invisible_and_does_not_collide_with_ships="true">
<spawn>
<bullet_pattern>
$SawToothShot ANGLE=30
$SawToothShot ANGLE=60
$SawToothShot ANGLE=90
$SawToothShot ANGLE=120
$SawToothShot ANGLE=150
$SawToothShot ANGLE=180
$SawToothShot ANGLE=210
$SawToothShot ANGLE=240
$SawToothShot ANGLE=270
$SawToothShot ANGLE=300
$SawToothShot ANGLE=330
$SawToothShot ANGLE=360
</bullet_pattern>
</spawn>
<loop iterations="-1">
<change offset_from_parent="[CENTERX],[CENTERY]" time="0"/>
</loop>
</bullet>
  </var>


<var name="SawToothShot">
<bullet angle="[ANGLE]" speed="0" shot_type="[SHOT]" shots_use_performance_sensitive_logic="true" rotates_around_firing_entity="false" moves_with_firing_entity="true" spawns_offset_from_firing_entity="[SPOSX],[SPOSY]" never_collides_with_terrain="true" dumbfire="true" offset_is_relative_to_parent_bullet_instead_of_firing_entity="true" ShotIsNotStoppedByHitting="true">
<loop iterations="16">
<change offset_from_parent="[SPOSX],[SPOSY]" time="0"/>
<change relative="true" angle="[ROTDIR]" time="[ROTSPEED]"/>
</loop>
            <die />
</bullet>
  </var>

Also, I just saw "angle_from_parent (float), distance_from_parent (float)", which would have made my life much easier.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 24, 2016, 01:20:17 AM
Q: Anyone have a good method to combine all of the xml docs into a single searchable offline document that is easily updated?
Q: Are death animations changeable?
Q: Should a modding forum be established?
Title: Re: [.80X] xml questions and answers
Post by: Cinth on January 24, 2016, 01:50:53 AM
Q: Anyone have a good method to combine all of the xml docs into a single searchable offline document that is easily updated?
Q: Are death animations changeable?
Q: Should a modding forum be established?

No.
Should be, but going by the Wiki, it would be a pain in the ...
I already emailed Chris about a modding subforum.  :D
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 24, 2016, 06:13:00 AM
The wiki is a hideous exploded mess;  I know I wouldnt want to try to put that thing together.

Title: Re: [.80X] xml questions and answers
Post by: Cinth on January 24, 2016, 06:33:01 AM
It's not helpful at all.  I'm having better luck using existing stuff as templates to modify.

Still a royal pain trying to find everything you need to adjust for systems.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 24, 2016, 06:07:16 PM
Q: Method for system to have a chance to fire?
Q: Method to move system to location in room? Right now the best idea I have is to create an invisible invulnerable entity to move to a location given a bullet pattern, but I don't have example code for it...
Q: Apply gravity effect to an entity?
Title: Re: [.80X] xml questions and answers
Post by: Cinth on January 24, 2016, 06:17:09 PM
Q: Method for system to have a chance to fire?

A: Use two bullet patterns. One is the real deal.  The other spawns an invisible shot that just fizzles.  Chance to fire = 1 real / # fakes

special_bullet_patterns="Realdealpattern, Junkpattern,Junkpattern"


Did I do good?
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 24, 2016, 06:21:10 PM
That works for shots, but not for systems that act on events. In this case I want to have a chance to summon another guy on death.
Title: Re: [.80X] xml questions and answers
Post by: Cinth on January 24, 2016, 06:30:50 PM
on_death_transforms_into  using the same principal  as the bullet patterns?


Gravity stuff:

gravity_pull_per_second, gravity_falloff_per_unit_distance (both floats, optional)

    so if you had values of 100 and 0.2, then it would exert a pull on something up to 500 units away, where that pull is 20 at 400 distance, 40 at 300, 60 at 200, 80 at 100, etc

gravity_affects_shots, gravity_affects_ships , shot_gravity_affects_friendlies (all bools, optional)

    you need to set either shots or ships for it to do anything; always affects enemies, but only friendlies if you set that flag

gravity_has_repelling_effect (bool, optional)

    makes the entity's gravity pull do a repulsion instea
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 24, 2016, 07:46:34 PM
That works for shots, but not for systems that act on events. In this case I want to have a chance to summon another guy on death.
give the entity a system with:
- only_fires_on_death=true
- effect
-- timing=OnUse
-- type=SpawnEnemy
-- chance_out_of_100_to_happen=(whatever)
Title: Re: [.80X] xml questions and answers
Post by: Misery on January 24, 2016, 07:59:40 PM
You can give systems a random chance of activating?

....huh.
Title: Re: [.80X] xml questions and answers
Post by: keith.lamothe on January 24, 2016, 10:04:04 PM
You can give systems a random chance of activating?

....huh.
You can give the individual effect nodes a random chance of doing something. Which isn't quite the same thing. But still useful.
Title: Re: [.80X] xml questions and answers
Post by: ptarth on January 25, 2016, 12:20:23 AM
gravity_affects_ships ... of course. Thanks. It is possible that I was having too many overlaping gravity effects and that was affecting things. It would be nice to have a nonlinear gravity function, but this works.
effects ... these guys give me a bit of a headache honestly. Using them to add and remove systems from other entities to create timing events... Or using it to add a weapon system to another entity (or to take that weapon away).

Thank you, Misery, Keith, and Cinth (reverse alphabetic order, no favoritism implied)

Mechanics have been added to the Invader Boss, I'm not good enough to test Misery mode balance.
New miniboss/boss is about half done. I really like him/her/it. I was trying to make a miniboss, but my playtester informed me I was making a boss.
Control over image rotation of a shot rotating around a pivot point is proving awkward. I finally got shot_is_not_stopped_by_hitting="true" to make the shots no collide, I'm not sure what the other tags like Self_NotDestroyedOnCollisionWithShip do then.
Title: Re: [.80X] xml questions and answers
Post by: Cinth on January 25, 2016, 04:14:46 AM
All I did was use a spaghetti test using stuff from the wiki :)   I have no idea what I'm doing   ;)
Title: Re: [.80X] xml questions and answers
Post by: Dominus Arbitrationis on January 25, 2016, 04:21:34 AM
I already emailed Chris about a modding subforum.  :D

I went ahead and made it since the game does have an emphasis on the whole modability thing. :)
Title: Re: [.80X] xml questions and answers
Post by: Cinth on January 25, 2016, 04:33:11 AM
I already emailed Chris about a modding subforum.  :D

I went ahead and made it since the game does have an emphasis on the whole modability thing. :)

:D  Chris will probably see my mail in a few weeks, once he gets time to sift through his inbox.
Title: Re: XML questions and answers
Post by: ptarth on January 25, 2016, 05:36:08 PM
Controlling Enemy Movement
This is one of the things that we've all wanted to use (precise boss movement controls), but no one has gotten to work quite right yet.

The only code I've seen is from Dayton.
Code: [Select]
  <system name="MagneticPersonalitySystem"
          category="DirectUseSystem"
          firing_timing="Never"
          image_name="Invisible"
          display_name="Magnetic Personality" description="Nothing will be barred from you."
          >
    <effect timing="OnRoomSwitch" targeting="AllAutoPickups" type="StartMovementDrivingPattern" related_pattern="MagneticPattern"/>
    <effect timing="OnRoomSwitch" targeting="AllAutoPickups" type="CopyModifiersToWorldToAffect">
      <modifier type="IgnoresCollisionWithNonWallTerrain"/>
      <modifier type="IgnoresCollisionWithWallTerrain"/>
    </effect>
  </system>


  <bullet_pattern name="MagneticPattern">
    <bullet speed="100" angle="0" shot_type="Invisible" never_collides_with_terrain="true">
      <loop iterations="-1">
        <wait time="0.01" />
        <change relative="ToPlayer" angle="0" speed="100" time="0.0001"/>
      </loop>
    </bullet>
  </bullet_pattern>
 

I've tried many things to get it to work, but I haven't managed yet. Here is my latest failure.
Code: [Select]
  <system name="BossTrainSystem"
category="DirectUseSystem"
fire_rate="1"
firing_timing="AllTheTime"
image_name="MolarBlue"
special_bullet_patterns="BossTrainPattern"
>
<effect timing="OnUse" targetting="Self" type="StartMovementDrivingPattern" related_pattern="BossTrainPattern"/>
  </system>

    <bullet_pattern name="BossTrainPattern">
<bullet speed="200" angle="180" shot_type="HexishellEmblazonedYellow" relative="true">
    <loop iterations="-1">
<change angle="90" speed="100" time="0.5"/>
<wait time="1" />
</loop>
</bullet>
  </bullet_pattern>

Ideas? Answers?
Title: Re: XML questions and answers
Post by: keith.lamothe on January 25, 2016, 05:38:34 PM
Controlling Enemy Movement
This is one of the things that we've all wanted to use (precise boss movement controls), but no one has gotten to work quite right yet.
I'd suggest bullet.uses_direct_location_control and change.location as starting points there.
Title: Re: XML questions and answers
Post by: ptarth on January 25, 2016, 06:07:11 PM
I'm not even sure that the system to start the movement pattern is triggering correctly. I had a version that was firing shots at the same time the movement pattern was supposed to be triggering, but either way I'm not seeing any changes in movement occurring.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 25, 2016, 06:17:38 PM
Oh, for that, for enemies/bosses, see entity.initial_movement_driving_bullet_pattern

If you want the movement-driving-pattern to start at some point other than initial spawning of the entity, see EffectType.StartMovementDrivingPattern (to time delay that, give it OnUse timing and put it on a system on the entity, with that system having one unit of ammo and either cue_time or initial_firing_delay set to the desired time)
Title: Re: XML questions and answers
Post by: ptarth on January 25, 2016, 06:33:53 PM
...see entity.initial_movement_driving_bullet_pattern...
...see EffectType.StartMovementDrivingPattern ...

Is there a secret document or something that contains all of these tags and attributes that I'm unaware of?
Title: Re: XML questions and answers
Post by: keith.lamothe on January 25, 2016, 06:40:10 PM
...see entity.initial_movement_driving_bullet_pattern...
...see EffectType.StartMovementDrivingPattern ...

Is there a secret document or something that contains all of these tags and attributes that I'm unaware of?
https://www.arcengames.com/mediawiki/index.php?title=Starward_Rogue:XML_-_GameEntity_Definitions contains initial_movement_driving_bullet_pattern

https://www.arcengames.com/mediawiki/index.php?title=Starward_Rogue:XML_-_Enum_Reference contains EffectType.StartMovementDrivingPattern
Title: Re: XML questions and answers
Post by: Cinth on January 25, 2016, 06:41:03 PM
You know that wiki is really hard to use  :-\
Title: Re: XML questions and answers
Post by: keith.lamothe on January 25, 2016, 06:46:59 PM
You know that wiki is really hard to use  :-\
If you know a better way, let us know. My role is just to add the names and descriptions of the flags/etc I implement for use in the content xml.
Title: Re: XML questions and answers
Post by: Cinth on January 25, 2016, 06:52:17 PM
You know that wiki is really hard to use  :-\
If you know a better way, let us know. My role is just to add the names and descriptions of the flags/etc I implement for use in the content xml.

My job here is to complain about stuff that's broken, bad, confusing and make bad jokes in awkward places.  I thought coming up with creative solutions was your job.   ;D  Bad joke awkward place, don't hate me.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 25, 2016, 06:56:25 PM
Carry on, Awkward Humor And Complaint Unit 763 ;)

My point is: I don't know how to better organize the info. Even if I did, I don't have the time because the list of bugs assigned to me is always full. Even if I had the time, Chris organized the wiki, not me, and I dunno if he wants me messing with that ;)

But if y'all have the ideas, and someone has the time to implement them, that would be a start.
Title: Re: XML questions and answers
Post by: Cinth on January 25, 2016, 07:05:02 PM
Carry on, Awkward Humor And Complaint Unit 763 ;)
*Renders proper salute*
OF COURSE I WILL, SIR

Quote
My point is: I don't know how to better organize the info. Even if I did, I don't have the time because the list of bugs assigned to me is always full. Even if I had the time, Chris organized the wiki, not me, and I dunno if he wants me messing with that ;)

But if y'all have the ideas, and someone has the time to implement them, that would be a start.

Need to enlist the guys in the AIW forum (I can't remember names :( ) who helped with the wiki. 

I think a lot of us are busy.  Some of us are fixing stuff, some of us are creating stuff, and I'm to busy playing the game to do much else except generate lots of bug reports and try to create content.   :D
Title: Re: XML questions and answers
Post by: Misery on January 25, 2016, 07:15:05 PM
I'd try to help with the wiki like I did for Valley 1, but I'm relatively certain I'd go insane in the process, been doing too much already.   You'd click to go to a page, and all you'd get would be like, I dunno, a picture of a piece of cheese with a top hat.

I dunno how I come up with this stuff.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 25, 2016, 07:17:41 PM
Oh, that would be <system type="TopHat" with_cheese="true" />
Title: Re: XML questions and answers
Post by: zharmad on January 25, 2016, 07:28:17 PM
I would not be surprised if adding with_cheese to your entity literally causes it to spawn with a random image drawn from https://en.wikipedia.org/wiki/List_of_cheeses

P.S. Diazo, I, Histidine, and a few others organised the AIWar Wiki back in the Spire expansion days. I'm not sure whether anyone in maintaining them now.
Title: Re: XML questions and answers
Post by: Misery on January 25, 2016, 07:33:59 PM
I would not be surprised if adding with_cheese to your entity literally causes it to spawn with a random image drawn from https://en.wikipedia.org/wiki/List_of_cheeses

Feature request!
Title: Re: XML questions and answers
Post by: Cinth on January 25, 2016, 07:36:00 PM
P.S. Diazo, I, Histidine, and a few others organised the AIWar Wiki back in the Spire expansion days. I'm not sure whether anyone in maintaining them now.

I thought someone made a script that helped with everything after crystal went away.  It's been awhile so I can't remember right off.
Title: Re: XML questions and answers
Post by: zharmad on January 25, 2016, 08:44:36 PM
Yeah, no idea where the script is though. Diazo had one to convert from the raw exported .csv to formatted wiki.
Title: Re: XML questions and answers
Post by: ptarth on January 25, 2016, 09:01:47 PM
The movement on spawning works. Here is an example. The die tag will kill it automatically, remove it to see the ship move in a square pattern.
Code: [Select]

  <entity name="TestMinion" ship_category="EnemyFamiliar" is_not_ready_to_seed="true"
  display_name="Test"
  behavior="Attacker" category="Ship"
  speed="300"
  max_health="20"
  image_folder="Enemy_BossBuddies" image_name="InvaderMinion2OrangeTeal"
  wall_collision_reduction="-15"
  time_to_visually_rotate_180_degrees="0.3"
  always_faces_player ="true"
  initial_movement_driving_bullet_pattern="ExampleBoxMovePattern"
>
    <hitbox radius="37" offset="-10,0" />
  </entity>



      <bullet_pattern name="ExampleBoxMovePattern">
<bullet speed="200" angle="180" shot_type="HexishellEmblazonedYellow" relative="true" uses_direct_location_control="true" location="150,300">
<die/>
    <loop iterations="-1">
<change uses_direct_location_control="true" location="300,300" time="0.5"/>
<wait time="1" />
<change uses_direct_location_control="true" location="-300,300" time="0.5"/>
<wait time="1" />
<change uses_direct_location_control="true" location="-300,-300" time="0.5"/>
<wait time="1" />
<change uses_direct_location_control="true" location="300,-300" time="0.5"/>
<wait time="1" />
</loop>
</bullet>
  </bullet_pattern>

And for EffectType.StartMovementDrivingPattern

Code: [Select]
  <system name="InteruptMovementSystem"
category="DirectUseSystem"
fire_rate="5"
ammo="10"
cue_time="0"
image_name="MolarBlue"
firing_timing="AllTheTime"
>
<effect timing="OnUse" targeting="Self" type="StartMovementDrivingPattern" related_pattern="ExampleBoxMovePattern"/>
  </system>

Part of the wiki problem is that searching is awkward for me using Chrome. The search is case sensitive and information is spread across pages, especially with modifiers and effects.

Thanks again for your help Keith. I'm trying to document my successes so that future generations have examples to work from.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 25, 2016, 09:47:02 PM
typo in those effect tags:

targeting instead of targetting

And the value "OnUse_ParentEntity" isn't valid; valid values are:

    Player
    AllEnemies
    AllPlayerFamiliars
    AllShots
    AllEnemyShots
    AllPlayerShots
    Self
    AllNormalEnemiesAndShots
    NonCondemnedBossesAndShots
    AllAutoPickups

In this case, I believe Self is what you want.
Title: Re: XML questions and answers
Post by: ptarth on January 25, 2016, 10:34:47 PM
Thank you. I...   :'( .... I think this is the point where I join Cinth and Misery and giant blocks of hat wear cheeses.


I'm taking a break now after sending Misery some updates.
Title: Re: XML questions and answers
Post by: ptarth on January 27, 2016, 08:01:56 PM
Okay, I mostly got the movement stuff sorted out. i'm having some oddity in entities moving slowly or quickly towards a location, I think that might have to do with mixing fixed/relative/location attributes. I have this idea for a train boss that moves on a couple of different fixed paths with him "entering an exit" at the edge of the screen and then teleporting to a different "entrance" using the locations. It is having teleport issues. However, since there is a demand for low level enemies I've been workgin on those instead. Interestingly using fixed locations can move your entity outside of the map boundaries, which has some potential (and potential for trouble). If you want to keep entities inside the boundaries, relative movement using angle and speed seems to be the way to go.

My current problem is in regards to using the bullet attribute follows_previously_spawned_entity. The wiki entry:

Code: [Select]
follows_previously_spawned_entity (bool)
*makes this entity follow the last entity spawned by this operation
*for now [b]only[/b] works with a pattern triggered by an entity's [u]spawning_patterns[/u] attribute
*also, only takes effect on an entity after the spawning bullet behavior has concluded (without a die tag); before that point the bullet pattern itself decides where it moves

entity attribute spawning_patterns
Code: [Select]
spawning_patterns (List<bullet_pattern>)
when this entity is spawned by room-generation, instead of just spawning one at the center of the corresponding tile, it picks one of the bullet patterns in this list, then spawns one entity per bullet node that's a direct child of the pattern (so child nodes that do their own spawns don't count)

What I think I figured out at this point in writing this is that it works like this:
An Entity Y with spawning_pattern X spawns in a room. Entity Y then spawns new entities around it in the pattern specified by spawning_pattern X. Those entities then move according spawning_pattern X.

Which is great, except it is nothing that I was interested in using. I wanted to get bullets to follow bullets, but wait, shots are entities. But bullets aren't shots. So never mind again.

And now if anyone else has this bright idea they can save themselves some trouble, unless I'm completely wrong.
Title: Re: XML questions and answers
Post by: ptarth on January 28, 2016, 12:13:17 AM
Welcome to today's show, 'The Mystery of the Two Bodied Snake'. In this chilling tale we see what should be a terrifying pink, gold, and white snake, is even more disturbing as it has extra bodies!

The code for today's mystery is
Code: [Select]
<entity name="AbmoogBasic" ship_category="LocalGuard_1x1"
    category="Ship"
    display_name="Basic Abmoog"
    behavior="CardinalMover"
    speed="1" acceleration="50"
    max_health="25"
    image_folder="Enemy_Pursuers" image_name="Abmoog1Green"
    time_to_visually_rotate_180_degrees="2"
    >
    <hitbox radius="26" />
<system type="AbmoogBasicSystem" offset="0,0" />
  </entity>


 
 <system name="AbmoogBasicSystem"
   category="Weapon"
   shot_type="ClipperWhite"
   damage_type="Ballistic"
   attack_power="1"
   fire_rate="5"
   cue_time = "0"
   range_actual="600"
   shots_per_salvo="1"
   shot_speed="0"
   targeting_logic="Direct"
   image_name="Invisible"
   firing_timing="OnlyinRange"
   initial_firing_delay ="0"
   special_bullet_patterns="SnakePattern"
>
</system>

    <bullet_pattern name="SnakePattern">
  <bullet angle="0" speed="0">
<spawn>
<bullet_pattern>
$SnakeShot SHOT_TYPE=ClipperRed TIME=0.5 SPEED=300
</bullet_pattern>
</spawn>

<loop iterations="2">
<wait time="0.1"/>
<spawn>
        <bullet_pattern>
$SnakeShot SHOT_TYPE=TorchWhite TIME=0.5 SPEED=300
</bullet_pattern>
</spawn>
<wait time="0.1"/>
<spawn>
        <bullet_pattern>
$SnakeShot SHOT_TYPE=TorchGolden TIME=0.5 SPEED=300
</bullet_pattern>
</spawn>
<wait time="0.1"/>
</loop>
</bullet>
  </bullet_pattern>

 
    <var name="SnakeShot">
<bullet angle="0" speed="[SPEED]" shot_type="[SHOT_TYPE]" relative="true">
<loop iterations="-1">
<change angle="90" speed="0" relative="true" time="[TIME]"/>
<change angle="-90" speed="0" relative="true" time="[TIME]"/>
<change angle="-90" speed="0" relative="true" time="[TIME]"/>
<change angle="90" speed="0" relative="true" time="[TIME]"/>
</loop>
</bullet>
  </var>
 


What it should hypothetically produce is a snake like shot pattern with a pink head and alternating white and gold body segments. By changing the loop iteration count you should be able to increase the length of the snake. Our home viewers are encouraged to try it.

Now, here are images of loop iteration = 2 and 3. Note that the head and first 2 bodies pieces are fine and normal. But every white segment after the first is doubled! Increasing the length of the snake continues this pattern. I've no idea what is causing it. I'm going to try some more things, but I'm posting this as a morale booster.

Further information. It doesn't depend upon the color of the shot. Whichever one is topmost in the loop is doubled. It doesn't change with the addition of additional shots, body segment pattern sizes or 3 & 4 produce as expected with the first still being doubled.

I can confirm that this is the case, the loop is making the first line occur twice. Code that demonstrates:

Code: [Select]
    <var name="SnakeLoopShot">
<bullet angle="0" speed="100" shot_type="SpikeGreen" relative="false" interval_mult="1">
<loop iterations="-1">
<change self_scale="1"/>
<change angle="45" speed="100" relative="false" time=".5"/>
<change angle="-45" speed="100" relative="false" time=".5"/>
</loop>
</bullet>
  </var>
 
      <var name="SnakeNoBuffLoopShot">
<bullet angle="0" speed="100" shot_type="SpikeRed" relative="false" interval_mult="1">
<loop iterations="-1">
<change angle="45" speed="100" relative="false" time=".5"/>
<change angle="-45" speed="100" relative="false" time=".5"/>
</loop>
</bullet>
  </var>
 
 
      <var name="SnakeNoLoopShot">
<bullet angle="0" speed="100" shot_type="SpikeYellow" relative="false" interval_mult="1">
<change angle="45" speed="100" relative="false" time=".5"/>
<change angle="-45" speed="100" relative="false" time=".5"/>
<change angle="45" speed="100" relative="false" time=".5"/>
<change angle="-45" speed="100" relative="false" time=".5"/>
<change angle="45" speed="100" relative="false" time=".5"/>
<change angle="-45" speed="100" relative="false" time=".5"/>
<change angle="45" speed="100" relative="false" time=".5"/>
<change angle="-45" speed="100" relative="false" time=".5"/>
</bullet>
  </var>
 

These are 3 patterns that should produce identical behaviors for the first 8 turns. After that the Yellow no loop shot should depart on its way. Attached is a screenshot demonstrating what does occur. On the first loop, the Red shot exits, then every loop cycle after that you can see it increase in distance. Note that the Green shot stays in proper position. So a quick and ugly solution is to add a change size line as the first line in your loop.

On an off note, it used to be you could have loop iterations=0 work, but not it forces at least 1 cycle. I'm mantising.
Title: Re: XML questions and answers
Post by: Misery on January 28, 2016, 05:49:54 PM
This looks complicated
Title: Re: XML questions and answers
Post by: zharmad on January 29, 2016, 08:52:44 AM
How can I make a particular shot in a bullet pattern richochet off terrain? I've only seen modifiers in the system entities, which will be ignored by a special bullet pattern.
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 08:57:32 AM
I've only seen it as a system modifier and it's usually an all or nothing flag.
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 09:03:38 AM
How can I make a particular shot in a bullet pattern richochet off terrain? I've only seen modifiers in the system entities, which will be ignored by a special bullet pattern.

Modifiers like that affect bullets in patterns actually.
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 09:19:50 AM
How can I make a particular shot in a bullet pattern richochet off terrain? I've only seen modifiers in the system entities, which will be ignored by a special bullet pattern.

Modifiers like that affect bullets in patterns actually.

While this is true, the usage zharmad is looking for isn't possible (as far as I know).
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 09:33:20 AM
What you'd need is basically multiple systems.  That's the only way to get a combination of bullets that bounce and ones that do not.

I've never really found the need for a function beyond that, myself, or I'd have requested it awhile ago.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 12:18:07 PM
https://www.arcengames.com/mediawiki/index.php?title=Starward_Rogue:XML_-_Modifier_Definitions#Contexts_In_Which_You_Can_Use_A_Modifier_Tag

bullet nodes can take modifier sub-nodes, with target="Self", and they should impact just that bullet. RicochetsOffTerrain is probably the modifier type you're looking for.
Title: Re: XML questions and answers
Post by: zharmad on January 29, 2016, 02:48:16 PM
https://www.arcengames.com/mediawiki/index.php?title=Starward_Rogue:XML_-_Modifier_Definitions#Contexts_In_Which_You_Can_Use_A_Modifier_Tag

bullet nodes can take modifier sub-nodes, with target="Self", and they should impact just that bullet. RicochetsOffTerrain is probably the modifier type you're looking for.

That's the thing, it didn't work. Granted, I was changing angles and speeds of the bouncing bullet, but this shouldn't impact their richochet behaviour?

Okay just tested. The bullets are "richochay-ing" during a <wait> tag, but not a <change angle...> tag. Specifically, the richochet won't work if it's currently changing the angle (and will die), but will still richochet if it's just changing the speed.

...um, can this be fixed? It seems like a bug, and I was kinda hoping for, well, bouncing and curving boomerangs for my Australian-aboriginal warriors.
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 03:10:22 PM
You sir, are evil.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 03:11:00 PM
Oh, ok. Yea, if you've got a bullet-pattern telling it what angle to use at that time, that conflicts with the ricochet logic. It can't honor both. I don't really see a fix there, since the requirements are mutually exclusive.

You could give the bullets the modifiers for ignoring terrain; it wouldn't ricochet but it could arc through walls or whatever.

I don't think "a boomerang that acts like a boomerang unless it hits a wall, then it ricochets off and starts acting like a boomerang again" is something the engine can reasonably handle at this time :)

Though I guess you _could_ give it a system that causes "boomerang fragments" to spray out on death of the bullet, so when it hits the wall it "shatters". It wouldn't be relative to the angle of the collision, though.

Edit: though you could have the fragments fly in a fan towards the player using the relative-to-player logic.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 03:20:43 PM
What about micro-turns?
Something like?

<loop iterations="180">
<change self_size="1">
<change angle="1" relative="true" time="0.0">
<wait time="0.1">
</loop>

IIUC that should allow for the bounce in between rotations. Also, don't forget to deal with your pants.
Updated for Keith.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 03:23:54 PM
Sure, if all the angle changes are instantaneous it shouldn't block the ricochet logic. And the loop would keep it from being an insane volume of text. Though for that particular loop you'd need to use the flag for suppressing the "after the first iteration, skip the first action inside the loop" bug.
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 03:28:58 PM
This is why I ask for help on patterns, you guys are giving me a headache ;)
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 03:34:04 PM
This is why I ask for help on patterns, you guys are giving me a headache ;)

<loop iterations="-1">
    <bang head="into_wall" />
</loop>
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 03:40:34 PM
Speaking of which, angle changes:  annoying.   Cant get it to turn in the CORRECT direction.

Just.... lots of weird crap today too.  Sent Chris an email about it just now.

I swear this game is aggravating on purpose sometimes.  It's a conspiracy somehow.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 03:41:53 PM
if(user=="Misery")
    give_user("Misery");
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 03:44:32 PM
<system name="Face"
   fire_rate="1" shot_type="palm"
   range_actual="1" attack_power="1"
   shots_rubber_band_to_firing_system="true"
   shots_do_friendly_fire_after_time=".01"
   category="PlayerDirectedWeapon" targeting_logic="Direct">
</system>
   
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 03:46:32 PM
You forgot:

firing_timing="AllTheTime"
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 03:48:03 PM
You forgot:

firing_timing="AllTheTime"

Happy meow?
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 03:51:25 PM
Happy meow?
You put it after the >! All the exemel smoke will get out!
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 03:52:55 PM
Happy meow?
You put it after the >! All the exemel smoke will get out!

Now it has been refined to be controllable by the user.  Gotta love iterative processes.


For the record, Keith sounded just like my ArcenDebugLog reads.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 04:00:15 PM
Speaking of which, angle changes:  annoying.   Cant get it to turn in the CORRECT direction.

Just.... lots of weird crap today too.  Sent Chris an email about it just now.

I swear this game is aggravating on purpose sometimes.  It's a conspiracy somehow.

I swear that relative works in different ways, especially when you are mixing in angle , rotate_around_entity, move_with_entity, use_real_locations, set_distance_from_entity, and set_angle_from_entity. I'm also still having a nervous breakdown about this loop issue. I see in the secret path notes there is a secret problem with pants, wherein it skips the first line in a loop, but the problem I've been having is that I see the first line being repeated twice in every loop after the first. And Keith just sits there smiling.... smiling....

On the bright side, the code I wrote above will fix my nonbouncing snake issue. Of course now I have to go back and change everything from time units to angle units per unit of time, and add more time, but this is for bouncing snakes!
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 04:06:32 PM
Happy meow?
You put it after the >! All the exemel smoke will get out!

Now it has been refined to be controllable by the user.  Gotta love iterative processes.


For the record, Keith sounded just like my ArcenDebugLog reads.

I look in there, and I keep wondering why it says "Verbosity Verbosity" in a large variety of places.

Just... confusing....

It's a conspiracy, I tell you!


Speaking of which, angle changes:  annoying.   Cant get it to turn in the CORRECT direction.

Just.... lots of weird crap today too.  Sent Chris an email about it just now.

I swear this game is aggravating on purpose sometimes.  It's a conspiracy somehow.

I swear that relative works in different ways, especially when you are mixing in angle , rotate_around_entity, move_with_entity, use_real_locations, set_distance_from_entity, and set_angle_from_entity. I'm also still having a nervous breakdown about this loop issue. I see in the secret path notes there is a secret problem with pants, wherein it skips the first line in a loop, but the problem I've been having is that I see the first line being repeated twice in every loop after the first. And Keith just sits there smiling.... smiling....

On the bright side, the code I wrote above will fix my nonbouncing snake issue. Of course now I have to go back and change everything from time units to angle units per unit of time, and add more time, but this is for bouncing snakes!

I found even more weirdness with that stuff today.

I've sent an update, load up my main test chamber, and just sit there and let the boss fire for awhile; dont move at all, and watch what it does.  Hint, those other circles arent supposed to form. They shouldnt be ABLE to form. Well, they're not supposed to BE circles, but that best showed off the bizarre thing it's doing, so that's why it's like that.   I couldnt get the angles to do what I wanted anyway.  AND the game just ignores loops sometimes, I dont get that either.  Take "relative=true" out of those angle changes, and the looping just doesnt happen.  Among other possible ways to make it not loop.

I just... I dont even.

At least it's not the Warden again.  I'm going to keep repeating that.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 04:07:39 PM
For the record, Keith sounded just like my ArcenDebugLog reads.

I wish I had that problem. Here is my debug reads:

Code: [Select]
Error Opening vars file: System.Xml.XmlException: 'wait' is expected file:///D:/Steam/steamapps/common/Starward Rogue/RuntimeData/Configuration/BulletPatternVariables/Ptarth_BulletVarsSubmission.xml Line 32, position 9.
  at Mono.Xml2.XmlTextReader.Expect (System.String expected) [0x00000] in <filename unknown>:0
  at Mono.Xml2.XmlTextReader.ReadEndTag () [0x00000] in <filename unknown>:0
  at Mono.Xml2.XmlTextReader.ReadContent () [0x00000] in <filename unknown>:0
  at Mono.Xml2.XmlTextReader.Read () [0x00000] in <filename unknown>:0
  at System.Xml.XmlTextReader.Read () [0x00000] in <filename unknown>:0
  at Mono.Xml.EntityResolvingXmlReader.Read () [0x00000] in <filename unknown>:0
  at Mono.Xml.Schema.XsdValidatingReader.Read () [0x00000] in <filename unknown>:0
  at System.Xml.XmlValidatingReader.Read () [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNode (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.Load (System.Xml.XmlReader xmlReader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.Load (System.String filename) [0x00000] in <filename unknown>:0
  at BulletPatternDataTable.DoPreInitializationLogic () [0x00000] in <filename unknown>:0 :    D:/Steam/steamapps/common/Starward Rogue/RuntimeData/Configuration/BulletPatternVariables/Ptarth_BulletVarsSubmission.xml

   at System.Environment.get_StackTrace()
   at ArcenDebugging.ArcenDebugLog(System.String Message, DebugLogDestination Destination, Boolean IncludeStackTrace, Verbosity Verbosity)
   at ArcenDebugging.ArcenDebugLog(System.String Message, DebugLogDestination Destination, Verbosity Verbosity)
   at ArcenDebugging.ArcenDebugLog(System.String Message, Verbosity Verbosity)
   at EngineConfig.WriteToErrorFile(System.String ErrorFile, System.String ErrorName, System.String ErrorText, Boolean SuppressArcenDebugLog)
   at EngineConfig.WriteToErrorFile(System.String ErrorFile, System.String ErrorName, System.String ErrorText)
   at BulletPatternDataTable.DoPreInitializationLogic()
   at ArcenDynamicTable`1.Initialize(Boolean IsPostInitReParse)
   at Game.GameForm_Load()
   at Game.ContinueInitializeGame()
   at Game.ContinueMultiStageProcess()
   at ArcenMainCameraImplementations.MainUpdateLogic()
   at MainCameraLogic.Update()

1/29/2016 7:54:07 AM
Errors in reading GameEntityTypeDataTable
internal name 'PlayerRedBlack' occured more than once
internal name 'AbmoogSnakeHandler' occured more than once
internal name 'AbmoogHitSideStep' occured more than once
internal name 'AbmoogHitPhase' occured more than once
internal name 'AbmoogJanitor' occured more than once
internal name 'AbmoogSideStep' occured more than once
internal name 'AbmoogPhaseOut' occured more than once
internal name 'KamikazeInvaderMinion' occured more than once
internal name 'InvaderMinion' occured more than once
internal name 'InvaderMinion1' occured more than once
internal name 'InvaderMinion2' occured more than once
internal name 'InvaderMinion3' occured more than once
internal name 'InvaderMinion4' occured more than once
internal name 'InvaderMinion5' occured more than once
internal name 'InvaderBoss' occured more than once
internal name 'ReanimatorBoss' occured more than once
internal name 'ReanimatorBossStage2' occured more than once
internal name 'ReanimatorBossStage3' occured more than once
internal name 'ReanimatorBossStage4' occured more than once
internal name 'ZombieMech' occured more than once
internal name 'ZombieMechFamiliar' occured more than once
internal name 'BrokenZombieMech' occured more than once
internal name 'ZombiePartPile' occured more than once
internal name 'ZombieGoodPartPile' occured more than once     1/29/2016 7:54:07 AM
GameInit (1 - 1/29/2016 7:54:07 AM)     1/29/2016 7:54:08 AM
Version: 1.009     1/29/2016 7:54:08 AM
sound file count: 509     1/29/2016 7:54:08 AM
sound loading finished     1/29/2016 7:54:08 AM
GameInit (2 - 1/29/2016 7:54:08 AM)     1/29/2016 7:54:16 AM
GameInit (3 - 1/29/2016 7:54:16 AM)   
Also Internal failure in that other bullet pattern, but we aren't going to tell you about it. Instead we are going to use the previous version that sorta worked, and keep using it regardless of the changes you made to the pattern, because you have a typo. After you start crying, then we'll consider giving you a fatal error which will remind you to restart the game and notice the pattern won't load. Or perhaps we'll not do anything and see if you notice that your patternslog file has changed again. And for fun, let's add an extra " and see if you notice.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 04:11:55 PM
Take "relative=true" out of those angle changes, and the looping just doesnt happen.  Among other possible ways to make it not loop.

Oh, I think I know this one, are you doing loops of something like:
<loop iterations = "-1">
<change angle="90", relative="false"/>
</loop>

If so, then once the absolute angle is 90 degrees, it won't change anymore, because it already 90 degrees. So you'll get a shot that makes a single 90 degree turn then stays in that direction. Of course, someone needs to be beaten for having 90 degrees being backwards of a healthy persons idea of 90 degrees, and sometimes it seems that it is relatively to another range angle or to the entity or its parent entity, but that's another issue.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 04:12:29 PM
I see in the secret path notes
Well, it's in the XML docs too. Though I think people try to read those like they're animal entrails.


Quote
there is a secret problem with pants, wherein it skips the first line in a loop, but the problem I've been having is that I see the first line being repeated twice in every loop after the first.
Bizarre. The pants aren't on the head anymore... but it's wearing two pair.

wear_one_and_exactly_one_pair_of_pants="true"

If you could give me a reproducible case for that one I could take a look.


Quote
bouncing snakes!
And I'm the tormentor?
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 04:14:05 PM
For the record, Keith sounded just like my ArcenDebugLog reads.

I wish I had that problem. Here is my debug reads:

Code: [Select]
Error Opening vars file: System.Xml.XmlException: 'wait' is expected file:///D:/Steam/steamapps/common/Starward Rogue/RuntimeData/Configuration/BulletPatternVariables/Ptarth_BulletVarsSubmission.xml Line 32, position 9.
  at Mono.Xml2.XmlTextReader.Expect (System.String expected) [0x00000] in <filename unknown>:0
  at Mono.Xml2.XmlTextReader.ReadEndTag () [0x00000] in <filename unknown>:0
  at Mono.Xml2.XmlTextReader.ReadContent () [0x00000] in <filename unknown>:0
  at Mono.Xml2.XmlTextReader.Read () [0x00000] in <filename unknown>:0
  at System.Xml.XmlTextReader.Read () [0x00000] in <filename unknown>:0
  at Mono.Xml.EntityResolvingXmlReader.Read () [0x00000] in <filename unknown>:0
  at Mono.Xml.Schema.XsdValidatingReader.Read () [0x00000] in <filename unknown>:0
  at System.Xml.XmlValidatingReader.Read () [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNodeCore (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.ReadNode (System.Xml.XmlReader reader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.Load (System.Xml.XmlReader xmlReader) [0x00000] in <filename unknown>:0
  at System.Xml.XmlDocument.Load (System.String filename) [0x00000] in <filename unknown>:0
  at BulletPatternDataTable.DoPreInitializationLogic () [0x00000] in <filename unknown>:0 :    D:/Steam/steamapps/common/Starward Rogue/RuntimeData/Configuration/BulletPatternVariables/Ptarth_BulletVarsSubmission.xml

   at System.Environment.get_StackTrace()
   at ArcenDebugging.ArcenDebugLog(System.String Message, DebugLogDestination Destination, Boolean IncludeStackTrace, Verbosity Verbosity)
   at ArcenDebugging.ArcenDebugLog(System.String Message, DebugLogDestination Destination, Verbosity Verbosity)
   at ArcenDebugging.ArcenDebugLog(System.String Message, Verbosity Verbosity)
   at EngineConfig.WriteToErrorFile(System.String ErrorFile, System.String ErrorName, System.String ErrorText, Boolean SuppressArcenDebugLog)
   at EngineConfig.WriteToErrorFile(System.String ErrorFile, System.String ErrorName, System.String ErrorText)
   at BulletPatternDataTable.DoPreInitializationLogic()
   at ArcenDynamicTable`1.Initialize(Boolean IsPostInitReParse)
   at Game.GameForm_Load()
   at Game.ContinueInitializeGame()
   at Game.ContinueMultiStageProcess()
   at ArcenMainCameraImplementations.MainUpdateLogic()
   at MainCameraLogic.Update()

1/29/2016 7:54:07 AM
Errors in reading GameEntityTypeDataTable
internal name 'PlayerRedBlack' occured more than once
internal name 'AbmoogSnakeHandler' occured more than once
internal name 'AbmoogHitSideStep' occured more than once
internal name 'AbmoogHitPhase' occured more than once
internal name 'AbmoogJanitor' occured more than once
internal name 'AbmoogSideStep' occured more than once
internal name 'AbmoogPhaseOut' occured more than once
internal name 'KamikazeInvaderMinion' occured more than once
internal name 'InvaderMinion' occured more than once
internal name 'InvaderMinion1' occured more than once
internal name 'InvaderMinion2' occured more than once
internal name 'InvaderMinion3' occured more than once
internal name 'InvaderMinion4' occured more than once
internal name 'InvaderMinion5' occured more than once
internal name 'InvaderBoss' occured more than once
internal name 'ReanimatorBoss' occured more than once
internal name 'ReanimatorBossStage2' occured more than once
internal name 'ReanimatorBossStage3' occured more than once
internal name 'ReanimatorBossStage4' occured more than once
internal name 'ZombieMech' occured more than once
internal name 'ZombieMechFamiliar' occured more than once
internal name 'BrokenZombieMech' occured more than once
internal name 'ZombiePartPile' occured more than once
internal name 'ZombieGoodPartPile' occured more than once     1/29/2016 7:54:07 AM
GameInit (1 - 1/29/2016 7:54:07 AM)     1/29/2016 7:54:08 AM
Version: 1.009     1/29/2016 7:54:08 AM
sound file count: 509     1/29/2016 7:54:08 AM
sound loading finished     1/29/2016 7:54:08 AM
GameInit (2 - 1/29/2016 7:54:08 AM)     1/29/2016 7:54:16 AM
GameInit (3 - 1/29/2016 7:54:16 AM)   
Also Internal failure in that other bullet pattern, but we aren't going to tell you about it. Instead we are going to use the previous version that sorta worked, and keep using it regardless of the changes you made to the pattern, because you have a typo. After you start crying, then we'll consider giving you a fatal error which will remind you to restart the game and notice the pattern won't load. Or perhaps we'll not do anything and see if you notice that your patternslog file has changed again. And for fun, let's add an extra " and see if you notice.

How.... how are you supposed to make sense of that?
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 04:15:42 PM
How.... how are you supposed to make sense of that?
The only way to win is not to play.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 04:17:50 PM
Maybe I should take the time to add support for "if there's an attribute that doesn't match something the code actually looks at, fuss". It's... involved, but I think the alternative is cthulhan for some of the content editors.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 04:19:09 PM
I see in the secret path notes
Well, it's in the XML docs too. Though I think people try to read those like they're animal entrails.

I've saved copies of the xml docs locally, because otherwise I end up performing DOS attacks against the wiki server. As a simple person, when I look for bullet properties I have this naive hope it will be all together, instead I have to check: bulletpatterns, systems, modifiers, effects, and occasional entities to find the property modifier effect attribute subnode THINGIE I need. And because I forget where I found it last time, I have to do it every time (almost). I also have to open enums a few times, just to get to the right section. And let's not get into targetting versus target versus targeting.


Quote
Quote
there is a secret problem with pants, wherein it skips the first line in a loop, but the problem I've been having is that I see the first line being repeated twice in every loop after the first.
Bizarre. The pants aren't on the head anymore... but it's wearing two pair.

wear_one_and_exactly_one_pair_of_pants="true"

If you could give me a reproducible case for that one I could take a look.

gibbering maddness ensues...
https://www.arcengames.com/mantisbt/view.php?id=18584
https://www.arcengames.com/mantisbt/view.php?id=18585
https://www.arcengames.com/forums/index.php/topic,18335.msg198033.html#msg198033
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 04:19:35 PM
How.... how are you supposed to make sense of that?
The only way to win is not to play.

Yeah, that'd probably be pretty much my reaction to it (and I wonder how many people would know where that line is from).  That and something thrown at the wall.

I mean, that whole thing may as well just read "LOL NOPE!" as far as I'm concerned.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 04:22:33 PM
gibbering maddness ensues...
My apologies, I don't actually crawl mantis (or most of the forums) myself, Chris just puts stuff on my list. Will take a look.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 04:28:36 PM
No worries. The optimal placement of the criterion for separating signal to noise means you are going to miss things at times.

Or Chris hates me....

Have some snakes.
Title: Re: XML questions and answers
Post by: zharmad on January 29, 2016, 04:31:50 PM
Yeah okay, so they can't easily & smoothly (non-instantly) track the player *and* bounce-ish. Okay, I can live with that.

Also, this tag doesn't work:
            requires_firing_system_range_to_player_more_than_or_equal_to="[TRIGGER_DMIN]"
while this tag does:
            requires_firing_system_range_to_player_less_than_or_equal_to="[TRIGGER_DMAX]"

Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 04:35:38 PM
Have some snakes.
Why does it always have to be snakes?
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 04:38:00 PM
My debug logs aren't bad because I'm using something that was already written and tested, I'm just making changes that fit what I want (usually).  I also do stuff in very small batches so if it doesn't work, I know where to look (generally speaking).  At that point I either find another example to use or hit up the wiki for alternatives.

My approach, small bytes ;)
Have some snakes.
Why does it always have to be snakes?

Indy, Indy ! LOOK OUT!
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 04:45:04 PM
Have some snakes.
Why does it always have to be snakes?

Could be worse.

Could be bigger Blaze Turrets.
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 04:45:42 PM
Could be worse.

Could be bigger Blaze Turrets.

We already have those.....
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 04:53:09 PM
Maybe we need a shop item that gives immunity to blaze turret...
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 05:05:43 PM
Just buff Flak Turrets back to where they were.  100% sure all Blaze Turret complaints stop.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 05:07:03 PM
Just buff Flak Turrets back to where they were.  100% sure all Blaze Turret complaints stop.
Now we know how all those AI ships coming out of a wormhole feel...
Title: Re: XML questions and answers
Post by: Misery on January 29, 2016, 05:09:56 PM
Could be worse.

Could be bigger Blaze Turrets.

We already have those.....

Blaze Turrets ARE the bigger one.  The blue version that fires 2 bolts.  The red weaker ones are Blaze Cannons.

I could always put the Turrets back to where they used to be, where they fired 4 of those shots in a spread.... it's tempting.  Weren't those fun?
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 05:16:23 PM
I enjoyed having to bait the damned things to shoot one way as I sprinted the other way  :P
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 05:21:44 PM
Hey Keith, while you are around, can you take a quick look at this? See attached image. The shots all being given the same instructions and should be in a nice line, but as you can see they start deviating and it only gets worse. My guess is that rounding precision in position, angle, and speed is causing the deviance. Does that seem to be the case to you? Or is there something else going on that might be driving it?

Code is a series of small angle changes in a sequence of small steps.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 05:26:57 PM
Hmm, it's probably due to the length of time between frames not being fixed. Which kind of works out to a precision issue, yes, but I don't think it's something that's fixed by using double-precision instead of single-precision floating point.

It's something I could investigate, with a test case.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 06:15:11 PM
That makes a lot of sense. Most small change iterations I've seen do it, but I'm also running on a older monitor, which doesn't have the snazzy refresh rates  others have. Here is bullet_pattern code that does it for me. Just stick it on a weapon system of your choice. It doesn't have to be this long, but I made it this way to see if it was a looping issue.

Code: [Select]
          <bullet_pattern name="SnakeShot2">
<bullet angle="0" speed="200" shot_type="TorchRed" relative="true" shot_is_not_stopped_by_hitting="true">
<loop iterations="15" take_pants_off_head="true">
<change self_scale="1"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<change angle="5" relative="true" speed="0" time="0.10"/>
<wait time="0.15"/>
</loop>
</bullet>
  </bullet_pattern>


My brilliant observation of the morning is that I can grep my local wiki doc html files to look for things I'm trying to find rather than use find in chrome.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 06:29:37 PM
I swore there was something in the wiki docs about time-based rather than refresh-rate based actions, but I can't find it. Am I misremembering? Anyone else recall or know what it was?
Title: Re: XML questions and answers
Post by: Cinth on January 29, 2016, 06:43:42 PM
No idea.

Would something like this work if you set the first shots path?

follows_previously_spawned_entity
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 09:46:50 PM
On SnakeShot2, I did see the imprecision you saw (it's not a monitor-refresh-rate thing, btw, but rather sim frame rate; once our game sends the bits off to the video card it honestly doesn't care what happens to them or when), but if I did something very similar but not as broken up:

      <loop iterations="600" take_pants_off_head="true">
        <change angle="10" relative="true" speed="0" time="0.20"/>
        <wait time="0.15"/>
      </loop>

It seems to work fine. I'm not able to see any shots getting demonstrably "out of line". Possibly they would on lower framerates. You could perhaps make the changes coarser to deal with it should that come up.

Anyway, in general our engine is floating-point based and not fixed-frame-length and so there are limits to the precision. If you don't want to hit them, don't try so hard ;) If you want pixel-perfect motion the location-based patterns probably do a decent job of that, though getting a smooth arc there would be excessively painful.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 10:33:00 PM
gibbering maddness ensues...
https://www.arcengames.com/mantisbt/view.php?id=18584
https://www.arcengames.com/mantisbt/view.php?id=18585
https://www.arcengames.com/forums/index.php/topic,18335.msg198033.html#msg198033
Ok, I think those are dealt with.

Quote from: zharmad
Also, this tag doesn't work:
            requires_firing_system_range_to_player_more_than_or_equal_to="[TRIGGER_DMIN]"
while this tag does:
            requires_firing_system_range_to_player_less_than_or_equal_to="[TRIGGER_DMAX]"

what about:
            requires_firing_system_range_to_player_greater_than_or_equal_to="[TRIGGER_DMIN]"
?
Title: Re: XML questions and answers
Post by: zharmad on January 29, 2016, 10:55:07 PM
requires_firing_system_range_to_player_greater_than_or_equal_to

I swear, every time I looked at the wiki in the last 24 hours it said more_than instead of greater_than, up until you mentioned it.

Okay, I'd have one really REALLY aggravating complaint, which is that commenting can really break your interpreter (especially multiline commenting. It's not helping.
Title: Re: XML questions and answers
Post by: ptarth on January 29, 2016, 11:08:38 PM
requires_firing_system_range_to_player_greater_than_or_equal_to

I swear, every time I looked at the wiki in the last 24 hours it said more_than instead of greater_than, up until you mentioned it.

I think he wrote a script to change parts of the wiki, at random, every few hours.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 29, 2016, 11:22:58 PM
I think he wrote a script to change parts of the wiki, at random, every few hours.
Don't be ridiculous.

I delegated that.
Title: Re: XML questions and answers
Post by: zharmad on January 30, 2016, 12:01:40 AM
Well, it would help if the interpreter is also fussy on, e.g. not reading multi-line comments. I'm losing the motivation to stay up at 1am bug fixing what's otherwise perfectly fine code, except that your interpreter ignores the entire file.

You ain't getting nothing until you make me a proper debug tool. ;)
Title: Re: XML questions and answers
Post by: ptarth on January 30, 2016, 01:46:41 AM
Well, it would help if the interpreter is also fussy on, e.g. not reading multi-line comments. I'm losing the motivation to stay up at 1am bug fixing what's otherwise perfectly fine code, except that your interpreter ignores the entire file.

You ain't getting nothing until you make me a proper debug tool. ;)

Have you checked the BulletScriptErrors.txt log? That's usually where I die.

I've been experimenting with how good the angular and time precision is:
I'm trying to make bouncy snakes. Shots that follow each other with tight precision in an S curve pattern that ricochet off walls and then home in on the player. I had given up before because I couldn't keep them in line and thus they deteriorated into a swarm of bees. (Swarm of bees or school of fish shots...). Then my hope was rekindled after the boomerangs. So I tried and failed and then decided to try a precision test.

Procedure
Setup 7 trials, each of which should take the same length of time to complete an 180 degree turn.

Loops # of loops performed
Angle = Degrees change per loops
Time = How long each loop step should take
Code: [Select]
TorchWhite   Loops=1    ANGLE=-179 TIME=1.8
TorchRed   Loops=170  ANGLE=-1   TIME=0.01
TorchEmblazonedYellow Loops=90   ANGLE=-2   TIME=0.02
TorchYellow   Loops=60   ANGLE=-3   TIME=0.03
TorchBlue   Loops=45   ANGLE=-4   TIME=0.04
TorchGreen            Loops=36   ANGLE=-5   TIME=0.05
TorchPurple           Loops=30   ANGLE=-6   TIME=0.06
TorchPink             Loops=25.7 ANGLE=-7   TIME=0.07
Notes:
Loops=25.7 I just noticed I asked for it to loop float number of times. I'm not sure what it did, probably rounded down.
Why 179 instead of 180? 180 could go either clockwise or counter-clockwise. I've had it even happen with values in the low 170s. This seemed to work fine here.
Also, my results may be related to system load or system specs, which means they are only valid for me.

Discussion
Only the 179 turn made it. The 1 degree turn just gave up and went straight. I don't think it is a take_pants_off_head problem.

Trying again with large angles.
Changed to angles 8-14, with respective changes made to loops and time.

Discussion
They do better. After 2 S turns even the 179 degree turn shot stream isn't in single file any more.

Conclusion
Keep angles above 15 and with rotations longer than 1.8 seconds if you really need precision. Tight, high precision bouncing snakes and boomerangs probably aren't going to happen very well. Regular jumping snakes will have to suffice. Invest in bees.

Pictures:
Test 1: Red gives up
Test 2: Everyone is together at first
Test 2: After 2 S curves
Test 2: After more than that S curves
Title: Re: XML questions and answers
Post by: zharmad on January 30, 2016, 11:14:55 AM
 So I went with bouncing, non-curving boomerangs, given that any significant curving is liable to make it collide with something during the frame it is changing angles.

 = = =

.. Is there anyway to make a bullet point in an absolute direction regardless of the orientation of the parent entity AND the player? I want to synch up a particular system when it fires, in terms of the angles from one firing trigger to the next. The blademorphs image is attached (they convert between offensive and defensive depending on distance to the player, updated every ~0.6 seconds or so.) - there's a desynch each time the system fires, but if I leave a bullet pattern on for 30 seconds, it won't die when the parent does. So...
Title: Re: XML questions and answers
Post by: zharmad on January 30, 2016, 11:28:50 AM
<loops>

I've found that the small angle deviations aren't noticeable too, but I'm guessing this is a numerical integration problem, as well as a potential issue with precision.
Title: Re: XML questions and answers
Post by: ptarth on January 30, 2016, 02:51:22 PM
So I went with bouncing, non-curving boomerangs, given that any significant curving is liable to make it collide with something during the frame it is changing angles.

 = = =

.. Is there anyway to make a bullet point in an absolute direction regardless of the orientation of the parent entity AND the player? I want to synch up a particular system when it fires, in terms of the angles from one firing trigger to the next. The blademorphs image is attached (they convert between offensive and defensive depending on distance to the player, updated every ~0.6 seconds or so.) - there's a desynch each time the system fires, but if I leave a bullet pattern on for 30 seconds, it won't die when the parent does. So...

I'm not sure what you mean.
<change angle="<number>" speed="<number>" relative="false"/> will make them sync, but I have a feeling that's not what you meant. Another choice is to do a shot that then fires the blades of the boomerangs every X time units, like the Reaper's weapons. You can also do things with with rotation and direction using angle_from_parent="<number>" distance_from_parent="<number">.

I can give something more specific if you can describe it so I can understand it better.
Title: Re: XML questions and answers
Post by: zharmad on January 30, 2016, 05:15:11 PM
 I'm looking at a different creation at the moment, which has permanently spinning blade/shields around itself It should have the following properties:
 1) each arm changes as a function of distance to the player, morphing the shields into blades as the player approaches.
 2) this needs to happen smoothly.

 So, (1) occurs every time I respawn the bullet pattern, using the <bullet>'s min and max distance criterion. Due to this, the speed and starting angle at which they spin needs to sync up with the refresh time so that the new bullet pattern spawns on top of the old one. On the other hand, the three settings of targeting_logic "Direct" "Lead" and "Dumbfire" all give me different initial angles, which are time varying.
 The current workaround I just implemented is to fix the ship orientation completely after spawn, which I can get away with since I picked a circular sprite.
Title: Re: XML questions and answers
Post by: ptarth on January 30, 2016, 06:33:42 PM
Ah, rotations. I hate them. So much.
Spawn X (where x = number of arms) infinite undestroyable nonhitboxed shots at 360/X angle around your ship at the distance you want the arms to spawn at (or at 0 and just move the arms farther out to start).
Have those spawn your Arms using dumbfire, straight ahead using X & Y coordinates and relative. The X will vary, Y will always be 0.
Title: Re: XML questions and answers
Post by: Misery on January 30, 2016, 07:21:38 PM
Aaaaaand I look back in here, and I have no idea what's even being talked about anymore.

 I sense math somewhere nearby.  A horrible feeling.
Title: Re: XML questions and answers
Post by: zharmad on January 30, 2016, 07:53:17 PM
 Well, here's a rar file to show you what I'm talking about dynamically. The Enemy_Pursuers folder contain the images of ships I reserved earlier that's meant to go into the Ships folder. They're at completion except for the advanced blademorph variant that I'm not sure yet how to turn into an interesting deadly pursuer.

 The test room contains 6 of the normal blademorphs that show you the spinning/player-distance dependent bullet patterns. The whole idea is that at >650 range they're immune to normal bullets so they can actually survive pursuit into ~300 range, unlike all of the other vanilla pursuers. Players are supposed to bait them into attack mode to kill them - they'll open up in stages so that the more timid players can simply take longer to kill them at about 300~400 range.
 Facing any one of these alone in a 5x5 tile room, one should be able to circle kite them all day.

 The Anangu (https://en.wikipedia.org/wiki/Pitjantjatjara), on the other hand, could be challenging in a maze or many-walled layout where it is difficult to predict the bounce of the sizeable boomerangs. I'm considering reducing the boomerang size a little, but again, faced alone it really shouldn't be any trouble to kill. They even throw purposefully off to one side (unless you're really far away), so I think players would learn fairly quickly to avoid the arm side.
 The remaining problem with this is how to resolve partial hits, since the boomerang is itself 9 bullets, so it could actually hit players multiple times. I think I can simply make the individual parts of the boomerang pass through and damage the player, but the more appealing (reduce difficulty) option is to make the entire boomerang die upon impact. Might not be possible engine-wise.
Title: Re: XML questions and answers
Post by: ptarth on January 31, 2016, 12:18:57 AM

And you've given me a hilarious idea... A pinball machine boss. Using a variant of the blademorph weapon as the flippers, needing to somehow trigger them to launch projectiles back at the boss. Or perhaps something with the player as the pinball, needing to hit "speed up" objects in order to get far & fast enough into the bosses area to do damage before falling back down.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 31, 2016, 12:26:06 AM
A pinball machine boss.
Genius.
Title: Re: XML questions and answers
Post by: ptarth on January 31, 2016, 12:43:26 AM
A pinball machine boss.
Genius.

Thanks. Its on my list with:

I need to find something that dinosaurs could work with.

reZHA-I'm trying to parse your code, but its taking me a while, I'll try to get back to you tomorrow when I have more free time.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 31, 2016, 12:47:00 AM
Looking forward to seeing those bosses. Assuming the XML doesn't unravel your mind first.
Title: Re: XML questions and answers
Post by: ptarth on January 31, 2016, 01:03:01 AM
Looking forward to seeing those bosses. Assuming the XML doesn't unravel your mind first.

The protoype of the reanimator is already in and functional in the SVN. Pepisolo was actually looking for feedback from you guys about what direction to go in, before we develop it much further. Goodness knows there is no hurry and you guys have tons on your plate as it is though. Most of the others are tragically waiting in my notebook, having had all of my time spent on making snakes this week.
Title: Re: XML questions and answers
Post by: keith.lamothe on January 31, 2016, 01:04:49 AM
Yea, that's in Chris's ballpark. I'm not generally involved in giving content direction, I just make bad jokes and occasionally code something.
Title: Re: XML questions and answers
Post by: zharmad on January 31, 2016, 10:16:47 AM
 A Train Boss or Pacman could be good fun and a change from the usual boss in one place mode. The current limitation I can think of for the Pac man is some form of a location-based trigger, or on-collision-change-angle-by-90-degrees thing. I haven't quite figured out how to have an entity dodge 90 degrees to one side on trigger, but with a bullet-pattern moving the entity, it would be possible to do a simplified Pacman move system.

 On the boomerang shot: I'd try to make them components shots destroy on AOE again. For a short time on Friday I was playing around with explosive boomerangs, when I copied the player misille launcher into the code (I'm sure gifs of TNT-strapped ones are around somewhere on the internet...)

 I think I'd like to make a 7x7 carrier enemy before committing the set to Misery. If only there's an easy way to make a Free-Space style sweeping beam...?
Title: Re: XML questions and answers
Post by: zharmad on January 31, 2016, 10:43:35 AM
A pinball machine boss.
Genius.

 Or, perhaps, the boss has mandibles that reflect shots back at you? It actually has only 1 health x 3 morphs, but it's extremely difficult to line a shot up to get back those mandibles.
Title: Re: XML questions and answers
Post by: Ayrix on January 31, 2016, 03:11:21 PM
. I haven't quite figured out how to have an entity dodge 90 degrees to one side on trigger, but with a bullet-pattern moving the entity, it w
The cardinal movement option does something awfully similar. Making a train like boss that moves like a game of Snake should be relatively easy, and quite a change.

for now I just want to make a (mid?) boss using (o)Rin's zombie mechanic from touhou 11.
i.e. spawns familiars that shoot and run at you, on death they become untargetable and stop moving, but then re-spawn in the same spot  a few seconds later.
Title: Re: XML questions and answers
Post by: Misery on January 31, 2016, 03:41:06 PM
. I haven't quite figured out how to have an entity dodge 90 degrees to one side on trigger, but with a bullet-pattern moving the entity, it w
The cardinal movement option does something awfully similar. Making a train like boss that moves like a game of Snake should be relatively easy, and quite a change.

for now I just want to make a (mid?) boss using (o)Rin's zombie mechanic from touhou 11.
i.e. spawns familiars that shoot and run at you, on death they become untargetable and stop moving, but then re-spawn in the same spot  a few seconds later.

The problem is that each seperate entity with the cardinal-movement behavior would be under it's own AI, and would soon split up.  You'd have parts going all over the place.

That's why most of the bosses dont move:  The AI behavior is too unpredictable (with the exception of the Zamboni one), and unpredictable movement can cause undodgeable attacks.  Annoying, but... that's how it goes.
Title: Re: XML questions and answers
Post by: Cinth on January 31, 2016, 03:43:18 PM
You could design the boss room around the movement behavior.

You want a boss to act like a train?  Give him a track to run that fits his movement pattern. 
Title: Re: XML questions and answers
Post by: Misery on January 31, 2016, 03:52:03 PM
You could design the boss room around the movement behavior.

You want a boss to act like a train?  Give him a track to run that fits his movement pattern.

They still switch direction at random, is the thing.

That being said, a cardinal-mover with a track will show up soon enough. Well, sort of...   That one wont be from me, but from Ptarth.   I wont spoil it though.  It's not ready though, theres a few things to work out with it first. 
Title: Re: XML questions and answers
Post by: Cinth on January 31, 2016, 03:54:37 PM
That's what I was implying.  Cardinal makes 90 degree turns when it runs into something.  You can design a room to work with the and get the desired effect.
Title: Re: XML questions and answers
Post by: Misery on January 31, 2016, 04:54:47 PM
That's what I was implying.  Cardinal makes 90 degree turns when it runs into something.  You can design a room to work with the and get the desired effect.

What I meant was, they can still make total 180-degree turns.  But without being predictable about it.  Like, you dont know which way they'll turn next.

The boss that already has a track does this (for that boss, that's totally fine).
Title: Re: XML questions and answers
Post by: Cinth on January 31, 2016, 05:07:14 PM
180s would be ok, I should think.  So long as the boss isn't inaccessible for an extended period of time (I have no idea about the one ptarth is making).

You all do a great job at making fun stuff.  I'll keep making sure it feels good at normal. ;)
Title: Re: XML questions and answers
Post by: ptarth on January 31, 2016, 05:08:56 PM
A Train Boss or Pacman could be good fun and a change from the usual boss in one place mode. The current limitation I can think of for the Pac man is some form of a location-based trigger, or on-collision-change-angle-by-90-degrees thing. I haven't quite figured out how to have an entity dodge 90 degrees to one side on trigger, but with a bullet-pattern moving the entity, it would be possible to do a simplified Pacman move system.

I've been working on code like this for a while now. I have an entity that will move in a direction on hit, but it doesn't know WHICH direction to go. However, if it is a fixed boss room, we could do some crazy things. Have each and the corner turns filled with 2 invisible entities. When the enemy boss goes into a corner, it hits one, based on which direction it came from. That entity then has the boss turn in the appropriate direction. Since the boss is already acting on a movement pattern, the second one won't change its behavior. T intersections would simply have some systems with a chance of happening and the others would always happen (unless the first does and put it into movement mode again). It would take a large amount of scripting to work.

Quote
If only there's an easy way to make a Free-Space style sweeping beam...?

I've been obsessing about this one too. My best idea so far is particles on a very high salvo or just a gravity laser with a low firing_rate. But then it is effectively always on and still have targeting issues, I can't get it to target where I want. On the other hand you can do fixed point targeting, which only will really work for a stationary boss. Although, thinking about it now, perhaps something like the the rotating shots Zharmad made recently might work out. There would be a lot of angle finagling involved.

That's what I was implying.  Cardinal makes 90 degree turns when it runs into something.  You can design a room to work with the and get the desired effect.

I spent some time on this with my first attempt at a pacman level. When a Cardinal mover hits a wall it chooses a random 90,180, or 270 path to follow. It will also ignore T-intersections and treat them as straightaways (for the most part). They aren't very good at doing anything rather than an aimless wander in a pacman style grid. The Zamboni did better a little better, but what was needed were all the variations of Zamboni movement, not just the right & down version. Mixing the movement types in the entities in the pacman grid was okay, but it really needed the pac pellets do make it really cool. I had tried a version with the maze filled with $1 credit pickups. That was actually really cool, and the sound effect was awesome. But they didn't want that much money seeded into a single miniboss room. Now though I have found you can have nondamaging shots that do the same thing, but I haven't pursued it again.
Title: Re: XML questions and answers
Post by: ptarth on January 31, 2016, 07:43:22 PM
re:Zharmad

After about an hour of working on your Blademorph code I have successfully made them stop firing completely and occasionally force Stardward Rogue into locking up. I'm going to try again later.
Title: Re: XML questions and answers
Post by: Ayrix on January 31, 2016, 08:27:45 PM
Getting there with the reanimating zombie familiars, the problem is making them go away after the boss dies.
Am I going to have to implement them as a very strange type of bullet, would even that clear them?
Essentially, I designed them as 2 entities, which both become the other on death.
(one chases and shoots you, the other is static, immortal, and just sits there and self attritions to trigger the re-spawn.)
Title: Re: XML questions and answers
Post by: zharmad on January 31, 2016, 09:07:05 PM
re:Zharmad

After about an hour of working on your Blademorph code I have successfully made them stop firing completely and occasionally force Stardward Rogue into locking up. I'm going to try again later.

Maybe the game doesn't like bullets travelling at the speed of light... also, the XML reload function gets slower as slower until it locks up the game. Some sort of memory leak issue introduced with the extra fussiness?

Getting there with the reanimating zombie familiars, the problem is making them go away after the boss dies.
Am I going to have to implement them as a very strange type of bullet, would even that clear them?
Essentially, I designed them as 2 entities, which both become the other on death.
(one chases and shoots you, the other is static, immortal, and just sits there and self attritions to trigger the re-spawn.)

At the moment, the engine doesn't support several types of direct communication between a parent entity and the entities it spawns. What is your implementation like compared to the guardian turrets of the Warden / Backfire / etc. ?

One possibility is to check whether the boss can alter the ammo count of entity systems around it, and then have the reanimation be fueled by the ammo then set to zero on boss death. It's going to be a modifier that checks targets within the area of effect, but I haven't used this before. The ammo count for an entity system definitely works on enemies (I had this for the gemini sister, but took it off later IIRC) so you can have a limited ammo on death respawn that could potentially be set to zero ammo.

EDIT: Okay doesn't work or can't find the ammo of the target. Have you tried simply to set all of the minions as "is_familiar_that_dies_when_parent_dies", or does this not work when the entities spawn each other?
Title: Re: XML questions and answers
Post by: ptarth on January 31, 2016, 10:31:39 PM
You might try a on death system that spread to all enemies that causes them to self destruct
Title: Re: XML questions and answers
Post by: Ayrix on January 31, 2016, 11:44:42 PM
nope I need to get them to regen health, or for one type to become immortal. That would stop the respawning.
Title: Re: XML questions and answers
Post by: TheVampire100 on February 01, 2016, 06:55:10 AM
When I design a Mech, is the mech selectable on the mech selection? or do I have to replace another mech?
Can I somehow make it selectable?
Title: Re: XML questions and answers
Post by: zharmad on February 01, 2016, 08:37:18 AM
Cinth needed to replace one for his mod mech, although Chris was thinking to expand the selection box to 9.
Title: Re: XML questions and answers
Post by: TheVampire100 on February 01, 2016, 08:54:21 AM
Okay, then I will replace the White gloss Mech for now (because he is the most boring to play with). I'm currently working on some kind of Ninja Mech.
Title: Re: XML questions and answers
Post by: keith.lamothe on February 01, 2016, 11:26:30 AM
If you make the filename you're putting your mechs in come before the stock mechs file in alphabetical order I believe it will be processed first and thus take precedence over the other.

Alternatively you could just add yours into the stock file, before the others. Bear in mind it's liable to be overwritten by future patches.
Title: Re: XML questions and answers
Post by: Cinth on February 01, 2016, 02:21:38 PM
Cinth needed to replace one for his mod mech, although Chris was thinking to expand the selection box to 9.

The game used the top six mechs it finds to seed the mech windows.  Mine are easy since I title my files "Cinth" and the player hulls are titled "CMP".  Mine always get found first.

The easiest way to make a slot would be to just delete one mech from CMP_PlayerHulls, (Configuration/GameEntity).

GL and have fun.  I've 3 mechs I tool around with.  It's fun.
Title: Re: XML questions and answers
Post by: keith.lamothe on February 01, 2016, 04:35:35 PM
The easiest way to make a slot would be to just delete one mech from CMP_PlayerHulls, (Configuration/GameEntity).
FYI, if you remove an entry or change its "name" attribute (which is essentially removing it and adding a similar one with a different name) you break all files that contain that entity/system/whatever. To load them properly you have to put whatever it is back.
Title: Re: XML questions and answers
Post by: Cinth on February 01, 2016, 04:39:53 PM
The easiest way to make a slot would be to just delete one mech from CMP_PlayerHulls, (Configuration/GameEntity).
FYI, if you remove an entry or change its "name" attribute (which is essentially removing it and adding a similar one with a different name) you break all files that contain that entity/system/whatever. To load them properly you have to put whatever it is back.

This is very true.  My message log blows up whenever I want to run any mech that normally seeds in the second row.
Title: Re: XML questions and answers
Post by: keith.lamothe on February 01, 2016, 04:41:41 PM
This is very true.  My message log blows up whenever I want to run any mech that normally seeds in the second row.
You can avoid that by putting your mech in the stock file at the top, before white gloss. No need to remove white gloss or any of the others.

Anyway, there are a number of solutions, just saying that deleting or renaming existing entries is not generally a good one :)
Title: Re: XML questions and answers
Post by: Cinth on February 01, 2016, 04:53:18 PM
This is very true.  My message log blows up whenever I want to run any mech that normally seeds in the second row.
You can avoid that by putting your mech in the stock file at the top, before white gloss. No need to remove white gloss or any of the others.

Anyway, there are a number of solutions, just saying that deleting or renaming existing entries is not generally a good one :)

Like adding support for more than 6 mechs (poke poke, hint hint).  I'm actually using 2 copies of the config file now.  One I've modded and one that's the live version.  The whole blowing up thing doesn't make a pretty start for a stream.
Title: Re: XML questions and answers
Post by: TheVampire100 on February 01, 2016, 06:37:20 PM
Okay, I experimented a little witht he xml Code (to be honest, I'm a total noob) and I wanted to make my ninja stealth himself whenever he enters a room. However, the code I wrote phased him out only at the beginning of a floor, not a room. Any tips how I can manage it, that he does this on every room?
Title: Re: XML questions and answers
Post by: ptarth on February 06, 2016, 03:26:25 AM
Quote from: TheVampire100 link=topic=18335.msg198566#msg198566
...ninja stealth himself whenever he enters a room....

<effect type="AddSystem" relate_sytems="StealthSystem" targeting=
"Self" timing="OnRoomSwitch"/>

Question:
I'm trying to make a game enemy using stacked image. The pieces add fine, but the non-base image does not get the hover idling animation the base image does. Is there a way to do so? Should there be? My work around is to use is_considered_ground_walker.
Title: Re: XML questions and answers
Post by: Cinth on February 06, 2016, 03:45:27 AM
That looks like a Chris type question there, ptarth.
Title: Re: XML questions and answers
Post by: ptarth on February 08, 2016, 10:57:19 PM
Need to map something?
Here is a weapon fired grid that can help with that.

Code: [Select]
<system name="MapSystem"
category="Weapon"
shot_type="Invisible"
damage_type="Energy"
attack_power="1"
fire_rate="2000"
cue_time = "0.0"
range_actual="10"
shots_per_salvo="1"
shot_speed="0"
targeting_logic="Dumbfire"
firing_timing="AllTheTime"
image_name="Invisible"
special_bullet_patterns="MapPattern"
does_no_actual_damage="true"
shots_never_collide_with_terrain="true"
shot_is_not_stopped_by_hitting="true"
shots_leave_no_shadows_or_reflections="true"
>
<modifier target="MyShots" type="IgnoresCollisionWithNonWallTerrain"/>
<modifier target="MyShots" type="IgnoresCollisionWithWallTerrain"/>
</system>
     <bullet_pattern name="MapPattern">
$MapPatternShot X=-1000 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=0 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=50 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=100 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=150 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=200 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=250 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=300 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=350 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=400 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=450 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=500 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=550 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=600 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=650 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=700 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=750 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=800 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=850 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=900 SHOT=CrossBlue
$MapPatternShot X=-1000 Y=950 SHOT=CrossGreen
$MapPatternShot X=-1000 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-950 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-950 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-950 Y=0 SHOT=CrossBlue
$MapPatternShot X=-950 Y=50 SHOT=CrossGreen
$MapPatternShot X=-950 Y=100 SHOT=CrossBlue
$MapPatternShot X=-950 Y=150 SHOT=CrossGreen
$MapPatternShot X=-950 Y=200 SHOT=CrossBlue
$MapPatternShot X=-950 Y=250 SHOT=CrossGreen
$MapPatternShot X=-950 Y=300 SHOT=CrossBlue
$MapPatternShot X=-950 Y=350 SHOT=CrossGreen
$MapPatternShot X=-950 Y=400 SHOT=CrossBlue
$MapPatternShot X=-950 Y=450 SHOT=CrossGreen
$MapPatternShot X=-950 Y=500 SHOT=CrossBlue
$MapPatternShot X=-950 Y=550 SHOT=CrossGreen
$MapPatternShot X=-950 Y=600 SHOT=CrossBlue
$MapPatternShot X=-950 Y=650 SHOT=CrossGreen
$MapPatternShot X=-950 Y=700 SHOT=CrossBlue
$MapPatternShot X=-950 Y=750 SHOT=CrossGreen
$MapPatternShot X=-950 Y=800 SHOT=CrossBlue
$MapPatternShot X=-950 Y=850 SHOT=CrossGreen
$MapPatternShot X=-950 Y=900 SHOT=CrossBlue
$MapPatternShot X=-950 Y=950 SHOT=CrossGreen
$MapPatternShot X=-950 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-900 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-900 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-900 Y=0 SHOT=CrossBlue
$MapPatternShot X=-900 Y=50 SHOT=CrossGreen
$MapPatternShot X=-900 Y=100 SHOT=CrossBlue
$MapPatternShot X=-900 Y=150 SHOT=CrossGreen
$MapPatternShot X=-900 Y=200 SHOT=CrossBlue
$MapPatternShot X=-900 Y=250 SHOT=CrossGreen
$MapPatternShot X=-900 Y=300 SHOT=CrossBlue
$MapPatternShot X=-900 Y=350 SHOT=CrossGreen
$MapPatternShot X=-900 Y=400 SHOT=CrossBlue
$MapPatternShot X=-900 Y=450 SHOT=CrossGreen
$MapPatternShot X=-900 Y=500 SHOT=CrossBlue
$MapPatternShot X=-900 Y=550 SHOT=CrossGreen
$MapPatternShot X=-900 Y=600 SHOT=CrossBlue
$MapPatternShot X=-900 Y=650 SHOT=CrossGreen
$MapPatternShot X=-900 Y=700 SHOT=CrossBlue
$MapPatternShot X=-900 Y=750 SHOT=CrossGreen
$MapPatternShot X=-900 Y=800 SHOT=CrossBlue
$MapPatternShot X=-900 Y=850 SHOT=CrossGreen
$MapPatternShot X=-900 Y=900 SHOT=CrossBlue
$MapPatternShot X=-900 Y=950 SHOT=CrossGreen
$MapPatternShot X=-900 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-850 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-850 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-850 Y=0 SHOT=CrossBlue
$MapPatternShot X=-850 Y=50 SHOT=CrossGreen
$MapPatternShot X=-850 Y=100 SHOT=CrossBlue
$MapPatternShot X=-850 Y=150 SHOT=CrossGreen
$MapPatternShot X=-850 Y=200 SHOT=CrossBlue
$MapPatternShot X=-850 Y=250 SHOT=CrossGreen
$MapPatternShot X=-850 Y=300 SHOT=CrossBlue
$MapPatternShot X=-850 Y=350 SHOT=CrossGreen
$MapPatternShot X=-850 Y=400 SHOT=CrossBlue
$MapPatternShot X=-850 Y=450 SHOT=CrossGreen
$MapPatternShot X=-850 Y=500 SHOT=CrossBlue
$MapPatternShot X=-850 Y=550 SHOT=CrossGreen
$MapPatternShot X=-850 Y=600 SHOT=CrossBlue
$MapPatternShot X=-850 Y=650 SHOT=CrossGreen
$MapPatternShot X=-850 Y=700 SHOT=CrossBlue
$MapPatternShot X=-850 Y=750 SHOT=CrossGreen
$MapPatternShot X=-850 Y=800 SHOT=CrossBlue
$MapPatternShot X=-850 Y=850 SHOT=CrossGreen
$MapPatternShot X=-850 Y=900 SHOT=CrossBlue
$MapPatternShot X=-850 Y=950 SHOT=CrossGreen
$MapPatternShot X=-850 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-800 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-800 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-800 Y=0 SHOT=CrossBlue
$MapPatternShot X=-800 Y=50 SHOT=CrossGreen
$MapPatternShot X=-800 Y=100 SHOT=CrossBlue
$MapPatternShot X=-800 Y=150 SHOT=CrossGreen
$MapPatternShot X=-800 Y=200 SHOT=CrossBlue
$MapPatternShot X=-800 Y=250 SHOT=CrossGreen
$MapPatternShot X=-800 Y=300 SHOT=CrossBlue
$MapPatternShot X=-800 Y=350 SHOT=CrossGreen
$MapPatternShot X=-800 Y=400 SHOT=CrossBlue
$MapPatternShot X=-800 Y=450 SHOT=CrossGreen
$MapPatternShot X=-800 Y=500 SHOT=CrossBlue
$MapPatternShot X=-800 Y=550 SHOT=CrossGreen
$MapPatternShot X=-800 Y=600 SHOT=CrossBlue
$MapPatternShot X=-800 Y=650 SHOT=CrossGreen
$MapPatternShot X=-800 Y=700 SHOT=CrossBlue
$MapPatternShot X=-800 Y=750 SHOT=CrossGreen
$MapPatternShot X=-800 Y=800 SHOT=CrossBlue
$MapPatternShot X=-800 Y=850 SHOT=CrossGreen
$MapPatternShot X=-800 Y=900 SHOT=CrossBlue
$MapPatternShot X=-800 Y=950 SHOT=CrossGreen
$MapPatternShot X=-800 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-750 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-750 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-750 Y=0 SHOT=CrossBlue
$MapPatternShot X=-750 Y=50 SHOT=CrossGreen
$MapPatternShot X=-750 Y=100 SHOT=CrossBlue
$MapPatternShot X=-750 Y=150 SHOT=CrossGreen
$MapPatternShot X=-750 Y=200 SHOT=CrossBlue
$MapPatternShot X=-750 Y=250 SHOT=CrossGreen
$MapPatternShot X=-750 Y=300 SHOT=CrossBlue
$MapPatternShot X=-750 Y=350 SHOT=CrossGreen
$MapPatternShot X=-750 Y=400 SHOT=CrossBlue
$MapPatternShot X=-750 Y=450 SHOT=CrossGreen
$MapPatternShot X=-750 Y=500 SHOT=CrossBlue
$MapPatternShot X=-750 Y=550 SHOT=CrossGreen
$MapPatternShot X=-750 Y=600 SHOT=CrossBlue
$MapPatternShot X=-750 Y=650 SHOT=CrossGreen
$MapPatternShot X=-750 Y=700 SHOT=CrossBlue
$MapPatternShot X=-750 Y=750 SHOT=CrossGreen
$MapPatternShot X=-750 Y=800 SHOT=CrossBlue
$MapPatternShot X=-750 Y=850 SHOT=CrossGreen
$MapPatternShot X=-750 Y=900 SHOT=CrossBlue
$MapPatternShot X=-750 Y=950 SHOT=CrossGreen
$MapPatternShot X=-750 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-700 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-700 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-700 Y=0 SHOT=CrossBlue
$MapPatternShot X=-700 Y=50 SHOT=CrossGreen
$MapPatternShot X=-700 Y=100 SHOT=CrossBlue
$MapPatternShot X=-700 Y=150 SHOT=CrossGreen
$MapPatternShot X=-700 Y=200 SHOT=CrossBlue
$MapPatternShot X=-700 Y=250 SHOT=CrossGreen
$MapPatternShot X=-700 Y=300 SHOT=CrossBlue
$MapPatternShot X=-700 Y=350 SHOT=CrossGreen
$MapPatternShot X=-700 Y=400 SHOT=CrossBlue
$MapPatternShot X=-700 Y=450 SHOT=CrossGreen
$MapPatternShot X=-700 Y=500 SHOT=CrossBlue
$MapPatternShot X=-700 Y=550 SHOT=CrossGreen
$MapPatternShot X=-700 Y=600 SHOT=CrossBlue
$MapPatternShot X=-700 Y=650 SHOT=CrossGreen
$MapPatternShot X=-700 Y=700 SHOT=CrossBlue
$MapPatternShot X=-700 Y=750 SHOT=CrossGreen
$MapPatternShot X=-700 Y=800 SHOT=CrossBlue
$MapPatternShot X=-700 Y=850 SHOT=CrossGreen
$MapPatternShot X=-700 Y=900 SHOT=CrossBlue
$MapPatternShot X=-700 Y=950 SHOT=CrossGreen
$MapPatternShot X=-700 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-650 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-650 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-650 Y=0 SHOT=CrossBlue
$MapPatternShot X=-650 Y=50 SHOT=CrossGreen
$MapPatternShot X=-650 Y=100 SHOT=CrossBlue
$MapPatternShot X=-650 Y=150 SHOT=CrossGreen
$MapPatternShot X=-650 Y=200 SHOT=CrossBlue
$MapPatternShot X=-650 Y=250 SHOT=CrossGreen
$MapPatternShot X=-650 Y=300 SHOT=CrossBlue
$MapPatternShot X=-650 Y=350 SHOT=CrossGreen
$MapPatternShot X=-650 Y=400 SHOT=CrossBlue
$MapPatternShot X=-650 Y=450 SHOT=CrossGreen
$MapPatternShot X=-650 Y=500 SHOT=CrossBlue
$MapPatternShot X=-650 Y=550 SHOT=CrossGreen
$MapPatternShot X=-650 Y=600 SHOT=CrossBlue
$MapPatternShot X=-650 Y=650 SHOT=CrossGreen
$MapPatternShot X=-650 Y=700 SHOT=CrossBlue
$MapPatternShot X=-650 Y=750 SHOT=CrossGreen
$MapPatternShot X=-650 Y=800 SHOT=CrossBlue
$MapPatternShot X=-650 Y=850 SHOT=CrossGreen
$MapPatternShot X=-650 Y=900 SHOT=CrossBlue
$MapPatternShot X=-650 Y=950 SHOT=CrossGreen
$MapPatternShot X=-650 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-600 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-600 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-600 Y=0 SHOT=CrossBlue
$MapPatternShot X=-600 Y=50 SHOT=CrossGreen
$MapPatternShot X=-600 Y=100 SHOT=CrossBlue
$MapPatternShot X=-600 Y=150 SHOT=CrossGreen
$MapPatternShot X=-600 Y=200 SHOT=CrossBlue
$MapPatternShot X=-600 Y=250 SHOT=CrossGreen
$MapPatternShot X=-600 Y=300 SHOT=CrossBlue
$MapPatternShot X=-600 Y=350 SHOT=CrossGreen
$MapPatternShot X=-600 Y=400 SHOT=CrossBlue
$MapPatternShot X=-600 Y=450 SHOT=CrossGreen
$MapPatternShot X=-600 Y=500 SHOT=CrossBlue
$MapPatternShot X=-600 Y=550 SHOT=CrossGreen
$MapPatternShot X=-600 Y=600 SHOT=CrossBlue
$MapPatternShot X=-600 Y=650 SHOT=CrossGreen
$MapPatternShot X=-600 Y=700 SHOT=CrossBlue
$MapPatternShot X=-600 Y=750 SHOT=CrossGreen
$MapPatternShot X=-600 Y=800 SHOT=CrossBlue
$MapPatternShot X=-600 Y=850 SHOT=CrossGreen
$MapPatternShot X=-600 Y=900 SHOT=CrossBlue
$MapPatternShot X=-600 Y=950 SHOT=CrossGreen
$MapPatternShot X=-600 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-550 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-550 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-550 Y=0 SHOT=CrossBlue
$MapPatternShot X=-550 Y=50 SHOT=CrossGreen
$MapPatternShot X=-550 Y=100 SHOT=CrossBlue
$MapPatternShot X=-550 Y=150 SHOT=CrossGreen
$MapPatternShot X=-550 Y=200 SHOT=CrossBlue
$MapPatternShot X=-550 Y=250 SHOT=CrossGreen
$MapPatternShot X=-550 Y=300 SHOT=CrossBlue
$MapPatternShot X=-550 Y=350 SHOT=CrossGreen
$MapPatternShot X=-550 Y=400 SHOT=CrossBlue
$MapPatternShot X=-550 Y=450 SHOT=CrossGreen
$MapPatternShot X=-550 Y=500 SHOT=CrossBlue
$MapPatternShot X=-550 Y=550 SHOT=CrossGreen
$MapPatternShot X=-550 Y=600 SHOT=CrossBlue
$MapPatternShot X=-550 Y=650 SHOT=CrossGreen
$MapPatternShot X=-550 Y=700 SHOT=CrossBlue
$MapPatternShot X=-550 Y=750 SHOT=CrossGreen
$MapPatternShot X=-550 Y=800 SHOT=CrossBlue
$MapPatternShot X=-550 Y=850 SHOT=CrossGreen
$MapPatternShot X=-550 Y=900 SHOT=CrossBlue
$MapPatternShot X=-550 Y=950 SHOT=CrossGreen
$MapPatternShot X=-550 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-500 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-500 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-500 Y=0 SHOT=CrossBlue
$MapPatternShot X=-500 Y=50 SHOT=CrossGreen
$MapPatternShot X=-500 Y=100 SHOT=CrossBlue
$MapPatternShot X=-500 Y=150 SHOT=CrossGreen
$MapPatternShot X=-500 Y=200 SHOT=CrossBlue
$MapPatternShot X=-500 Y=250 SHOT=CrossGreen
$MapPatternShot X=-500 Y=300 SHOT=CrossBlue
$MapPatternShot X=-500 Y=350 SHOT=CrossGreen
$MapPatternShot X=-500 Y=400 SHOT=CrossBlue
$MapPatternShot X=-500 Y=450 SHOT=CrossGreen
$MapPatternShot X=-500 Y=500 SHOT=CrossBlue
$MapPatternShot X=-500 Y=550 SHOT=CrossGreen
$MapPatternShot X=-500 Y=600 SHOT=CrossBlue
$MapPatternShot X=-500 Y=650 SHOT=CrossGreen
$MapPatternShot X=-500 Y=700 SHOT=CrossBlue
$MapPatternShot X=-500 Y=750 SHOT=CrossGreen
$MapPatternShot X=-500 Y=800 SHOT=CrossBlue
$MapPatternShot X=-500 Y=850 SHOT=CrossGreen
$MapPatternShot X=-500 Y=900 SHOT=CrossBlue
$MapPatternShot X=-500 Y=950 SHOT=CrossGreen
$MapPatternShot X=-500 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-450 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-450 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-450 Y=0 SHOT=CrossBlue
$MapPatternShot X=-450 Y=50 SHOT=CrossGreen
$MapPatternShot X=-450 Y=100 SHOT=CrossBlue
$MapPatternShot X=-450 Y=150 SHOT=CrossGreen
$MapPatternShot X=-450 Y=200 SHOT=CrossBlue
$MapPatternShot X=-450 Y=250 SHOT=CrossGreen
$MapPatternShot X=-450 Y=300 SHOT=CrossBlue
$MapPatternShot X=-450 Y=350 SHOT=CrossGreen
$MapPatternShot X=-450 Y=400 SHOT=CrossBlue
$MapPatternShot X=-450 Y=450 SHOT=CrossGreen
$MapPatternShot X=-450 Y=500 SHOT=CrossBlue
$MapPatternShot X=-450 Y=550 SHOT=CrossGreen
$MapPatternShot X=-450 Y=600 SHOT=CrossBlue
$MapPatternShot X=-450 Y=650 SHOT=CrossGreen
$MapPatternShot X=-450 Y=700 SHOT=CrossBlue
$MapPatternShot X=-450 Y=750 SHOT=CrossGreen
$MapPatternShot X=-450 Y=800 SHOT=CrossBlue
$MapPatternShot X=-450 Y=850 SHOT=CrossGreen
$MapPatternShot X=-450 Y=900 SHOT=CrossBlue
$MapPatternShot X=-450 Y=950 SHOT=CrossGreen
$MapPatternShot X=-450 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-400 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-400 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-400 Y=0 SHOT=CrossBlue
$MapPatternShot X=-400 Y=50 SHOT=CrossGreen
$MapPatternShot X=-400 Y=100 SHOT=CrossBlue
$MapPatternShot X=-400 Y=150 SHOT=CrossGreen
$MapPatternShot X=-400 Y=200 SHOT=CrossBlue
$MapPatternShot X=-400 Y=250 SHOT=CrossGreen
$MapPatternShot X=-400 Y=300 SHOT=CrossBlue
$MapPatternShot X=-400 Y=350 SHOT=CrossGreen
$MapPatternShot X=-400 Y=400 SHOT=CrossBlue
$MapPatternShot X=-400 Y=450 SHOT=CrossGreen
$MapPatternShot X=-400 Y=500 SHOT=CrossBlue
$MapPatternShot X=-400 Y=550 SHOT=CrossGreen
$MapPatternShot X=-400 Y=600 SHOT=CrossBlue
$MapPatternShot X=-400 Y=650 SHOT=CrossGreen
$MapPatternShot X=-400 Y=700 SHOT=CrossBlue
$MapPatternShot X=-400 Y=750 SHOT=CrossGreen
$MapPatternShot X=-400 Y=800 SHOT=CrossBlue
$MapPatternShot X=-400 Y=850 SHOT=CrossGreen
$MapPatternShot X=-400 Y=900 SHOT=CrossBlue
$MapPatternShot X=-400 Y=950 SHOT=CrossGreen
$MapPatternShot X=-400 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-350 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-350 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-350 Y=0 SHOT=CrossBlue
$MapPatternShot X=-350 Y=50 SHOT=CrossGreen
$MapPatternShot X=-350 Y=100 SHOT=CrossBlue
$MapPatternShot X=-350 Y=150 SHOT=CrossGreen
$MapPatternShot X=-350 Y=200 SHOT=CrossBlue
$MapPatternShot X=-350 Y=250 SHOT=CrossGreen
$MapPatternShot X=-350 Y=300 SHOT=CrossBlue
$MapPatternShot X=-350 Y=350 SHOT=CrossGreen
$MapPatternShot X=-350 Y=400 SHOT=CrossBlue
$MapPatternShot X=-350 Y=450 SHOT=CrossGreen
$MapPatternShot X=-350 Y=500 SHOT=CrossBlue
$MapPatternShot X=-350 Y=550 SHOT=CrossGreen
$MapPatternShot X=-350 Y=600 SHOT=CrossBlue
$MapPatternShot X=-350 Y=650 SHOT=CrossGreen
$MapPatternShot X=-350 Y=700 SHOT=CrossBlue
$MapPatternShot X=-350 Y=750 SHOT=CrossGreen
$MapPatternShot X=-350 Y=800 SHOT=CrossBlue
$MapPatternShot X=-350 Y=850 SHOT=CrossGreen
$MapPatternShot X=-350 Y=900 SHOT=CrossBlue
$MapPatternShot X=-350 Y=950 SHOT=CrossGreen
$MapPatternShot X=-350 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-300 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-300 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-300 Y=0 SHOT=CrossBlue
$MapPatternShot X=-300 Y=50 SHOT=CrossGreen
$MapPatternShot X=-300 Y=100 SHOT=CrossBlue
$MapPatternShot X=-300 Y=150 SHOT=CrossGreen
$MapPatternShot X=-300 Y=200 SHOT=CrossBlue
$MapPatternShot X=-300 Y=250 SHOT=CrossGreen
$MapPatternShot X=-300 Y=300 SHOT=CrossBlue
$MapPatternShot X=-300 Y=350 SHOT=CrossGreen
$MapPatternShot X=-300 Y=400 SHOT=CrossBlue
$MapPatternShot X=-300 Y=450 SHOT=CrossGreen
$MapPatternShot X=-300 Y=500 SHOT=CrossBlue
$MapPatternShot X=-300 Y=550 SHOT=CrossGreen
$MapPatternShot X=-300 Y=600 SHOT=CrossBlue
$MapPatternShot X=-300 Y=650 SHOT=CrossGreen
$MapPatternShot X=-300 Y=700 SHOT=CrossBlue
$MapPatternShot X=-300 Y=750 SHOT=CrossGreen
$MapPatternShot X=-300 Y=800 SHOT=CrossBlue
$MapPatternShot X=-300 Y=850 SHOT=CrossGreen
$MapPatternShot X=-300 Y=900 SHOT=CrossBlue
$MapPatternShot X=-300 Y=950 SHOT=CrossGreen
$MapPatternShot X=-300 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-250 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-250 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-250 Y=0 SHOT=CrossBlue
$MapPatternShot X=-250 Y=50 SHOT=CrossGreen
$MapPatternShot X=-250 Y=100 SHOT=CrossBlue
$MapPatternShot X=-250 Y=150 SHOT=CrossGreen
$MapPatternShot X=-250 Y=200 SHOT=CrossBlue
$MapPatternShot X=-250 Y=250 SHOT=CrossGreen
$MapPatternShot X=-250 Y=300 SHOT=CrossBlue
$MapPatternShot X=-250 Y=350 SHOT=CrossGreen
$MapPatternShot X=-250 Y=400 SHOT=CrossBlue
$MapPatternShot X=-250 Y=450 SHOT=CrossGreen
$MapPatternShot X=-250 Y=500 SHOT=CrossBlue
$MapPatternShot X=-250 Y=550 SHOT=CrossGreen
$MapPatternShot X=-250 Y=600 SHOT=CrossBlue
$MapPatternShot X=-250 Y=650 SHOT=CrossGreen
$MapPatternShot X=-250 Y=700 SHOT=CrossBlue
$MapPatternShot X=-250 Y=750 SHOT=CrossGreen
$MapPatternShot X=-250 Y=800 SHOT=CrossBlue
$MapPatternShot X=-250 Y=850 SHOT=CrossGreen
$MapPatternShot X=-250 Y=900 SHOT=CrossBlue
$MapPatternShot X=-250 Y=950 SHOT=CrossGreen
$MapPatternShot X=-250 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-200 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-200 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-200 Y=0 SHOT=CrossBlue
$MapPatternShot X=-200 Y=50 SHOT=CrossGreen
$MapPatternShot X=-200 Y=100 SHOT=CrossBlue
$MapPatternShot X=-200 Y=150 SHOT=CrossGreen
$MapPatternShot X=-200 Y=200 SHOT=CrossBlue
$MapPatternShot X=-200 Y=250 SHOT=CrossGreen
$MapPatternShot X=-200 Y=300 SHOT=CrossBlue
$MapPatternShot X=-200 Y=350 SHOT=CrossGreen
$MapPatternShot X=-200 Y=400 SHOT=CrossBlue
$MapPatternShot X=-200 Y=450 SHOT=CrossGreen
$MapPatternShot X=-200 Y=500 SHOT=CrossBlue
$MapPatternShot X=-200 Y=550 SHOT=CrossGreen
$MapPatternShot X=-200 Y=600 SHOT=CrossBlue
$MapPatternShot X=-200 Y=650 SHOT=CrossGreen
$MapPatternShot X=-200 Y=700 SHOT=CrossBlue
$MapPatternShot X=-200 Y=750 SHOT=CrossGreen
$MapPatternShot X=-200 Y=800 SHOT=CrossBlue
$MapPatternShot X=-200 Y=850 SHOT=CrossGreen
$MapPatternShot X=-200 Y=900 SHOT=CrossBlue
$MapPatternShot X=-200 Y=950 SHOT=CrossGreen
$MapPatternShot X=-200 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-150 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-150 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-150 Y=0 SHOT=CrossBlue
$MapPatternShot X=-150 Y=50 SHOT=CrossGreen
$MapPatternShot X=-150 Y=100 SHOT=CrossBlue
$MapPatternShot X=-150 Y=150 SHOT=CrossGreen
$MapPatternShot X=-150 Y=200 SHOT=CrossBlue
$MapPatternShot X=-150 Y=250 SHOT=CrossGreen
$MapPatternShot X=-150 Y=300 SHOT=CrossBlue
$MapPatternShot X=-150 Y=350 SHOT=CrossGreen
$MapPatternShot X=-150 Y=400 SHOT=CrossBlue
$MapPatternShot X=-150 Y=450 SHOT=CrossGreen
$MapPatternShot X=-150 Y=500 SHOT=CrossBlue
$MapPatternShot X=-150 Y=550 SHOT=CrossGreen
$MapPatternShot X=-150 Y=600 SHOT=CrossBlue
$MapPatternShot X=-150 Y=650 SHOT=CrossGreen
$MapPatternShot X=-150 Y=700 SHOT=CrossBlue
$MapPatternShot X=-150 Y=750 SHOT=CrossGreen
$MapPatternShot X=-150 Y=800 SHOT=CrossBlue
$MapPatternShot X=-150 Y=850 SHOT=CrossGreen
$MapPatternShot X=-150 Y=900 SHOT=CrossBlue
$MapPatternShot X=-150 Y=950 SHOT=CrossGreen
$MapPatternShot X=-150 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-100 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-100 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-100 Y=0 SHOT=CrossBlue
$MapPatternShot X=-100 Y=50 SHOT=CrossGreen
$MapPatternShot X=-100 Y=100 SHOT=CrossBlue
$MapPatternShot X=-100 Y=150 SHOT=CrossGreen
$MapPatternShot X=-100 Y=200 SHOT=CrossBlue
$MapPatternShot X=-100 Y=250 SHOT=CrossGreen
$MapPatternShot X=-100 Y=300 SHOT=CrossBlue
$MapPatternShot X=-100 Y=350 SHOT=CrossGreen
$MapPatternShot X=-100 Y=400 SHOT=CrossBlue
$MapPatternShot X=-100 Y=450 SHOT=CrossGreen
$MapPatternShot X=-100 Y=500 SHOT=CrossBlue
$MapPatternShot X=-100 Y=550 SHOT=CrossGreen
$MapPatternShot X=-100 Y=600 SHOT=CrossBlue
$MapPatternShot X=-100 Y=650 SHOT=CrossGreen
$MapPatternShot X=-100 Y=700 SHOT=CrossBlue
$MapPatternShot X=-100 Y=750 SHOT=CrossGreen
$MapPatternShot X=-100 Y=800 SHOT=CrossBlue
$MapPatternShot X=-100 Y=850 SHOT=CrossGreen
$MapPatternShot X=-100 Y=900 SHOT=CrossBlue
$MapPatternShot X=-100 Y=950 SHOT=CrossGreen
$MapPatternShot X=-100 Y=1000 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-950 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-900 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-850 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-800 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-750 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-700 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-650 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-600 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-550 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-500 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-450 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-400 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-350 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-300 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-250 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-200 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-150 SHOT=CrossGreen
$MapPatternShot X=-50 Y=-100 SHOT=CrossBlue
$MapPatternShot X=-50 Y=-50 SHOT=CrossGreen
$MapPatternShot X=-50 Y=0 SHOT=CrossBlue
$MapPatternShot X=-50 Y=50 SHOT=CrossGreen
$MapPatternShot X=-50 Y=100 SHOT=CrossBlue
$MapPatternShot X=-50 Y=150 SHOT=CrossGreen
$MapPatternShot X=-50 Y=200 SHOT=CrossBlue
$MapPatternShot X=-50 Y=250 SHOT=CrossGreen
$MapPatternShot X=-50 Y=300 SHOT=CrossBlue
$MapPatternShot X=-50 Y=350 SHOT=CrossGreen
$MapPatternShot X=-50 Y=400 SHOT=CrossBlue
$MapPatternShot X=-50 Y=450 SHOT=CrossGreen
$MapPatternShot X=-50 Y=500 SHOT=CrossBlue
$MapPatternShot X=-50 Y=550 SHOT=CrossGreen
$MapPatternShot X=-50 Y=600 SHOT=CrossBlue
$MapPatternShot X=-50 Y=650 SHOT=CrossGreen
$MapPatternShot X=-50 Y=700 SHOT=CrossBlue
$MapPatternShot X=-50 Y=750 SHOT=CrossGreen
$MapPatternShot X=-50 Y=800 SHOT=CrossBlue
$MapPatternShot X=-50 Y=850 SHOT=CrossGreen
$MapPatternShot X=-50 Y=900 SHOT=CrossBlue
$MapPatternShot X=-50 Y=950 SHOT=CrossGreen
$MapPatternShot X=-50 Y=1000 SHOT=CrossBlue
$MapPatternShot X=0 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=0 Y=-950 SHOT=CrossGreen
$MapPatternShot X=0 Y=-900 SHOT=CrossBlue
$MapPatternShot X=0 Y=-850 SHOT=CrossGreen
$MapPatternShot X=0 Y=-800 SHOT=CrossBlue
$MapPatternShot X=0 Y=-750 SHOT=CrossGreen
$MapPatternShot X=0 Y=-700 SHOT=CrossBlue
$MapPatternShot X=0 Y=-650 SHOT=CrossGreen
$MapPatternShot X=0 Y=-600 SHOT=CrossBlue
$MapPatternShot X=0 Y=-550 SHOT=CrossGreen
$MapPatternShot X=0 Y=-500 SHOT=CrossBlue
$MapPatternShot X=0 Y=-450 SHOT=CrossGreen
$MapPatternShot X=0 Y=-400 SHOT=CrossBlue
$MapPatternShot X=0 Y=-350 SHOT=CrossGreen
$MapPatternShot X=0 Y=-300 SHOT=CrossBlue
$MapPatternShot X=0 Y=-250 SHOT=CrossGreen
$MapPatternShot X=0 Y=-200 SHOT=CrossBlue
$MapPatternShot X=0 Y=-150 SHOT=CrossGreen
$MapPatternShot X=0 Y=-100 SHOT=CrossBlue
$MapPatternShot X=0 Y=-50 SHOT=CrossGreen
$MapPatternShot X=0 Y=0 SHOT=CrossBlue
$MapPatternShot X=0 Y=50 SHOT=CrossGreen
$MapPatternShot X=0 Y=100 SHOT=CrossBlue
$MapPatternShot X=0 Y=150 SHOT=CrossGreen
$MapPatternShot X=0 Y=200 SHOT=CrossBlue
$MapPatternShot X=0 Y=250 SHOT=CrossGreen
$MapPatternShot X=0 Y=300 SHOT=CrossBlue
$MapPatternShot X=0 Y=350 SHOT=CrossGreen
$MapPatternShot X=0 Y=400 SHOT=CrossBlue
$MapPatternShot X=0 Y=450 SHOT=CrossGreen
$MapPatternShot X=0 Y=500 SHOT=CrossBlue
$MapPatternShot X=0 Y=550 SHOT=CrossGreen
$MapPatternShot X=0 Y=600 SHOT=CrossBlue
$MapPatternShot X=0 Y=650 SHOT=CrossGreen
$MapPatternShot X=0 Y=700 SHOT=CrossBlue
$MapPatternShot X=0 Y=750 SHOT=CrossGreen
$MapPatternShot X=0 Y=800 SHOT=CrossBlue
$MapPatternShot X=0 Y=850 SHOT=CrossGreen
$MapPatternShot X=0 Y=900 SHOT=CrossBlue
$MapPatternShot X=0 Y=950 SHOT=CrossGreen
$MapPatternShot X=0 Y=1000 SHOT=CrossBlue
$MapPatternShot X=50 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=50 Y=-950 SHOT=CrossGreen
$MapPatternShot X=50 Y=-900 SHOT=CrossBlue
$MapPatternShot X=50 Y=-850 SHOT=CrossGreen
$MapPatternShot X=50 Y=-800 SHOT=CrossBlue
$MapPatternShot X=50 Y=-750 SHOT=CrossGreen
$MapPatternShot X=50 Y=-700 SHOT=CrossBlue
$MapPatternShot X=50 Y=-650 SHOT=CrossGreen
$MapPatternShot X=50 Y=-600 SHOT=CrossBlue
$MapPatternShot X=50 Y=-550 SHOT=CrossGreen
$MapPatternShot X=50 Y=-500 SHOT=CrossBlue
$MapPatternShot X=50 Y=-450 SHOT=CrossGreen
$MapPatternShot X=50 Y=-400 SHOT=CrossBlue
$MapPatternShot X=50 Y=-350 SHOT=CrossGreen
$MapPatternShot X=50 Y=-300 SHOT=CrossBlue
$MapPatternShot X=50 Y=-250 SHOT=CrossGreen
$MapPatternShot X=50 Y=-200 SHOT=CrossBlue
$MapPatternShot X=50 Y=-150 SHOT=CrossGreen
$MapPatternShot X=50 Y=-100 SHOT=CrossBlue
$MapPatternShot X=50 Y=-50 SHOT=CrossGreen
$MapPatternShot X=50 Y=0 SHOT=CrossBlue
$MapPatternShot X=50 Y=50 SHOT=CrossGreen
$MapPatternShot X=50 Y=100 SHOT=CrossBlue
$MapPatternShot X=50 Y=150 SHOT=CrossGreen
$MapPatternShot X=50 Y=200 SHOT=CrossBlue
$MapPatternShot X=50 Y=250 SHOT=CrossGreen
$MapPatternShot X=50 Y=300 SHOT=CrossBlue
$MapPatternShot X=50 Y=350 SHOT=CrossGreen
$MapPatternShot X=50 Y=400 SHOT=CrossBlue
$MapPatternShot X=50 Y=450 SHOT=CrossGreen
$MapPatternShot X=50 Y=500 SHOT=CrossBlue
$MapPatternShot X=50 Y=550 SHOT=CrossGreen
$MapPatternShot X=50 Y=600 SHOT=CrossBlue
$MapPatternShot X=50 Y=650 SHOT=CrossGreen
$MapPatternShot X=50 Y=700 SHOT=CrossBlue
$MapPatternShot X=50 Y=750 SHOT=CrossGreen
$MapPatternShot X=50 Y=800 SHOT=CrossBlue
$MapPatternShot X=50 Y=850 SHOT=CrossGreen
$MapPatternShot X=50 Y=900 SHOT=CrossBlue
$MapPatternShot X=50 Y=950 SHOT=CrossGreen
$MapPatternShot X=50 Y=1000 SHOT=CrossBlue
$MapPatternShot X=100 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=100 Y=-950 SHOT=CrossGreen
$MapPatternShot X=100 Y=-900 SHOT=CrossBlue
$MapPatternShot X=100 Y=-850 SHOT=CrossGreen
$MapPatternShot X=100 Y=-800 SHOT=CrossBlue
$MapPatternShot X=100 Y=-750 SHOT=CrossGreen
$MapPatternShot X=100 Y=-700 SHOT=CrossBlue
$MapPatternShot X=100 Y=-650 SHOT=CrossGreen
$MapPatternShot X=100 Y=-600 SHOT=CrossBlue
$MapPatternShot X=100 Y=-550 SHOT=CrossGreen
$MapPatternShot X=100 Y=-500 SHOT=CrossBlue
$MapPatternShot X=100 Y=-450 SHOT=CrossGreen
$MapPatternShot X=100 Y=-400 SHOT=CrossBlue
$MapPatternShot X=100 Y=-350 SHOT=CrossGreen
$MapPatternShot X=100 Y=-300 SHOT=CrossBlue
$MapPatternShot X=100 Y=-250 SHOT=CrossGreen
$MapPatternShot X=100 Y=-200 SHOT=CrossBlue
$MapPatternShot X=100 Y=-150 SHOT=CrossGreen
$MapPatternShot X=100 Y=-100 SHOT=CrossBlue
$MapPatternShot X=100 Y=-50 SHOT=CrossGreen
$MapPatternShot X=100 Y=0 SHOT=CrossBlue
$MapPatternShot X=100 Y=50 SHOT=CrossGreen
$MapPatternShot X=100 Y=100 SHOT=CrossBlue
$MapPatternShot X=100 Y=150 SHOT=CrossGreen
$MapPatternShot X=100 Y=200 SHOT=CrossBlue
$MapPatternShot X=100 Y=250 SHOT=CrossGreen
$MapPatternShot X=100 Y=300 SHOT=CrossBlue
$MapPatternShot X=100 Y=350 SHOT=CrossGreen
$MapPatternShot X=100 Y=400 SHOT=CrossBlue
$MapPatternShot X=100 Y=450 SHOT=CrossGreen
$MapPatternShot X=100 Y=500 SHOT=CrossBlue
$MapPatternShot X=100 Y=550 SHOT=CrossGreen
$MapPatternShot X=100 Y=600 SHOT=CrossBlue
$MapPatternShot X=100 Y=650 SHOT=CrossGreen
$MapPatternShot X=100 Y=700 SHOT=CrossBlue
$MapPatternShot X=100 Y=750 SHOT=CrossGreen
$MapPatternShot X=100 Y=800 SHOT=CrossBlue
$MapPatternShot X=100 Y=850 SHOT=CrossGreen
$MapPatternShot X=100 Y=900 SHOT=CrossBlue
$MapPatternShot X=100 Y=950 SHOT=CrossGreen
$MapPatternShot X=100 Y=1000 SHOT=CrossBlue
$MapPatternShot X=150 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=150 Y=-950 SHOT=CrossGreen
$MapPatternShot X=150 Y=-900 SHOT=CrossBlue
$MapPatternShot X=150 Y=-850 SHOT=CrossGreen
$MapPatternShot X=150 Y=-800 SHOT=CrossBlue
$MapPatternShot X=150 Y=-750 SHOT=CrossGreen
$MapPatternShot X=150 Y=-700 SHOT=CrossBlue
$MapPatternShot X=150 Y=-650 SHOT=CrossGreen
$MapPatternShot X=150 Y=-600 SHOT=CrossBlue
$MapPatternShot X=150 Y=-550 SHOT=CrossGreen
$MapPatternShot X=150 Y=-500 SHOT=CrossBlue
$MapPatternShot X=150 Y=-450 SHOT=CrossGreen
$MapPatternShot X=150 Y=-400 SHOT=CrossBlue
$MapPatternShot X=150 Y=-350 SHOT=CrossGreen
$MapPatternShot X=150 Y=-300 SHOT=CrossBlue
$MapPatternShot X=150 Y=-250 SHOT=CrossGreen
$MapPatternShot X=150 Y=-200 SHOT=CrossBlue
$MapPatternShot X=150 Y=-150 SHOT=CrossGreen
$MapPatternShot X=150 Y=-100 SHOT=CrossBlue
$MapPatternShot X=150 Y=-50 SHOT=CrossGreen
$MapPatternShot X=150 Y=0 SHOT=CrossBlue
$MapPatternShot X=150 Y=50 SHOT=CrossGreen
$MapPatternShot X=150 Y=100 SHOT=CrossBlue
$MapPatternShot X=150 Y=150 SHOT=CrossGreen
$MapPatternShot X=150 Y=200 SHOT=CrossBlue
$MapPatternShot X=150 Y=250 SHOT=CrossGreen
$MapPatternShot X=150 Y=300 SHOT=CrossBlue
$MapPatternShot X=150 Y=350 SHOT=CrossGreen
$MapPatternShot X=150 Y=400 SHOT=CrossBlue
$MapPatternShot X=150 Y=450 SHOT=CrossGreen
$MapPatternShot X=150 Y=500 SHOT=CrossBlue
$MapPatternShot X=150 Y=550 SHOT=CrossGreen
$MapPatternShot X=150 Y=600 SHOT=CrossBlue
$MapPatternShot X=150 Y=650 SHOT=CrossGreen
$MapPatternShot X=150 Y=700 SHOT=CrossBlue
$MapPatternShot X=150 Y=750 SHOT=CrossGreen
$MapPatternShot X=150 Y=800 SHOT=CrossBlue
$MapPatternShot X=150 Y=850 SHOT=CrossGreen
$MapPatternShot X=150 Y=900 SHOT=CrossBlue
$MapPatternShot X=150 Y=950 SHOT=CrossGreen
$MapPatternShot X=150 Y=1000 SHOT=CrossBlue
$MapPatternShot X=200 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=200 Y=-950 SHOT=CrossGreen
$MapPatternShot X=200 Y=-900 SHOT=CrossBlue
$MapPatternShot X=200 Y=-850 SHOT=CrossGreen
$MapPatternShot X=200 Y=-800 SHOT=CrossBlue
$MapPatternShot X=200 Y=-750 SHOT=CrossGreen
$MapPatternShot X=200 Y=-700 SHOT=CrossBlue
$MapPatternShot X=200 Y=-650 SHOT=CrossGreen
$MapPatternShot X=200 Y=-600 SHOT=CrossBlue
$MapPatternShot X=200 Y=-550 SHOT=CrossGreen
$MapPatternShot X=200 Y=-500 SHOT=CrossBlue
$MapPatternShot X=200 Y=-450 SHOT=CrossGreen
$MapPatternShot X=200 Y=-400 SHOT=CrossBlue
$MapPatternShot X=200 Y=-350 SHOT=CrossGreen
$MapPatternShot X=200 Y=-300 SHOT=CrossBlue
$MapPatternShot X=200 Y=-250 SHOT=CrossGreen
$MapPatternShot X=200 Y=-200 SHOT=CrossBlue
$MapPatternShot X=200 Y=-150 SHOT=CrossGreen
$MapPatternShot X=200 Y=-100 SHOT=CrossBlue
$MapPatternShot X=200 Y=-50 SHOT=CrossGreen
$MapPatternShot X=200 Y=0 SHOT=CrossBlue
$MapPatternShot X=200 Y=50 SHOT=CrossGreen
$MapPatternShot X=200 Y=100 SHOT=CrossBlue
$MapPatternShot X=200 Y=150 SHOT=CrossGreen
$MapPatternShot X=200 Y=200 SHOT=CrossBlue
$MapPatternShot X=200 Y=250 SHOT=CrossGreen
$MapPatternShot X=200 Y=300 SHOT=CrossBlue
$MapPatternShot X=200 Y=350 SHOT=CrossGreen
$MapPatternShot X=200 Y=400 SHOT=CrossBlue
$MapPatternShot X=200 Y=450 SHOT=CrossGreen
$MapPatternShot X=200 Y=500 SHOT=CrossBlue
$MapPatternShot X=200 Y=550 SHOT=CrossGreen
$MapPatternShot X=200 Y=600 SHOT=CrossBlue
$MapPatternShot X=200 Y=650 SHOT=CrossGreen
$MapPatternShot X=200 Y=700 SHOT=CrossBlue
$MapPatternShot X=200 Y=750 SHOT=CrossGreen
$MapPatternShot X=200 Y=800 SHOT=CrossBlue
$MapPatternShot X=200 Y=850 SHOT=CrossGreen
$MapPatternShot X=200 Y=900 SHOT=CrossBlue
$MapPatternShot X=200 Y=950 SHOT=CrossGreen
$MapPatternShot X=200 Y=1000 SHOT=CrossBlue
$MapPatternShot X=250 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=250 Y=-950 SHOT=CrossGreen
$MapPatternShot X=250 Y=-900 SHOT=CrossBlue
$MapPatternShot X=250 Y=-850 SHOT=CrossGreen
$MapPatternShot X=250 Y=-800 SHOT=CrossBlue
$MapPatternShot X=250 Y=-750 SHOT=CrossGreen
$MapPatternShot X=250 Y=-700 SHOT=CrossBlue
$MapPatternShot X=250 Y=-650 SHOT=CrossGreen
$MapPatternShot X=250 Y=-600 SHOT=CrossBlue
$MapPatternShot X=250 Y=-550 SHOT=CrossGreen
$MapPatternShot X=250 Y=-500 SHOT=CrossBlue
$MapPatternShot X=250 Y=-450 SHOT=CrossGreen
$MapPatternShot X=250 Y=-400 SHOT=CrossBlue
$MapPatternShot X=250 Y=-350 SHOT=CrossGreen
$MapPatternShot X=250 Y=-300 SHOT=CrossBlue
$MapPatternShot X=250 Y=-250 SHOT=CrossGreen
$MapPatternShot X=250 Y=-200 SHOT=CrossBlue
$MapPatternShot X=250 Y=-150 SHOT=CrossGreen
$MapPatternShot X=250 Y=-100 SHOT=CrossBlue
$MapPatternShot X=250 Y=-50 SHOT=CrossGreen
$MapPatternShot X=250 Y=0 SHOT=CrossBlue
$MapPatternShot X=250 Y=50 SHOT=CrossGreen
$MapPatternShot X=250 Y=100 SHOT=CrossBlue
$MapPatternShot X=250 Y=150 SHOT=CrossGreen
$MapPatternShot X=250 Y=200 SHOT=CrossBlue
$MapPatternShot X=250 Y=250 SHOT=CrossGreen
$MapPatternShot X=250 Y=300 SHOT=CrossBlue
$MapPatternShot X=250 Y=350 SHOT=CrossGreen
$MapPatternShot X=250 Y=400 SHOT=CrossBlue
$MapPatternShot X=250 Y=450 SHOT=CrossGreen
$MapPatternShot X=250 Y=500 SHOT=CrossBlue
$MapPatternShot X=250 Y=550 SHOT=CrossGreen
$MapPatternShot X=250 Y=600 SHOT=CrossBlue
$MapPatternShot X=250 Y=650 SHOT=CrossGreen
$MapPatternShot X=250 Y=700 SHOT=CrossBlue
$MapPatternShot X=250 Y=750 SHOT=CrossGreen
$MapPatternShot X=250 Y=800 SHOT=CrossBlue
$MapPatternShot X=250 Y=850 SHOT=CrossGreen
$MapPatternShot X=250 Y=900 SHOT=CrossBlue
$MapPatternShot X=250 Y=950 SHOT=CrossGreen
$MapPatternShot X=250 Y=1000 SHOT=CrossBlue
$MapPatternShot X=300 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=300 Y=-950 SHOT=CrossGreen
$MapPatternShot X=300 Y=-900 SHOT=CrossBlue
$MapPatternShot X=300 Y=-850 SHOT=CrossGreen
$MapPatternShot X=300 Y=-800 SHOT=CrossBlue
$MapPatternShot X=300 Y=-750 SHOT=CrossGreen
$MapPatternShot X=300 Y=-700 SHOT=CrossBlue
$MapPatternShot X=300 Y=-650 SHOT=CrossGreen
$MapPatternShot X=300 Y=-600 SHOT=CrossBlue
$MapPatternShot X=300 Y=-550 SHOT=CrossGreen
$MapPatternShot X=300 Y=-500 SHOT=CrossBlue
$MapPatternShot X=300 Y=-450 SHOT=CrossGreen
$MapPatternShot X=300 Y=-400 SHOT=CrossBlue
$MapPatternShot X=300 Y=-350 SHOT=CrossGreen
$MapPatternShot X=300 Y=-300 SHOT=CrossBlue
$MapPatternShot X=300 Y=-250 SHOT=CrossGreen
$MapPatternShot X=300 Y=-200 SHOT=CrossBlue
$MapPatternShot X=300 Y=-150 SHOT=CrossGreen
$MapPatternShot X=300 Y=-100 SHOT=CrossBlue
$MapPatternShot X=300 Y=-50 SHOT=CrossGreen
$MapPatternShot X=300 Y=0 SHOT=CrossBlue
$MapPatternShot X=300 Y=50 SHOT=CrossGreen
$MapPatternShot X=300 Y=100 SHOT=CrossBlue
$MapPatternShot X=300 Y=150 SHOT=CrossGreen
$MapPatternShot X=300 Y=200 SHOT=CrossBlue
$MapPatternShot X=300 Y=250 SHOT=CrossGreen
$MapPatternShot X=300 Y=300 SHOT=CrossBlue
$MapPatternShot X=300 Y=350 SHOT=CrossGreen
$MapPatternShot X=300 Y=400 SHOT=CrossBlue
$MapPatternShot X=300 Y=450 SHOT=CrossGreen
$MapPatternShot X=300 Y=500 SHOT=CrossBlue
$MapPatternShot X=300 Y=550 SHOT=CrossGreen
$MapPatternShot X=300 Y=600 SHOT=CrossBlue
$MapPatternShot X=300 Y=650 SHOT=CrossGreen
$MapPatternShot X=300 Y=700 SHOT=CrossBlue
$MapPatternShot X=300 Y=750 SHOT=CrossGreen
$MapPatternShot X=300 Y=800 SHOT=CrossBlue
$MapPatternShot X=300 Y=850 SHOT=CrossGreen
$MapPatternShot X=300 Y=900 SHOT=CrossBlue
$MapPatternShot X=300 Y=950 SHOT=CrossGreen
$MapPatternShot X=300 Y=1000 SHOT=CrossBlue
$MapPatternShot X=350 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=350 Y=-950 SHOT=CrossGreen
$MapPatternShot X=350 Y=-900 SHOT=CrossBlue
$MapPatternShot X=350 Y=-850 SHOT=CrossGreen
$MapPatternShot X=350 Y=-800 SHOT=CrossBlue
$MapPatternShot X=350 Y=-750 SHOT=CrossGreen
$MapPatternShot X=350 Y=-700 SHOT=CrossBlue
$MapPatternShot X=350 Y=-650 SHOT=CrossGreen
$MapPatternShot X=350 Y=-600 SHOT=CrossBlue
$MapPatternShot X=350 Y=-550 SHOT=CrossGreen
$MapPatternShot X=350 Y=-500 SHOT=CrossBlue
$MapPatternShot X=350 Y=-450 SHOT=CrossGreen
$MapPatternShot X=350 Y=-400 SHOT=CrossBlue
$MapPatternShot X=350 Y=-350 SHOT=CrossGreen
$MapPatternShot X=350 Y=-300 SHOT=CrossBlue
$MapPatternShot X=350 Y=-250 SHOT=CrossGreen
$MapPatternShot X=350 Y=-200 SHOT=CrossBlue
$MapPatternShot X=350 Y=-150 SHOT=CrossGreen
$MapPatternShot X=350 Y=-100 SHOT=CrossBlue
$MapPatternShot X=350 Y=-50 SHOT=CrossGreen
$MapPatternShot X=350 Y=0 SHOT=CrossBlue
$MapPatternShot X=350 Y=50 SHOT=CrossGreen
$MapPatternShot X=350 Y=100 SHOT=CrossBlue
$MapPatternShot X=350 Y=150 SHOT=CrossGreen
$MapPatternShot X=350 Y=200 SHOT=CrossBlue
$MapPatternShot X=350 Y=250 SHOT=CrossGreen
$MapPatternShot X=350 Y=300 SHOT=CrossBlue
$MapPatternShot X=350 Y=350 SHOT=CrossGreen
$MapPatternShot X=350 Y=400 SHOT=CrossBlue
$MapPatternShot X=350 Y=450 SHOT=CrossGreen
$MapPatternShot X=350 Y=500 SHOT=CrossBlue
$MapPatternShot X=350 Y=550 SHOT=CrossGreen
$MapPatternShot X=350 Y=600 SHOT=CrossBlue
$MapPatternShot X=350 Y=650 SHOT=CrossGreen
$MapPatternShot X=350 Y=700 SHOT=CrossBlue
$MapPatternShot X=350 Y=750 SHOT=CrossGreen
$MapPatternShot X=350 Y=800 SHOT=CrossBlue
$MapPatternShot X=350 Y=850 SHOT=CrossGreen
$MapPatternShot X=350 Y=900 SHOT=CrossBlue
$MapPatternShot X=350 Y=950 SHOT=CrossGreen
$MapPatternShot X=350 Y=1000 SHOT=CrossBlue
$MapPatternShot X=400 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=400 Y=-950 SHOT=CrossGreen
$MapPatternShot X=400 Y=-900 SHOT=CrossBlue
$MapPatternShot X=400 Y=-850 SHOT=CrossGreen
$MapPatternShot X=400 Y=-800 SHOT=CrossBlue
$MapPatternShot X=400 Y=-750 SHOT=CrossGreen
$MapPatternShot X=400 Y=-700 SHOT=CrossBlue
$MapPatternShot X=400 Y=-650 SHOT=CrossGreen
$MapPatternShot X=400 Y=-600 SHOT=CrossBlue
$MapPatternShot X=400 Y=-550 SHOT=CrossGreen
$MapPatternShot X=400 Y=-500 SHOT=CrossBlue
$MapPatternShot X=400 Y=-450 SHOT=CrossGreen
$MapPatternShot X=400 Y=-400 SHOT=CrossBlue
$MapPatternShot X=400 Y=-350 SHOT=CrossGreen
$MapPatternShot X=400 Y=-300 SHOT=CrossBlue
$MapPatternShot X=400 Y=-250 SHOT=CrossGreen
$MapPatternShot X=400 Y=-200 SHOT=CrossBlue
$MapPatternShot X=400 Y=-150 SHOT=CrossGreen
$MapPatternShot X=400 Y=-100 SHOT=CrossBlue
$MapPatternShot X=400 Y=-50 SHOT=CrossGreen
$MapPatternShot X=400 Y=0 SHOT=CrossBlue
$MapPatternShot X=400 Y=50 SHOT=CrossGreen
$MapPatternShot X=400 Y=100 SHOT=CrossBlue
$MapPatternShot X=400 Y=150 SHOT=CrossGreen
$MapPatternShot X=400 Y=200 SHOT=CrossBlue
$MapPatternShot X=400 Y=250 SHOT=CrossGreen
$MapPatternShot X=400 Y=300 SHOT=CrossBlue
$MapPatternShot X=400 Y=350 SHOT=CrossGreen
$MapPatternShot X=400 Y=400 SHOT=CrossBlue
$MapPatternShot X=400 Y=450 SHOT=CrossGreen
$MapPatternShot X=400 Y=500 SHOT=CrossBlue
$MapPatternShot X=400 Y=550 SHOT=CrossGreen
$MapPatternShot X=400 Y=600 SHOT=CrossBlue
$MapPatternShot X=400 Y=650 SHOT=CrossGreen
$MapPatternShot X=400 Y=700 SHOT=CrossBlue
$MapPatternShot X=400 Y=750 SHOT=CrossGreen
$MapPatternShot X=400 Y=800 SHOT=CrossBlue
$MapPatternShot X=400 Y=850 SHOT=CrossGreen
$MapPatternShot X=400 Y=900 SHOT=CrossBlue
$MapPatternShot X=400 Y=950 SHOT=CrossGreen
$MapPatternShot X=400 Y=1000 SHOT=CrossBlue
$MapPatternShot X=450 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=450 Y=-950 SHOT=CrossGreen
$MapPatternShot X=450 Y=-900 SHOT=CrossBlue
$MapPatternShot X=450 Y=-850 SHOT=CrossGreen
$MapPatternShot X=450 Y=-800 SHOT=CrossBlue
$MapPatternShot X=450 Y=-750 SHOT=CrossGreen
$MapPatternShot X=450 Y=-700 SHOT=CrossBlue
$MapPatternShot X=450 Y=-650 SHOT=CrossGreen
$MapPatternShot X=450 Y=-600 SHOT=CrossBlue
$MapPatternShot X=450 Y=-550 SHOT=CrossGreen
$MapPatternShot X=450 Y=-500 SHOT=CrossBlue
$MapPatternShot X=450 Y=-450 SHOT=CrossGreen
$MapPatternShot X=450 Y=-400 SHOT=CrossBlue
$MapPatternShot X=450 Y=-350 SHOT=CrossGreen
$MapPatternShot X=450 Y=-300 SHOT=CrossBlue
$MapPatternShot X=450 Y=-250 SHOT=CrossGreen
$MapPatternShot X=450 Y=-200 SHOT=CrossBlue
$MapPatternShot X=450 Y=-150 SHOT=CrossGreen
$MapPatternShot X=450 Y=-100 SHOT=CrossBlue
$MapPatternShot X=450 Y=-50 SHOT=CrossGreen
$MapPatternShot X=450 Y=0 SHOT=CrossBlue
$MapPatternShot X=450 Y=50 SHOT=CrossGreen
$MapPatternShot X=450 Y=100 SHOT=CrossBlue
$MapPatternShot X=450 Y=150 SHOT=CrossGreen
$MapPatternShot X=450 Y=200 SHOT=CrossBlue
$MapPatternShot X=450 Y=250 SHOT=CrossGreen
$MapPatternShot X=450 Y=300 SHOT=CrossBlue
$MapPatternShot X=450 Y=350 SHOT=CrossGreen
$MapPatternShot X=450 Y=400 SHOT=CrossBlue
$MapPatternShot X=450 Y=450 SHOT=CrossGreen
$MapPatternShot X=450 Y=500 SHOT=CrossBlue
$MapPatternShot X=450 Y=550 SHOT=CrossGreen
$MapPatternShot X=450 Y=600 SHOT=CrossBlue
$MapPatternShot X=450 Y=650 SHOT=CrossGreen
$MapPatternShot X=450 Y=700 SHOT=CrossBlue
$MapPatternShot X=450 Y=750 SHOT=CrossGreen
$MapPatternShot X=450 Y=800 SHOT=CrossBlue
$MapPatternShot X=450 Y=850 SHOT=CrossGreen
$MapPatternShot X=450 Y=900 SHOT=CrossBlue
$MapPatternShot X=450 Y=950 SHOT=CrossGreen
$MapPatternShot X=450 Y=1000 SHOT=CrossBlue
$MapPatternShot X=500 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=500 Y=-950 SHOT=CrossGreen
$MapPatternShot X=500 Y=-900 SHOT=CrossBlue
$MapPatternShot X=500 Y=-850 SHOT=CrossGreen
$MapPatternShot X=500 Y=-800 SHOT=CrossBlue
$MapPatternShot X=500 Y=-750 SHOT=CrossGreen
$MapPatternShot X=500 Y=-700 SHOT=CrossBlue
$MapPatternShot X=500 Y=-650 SHOT=CrossGreen
$MapPatternShot X=500 Y=-600 SHOT=CrossBlue
$MapPatternShot X=500 Y=-550 SHOT=CrossGreen
$MapPatternShot X=500 Y=-500 SHOT=CrossBlue
$MapPatternShot X=500 Y=-450 SHOT=CrossGreen
$MapPatternShot X=500 Y=-400 SHOT=CrossBlue
$MapPatternShot X=500 Y=-350 SHOT=CrossGreen
$MapPatternShot X=500 Y=-300 SHOT=CrossBlue
$MapPatternShot X=500 Y=-250 SHOT=CrossGreen
$MapPatternShot X=500 Y=-200 SHOT=CrossBlue
$MapPatternShot X=500 Y=-150 SHOT=CrossGreen
$MapPatternShot X=500 Y=-100 SHOT=CrossBlue
$MapPatternShot X=500 Y=-50 SHOT=CrossGreen
$MapPatternShot X=500 Y=0 SHOT=CrossBlue
$MapPatternShot X=500 Y=50 SHOT=CrossGreen
$MapPatternShot X=500 Y=100 SHOT=CrossBlue
$MapPatternShot X=500 Y=150 SHOT=CrossGreen
$MapPatternShot X=500 Y=200 SHOT=CrossBlue
$MapPatternShot X=500 Y=250 SHOT=CrossGreen
$MapPatternShot X=500 Y=300 SHOT=CrossBlue
$MapPatternShot X=500 Y=350 SHOT=CrossGreen
$MapPatternShot X=500 Y=400 SHOT=CrossBlue
$MapPatternShot X=500 Y=450 SHOT=CrossGreen
$MapPatternShot X=500 Y=500 SHOT=CrossBlue
$MapPatternShot X=500 Y=550 SHOT=CrossGreen
$MapPatternShot X=500 Y=600 SHOT=CrossBlue
$MapPatternShot X=500 Y=650 SHOT=CrossGreen
$MapPatternShot X=500 Y=700 SHOT=CrossBlue
$MapPatternShot X=500 Y=750 SHOT=CrossGreen
$MapPatternShot X=500 Y=800 SHOT=CrossBlue
$MapPatternShot X=500 Y=850 SHOT=CrossGreen
$MapPatternShot X=500 Y=900 SHOT=CrossBlue
$MapPatternShot X=500 Y=950 SHOT=CrossGreen
$MapPatternShot X=500 Y=1000 SHOT=CrossBlue
$MapPatternShot X=550 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=550 Y=-950 SHOT=CrossGreen
$MapPatternShot X=550 Y=-900 SHOT=CrossBlue
$MapPatternShot X=550 Y=-850 SHOT=CrossGreen
$MapPatternShot X=550 Y=-800 SHOT=CrossBlue
$MapPatternShot X=550 Y=-750 SHOT=CrossGreen
$MapPatternShot X=550 Y=-700 SHOT=CrossBlue
$MapPatternShot X=550 Y=-650 SHOT=CrossGreen
$MapPatternShot X=550 Y=-600 SHOT=CrossBlue
$MapPatternShot X=550 Y=-550 SHOT=CrossGreen
$MapPatternShot X=550 Y=-500 SHOT=CrossBlue
$MapPatternShot X=550 Y=-450 SHOT=CrossGreen
$MapPatternShot X=550 Y=-400 SHOT=CrossBlue
$MapPatternShot X=550 Y=-350 SHOT=CrossGreen
$MapPatternShot X=550 Y=-300 SHOT=CrossBlue
$MapPatternShot X=550 Y=-250 SHOT=CrossGreen
$MapPatternShot X=550 Y=-200 SHOT=CrossBlue
$MapPatternShot X=550 Y=-150 SHOT=CrossGreen
$MapPatternShot X=550 Y=-100 SHOT=CrossBlue
$MapPatternShot X=550 Y=-50 SHOT=CrossGreen
$MapPatternShot X=550 Y=0 SHOT=CrossBlue
$MapPatternShot X=550 Y=50 SHOT=CrossGreen
$MapPatternShot X=550 Y=100 SHOT=CrossBlue
$MapPatternShot X=550 Y=150 SHOT=CrossGreen
$MapPatternShot X=550 Y=200 SHOT=CrossBlue
$MapPatternShot X=550 Y=250 SHOT=CrossGreen
$MapPatternShot X=550 Y=300 SHOT=CrossBlue
$MapPatternShot X=550 Y=350 SHOT=CrossGreen
$MapPatternShot X=550 Y=400 SHOT=CrossBlue
$MapPatternShot X=550 Y=450 SHOT=CrossGreen
$MapPatternShot X=550 Y=500 SHOT=CrossBlue
$MapPatternShot X=550 Y=550 SHOT=CrossGreen
$MapPatternShot X=550 Y=600 SHOT=CrossBlue
$MapPatternShot X=550 Y=650 SHOT=CrossGreen
$MapPatternShot X=550 Y=700 SHOT=CrossBlue
$MapPatternShot X=550 Y=750 SHOT=CrossGreen
$MapPatternShot X=550 Y=800 SHOT=CrossBlue
$MapPatternShot X=550 Y=850 SHOT=CrossGreen
$MapPatternShot X=550 Y=900 SHOT=CrossBlue
$MapPatternShot X=550 Y=950 SHOT=CrossGreen
$MapPatternShot X=550 Y=1000 SHOT=CrossBlue
$MapPatternShot X=600 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=600 Y=-950 SHOT=CrossGreen
$MapPatternShot X=600 Y=-900 SHOT=CrossBlue
$MapPatternShot X=600 Y=-850 SHOT=CrossGreen
$MapPatternShot X=600 Y=-800 SHOT=CrossBlue
$MapPatternShot X=600 Y=-750 SHOT=CrossGreen
$MapPatternShot X=600 Y=-700 SHOT=CrossBlue
$MapPatternShot X=600 Y=-650 SHOT=CrossGreen
$MapPatternShot X=600 Y=-600 SHOT=CrossBlue
$MapPatternShot X=600 Y=-550 SHOT=CrossGreen
$MapPatternShot X=600 Y=-500 SHOT=CrossBlue
$MapPatternShot X=600 Y=-450 SHOT=CrossGreen
$MapPatternShot X=600 Y=-400 SHOT=CrossBlue
$MapPatternShot X=600 Y=-350 SHOT=CrossGreen
$MapPatternShot X=600 Y=-300 SHOT=CrossBlue
$MapPatternShot X=600 Y=-250 SHOT=CrossGreen
$MapPatternShot X=600 Y=-200 SHOT=CrossBlue
$MapPatternShot X=600 Y=-150 SHOT=CrossGreen
$MapPatternShot X=600 Y=-100 SHOT=CrossBlue
$MapPatternShot X=600 Y=-50 SHOT=CrossGreen
$MapPatternShot X=600 Y=0 SHOT=CrossBlue
$MapPatternShot X=600 Y=50 SHOT=CrossGreen
$MapPatternShot X=600 Y=100 SHOT=CrossBlue
$MapPatternShot X=600 Y=150 SHOT=CrossGreen
$MapPatternShot X=600 Y=200 SHOT=CrossBlue
$MapPatternShot X=600 Y=250 SHOT=CrossGreen
$MapPatternShot X=600 Y=300 SHOT=CrossBlue
$MapPatternShot X=600 Y=350 SHOT=CrossGreen
$MapPatternShot X=600 Y=400 SHOT=CrossBlue
$MapPatternShot X=600 Y=450 SHOT=CrossGreen
$MapPatternShot X=600 Y=500 SHOT=CrossBlue
$MapPatternShot X=600 Y=550 SHOT=CrossGreen
$MapPatternShot X=600 Y=600 SHOT=CrossBlue
$MapPatternShot X=600 Y=650 SHOT=CrossGreen
$MapPatternShot X=600 Y=700 SHOT=CrossBlue
$MapPatternShot X=600 Y=750 SHOT=CrossGreen
$MapPatternShot X=600 Y=800 SHOT=CrossBlue
$MapPatternShot X=600 Y=850 SHOT=CrossGreen
$MapPatternShot X=600 Y=900 SHOT=CrossBlue
$MapPatternShot X=600 Y=950 SHOT=CrossGreen
$MapPatternShot X=600 Y=1000 SHOT=CrossBlue
$MapPatternShot X=650 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=650 Y=-950 SHOT=CrossGreen
$MapPatternShot X=650 Y=-900 SHOT=CrossBlue
$MapPatternShot X=650 Y=-850 SHOT=CrossGreen
$MapPatternShot X=650 Y=-800 SHOT=CrossBlue
$MapPatternShot X=650 Y=-750 SHOT=CrossGreen
$MapPatternShot X=650 Y=-700 SHOT=CrossBlue
$MapPatternShot X=650 Y=-650 SHOT=CrossGreen
$MapPatternShot X=650 Y=-600 SHOT=CrossBlue
$MapPatternShot X=650 Y=-550 SHOT=CrossGreen
$MapPatternShot X=650 Y=-500 SHOT=CrossBlue
$MapPatternShot X=650 Y=-450 SHOT=CrossGreen
$MapPatternShot X=650 Y=-400 SHOT=CrossBlue
$MapPatternShot X=650 Y=-350 SHOT=CrossGreen
$MapPatternShot X=650 Y=-300 SHOT=CrossBlue
$MapPatternShot X=650 Y=-250 SHOT=CrossGreen
$MapPatternShot X=650 Y=-200 SHOT=CrossBlue
$MapPatternShot X=650 Y=-150 SHOT=CrossGreen
$MapPatternShot X=650 Y=-100 SHOT=CrossBlue
$MapPatternShot X=650 Y=-50 SHOT=CrossGreen
$MapPatternShot X=650 Y=0 SHOT=CrossBlue
$MapPatternShot X=650 Y=50 SHOT=CrossGreen
$MapPatternShot X=650 Y=100 SHOT=CrossBlue
$MapPatternShot X=650 Y=150 SHOT=CrossGreen
$MapPatternShot X=650 Y=200 SHOT=CrossBlue
$MapPatternShot X=650 Y=250 SHOT=CrossGreen
$MapPatternShot X=650 Y=300 SHOT=CrossBlue
$MapPatternShot X=650 Y=350 SHOT=CrossGreen
$MapPatternShot X=650 Y=400 SHOT=CrossBlue
$MapPatternShot X=650 Y=450 SHOT=CrossGreen
$MapPatternShot X=650 Y=500 SHOT=CrossBlue
$MapPatternShot X=650 Y=550 SHOT=CrossGreen
$MapPatternShot X=650 Y=600 SHOT=CrossBlue
$MapPatternShot X=650 Y=650 SHOT=CrossGreen
$MapPatternShot X=650 Y=700 SHOT=CrossBlue
$MapPatternShot X=650 Y=750 SHOT=CrossGreen
$MapPatternShot X=650 Y=800 SHOT=CrossBlue
$MapPatternShot X=650 Y=850 SHOT=CrossGreen
$MapPatternShot X=650 Y=900 SHOT=CrossBlue
$MapPatternShot X=650 Y=950 SHOT=CrossGreen
$MapPatternShot X=650 Y=1000 SHOT=CrossBlue
$MapPatternShot X=700 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=700 Y=-950 SHOT=CrossGreen
$MapPatternShot X=700 Y=-900 SHOT=CrossBlue
$MapPatternShot X=700 Y=-850 SHOT=CrossGreen
$MapPatternShot X=700 Y=-800 SHOT=CrossBlue
$MapPatternShot X=700 Y=-750 SHOT=CrossGreen
$MapPatternShot X=700 Y=-700 SHOT=CrossBlue
$MapPatternShot X=700 Y=-650 SHOT=CrossGreen
$MapPatternShot X=700 Y=-600 SHOT=CrossBlue
$MapPatternShot X=700 Y=-550 SHOT=CrossGreen
$MapPatternShot X=700 Y=-500 SHOT=CrossBlue
$MapPatternShot X=700 Y=-450 SHOT=CrossGreen
$MapPatternShot X=700 Y=-400 SHOT=CrossBlue
$MapPatternShot X=700 Y=-350 SHOT=CrossGreen
$MapPatternShot X=700 Y=-300 SHOT=CrossBlue
$MapPatternShot X=700 Y=-250 SHOT=CrossGreen
$MapPatternShot X=700 Y=-200 SHOT=CrossBlue
$MapPatternShot X=700 Y=-150 SHOT=CrossGreen
$MapPatternShot X=700 Y=-100 SHOT=CrossBlue
$MapPatternShot X=700 Y=-50 SHOT=CrossGreen
$MapPatternShot X=700 Y=0 SHOT=CrossBlue
$MapPatternShot X=700 Y=50 SHOT=CrossGreen
$MapPatternShot X=700 Y=100 SHOT=CrossBlue
$MapPatternShot X=700 Y=150 SHOT=CrossGreen
$MapPatternShot X=700 Y=200 SHOT=CrossBlue
$MapPatternShot X=700 Y=250 SHOT=CrossGreen
$MapPatternShot X=700 Y=300 SHOT=CrossBlue
$MapPatternShot X=700 Y=350 SHOT=CrossGreen
$MapPatternShot X=700 Y=400 SHOT=CrossBlue
$MapPatternShot X=700 Y=450 SHOT=CrossGreen
$MapPatternShot X=700 Y=500 SHOT=CrossBlue
$MapPatternShot X=700 Y=550 SHOT=CrossGreen
$MapPatternShot X=700 Y=600 SHOT=CrossBlue
$MapPatternShot X=700 Y=650 SHOT=CrossGreen
$MapPatternShot X=700 Y=700 SHOT=CrossBlue
$MapPatternShot X=700 Y=750 SHOT=CrossGreen
$MapPatternShot X=700 Y=800 SHOT=CrossBlue
$MapPatternShot X=700 Y=850 SHOT=CrossGreen
$MapPatternShot X=700 Y=900 SHOT=CrossBlue
$MapPatternShot X=700 Y=950 SHOT=CrossGreen
$MapPatternShot X=700 Y=1000 SHOT=CrossBlue
$MapPatternShot X=750 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=750 Y=-950 SHOT=CrossGreen
$MapPatternShot X=750 Y=-900 SHOT=CrossBlue
$MapPatternShot X=750 Y=-850 SHOT=CrossGreen
$MapPatternShot X=750 Y=-800 SHOT=CrossBlue
$MapPatternShot X=750 Y=-750 SHOT=CrossGreen
$MapPatternShot X=750 Y=-700 SHOT=CrossBlue
$MapPatternShot X=750 Y=-650 SHOT=CrossGreen
$MapPatternShot X=750 Y=-600 SHOT=CrossBlue
$MapPatternShot X=750 Y=-550 SHOT=CrossGreen
$MapPatternShot X=750 Y=-500 SHOT=CrossBlue
$MapPatternShot X=750 Y=-450 SHOT=CrossGreen
$MapPatternShot X=750 Y=-400 SHOT=CrossBlue
$MapPatternShot X=750 Y=-350 SHOT=CrossGreen
$MapPatternShot X=750 Y=-300 SHOT=CrossBlue
$MapPatternShot X=750 Y=-250 SHOT=CrossGreen
$MapPatternShot X=750 Y=-200 SHOT=CrossBlue
$MapPatternShot X=750 Y=-150 SHOT=CrossGreen
$MapPatternShot X=750 Y=-100 SHOT=CrossBlue
$MapPatternShot X=750 Y=-50 SHOT=CrossGreen
$MapPatternShot X=750 Y=0 SHOT=CrossBlue
$MapPatternShot X=750 Y=50 SHOT=CrossGreen
$MapPatternShot X=750 Y=100 SHOT=CrossBlue
$MapPatternShot X=750 Y=150 SHOT=CrossGreen
$MapPatternShot X=750 Y=200 SHOT=CrossBlue
$MapPatternShot X=750 Y=250 SHOT=CrossGreen
$MapPatternShot X=750 Y=300 SHOT=CrossBlue
$MapPatternShot X=750 Y=350 SHOT=CrossGreen
$MapPatternShot X=750 Y=400 SHOT=CrossBlue
$MapPatternShot X=750 Y=450 SHOT=CrossGreen
$MapPatternShot X=750 Y=500 SHOT=CrossBlue
$MapPatternShot X=750 Y=550 SHOT=CrossGreen
$MapPatternShot X=750 Y=600 SHOT=CrossBlue
$MapPatternShot X=750 Y=650 SHOT=CrossGreen
$MapPatternShot X=750 Y=700 SHOT=CrossBlue
$MapPatternShot X=750 Y=750 SHOT=CrossGreen
$MapPatternShot X=750 Y=800 SHOT=CrossBlue
$MapPatternShot X=750 Y=850 SHOT=CrossGreen
$MapPatternShot X=750 Y=900 SHOT=CrossBlue
$MapPatternShot X=750 Y=950 SHOT=CrossGreen
$MapPatternShot X=750 Y=1000 SHOT=CrossBlue
$MapPatternShot X=800 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=800 Y=-950 SHOT=CrossGreen
$MapPatternShot X=800 Y=-900 SHOT=CrossBlue
$MapPatternShot X=800 Y=-850 SHOT=CrossGreen
$MapPatternShot X=800 Y=-800 SHOT=CrossBlue
$MapPatternShot X=800 Y=-750 SHOT=CrossGreen
$MapPatternShot X=800 Y=-700 SHOT=CrossBlue
$MapPatternShot X=800 Y=-650 SHOT=CrossGreen
$MapPatternShot X=800 Y=-600 SHOT=CrossBlue
$MapPatternShot X=800 Y=-550 SHOT=CrossGreen
$MapPatternShot X=800 Y=-500 SHOT=CrossBlue
$MapPatternShot X=800 Y=-450 SHOT=CrossGreen
$MapPatternShot X=800 Y=-400 SHOT=CrossBlue
$MapPatternShot X=800 Y=-350 SHOT=CrossGreen
$MapPatternShot X=800 Y=-300 SHOT=CrossBlue
$MapPatternShot X=800 Y=-250 SHOT=CrossGreen
$MapPatternShot X=800 Y=-200 SHOT=CrossBlue
$MapPatternShot X=800 Y=-150 SHOT=CrossGreen
$MapPatternShot X=800 Y=-100 SHOT=CrossBlue
$MapPatternShot X=800 Y=-50 SHOT=CrossGreen
$MapPatternShot X=800 Y=0 SHOT=CrossBlue
$MapPatternShot X=800 Y=50 SHOT=CrossGreen
$MapPatternShot X=800 Y=100 SHOT=CrossBlue
$MapPatternShot X=800 Y=150 SHOT=CrossGreen
$MapPatternShot X=800 Y=200 SHOT=CrossBlue
$MapPatternShot X=800 Y=250 SHOT=CrossGreen
$MapPatternShot X=800 Y=300 SHOT=CrossBlue
$MapPatternShot X=800 Y=350 SHOT=CrossGreen
$MapPatternShot X=800 Y=400 SHOT=CrossBlue
$MapPatternShot X=800 Y=450 SHOT=CrossGreen
$MapPatternShot X=800 Y=500 SHOT=CrossBlue
$MapPatternShot X=800 Y=550 SHOT=CrossGreen
$MapPatternShot X=800 Y=600 SHOT=CrossBlue
$MapPatternShot X=800 Y=650 SHOT=CrossGreen
$MapPatternShot X=800 Y=700 SHOT=CrossBlue
$MapPatternShot X=800 Y=750 SHOT=CrossGreen
$MapPatternShot X=800 Y=800 SHOT=CrossBlue
$MapPatternShot X=800 Y=850 SHOT=CrossGreen
$MapPatternShot X=800 Y=900 SHOT=CrossBlue
$MapPatternShot X=800 Y=950 SHOT=CrossGreen
$MapPatternShot X=800 Y=1000 SHOT=CrossBlue
$MapPatternShot X=850 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=850 Y=-950 SHOT=CrossGreen
$MapPatternShot X=850 Y=-900 SHOT=CrossBlue
$MapPatternShot X=850 Y=-850 SHOT=CrossGreen
$MapPatternShot X=850 Y=-800 SHOT=CrossBlue
$MapPatternShot X=850 Y=-750 SHOT=CrossGreen
$MapPatternShot X=850 Y=-700 SHOT=CrossBlue
$MapPatternShot X=850 Y=-650 SHOT=CrossGreen
$MapPatternShot X=850 Y=-600 SHOT=CrossBlue
$MapPatternShot X=850 Y=-550 SHOT=CrossGreen
$MapPatternShot X=850 Y=-500 SHOT=CrossBlue
$MapPatternShot X=850 Y=-450 SHOT=CrossGreen
$MapPatternShot X=850 Y=-400 SHOT=CrossBlue
$MapPatternShot X=850 Y=-350 SHOT=CrossGreen
$MapPatternShot X=850 Y=-300 SHOT=CrossBlue
$MapPatternShot X=850 Y=-250 SHOT=CrossGreen
$MapPatternShot X=850 Y=-200 SHOT=CrossBlue
$MapPatternShot X=850 Y=-150 SHOT=CrossGreen
$MapPatternShot X=850 Y=-100 SHOT=CrossBlue
$MapPatternShot X=850 Y=-50 SHOT=CrossGreen
$MapPatternShot X=850 Y=0 SHOT=CrossBlue
$MapPatternShot X=850 Y=50 SHOT=CrossGreen
$MapPatternShot X=850 Y=100 SHOT=CrossBlue
$MapPatternShot X=850 Y=150 SHOT=CrossGreen
$MapPatternShot X=850 Y=200 SHOT=CrossBlue
$MapPatternShot X=850 Y=250 SHOT=CrossGreen
$MapPatternShot X=850 Y=300 SHOT=CrossBlue
$MapPatternShot X=850 Y=350 SHOT=CrossGreen
$MapPatternShot X=850 Y=400 SHOT=CrossBlue
$MapPatternShot X=850 Y=450 SHOT=CrossGreen
$MapPatternShot X=850 Y=500 SHOT=CrossBlue
$MapPatternShot X=850 Y=550 SHOT=CrossGreen
$MapPatternShot X=850 Y=600 SHOT=CrossBlue
$MapPatternShot X=850 Y=650 SHOT=CrossGreen
$MapPatternShot X=850 Y=700 SHOT=CrossBlue
$MapPatternShot X=850 Y=750 SHOT=CrossGreen
$MapPatternShot X=850 Y=800 SHOT=CrossBlue
$MapPatternShot X=850 Y=850 SHOT=CrossGreen
$MapPatternShot X=850 Y=900 SHOT=CrossBlue
$MapPatternShot X=850 Y=950 SHOT=CrossGreen
$MapPatternShot X=850 Y=1000 SHOT=CrossBlue
$MapPatternShot X=900 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=900 Y=-950 SHOT=CrossGreen
$MapPatternShot X=900 Y=-900 SHOT=CrossBlue
$MapPatternShot X=900 Y=-850 SHOT=CrossGreen
$MapPatternShot X=900 Y=-800 SHOT=CrossBlue
$MapPatternShot X=900 Y=-750 SHOT=CrossGreen
$MapPatternShot X=900 Y=-700 SHOT=CrossBlue
$MapPatternShot X=900 Y=-650 SHOT=CrossGreen
$MapPatternShot X=900 Y=-600 SHOT=CrossBlue
$MapPatternShot X=900 Y=-550 SHOT=CrossGreen
$MapPatternShot X=900 Y=-500 SHOT=CrossBlue
$MapPatternShot X=900 Y=-450 SHOT=CrossGreen
$MapPatternShot X=900 Y=-400 SHOT=CrossBlue
$MapPatternShot X=900 Y=-350 SHOT=CrossGreen
$MapPatternShot X=900 Y=-300 SHOT=CrossBlue
$MapPatternShot X=900 Y=-250 SHOT=CrossGreen
$MapPatternShot X=900 Y=-200 SHOT=CrossBlue
$MapPatternShot X=900 Y=-150 SHOT=CrossGreen
$MapPatternShot X=900 Y=-100 SHOT=CrossBlue
$MapPatternShot X=900 Y=-50 SHOT=CrossGreen
$MapPatternShot X=900 Y=0 SHOT=CrossBlue
$MapPatternShot X=900 Y=50 SHOT=CrossGreen
$MapPatternShot X=900 Y=100 SHOT=CrossBlue
$MapPatternShot X=900 Y=150 SHOT=CrossGreen
$MapPatternShot X=900 Y=200 SHOT=CrossBlue
$MapPatternShot X=900 Y=250 SHOT=CrossGreen
$MapPatternShot X=900 Y=300 SHOT=CrossBlue
$MapPatternShot X=900 Y=350 SHOT=CrossGreen
$MapPatternShot X=900 Y=400 SHOT=CrossBlue
$MapPatternShot X=900 Y=450 SHOT=CrossGreen
$MapPatternShot X=900 Y=500 SHOT=CrossBlue
$MapPatternShot X=900 Y=550 SHOT=CrossGreen
$MapPatternShot X=900 Y=600 SHOT=CrossBlue
$MapPatternShot X=900 Y=650 SHOT=CrossGreen
$MapPatternShot X=900 Y=700 SHOT=CrossBlue
$MapPatternShot X=900 Y=750 SHOT=CrossGreen
$MapPatternShot X=900 Y=800 SHOT=CrossBlue
$MapPatternShot X=900 Y=850 SHOT=CrossGreen
$MapPatternShot X=900 Y=900 SHOT=CrossBlue
$MapPatternShot X=900 Y=950 SHOT=CrossGreen
$MapPatternShot X=900 Y=1000 SHOT=CrossBlue
$MapPatternShot X=950 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=950 Y=-950 SHOT=CrossGreen
$MapPatternShot X=950 Y=-900 SHOT=CrossBlue
$MapPatternShot X=950 Y=-850 SHOT=CrossGreen
$MapPatternShot X=950 Y=-800 SHOT=CrossBlue
$MapPatternShot X=950 Y=-750 SHOT=CrossGreen
$MapPatternShot X=950 Y=-700 SHOT=CrossBlue
$MapPatternShot X=950 Y=-650 SHOT=CrossGreen
$MapPatternShot X=950 Y=-600 SHOT=CrossBlue
$MapPatternShot X=950 Y=-550 SHOT=CrossGreen
$MapPatternShot X=950 Y=-500 SHOT=CrossBlue
$MapPatternShot X=950 Y=-450 SHOT=CrossGreen
$MapPatternShot X=950 Y=-400 SHOT=CrossBlue
$MapPatternShot X=950 Y=-350 SHOT=CrossGreen
$MapPatternShot X=950 Y=-300 SHOT=CrossBlue
$MapPatternShot X=950 Y=-250 SHOT=CrossGreen
$MapPatternShot X=950 Y=-200 SHOT=CrossBlue
$MapPatternShot X=950 Y=-150 SHOT=CrossGreen
$MapPatternShot X=950 Y=-100 SHOT=CrossBlue
$MapPatternShot X=950 Y=-50 SHOT=CrossGreen
$MapPatternShot X=950 Y=0 SHOT=CrossBlue
$MapPatternShot X=950 Y=50 SHOT=CrossGreen
$MapPatternShot X=950 Y=100 SHOT=CrossBlue
$MapPatternShot X=950 Y=150 SHOT=CrossGreen
$MapPatternShot X=950 Y=200 SHOT=CrossBlue
$MapPatternShot X=950 Y=250 SHOT=CrossGreen
$MapPatternShot X=950 Y=300 SHOT=CrossBlue
$MapPatternShot X=950 Y=350 SHOT=CrossGreen
$MapPatternShot X=950 Y=400 SHOT=CrossBlue
$MapPatternShot X=950 Y=450 SHOT=CrossGreen
$MapPatternShot X=950 Y=500 SHOT=CrossBlue
$MapPatternShot X=950 Y=550 SHOT=CrossGreen
$MapPatternShot X=950 Y=600 SHOT=CrossBlue
$MapPatternShot X=950 Y=650 SHOT=CrossGreen
$MapPatternShot X=950 Y=700 SHOT=CrossBlue
$MapPatternShot X=950 Y=750 SHOT=CrossGreen
$MapPatternShot X=950 Y=800 SHOT=CrossBlue
$MapPatternShot X=950 Y=850 SHOT=CrossGreen
$MapPatternShot X=950 Y=900 SHOT=CrossBlue
$MapPatternShot X=950 Y=950 SHOT=CrossGreen
$MapPatternShot X=950 Y=1000 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-1000 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-950 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-900 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-850 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-800 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-750 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-700 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-650 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-600 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-550 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-500 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-450 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-400 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-350 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-300 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-250 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-200 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-150 SHOT=CrossGreen
$MapPatternShot X=1000 Y=-100 SHOT=CrossBlue
$MapPatternShot X=1000 Y=-50 SHOT=CrossGreen
$MapPatternShot X=1000 Y=0 SHOT=CrossBlue
$MapPatternShot X=1000 Y=50 SHOT=CrossGreen
$MapPatternShot X=1000 Y=100 SHOT=CrossBlue
$MapPatternShot X=1000 Y=150 SHOT=CrossGreen
$MapPatternShot X=1000 Y=200 SHOT=CrossBlue
$MapPatternShot X=1000 Y=250 SHOT=CrossGreen
$MapPatternShot X=1000 Y=300 SHOT=CrossBlue
$MapPatternShot X=1000 Y=350 SHOT=CrossGreen
$MapPatternShot X=1000 Y=400 SHOT=CrossBlue
$MapPatternShot X=1000 Y=450 SHOT=CrossGreen
$MapPatternShot X=1000 Y=500 SHOT=CrossBlue
$MapPatternShot X=1000 Y=550 SHOT=CrossGreen
$MapPatternShot X=1000 Y=600 SHOT=CrossBlue
$MapPatternShot X=1000 Y=650 SHOT=CrossGreen
$MapPatternShot X=1000 Y=700 SHOT=CrossBlue
$MapPatternShot X=1000 Y=750 SHOT=CrossGreen
$MapPatternShot X=1000 Y=800 SHOT=CrossBlue
$MapPatternShot X=1000 Y=850 SHOT=CrossGreen
$MapPatternShot X=1000 Y=900 SHOT=CrossBlue
$MapPatternShot X=1000 Y=950 SHOT=CrossGreen
$MapPatternShot X=1000 Y=1000 SHOT=CrossBlue
  </bullet_pattern>

  <var name="MapPatternShot">
    <bullet speed="0" angle="0" shot_type="[SHOT]" uses_direct_location_control="true" never_collides_with_terrain="true" dumbfire="true">
      <change location="[X],[Y]" angle="0" time="0"/>
  <wait time="10"/>
    </bullet>
  </var>
Title: Re: XML questions and answers
Post by: TheVampire100 on February 08, 2016, 11:04:34 PM
I saw int he wiki that you can create an effect, that lets enemies drop items (like what Life Harvester does) but could you also make it that the an enemy itself would drop an item without having the need of owning a specific item/upgrade?
Or, in other words, that the enemy has this effect on all runs you do?
Title: Re: XML questions and answers
Post by: ptarth on February 08, 2016, 11:08:33 PM
..[Can you control loot from killing enemies]...

I believe so. The complexity of the loot system would be related to the complexity of code required.
Title: Re: XML questions and answers
Post by: Ayrix on February 09, 2016, 12:00:00 AM
I saw int he wiki that you can create an effect, that lets enemies drop items (like what Life Harvester does) but could you also make it that the an enemy itself would drop an item without having the need of owning a specific item/upgrade?
Or, in other words, that the enemy has this effect on all runs you do?
You could do it via a bullet pattern fairly easily using death_spiral_movement_driving_bullet_pattern, and then spawn entity.
Or
 you could instead grant the enemy a single use system that drops (an) item(s).
Or
you can make it turn into an item on death.

most of the loot system is based on loot pools, which items are in which pools is a property of the item.
You can either make them drop something from a pool, or a specific item.

Making them drop sometimes is more difficult.  Chance based things must be a effect (which normally means a system), or a modifier (what those can do is more limited, and is how the 5% chance of grants health on kill stuff works).
Title: Re: XML questions and answers
Post by: ptarth on February 12, 2016, 09:37:30 PM
Q: Why can't I mixed relative=true movement with relative=false movement patterns using uses_direct_location_control?
A: You can. But there is a catch. If your change statement contains time="0" and is immediately followed by another change statement, then the first one is ignored and the position of the entity prior to the first change statement is used. I'm guessing its because the second instruction overwrite the first instruction since no time has passed. In other words, you tell the entity to shift one way, then before it can do anything, you tell it to shift the other. The entity ends ignoring the first instruction. (Go Left, er, no I mean Right. RIGHT!).


Examples:
Code: [Select]
<change location="0,-100" time="0"/>
<change relative="true" location="100,0" time="0.75"/>

Result: Entity moves to the left 100 pixels from original position.

<change location="0,-100" time="0"/>
<wait time="0.01"/>
<change relative="true" location="100,0" time="0.75"/>

Result: Entity appears 100 pixels to the right of the original position. Then shifts 100 moves to the left ending up at the original position.

<change location="0,-100" time="0.01"/>
<change relative="true" location="100,0" time="0.75"/>
Result: Entity moves very quickly to 100 pixels to the right of the original position. Then moves 100 moves to the left ending up at the original position.

I hope this reduces the amount of time you spend wandering the halls cursing Keith.
Title: Re: XML questions and answers
Post by: ptarth on February 12, 2016, 10:24:37 PM
Q: Anything I should know about spawning Bosses, Minibosses, and Condemned Bosses?
A: If you define the spawn location in the game entity room tag using boss_spawn_point, DO NOT USE 0,0. The engine self-destructs and may cause your computer to explode. Don't do it. Using "0,1" or "1,0" or "1,1" or "-1,-1" are all fine. (I think I haven't tested them).

Hopefully this will reduce the amount of time you spend wandering the halls cursing at Keith.
Title: Re: XML questions and answers
Post by: Misery on February 12, 2016, 11:46:07 PM
Hopefully this will reduce the amount of time you spend wandering the halls cursing at Keith.

I'm detecting a theme here.
Title: Re: XML questions and answers
Post by: keith.lamothe on February 12, 2016, 11:48:15 PM
Hopefully this will reduce the amount of time you spend wandering the halls cursing at Keith.

I'm detecting a theme here.
It is an admirable, if futile, goal.
Title: Re: XML questions and answers
Post by: ptarth on February 12, 2016, 11:56:25 PM
See, Keith is such a great guy, and I know there are really good reasons for things be done in a certain way. And sometimes there are going to be idiosyncratic features. Obviously he knows about them. But no one ever wrote them down to be passed along to us poor suckers trying to work through this. At least not all of them. And sometimes we get passed outdated or not quite complete information.

And then I usually end up whimpering in a corner. So much time was spent trying to figure out why that train boss was going diagonally instead of orthogonal.
Title: Re: XML questions and answers
Post by: keith.lamothe on February 13, 2016, 12:03:11 AM
See, Keith is such a great guy, and I know there are really good reasons for things be done in a certain way.
Neither of these things is true.

Quote
And sometimes there are going to be idiosyncratic features.
That's true.

Quote
Obviously he knows about them.
That's only occasionally true.

Quote
But no one ever wrote them down to be passed along to us poor suckers trying to work through this.
No information was purposely withheld, is all I can plead :) This is our first time trying to have "real" modding that's not done via some editor or otherwise limited to a pretty specific subset of the game. Any time I added a tag or attribute needed by a content guy I put it in the wiki, but we're finding out that this is woefully inadequate :)
Title: Re: XML questions and answers
Post by: ptarth on February 13, 2016, 12:16:50 AM
From a bang your head on it until it breaks works perspective, most of the XML works pretty well. The major problems are finding things in the Wiki (e.g., Ricochet!), the few parts that just don't work (e.g., PeriodicMovementMode), and the awkwardness on where and how specific characteristics are made (at the level of the game entity, system, bullet, or bulletpattern), (e.g., the speed of a shot is defined at the system, most of the time). There are some deprecated and missing entries still (Ability Points, anything about floors.xml and particles), but they aren't that big of deal. Getting grep to work on my local install and getting a copy of the wiki helped a ton too.

Its just when I want to do something Ptarthian that things are troublesome. It would probably also help if I managed to get the NonSim parts down.
Title: Re: XML questions and answers
Post by: ptarth on February 13, 2016, 07:18:49 PM
Q: How does the teleporter shot destruction on use work?

I'm trying something new with the Reanimator, but when the teleporter is used it keeps wiping out the defensive barrier around it. I know that Misery did some hijinks with the new final boss regarding teleporters.
Title: Re: XML questions and answers
Post by: Hearteater on February 13, 2016, 07:26:14 PM
Question: as far as I can tell, you cannot control the facing of a shot sprite. It will always face in the direction it is traveling. You can fake this if you just want it to travel backwards with negative speed. But if you want it to travel along say angle 0, but be turned to face angle 30, you need to attach it to another invisible shot? Is that correct? Or is there a facing attribute on bullet I'm missing?
Title: Re: XML questions and answers
Post by: Ayrix on February 13, 2016, 09:13:50 PM
Question: as far as I can tell, you cannot control the facing of a shot sprite. It will always face in the direction it is traveling. You can fake this if you just want it to travel backwards with negative speed. But if you want it to travel along say angle 0, but be turned to face angle 30, you need to attach it to another invisible shot? Is that correct? Or is there a facing attribute on bullet I'm missing?
shots generate facing the angle you chose (movement direction is not tied to rotation), so you want to spawn them at angle 30, then immediately change movement direction.
Also never_changes_angle_after_spawn on the shot entity.
Title: Re: XML questions and answers
Post by: ptarth on February 14, 2016, 01:20:12 AM
Q: How can I kill the minions after the boss dies?
A: There are many ways.

One way is in the Invader Boss. He has a only_fires_on_death weapon that nukes everything around him (obstacles, enemies, shots).

Another way is to copy a suicide system to the appropriate entities.

Code: [Select]
##On boss entity
<system type="TakeBallAndGoHomeSystem" offset="0,0"/>

##System defintions
<system name="SuicideSystem"
category="Weapon"
shot_type="Invisible"
damage_type="Energy"
attack_power="1"
fire_rate="2000"
cue_time = "0.0"
range_actual="10"
shots_per_salvo="1"
shot_speed="0"
targeting_logic="Dumbfire"
firing_timing="AllTheTime"
image_name="Invisible"
destroys_firing_entity="true"
>
</system>

<system name="TakeBallAndGoHomeSystem"
category="Weapon"
shot_type="Invisible"
damage_type="Energy"
attack_power="1"
fire_rate="2000"
cue_time = "0.0"
range_actual="10"
shots_per_salvo="1"
shot_speed="0"
targeting_logic="Dumbfire"
firing_timing="AllTheTime"
image_name="Invisible"
only_fires_on_death="true"
>
<effect timing="OnUse" targeting="AllEnemies" type="AddSystem" related_systems="SuicideSystem"/>
</system>

*Note: These might be able to be cleaned up by making it a DirectUseSystem instead of a weapon.
Title: Re: XML questions and answers
Post by: ptarth on February 14, 2016, 01:25:46 AM
Q: Independent shot angle and movement
A2: Using a bullet with uses_direct_location_control="true" and specifying relative locations (or not relative, your choice) will also work. There is also some nonsim code that allows you to animate a shot, including rotational shifts, but I've never worked with it.
Title: Re: XML questions and answers
Post by: ptarth on February 14, 2016, 01:30:59 AM
Q: What are the specifications for the boss (and miniboss) mid room spawning for the player?
Title: Re: XML questions and answers
Post by: Ayrix on February 14, 2016, 02:13:17 AM
Q: What are the specifications for the boss (and miniboss) mid room spawning for the player?
You start at the test start location of the room don't you?


Also a Q
Does destroys_firing_entity count as a kill or not i.e. does it trigger on death effects?
Having fun trying to clear up my thing that endlessly respawns itself, needs to go *poof* without dying.
Title: Re: XML questions and answers
Post by: ptarth on February 14, 2016, 02:24:11 AM
Q: Does destroys_firing_entity count as a kill or not i.e. does it trigger on death effects?
Having fun trying to clear up my thing that endlessly respawns itself, needs to go *poof* without dying.

Yes. You can actually have enemies that propagate from having multiple destroys_firing_entity  and on_death effects. I found that out the hard way after my enemies started multiplying.
Title: Re: XML questions and answers
Post by: Ayrix on February 14, 2016, 02:32:27 PM
Q: Does destroys_firing_entity count as a kill or not i.e. does it trigger on death effects?
Having fun trying to clear up my thing that endlessly respawns itself, needs to go *poof* without dying.

Yes. You can actually have enemies that propagate from having multiple destroys_firing_entity  and on_death effects. I found that out the hard way after my enemies started multiplying.
Did you have a play with my silly miniboss, which just spawns more and more enemies that revive if the boss isn't dead

https://www.arcengames.com/mantisbt/view.php?id=18646 (https://www.arcengames.com/mantisbt/view.php?id=18646)
Title: Re: XML questions and answers
Post by: ptarth on February 14, 2016, 05:42:57 PM
I hadn't. I had known you were working on one, but wasn't sure you were interested in player feedback. I'll take a look now. I'll also start a thread, since I'm guessing it would be useful.
Title: Re: XML questions and answers
Post by: ptarth on February 15, 2016, 12:11:28 AM
Q: You have been making a ton of changes including writing up a new TestChamber. When you try to load the TestChamber you either get a fatal error or something like:
Code: [Select]
OnGUI: System.NullReferenceException: Object reference not set to an instance of an object
  at GameEntityTypeData.GetReplacementToUse (.MersenneTwister Random, Int32 FloorIndex, RoomType RoomType) [0x00000] in <filename unknown>:0
  at Room.SeedEntity (.GameEntityTypeData EntityTypeData, Vector2 spawnPoint, .MersenneTwister Random, Int32 FloorIndex, System.String SourceNameForErrorLog) [0x00000] in <filename unknown>:0
  at CombatEncounter+<>c__DisplayClass27_0.<Create>b__0 (.ArcenXMLElement Node) [0x00000] in <filename unknown>:0
  at ArcenXML.CustomProcessLoadedXml (.ArcenXMLElement Root, .CustomXmlProcessor Processor) [0x00000] in <filename unknown>:0
  at ArcenXML.CustomProcessXML (System.String FilePath, .CustomXmlProcessor Processor) [0x00000] in <filename unknown>:0
  at CombatEncounter.Create (Vector2 SpawnPoint, Int32 FloorIndex, Boolean CopyStuffFromOldPlayerEntity, .GameEntity oldPlayerEntity, System.Collections.Generic.List`1 modifiersBeforeSwitch, System.Collections.Generic.List`1 modifiersForShotsBeforeSwitch) [0x00000] in <filename unknown>:0
  at CombatEncounter.Create (Vector2 SpawnPoint, Int32 FloorIndex) [0x00000] in <filename unknown>:0
  at Game.ReloadTestChamber () [0x00000] in <filename unknown>:0
  at EscapeMenu+<>c.<SubclassInit>b__14_2 (ClickType <Click>) [0x00000] in <filename unknown>:0
  at ArcenQueuedButtonClickDelegate.Execute () [0x00000] in <filename unknown>:0
  at ArcenGUIManager.DrawGUI () [0x00000] in <filename unknown>:0
  at MainCameraLogic.OnGUI () [0x00000] in <filename unknown>:0
Stack Trace:   at GameEntityTypeData.GetReplacementToUse (.MersenneTwister Random, Int32 FloorIndex, RoomType RoomType) [0x00000] in <filename unknown>:0
  at Room.SeedEntity (.GameEntityTypeData EntityTypeData, Vector2 spawnPoint, .MersenneTwister Random, Int32 FloorIndex, System.String SourceNameForErrorLog) [0x00000] in <filename unknown>:0
  at CombatEncounter+<>c__DisplayClass27_0.<Create>b__0 (.ArcenXMLElement Node) [0x00000] in <filename unknown>:0
  at ArcenXML.CustomProcessLoadedXml (.ArcenXMLElement Root, .CustomXmlProcessor Processor) [0x00000] in <filename unknown>:0
  at ArcenXML.CustomProcessXML (System.String FilePath, .CustomXmlProcessor Processor) [0x00000] in <filename unknown>:0
  at CombatEncounter.Create (Vector2 SpawnPoint, Int32 FloorIndex, Boolean CopyStuffFromOldPlayerEntity, .GameEntity oldPlayerEntity, System.Collections.Generic.List`1 modifiersBeforeSwitch, System.Collections.Generic.List`1 modifiersForShotsBeforeSwitch) [0x00000] in <filename unknown>:0
  at CombatEncounter.Create (Vector2 SpawnPoint, Int32 FloorIndex) [0x00000] in <filename unknown>:0
  at Game.ReloadTestChamber () [0x00000] in <filename unknown>:0
  at EscapeMenu+<>c.<SubclassInit>b__14_2 (ClickType <Click>) [0x00000] in <filename unknown>:0
  at ArcenQueuedButtonClickDelegate.Execute () [0x00000] in <filename unknown>:0
  at ArcenGUIManager.DrawGUI () [0x00000] in <filename unknown>:0
  at MainCameraLogic.OnGUI () [0x00000] in <filename unknown>:0
What do you do?

A: You probably mispelled the name of the room. Check spelling punctuation, etc. If that still doesn't work, copy in a line from another test chamber with a good working room. (don't use mine).
Title: Re: XML questions and answers
Post by: Hearteater on February 19, 2016, 04:17:55 AM
Is there a way to reload XML you've changed without quiting and restarting Starward Rogue? DevScripts appear to be loaded from disk each time they are used, but the rest appear to only be loaded from disk when the game starts.
Title: Re: XML questions and answers
Post by: ptarth on February 19, 2016, 04:22:37 AM
ctrl+f4
Title: Re: XML questions and answers
Post by: Hearteater on February 19, 2016, 05:09:01 AM
Very helpful, thanks!

Also, is there any way to get a bullet that is using angle_from_parent or offset_from_parent to collide with terrain? Once either of those <change> commands are present, the shot appears to completely ignore walls. That's fine when I'm using orbitals, but in this case I want the pattern of bullets to move relative to the core, but die if they happen to touch a wall. I tried never_collides_with_terrain="false" and that doesn't do it.
Title: Re: XML questions and answers
Post by: ptarth on February 19, 2016, 05:14:20 AM
Not to my knowledge. Misery was having the same issue and created a thread about it a few days ago.

My solution was to have the rotation bullet have a short life and then be replaced.
Title: Re: XML questions and answers
Post by: Hearteater on February 19, 2016, 02:07:26 PM
Ok, that won't really work in my case because the distance between the center and edge is too great. You still get shots passing through walls for long enough to look wonky.

Is there a way to add a movement vector to its current movement? Like giving a shot a push on a given angle with a certain speed? So unlike how <change relative="true" angle="[a]" speed="[s ]" /> adds [a] and [s ] to current angle A and speed S of the shot directly (A = A + a, S = S + s), it instead would set A and S as follows:
S = SQRT(S^2 + s^2 - 2 * S^2 * s^2 * cos(A - a))
A = asin(sin(A - a) * s / S) {where S is the above calculated value}
Title: Re: XML questions and answers
Post by: Ayrix on February 19, 2016, 02:09:27 PM
Very helpful, thanks!

Also, is there any way to get a bullet that is using angle_from_parent or offset_from_parent to collide with terrain? Once either of those <change> commands are present, the shot appears to completely ignore walls. That's fine when I'm using orbitals, but in this case I want the pattern of bullets to move relative to the core, but die if they happen to touch a wall. I tried never_collides_with_terrain="false" and that doesn't do it.
my solution was to never have angle_from_parent or offset_from_parent on the bullets of the pattern, but rather only on bullets that draw the pattern.
You can make your bullets (as they are now) invisible but spawn bullets without the offending nodes, that don't move and with short lifetimes.

Title: Re: XML questions and answers
Post by: Hearteater on February 19, 2016, 02:13:11 PM
Ok, that might work. Thanks!
Title: Re: XML questions and answers
Post by: Hearteater on February 20, 2016, 05:00:53 PM
How do I <change angle="?"> a shot to point towards the player without spawning a new shot? I found spawning a new bullet (which auto-faces the player) and then just letting the old bullet die works, but that seems wasteful and silly. Am I missing something?
Title: Re: XML questions and answers
Post by: ptarth on February 20, 2016, 05:06:34 PM
Try:
<change angle="0" relative="ToPlayer"/>
Title: Re: XML questions and answers
Post by: TheVampire100 on February 22, 2016, 04:39:42 AM
Can you see or modify how much xp an enemy gives on defeat? Couldn't find it digging through the enemy systems.
Title: Re: XML questions and answers
Post by: ptarth on February 22, 2016, 05:01:49 AM
No.
It used to be you could set the value, but it was lost when ability points transitioned into experience.
Title: Re: XML questions and answers
Post by: TheVampire100 on February 22, 2016, 05:37:25 PM
Goddammit, I wanted to change it, so you get a bonus when you beat a boss on perfect.
Title: Re: XML questions and answers
Post by: ptarth on February 22, 2016, 05:50:44 PM
You'd also need access to if a boss was killed perfect.
Title: Re: XML questions and answers
Post by: Misery on February 22, 2016, 06:59:31 PM
Goddammit, I wanted to change it, so you get a bonus when you beat a boss on perfect.

Hm, that might not be a bad idea... maybe drop that one onto Mantis for later?
Title: Re: XML questions and answers
Post by: Draco18s on February 22, 2016, 07:03:53 PM
If you're going to do something like that, might want to have it be fully featured

e.g.
Standard exp (10)
Exp if killed without taking damage (+5)
Game difficulty modifier (x1.5)

Title: Re: XML questions and answers
Post by: TheVampire100 on February 22, 2016, 09:47:46 PM
Goddammit, I wanted to change it, so you get a bonus when you beat a boss on perfect.

Hm, that might not be a bad idea... maybe drop that one onto Mantis for later?
I already did weeks ago but I never got an answer, so I wanted it to change myself.
https://www.arcengames.com/mantisbt/view.php?id=18630
Title: Re: XML questions and answers
Post by: Misery on February 22, 2016, 10:01:24 PM
Goddammit, I wanted to change it, so you get a bonus when you beat a boss on perfect.

Hm, that might not be a bad idea... maybe drop that one onto Mantis for later?
I already did weeks ago but I never got an answer, so I wanted it to change myself.
https://www.arcengames.com/mantisbt/view.php?id=18630

...oh.  Yeah, I'm thinking Chris and Keith just plain dont have enough time to really be going through the Mantis stuff right now, and I dont think that's something that the rest of us could add to the game ourselves (unless maybe Draco could do it?).  But I do kinda think it's a good idea to give the player a useful reward for perfecting something.  That'd be a satisfying mechanic.
Title: Re: XML questions and answers
Post by: Draco18s on February 27, 2016, 08:22:01 PM
...oh.  Yeah, I'm thinking Chris and Keith just plain dont have enough time to really be going through the Mantis stuff right now, and I dont think that's something that the rest of us could add to the game ourselves (unless maybe Draco could do it?).  But I do kinda think it's a good idea to give the player a useful reward for perfecting something.  That'd be a satisfying mechanic.

Maybe.  I'd have to look.
I'd like to solidify my own project before I delve into SR's codebase.
Title: Re: XML questions and answers
Post by: ptarth on February 28, 2016, 05:33:01 PM
Should all experience be increased by difficulty? (i.e., regular enemies and xp items?)
Does giving more experience reduce the point of playing on the harder difficulties?
Title: Re: XML questions and answers
Post by: Hearteater on February 28, 2016, 05:51:20 PM
Difficulty settings should not affect XP.
Title: Re: XML questions and answers
Post by: Misery on February 28, 2016, 06:23:41 PM
I would almost say to lower incoming XP as difficulty rises.

I can be unpleasant that way really.
Title: Re: XML questions and answers
Post by: ptarth on March 23, 2016, 10:12:18 PM
I've been off of the forums, but still doing modding things. In secret. Just like this is my own personal secret forum. Anyway, a new question.

Q: Why does the orbital angle of a Ptarthian Orbit change depending on the presence or absence of a system (at least one)? The presence of one or more systems shifts the orbital by 45 degrees it seems.

A: Because someone (i.e., Keith) likes to know that I've descended into gibbering madness.
Title: Re: XML questions and answers
Post by: keith.lamothe on March 23, 2016, 10:15:54 PM
I don't have to deliberately implement such insanity-inducing features, they happen spontaneously. Saves me time and mental energy to devote to other goals.
Title: Re: XML questions and answers
Post by: Cinth on March 23, 2016, 10:40:09 PM
I've been off of the forums, but still doing modding things. In secret. Just like this is my own personal secret forum. Anyway, a new question.

Q: Why does the orbital angle of a Ptarthian Orbit change depending on the presence or absence of a system (at least one)? The presence of one or more systems shifts the orbital by 45 degrees it seems.

A: Because someone (i.e., Keith) likes to know that I've descended into gibbering madness.

If you have a case where the issue is isolated and is easily noticeable, I'll see if I can track down what's up. 

Title: Re: XML questions and answers
Post by: ptarth on March 24, 2016, 12:41:45 AM
https://www.arcengames.com/mantisbt/view.php?id=18785

I not sure how critical it is. I'm just going to give everything a weapon. Who needs framerates higher than 10 anyway?
Title: Re: XML questions and answers
Post by: Cinth on March 24, 2016, 01:10:18 AM
https://www.arcengames.com/mantisbt/view.php?id=18785

I not sure how critical it is. I'm just going to give everything a weapon. Who needs framerates higher than 10 anyway?

I dunno, but if it's something I can run down and improve on, I will.  If not I can at least add what I find to the case.
Title: Re: XML questions and answers
Post by: Pumpkin on March 24, 2016, 07:33:23 AM
Am I dreaming or are there more administrators than regular forum members in there?
Title: Re: XML questions and answers
Post by: Cinth on March 24, 2016, 07:38:06 AM
Some of us got promoted to help keep the spam bots out.
Title: Re: XML questions and answers
Post by: Misery on March 24, 2016, 09:50:20 AM
Not that the stupid things ever stop coming, of course.  It's like trying to stop a zombie horde.  Except they're abnormally dumb, cant spell, and try to sell you crazy stuff.

But now they'll never get past the wall of people with too much free time on their hands.

Or is that bit just me?  Not sure.
Title: Re: XML questions and answers
Post by: ptarth on March 24, 2016, 04:08:55 PM
What do you think our stance on purifying threads of off topic content should be?

I have to say, I'm a purists and would cleanse the world with fire.
Title: Re: XML questions and answers
Post by: Misery on March 24, 2016, 06:59:29 PM
If we tried to do something about threads that go off topic, most of the forum would just go up in smoke.

Would there be anything left?  I dont even know.
Title: Re: XML questions and answers
Post by: ptarth on March 24, 2016, 07:10:11 PM
Baring a counter suggestion, I propose at least technical threads should be cleansed.
Title: Re: XML questions and answers
Post by: Cinth on March 24, 2016, 07:12:49 PM
Leave it as is.  There is your counter. 
Title: Re: XML questions and answers
Post by: ptarth on March 24, 2016, 07:36:11 PM
So, if I'm the id, and Cinth is the superego, is then Pepisolo the ego? In this analogy Misery would be a fluctuating conscious/subconscious drive that acts nearly independent to the gestalt.

More seriously, technical threads are most useful when they contain relevant, accurate, and concise information. Banter decreases their use, and thus has negative value to the thread.

The patch threads (and suchlike) I'm less concerned with because they are more casual.
Title: Re: XML questions and answers
Post by: Misery on March 24, 2016, 09:16:35 PM
I thought we were being technical?
Title: Re: XML questions and answers
Post by: Cinth on March 24, 2016, 09:30:33 PM
He's derailing this thread by talking about this thread.  Quick, post a cat gif.


The only thing on these forums that needs to be cleaned up are the spam bots.  Grab a flamethrower and proceed to BBQ some bots.
Title: Re: XML questions and answers
Post by: ptarth on March 24, 2016, 10:01:45 PM
Trying to decide if the centers are upscaled too much. Thoughts?
Title: Re: XML questions and answers
Post by: Cinth on March 24, 2016, 10:06:47 PM
Looks fine to me, though art isn't my department.